Loading...
Loading...
View or change project config — effective merged values, or set locally in project.local.yaml.
npx skill4agent add donchitos/claude-code-game-studios settingsproject.yamlproject.local.yamlmodes.automationproject.local.yamlproject.yamlcollaborative.claude/docs/automation-modes.mdproject.yamlschema_changesautomation_always_ask/settingsautonomousschema_changes| Form | Mode |
|---|---|
| View-all (Phase 2) |
| View-one (Phase 3) |
| Set-yaml (Phase 4) |
| Set-local (Phase 5) |
<key>modes.review_modetesting.strict.logic<value>key=value=<key><value>--local--local/settings --local =foo/settings --local key=yaml-helper.shbash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" <helper call><helper call>resolve_setting modes.review_modevalidate_yaml_enum project.yamlproject.yamlproject.local.yamlis_locally_overridable01sourcecd ... &&; echo $?.claude/hooks/yaml-helper.sh.claude/docs/effects-map.md.claude/rules/skill-authoring.mdgrep -B14 '^> ### RESERVED' .claude/docs/effects-map.md | grep -E '^## '> ### RESERVEDplatform.cert_tierRESERVED_SETDeliberately phrased without naming those keys. The dead-settings gate asserts that a setting on the allowlist has no readers, and it counts any skill file that spells the key. Naming them here to illustrate the split would makeregister as a reader of two settings nothing reads, and the gate would fail — correctly. Spelling a dead path out while explaining why not to use it trips the same wire. Reword instead of adding an exemption: the strictness is the point, so do not re-introduce the literal names to make an example clearer./settings
project.yaml"Nofound — runproject.yamlto create one." And exit./start
project.local.yamlvalidate_yaml_enum project.yamlproject.local.yamlvalidate_yaml_enum project.local.yamlReadkey: valueproject.local.yamlproject.yamlmodes.rigormodes.workflowdocs.densityqa.levelmodes.story_granularitymodes.review_modeteam.sizemodes.rigormodes.review_modeteam.sizeresolve_setting <path><value><source>project.local.yamlproject.yamlrigorget_yaml_key project.yaml <path>is_locally_overridable <path><source> | Annotation |
|---|---|
| |
| |
| |
a legacy file path (e.g. | |
| |
| |
| skip the leaf (don't print unset keys) |
, lockedis_locally_overridable, reservedRESERVED_SETreserved = stored, but nothing reads it. Setting it changes
no behaviour today.All four phases must carry the reserved marking — view-one, view-all, and both write paths. Marking view-one and the writes while leaving view-all — the most-used form of this skill — unmarked means a user who set a reserved key sees it listed beside working settings with an ordinaryannotation, in the view most people actually run. Guard all four: view-one and view-all are twins in exactly the way the two write paths are.(project.yaml)
frameworkmodesenginemodes.automationmodes:project.local.yamltesting.strict.*project.yaml: present
project.local.yaml: present
Schema validation: ok
Effective config:
framework:
version: 1.2.0 (project.yaml, locked)
modes:
review_mode: lean (project.yaml)
automation: autonomous (LOCAL OVERRIDE — yaml has: collaborative)
rigor: full (project.yaml, locked)
workflow: full (derived from rigor: full, locked)
story_granularity: fine (derived from rigor: full, locked)
docs:
density: terse (project.yaml, locked)
qa:
level: full (derived from rigor: full, locked)
engine:
name: Godot (project.yaml, locked)
version: 4.7 (project.yaml, locked)
testing:
strict:
logic: false (LOCAL OVERRIDE — yaml has: true)
integration: true (project.yaml)
locked = cannot be overridden in project.local.yaml (project-wide setting).
It does NOT mean fixed: a derived value can still be set explicitly with
/settings <key>=<value>, and an explicit value wins over rigor.lockedlockeddocs.densityproject.yamlrigorSchema validation: ERRORS
[project.yaml] modes.review_mode: 'chaotic' is not a valid value (expected: full|lean|solo)
[project.local.yaml] engine.name: 'Pygame' is not a valid value (expected: Godot|Unity|Unreal)=<key>RESERVED_SETis RESERVED — nothing reads it. The value below is stored; it changes no behaviour today.<key>
<key>resolve_setting <key><value><source>get_yaml_key project.yaml <key>get_yaml_key project.local.yaml <key>is_locally_overridable <key><source>yesno<key>
Effective value: <effective-value or "(not set)" if <source> is unset>
Source: <project.yaml | project.local.yaml | project.local.yaml (overrides project.yaml) | derived from rigor: <level> | default>
Locally overridden: <yes | no>
Whitelist: <"can be locally overridden" if is_locally_overridable returned 0, else "locked — project-wide"> project.yaml value: <yamlvalue>
project.local.yaml value: <localvalue><source>rigor:<level> Set explicitly with: /settings <key>=<value> (an explicit value wins over rigor)<key>
Effective value: (not set)
Locally overridden: no
Whitelist: <"can be locally overridden" | "locked — project-wide"><key>=<value>--localvalidate_enum_value <key> <value>Invalid value '<value>' for '<key>'. Allowed: ...bash .claude/scripts/config-set.sh <key> <value> --dry-runknownyesnoAskUserQuestionUse <nearest> insteadnearest: <key>Write <key> anywayCancelUse <nearest> instead<key>RESERVED_SET"Note:is RESERVED — no skill or hook reads it, so setting it will not change any behaviour. Your value is stored either way."<key>
get_yaml_key project.local.yaml <key>"Note: this setting is currently locally overridden in(value:project.local.yaml). Writing to<localvalue>will not change your effective value."project.yaml
AskUserQuestionSet `<key>=<value>` in `project.yaml`?[A] Yes, write[B] No, cancelEditproject.yamlproject.yaml<lastsegment>: <oldvalue>modes:modes.review_modeEditold_string<lastsegment>: <oldvalue>modes.review_mode=fullold_string:
modes:
review_mode: lean
new_string:
modes:
review_mode: fullEditold_stringEditold_stringAskUserQuestion"Couldn't find a clean insertion point forin<key>. Show me what to do."project.yaml
Set `<key>=<value>` in `project.yaml`.<key>modes.rigorresolve_settingSet modes.rigor=full in project.yaml. It now supplies:
modes.workflow: full (derived from rigor: full)
docs.density: terse (project.yaml — explicit, unchanged)
qa.level: full (derived from rigor: full)
modes.story_granularity: fine (derived from rigor: full)
modes.review_mode: full (derived from rigor: full)
team.size: studio (derived from rigor: full)--local <key>=<value>is_locally_overridable <key><key> cannot be locally overridden — it's a project-wide setting. Use `/settings <key>=<value>` (no `--local`) to change it for the whole team.
validate_enum_value <key> <value>--local<key>knownnonearest:<key>RESERVED_SET"Note:is RESERVED — no skill or hook reads it, so setting it will not change any behaviour. Your value is stored either way."<key>
--localproject.yaml"Cannot create—project.local.yamlis missing. Runproject.yamlto create one first." Exit. (Local overrides require a base, per spec.)/start
AskUserQuestionSet `<key>=<value>` in `project.local.yaml` (your personal override, gitignored)?[A] Yes, write[B] No, cancelproject.local.yamlWrite--local modes.automation=autonomous# project.local.yaml — per-developer overrides (gitignored)
modes:
automation: autonomousEditSet `<key>=<value>` in `project.local.yaml` (your override).Usage:
/settings — view all effective config
/settings <key> — view a single setting
/settings <key>=<value> — change a setting (project.yaml)
/settings --local <key>=<value> — change a setting locally
(project.local.yaml, gitignored)
Examples:
/settings modes.review_mode
/settings modes.review_mode=full
/settings --local modes.automation=autonomousEditWriteyqyaml-helper.shis_locally_overridable_yaml_helper_locally_overridablemodes.workflowdocs.densityqa.levelmodes.story_granularitymodes.review_modeteam.sizemodes.rigoryaml-helper.sh_yaml_helper_rigor_expansionresolve_settingget_yaml_keyyaml-helper.sh_yaml_helper_enumsvalidate_enum_valuevalidate_yaml_enumsession-start.shproject.local.yaml.claude/docs/settings-guidance.mdeffects-map.md