diff --git a/.claude/docs/config-resolution.md b/.claude/docs/config-resolution.md index 1dbb2e5a..9c652c46 100644 --- a/.claude/docs/config-resolution.md +++ b/.claude/docs/config-resolution.md @@ -7,7 +7,14 @@ How a skill learns its effective settings. **One command, no prose chain.** A skill that needs config puts this near the top of its **body** (not frontmatter): ````markdown -!`source .claude/hooks/yaml-helper.sh 2>/dev/null && resolve_config` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys a,b` +```` + +**and** pre-approves exactly that command in its own frontmatter, with its own +directory name in the path: + +````yaml +allowed-tools: Read, …, Bash(bash "*/.claude/skills//../../hooks/yaml-helper.sh" resolve_config *) ```` The command runs as preprocessing *before the model sees the skill*, and its @@ -23,13 +30,47 @@ Skills that resolve a per-system tier pass the system name: `resolve_config comb `context: |` block containing `!` commands **never executes**; put the command in the skill body instead. -Two consequences: +## Why exactly this command — the permission check -- `allowed-tools` does **not** gate this. It governs tools the *model* calls - during the turn; preprocessing happens before that. A skill needs no `Bash` - grant to use `resolve_config`. -- The repo-wide setting `disableSkillShellExecution: true` disables it. If a - skill sees no config block, it falls back to the defaults below. +Claude Code permission-checks every injected command **before** the skill +renders. Outside auto mode, anything that does not come back "allow" — including +a command that would normally just prompt — **aborts the whole invocation**, and +the model never sees the skill. A preloaded skill (`skills:` on an agent) is +checked the same way at agent launch, so a failing bootstrap line stops the agent +from starting (GitHub issue #128). Measured on Claude Code 2.1.281 in default +mode: + +| Bootstrap form | Repo root | Subdirectory | Bash-less agent preloading it | +|---|---|---|---| +| `source "${CLAUDE_PROJECT_DIR:-.}/…" && resolve_config` (v1.1.0) | aborts | aborts | fails to launch | +| same, with a bare `Bash` grant | aborts | — | — | +| `bash "${CLAUDE_PROJECT_DIR}/…"` + grant | runs | aborts | — | +| **`bash "${CLAUDE_SKILL_DIR}/../../hooks/…"` + per-skill grant** | **runs** | **runs** | **launches** | + +What that table rules out: + +- **No `${VAR:-x}` expansion.** It fails as "Contains expansion", and no grant + can approve it. `${CLAUDE_SKILL_DIR}` and `${CLAUDE_PROJECT_DIR}` are fine: Claude + Code substitutes them as text before the check. +- **No `${CLAUDE_PROJECT_DIR}` for the path.** In a skill it is the directory + Claude Code was launched from, not the repo root, so it breaks from `src/`. + `${CLAUDE_SKILL_DIR}` always names the skill's own folder. +- **No `source … && …` compound.** Each part must be approved; `bash + resolve_config` is one command. `yaml-helper.sh` dispatches only + `resolve_config` when executed, and finds the repo root from its own location. +- **The grant is required.** `allowed-tools` is what pre-approves an injected + command. The pattern must include the literal `"` after the path — a pattern + ending `…yaml-helper.sh *` does not match. +- **Any non-zero exit aborts too.** The entry point always exits 0; other + injected commands that can fail end in `|| true`. + +Auto mode can approve the old form on its own, which is how v1.1.0 shipped with +it. Test bootstrap changes in default mode, in a project without a +`settings.local.json`. + +`disableSkillShellExecution: true` replaces every injected command with a +placeholder message. If a skill sees no config block, it falls back to the +defaults below. ## The block @@ -203,7 +244,8 @@ condition below degrades to defaults and is named on `notes:`: | `project.local.yaml` without a base | `validate_local_yaml_base` message on `notes:` | | Locked key in `project.local.yaml` | ignored as always, but now **named** on `notes:` — `local: not locally overridable, ignored — modes.rigor (move to project.yaml or delete)` | | No Python interpreter | legacy files and defaults only; **explicitly noted** on `notes:` | -| No block at all | shell preprocessing disabled — use the defaults table above | +| No block at all | shell preprocessing disabled (`disableSkillShellExecution`) — use the defaults table above | +| Bootstrap line not approved, or exits non-zero | **not a degraded state — the skill never renders at all.** See "Why exactly this command" above | A skill must never treat a missing block as "config is unset in an interesting way". It means the block did not render; the defaults apply. diff --git a/.claude/docs/director-gates.md b/.claude/docs/director-gates.md index 7c0b7cbf..926e9a9b 100644 --- a/.claude/docs/director-gates.md +++ b/.claude/docs/director-gates.md @@ -82,7 +82,8 @@ overriding the global config for that run only. **MANDATORY: apply the review mode before every gate spawn.** The value is already resolved — skills call -`` !`source .claude/hooks/yaml-helper.sh && resolve_config --keys review_mode` `` +`` !`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode` `` +(with the matching `allowed-tools` grant — see `config-resolution.md`) and read `review_mode` from the emitted block. Do **not** re-derive it here. The full chain (`project.local.yaml` → `project.yaml` → `production/review-mode.txt` → `modes.rigor` expansion, `standard`→`lean`), its defaults and its failure modes are specified in diff --git a/.claude/hooks/yaml-helper.sh b/.claude/hooks/yaml-helper.sh index 9ba8d595..fab89862 100644 --- a/.claude/hooks/yaml-helper.sh +++ b/.claude/hooks/yaml-helper.sh @@ -1545,3 +1545,46 @@ EOF fi return 0 } + +# --- Direct execution: the skill-bootstrap entry point ----------------------- +# +# bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys a,b +# +# Skills cannot `source` this file in their `` !`cmd` `` bootstrap line. Claude +# Code permission-checks every injected command before the skill renders, and +# outside auto mode anything short of "allow" ABORTS the whole invocation -- +# measured on 2.1.281, see .claude/docs/config-resolution.md. A `${VAR:-x}` or +# `$( )` in the command fails that check as "Contains expansion" and no grant can +# approve it; a `source … && resolve_config` compound needs every part approved. +# `${CLAUDE_SKILL_DIR}` is substituted as text before the check, so one plain +# `bash resolve_config …` call is approvable by the matching grant in the +# skill's own `allowed-tools`. That is also what lets a Bash-less agent preload +# the skill (GitHub issue #128). +# +# Only resolve_config is dispatchable: the bootstrap is the one caller, and +# every name added here widens what a skill grant can reach. +# +# ROOT. Run from a subdirectory, the skill shell's cwd has no project.yaml and +# $CLAUDE_PROJECT_DIR is the launch directory, not the repo root (measured), so +# rules 1-3 of _yaml_helper_set_root all miss. This file's own location is the +# one anchor that cannot drift: hooks/ sits two levels below the root. It only +# fills CLAUDE_PROJECT_DIR when that has no project.yaml, so rules 1-2 (cwd +# first, for nested projects) keep their precedence. +# +# ALWAYS exits 0: a non-zero exit from an injected command aborts the skill. +if [ "${BASH_SOURCE[0]}" = "$0" ]; then + case "${1:-}" in + resolve_config) + shift + if [ -z "${CLAUDE_PROJECT_DIR:-}" ] || [ ! -f "$CLAUDE_PROJECT_DIR/project.yaml" ]; then + _yh_self_root=$(cd "$(dirname "$0")/../.." 2>/dev/null && pwd) + [ -n "$_yh_self_root" ] && CLAUDE_PROJECT_DIR="$_yh_self_root" + fi + resolve_config "$@" + ;; + *) + echo "yaml-helper.sh: usage: bash yaml-helper.sh resolve_config [--keys k1,k2,...] []" + ;; + esac + exit 0 +fi diff --git a/.claude/scripts/migrate-v1-config.sh b/.claude/scripts/migrate-v1-config.sh index 9690d55f..811d0872 100644 --- a/.claude/scripts/migrate-v1-config.sh +++ b/.claude/scripts/migrate-v1-config.sh @@ -569,7 +569,7 @@ fi echo "schema_version: 1" echo "" echo "framework:" - echo " version: 1.1.0" + echo " version: 1.1.1" echo "" # Emit `project:` only when there is a stage to put in it -- same rule as the # `modes:` block below. Writing `stage: null` produced a file that FAILED THIS diff --git a/.claude/skills/adopt/SKILL.md b/.claude/skills/adopt/SKILL.md index b5f697f2..d9a861eb 100644 --- a/.claude/skills/adopt/SKILL.md +++ b/.claude/skills/adopt/SKILL.md @@ -3,11 +3,11 @@ name: adopt description: "Brownfield audit — do existing artifacts actually work? Numbered migration plan. Unlike /project-stage-detect, checks compliance not existence." argument-hint: "[focus: full | gdds | adrs | stories | infra]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write, AskUserQuestion +allowed-tools: Read, Glob, Grep, Bash, Write, AskUserQuestion, Bash(bash "*/.claude/skills/adopt/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,automation_always_ask,workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,automation_always_ask,workflow` Resolved above — use as-is. `/adopt` also inspects `project.yaml` and the legacy config files directly when reporting and writing migration state; that raw diff --git a/.claude/skills/architecture-decision/SKILL.md b/.claude/skills/architecture-decision/SKILL.md index 180b3fb1..a23e30a2 100644 --- a/.claude/skills/architecture-decision/SKILL.md +++ b/.claude/skills/architecture-decision/SKILL.md @@ -3,11 +3,11 @@ name: architecture-decision description: "Create an ADR documenting a technical decision: context, alternatives considered, consequences." argument-hint: "[title | retrofit | accept ] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/architecture-decision/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/architecture-review/SKILL.md b/.claude/skills/architecture-review/SKILL.md index c635c6c8..f03228bd 100644 --- a/.claude/skills/architecture-review/SKILL.md +++ b/.claude/skills/architecture-review/SKILL.md @@ -3,11 +3,11 @@ name: architecture-review description: "Traceability matrix mapping GDD requirements to ADRs. Finds gaps, cross-ADR conflicts, engine compatibility. PASS/CONCERNS/NOT ASSESSED/FAIL." argument-hint: "[focus: full | coverage | consistency | engine | single-gdd path/to/gdd.md]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Bash, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/architecture-review/../../hooks/yaml-helper.sh" resolve_config *) model: opus --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow` diff --git a/.claude/skills/art-bible/SKILL.md b/.claude/skills/art-bible/SKILL.md index f734dad1..8454c5ea 100644 --- a/.claude/skills/art-bible/SKILL.md +++ b/.claude/skills/art-bible/SKILL.md @@ -3,11 +3,11 @@ name: art-bible description: "Author the Art Bible — visual identity gating asset production. Run before /map-systems." argument-hint: "[--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/art-bible/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/asset-spec/SKILL.md b/.claude/skills/asset-spec/SKILL.md index d33d77b6..582444bc 100644 --- a/.claude/skills/asset-spec/SKILL.md +++ b/.claude/skills/asset-spec/SKILL.md @@ -3,11 +3,11 @@ name: asset-spec description: "Per-asset visual specs plus AI generation prompts from GDDs and character profiles. After the art bible." argument-hint: "[system: | level: | character:] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/asset-spec/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation` diff --git a/.claude/skills/balance-check/SKILL.md b/.claude/skills/balance-check/SKILL.md index 4949f11c..06e83c8a 100644 --- a/.claude/skills/balance-check/SKILL.md +++ b/.claude/skills/balance-check/SKILL.md @@ -3,11 +3,11 @@ name: balance-check description: "Find balance outliers, broken progressions, degenerate strategies, economy imbalances in formulas and data. 'Check game balance'." argument-hint: "[system-name|path-to-data-file]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, AskUserQuestion, Bash(bash "*/.claude/skills/balance-check/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/brainstorm/SKILL.md b/.claude/skills/brainstorm/SKILL.md index ed31c0be..b613bc00 100644 --- a/.claude/skills/brainstorm/SKILL.md +++ b/.claude/skills/brainstorm/SKILL.md @@ -3,11 +3,11 @@ name: brainstorm description: "Guided concept ideation using professional studio techniques, player psychology, creative exploration." argument-hint: "[genre or theme hint, or 'open'] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, WebSearch, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, WebSearch, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/brainstorm/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,docs.density,workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,docs.density,workflow` Resolved above — use as-is. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/bug-report/SKILL.md b/.claude/skills/bug-report/SKILL.md index 6d80951d..4dc79250 100644 --- a/.claude/skills/bug-report/SKILL.md +++ b/.claude/skills/bug-report/SKILL.md @@ -3,11 +3,11 @@ name: bug-report description: "Structured bug report from a description, or analyze code for potential bugs. Reproduction steps, severity." argument-hint: "[description] | analyze [path-to-file]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write, Edit +allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Bash(bash "*/.claude/skills/bug-report/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/bug-triage/SKILL.md b/.claude/skills/bug-triage/SKILL.md index c4bf8bb2..8397da1c 100644 --- a/.claude/skills/bug-triage/SKILL.md +++ b/.claude/skills/bug-triage/SKILL.md @@ -3,11 +3,11 @@ name: bug-triage description: "Re-evaluate open bugs — priority vs severity, assign to sprints, surface systemic trends. Run when the count grows." argument-hint: "[sprint | full | trend]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit +allowed-tools: Read, Glob, Grep, Write, Edit, Bash(bash "*/.claude/skills/bug-triage/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/changelog/SKILL.md b/.claude/skills/changelog/SKILL.md index cdc52ce9..5c335fcc 100644 --- a/.claude/skills/changelog/SKILL.md +++ b/.claude/skills/changelog/SKILL.md @@ -3,11 +3,11 @@ name: changelog description: "Auto-generate a changelog from git commits and sprint data. Internal and player-facing versions." argument-hint: "[version|sprint-number]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write +allowed-tools: Read, Glob, Grep, Bash, Write, Bash(bash "*/.claude/skills/changelog/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and @@ -19,7 +19,7 @@ every file write follows `.claude/docs/automation-modes.md` Recent commits: -!`git log --oneline -30 2>/dev/null` +!`git log --oneline -30 2>/dev/null || true` Recent tags (newest first): diff --git a/.claude/skills/code-review/SKILL.md b/.claude/skills/code-review/SKILL.md index a1e83e4f..adef751c 100644 --- a/.claude/skills/code-review/SKILL.md +++ b/.claude/skills/code-review/SKILL.md @@ -3,11 +3,11 @@ name: code-review description: "Architectural code review — coding standards, SOLID, testability, performance concerns." argument-hint: "[path-to-file-or-directory]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/code-review/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/consistency-check/SKILL.md b/.claude/skills/consistency-check/SKILL.md index 44c0ca86..7b289cbe 100644 --- a/.claude/skills/consistency-check/SKILL.md +++ b/.claude/skills/consistency-check/SKILL.md @@ -3,11 +3,11 @@ name: consistency-check description: "Scan GDDs against the entity registry for cross-document conflicts. Grep-first approach targets conflicting sections, different stats." argument-hint: "[full | since-last-review | entity: | item:]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, AskUserQuestion, Bash(bash "*/.claude/skills/consistency-check/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow` diff --git a/.claude/skills/content-audit/SKILL.md b/.claude/skills/content-audit/SKILL.md index 39271996..b9b90b70 100644 --- a/.claude/skills/content-audit/SKILL.md +++ b/.claude/skills/content-audit/SKILL.md @@ -3,11 +3,11 @@ name: content-audit description: "Audit GDD content counts against what's implemented — planned vs built." argument-hint: "[system-name | --summary | (no arg = full audit)]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/content-audit/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys workflow,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys workflow,automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/create-architecture/SKILL.md b/.claude/skills/create-architecture/SKILL.md index 3ef3619c..e01b52ac 100644 --- a/.claude/skills/create-architecture/SKILL.md +++ b/.claude/skills/create-architecture/SKILL.md @@ -3,11 +3,11 @@ name: create-architecture description: "Author the architecture blueprint before code is written. Validates decisions against the pinned engine, flags knowledge gaps." argument-hint: "[focus-area: full | layers | data-flow | api-boundaries | adr-audit] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash, AskUserQuestion, Agent +allowed-tools: Read, Glob, Grep, Write, Bash, AskUserQuestion, Agent, Bash(bash "*/.claude/skills/create-architecture/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/create-control-manifest/SKILL.md b/.claude/skills/create-control-manifest/SKILL.md index f6f7d5f8..0025d26d 100644 --- a/.claude/skills/create-control-manifest/SKILL.md +++ b/.claude/skills/create-control-manifest/SKILL.md @@ -3,11 +3,11 @@ name: create-control-manifest description: "Flat must-do/never-do rules sheet per system and layer, extracted from Accepted ADRs. ADRs explain why; this is actionable." argument-hint: "[update — regenerate from current ADRs]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/create-control-manifest/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/create-epics/SKILL.md b/.claude/skills/create-epics/SKILL.md index b8b23361..2dda6eff 100644 --- a/.claude/skills/create-epics/SKILL.md +++ b/.claude/skills/create-epics/SKILL.md @@ -3,11 +3,11 @@ name: create-epics description: "Turn GDDs plus architecture into epics — one per architectural module, with untraced requirements. Then /create-stories [epic-slug]." argument-hint: "[system-name | layer: foundation|core|feature|presentation | all] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/create-epics/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density,story_granularity,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density,story_granularity,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/create-stories/SKILL.md b/.claude/skills/create-stories/SKILL.md index 528f3e74..31ee5d1c 100644 --- a/.claude/skills/create-stories/SKILL.md +++ b/.claude/skills/create-stories/SKILL.md @@ -3,11 +3,11 @@ name: create-stories description: "Break one epic into implementable stories embedding TR-ID, ADR guidance, acceptance criteria. Reads the control manifest. After /create-epics." argument-hint: "[epic-slug | epic-path] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/create-stories/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density,story_granularity,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density,story_granularity,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/design-review/SKILL.md b/.claude/skills/design-review/SKILL.md index 1442d634..b6164d20 100644 --- a/.claude/skills/design-review/SKILL.md +++ b/.claude/skills/design-review/SKILL.md @@ -3,11 +3,11 @@ name: design-review description: "Reviews one design document for completeness, internal consistency, implementability, and design standards. Before handing to programmers." argument-hint: "[path-to-design-doc] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/design-review/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/design-system/SKILL.md b/.claude/skills/design-system/SKILL.md index 0e510e3c..211f845e 100644 --- a/.claude/skills/design-system/SKILL.md +++ b/.claude/skills/design-system/SKILL.md @@ -3,11 +3,11 @@ name: design-system description: "Section-by-section GDD authoring for one system — walks through each required section, cross-references dependencies." argument-hint: " [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/design-system/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/dev-story/SKILL.md b/.claude/skills/dev-story/SKILL.md index e20a0a17..877e2054 100644 --- a/.claude/skills/dev-story/SKILL.md +++ b/.claude/skills/dev-story/SKILL.md @@ -4,11 +4,11 @@ description: "Implement a story: ADR guidelines, right programmer agent, code pl argument-hint: "[story-path]" user-invocable: true disable-model-invocation: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/dev-story/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow,story_granularity,qa.level,testing.strict,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,story_granularity,qa.level,testing.strict,system_overrides` Resolved above — use as-is. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/gate-check/SKILL.md b/.claude/skills/gate-check/SKILL.md index d76a28d1..ac59fd00 100644 --- a/.claude/skills/gate-check/SKILL.md +++ b/.claude/skills/gate-check/SKILL.md @@ -3,11 +3,11 @@ name: gate-check description: "Ready to advance between development phases? PASS/CONCERNS/NOT ASSESSED/FAIL with blockers and required artifacts. 'Can we move to production?'" argument-hint: "[target-phase: systems-design | technical-setup | pre-production | production | polish | release] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/gate-check/../../hooks/yaml-helper.sh" resolve_config *) model: opus --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,workflow,qa.level,testing.strict,performance.enforce,team.size,project.stage,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,workflow,qa.level,testing.strict,performance.enforce,team.size,project.stage,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. @@ -630,7 +630,7 @@ Set `project.stage` to the new stage name in `project.yaml` at the repo root. schema_version: 1 framework: - version: 1.1.0 + version: 1.1.1 last_upgraded: project: diff --git a/.claude/skills/help/SKILL.md b/.claude/skills/help/SKILL.md index e898af5a..86c8d837 100644 --- a/.claude/skills/help/SKILL.md +++ b/.claude/skills/help/SKILL.md @@ -3,7 +3,7 @@ name: help description: "What should I do next? Use when stuck or you don't know what to do." argument-hint: "[optional: what you just finished, e.g. 'finished design-review' or 'stuck on ADRs']" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash +allowed-tools: Read, Glob, Grep, Bash, Bash(bash "*/.claude/skills/help/../../hooks/yaml-helper.sh" resolve_config *) model: haiku --- @@ -17,7 +17,7 @@ gap analysis, use `/project-stage-detect`. ## Live Project State -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys project.stage,workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys project.stage,workflow` !`echo "Latest sprint: $(ls -t production/sprints/*.md 2>/dev/null | head -1 || echo 'none')"; echo "Session state: $(head -5 production/session-state/active.md 2>/dev/null || echo 'none')"` diff --git a/.claude/skills/launch-checklist/SKILL.md b/.claude/skills/launch-checklist/SKILL.md index aad9f99a..9a3b971e 100644 --- a/.claude/skills/launch-checklist/SKILL.md +++ b/.claude/skills/launch-checklist/SKILL.md @@ -3,10 +3,10 @@ name: launch-checklist description: "Launch readiness across every department: code, content, store, marketing, community, infrastructure, legal, go/no-go sign-offs." argument-hint: "[launch-date or 'dry-run']" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/launch-checklist/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys rigor,project.stage,cert_tier,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys rigor,project.stage,cert_tier,automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/localize/SKILL.md b/.claude/skills/localize/SKILL.md index 79717166..3fc38343 100644 --- a/.claude/skills/localize/SKILL.md +++ b/.claude/skills/localize/SKILL.md @@ -3,11 +3,11 @@ name: localize description: "Localization pipeline — find hardcoded strings, extract string tables, cultural review, VO, RTL, enforce string freeze." argument-hint: "[scan|extract|validate|status|brief|cultural-review|vo-pipeline|rtl-check|freeze|qa]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/localize/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/map-systems/SKILL.md b/.claude/skills/map-systems/SKILL.md index e53f1dfe..908e180e 100644 --- a/.claude/skills/map-systems/SKILL.md +++ b/.claude/skills/map-systems/SKILL.md @@ -3,11 +3,11 @@ name: map-systems description: "Decompose a concept into individual systems, map dependencies, prioritize design order, create the systems index." argument-hint: "[next | system-name] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Agent +allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Agent, Bash(bash "*/.claude/skills/map-systems/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,docs.density` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,docs.density` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/milestone-review/SKILL.md b/.claude/skills/milestone-review/SKILL.md index 4fd80cbb..5a181e58 100644 --- a/.claude/skills/milestone-review/SKILL.md +++ b/.claude/skills/milestone-review/SKILL.md @@ -3,11 +3,11 @@ name: milestone-review description: "Milestone progress review — completeness, quality metrics, risk, go/no-go recommendation. At checkpoints or before a deadline." argument-hint: "[milestone-name|current] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/milestone-review/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation` diff --git a/.claude/skills/onboard/SKILL.md b/.claude/skills/onboard/SKILL.md index ca032903..cf11d3bb 100644 --- a/.claude/skills/onboard/SKILL.md +++ b/.claude/skills/onboard/SKILL.md @@ -3,11 +3,11 @@ name: onboard description: "Onboarding doc for a new contributor or agent — project state, conventions, priorities relevant to the specified role." argument-hint: "[role|area]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/onboard/../../hooks/yaml-helper.sh" resolve_config *) model: haiku --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/patch-notes/SKILL.md b/.claude/skills/patch-notes/SKILL.md index 8971d66f..4e7108cf 100644 --- a/.claude/skills/patch-notes/SKILL.md +++ b/.claude/skills/patch-notes/SKILL.md @@ -3,11 +3,11 @@ name: patch-notes description: "Player-facing patch notes from git history and changelogs. Translates developer language into player communication." argument-hint: "[version] [--style brief|detailed|full]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash +allowed-tools: Read, Glob, Grep, Write, Bash, Bash(bash "*/.claude/skills/patch-notes/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/perf-profile/SKILL.md b/.claude/skills/perf-profile/SKILL.md index 08326375..e5745367 100644 --- a/.claude/skills/perf-profile/SKILL.md +++ b/.claude/skills/perf-profile/SKILL.md @@ -3,11 +3,11 @@ name: perf-profile description: "Performance profiling — find bottlenecks, measure against budgets, produce ranked optimization recommendations." argument-hint: "[system-name or 'full']" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash +allowed-tools: Read, Glob, Grep, Bash, Bash(bash "*/.claude/skills/perf-profile/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys performance.enforce,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys performance.enforce,automation` Resolved above — use as-is. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/playtest-report/SKILL.md b/.claude/skills/playtest-report/SKILL.md index 75d47970..8663f51b 100644 --- a/.claude/skills/playtest-report/SKILL.md +++ b/.claude/skills/playtest-report/SKILL.md @@ -3,11 +3,11 @@ name: playtest-report description: "Structured playtest report template, or turn existing playtest notes into structured feedback." argument-hint: "[new|analyze path-to-notes] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/playtest-report/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation` diff --git a/.claude/skills/project-stage-detect/SKILL.md b/.claude/skills/project-stage-detect/SKILL.md index d3d1ee42..7ad2399d 100644 --- a/.claude/skills/project-stage-detect/SKILL.md +++ b/.claude/skills/project-stage-detect/SKILL.md @@ -3,7 +3,7 @@ name: project-stage-detect description: "Analyze project state, detect stage, identify gaps, recommend next steps. 'Where are we in development?'" argument-hint: "[optional: role filter like 'programmer' or 'designer']" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write +allowed-tools: Read, Glob, Grep, Bash, Write, Bash(bash "*/.claude/skills/project-stage-detect/../../hooks/yaml-helper.sh" resolve_config *) model: haiku # Read-only diagnostic skill — no specialist agent delegation needed --- @@ -21,7 +21,7 @@ of artifacts, and gaps that need attention. It's especially useful when: ## Workflow -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys workflow,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys workflow,automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/propagate-design-change/SKILL.md b/.claude/skills/propagate-design-change/SKILL.md index 7c6585eb..34a135a0 100644 --- a/.claude/skills/propagate-design-change/SKILL.md +++ b/.claude/skills/propagate-design-change/SKILL.md @@ -3,11 +3,11 @@ name: propagate-design-change description: "A GDD changed — scan ADRs and the traceability index for now-stale architectural decisions. Impact report, guides resolution." argument-hint: "[path/to/changed-gdd.md]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/propagate-design-change/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,system_overrides` diff --git a/.claude/skills/prototype/SKILL.md b/.claude/skills/prototype/SKILL.md index f1888869..31204f9a 100644 --- a/.claude/skills/prototype/SKILL.md +++ b/.claude/skills/prototype/SKILL.md @@ -3,12 +3,12 @@ name: prototype description: "Concept prototype before GDDs — throwaway HTML, Engine or Paper build, PROCEED/PIVOT/KILL. After /brainstorm and /setup-engine." argument-hint: "[concept-description] [--path html|engine|paper] [--review full|lean|solo] [--spike]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/prototype/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet isolation: worktree --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation` diff --git a/.claude/skills/qa-plan/SKILL.md b/.claude/skills/qa-plan/SKILL.md index 0e7d3dab..ba3ad97e 100644 --- a/.claude/skills/qa-plan/SKILL.md +++ b/.claude/skills/qa-plan/SKILL.md @@ -3,11 +3,11 @@ name: qa-plan description: "QA test plan for a sprint — classifies stories by Logic/Integration/Visual/UI, covers automated tests, manual cases, smoke scope." argument-hint: "[sprint | feature: system-name | story: path]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, Bash(bash "*/.claude/skills/qa-plan/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow,qa.level,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,qa.level,system_overrides` Resolved above — use as-is. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/quick-design/SKILL.md b/.claude/skills/quick-design/SKILL.md index d5f3dcbb..28c4c96c 100644 --- a/.claude/skills/quick-design/SKILL.md +++ b/.claude/skills/quick-design/SKILL.md @@ -3,11 +3,11 @@ name: quick-design description: "Lightweight spec for small changes — tuning adjustments, minor mechanics. Embeds directly into stories; skips full GDD." argument-hint: "[brief description of the change]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, Bash(bash "*/.claude/skills/quick-design/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/regression-suite/SKILL.md b/.claude/skills/regression-suite/SKILL.md index 6905b868..3cfa2ef0 100644 --- a/.claude/skills/regression-suite/SKILL.md +++ b/.claude/skills/regression-suite/SKILL.md @@ -3,11 +3,11 @@ name: regression-suite description: "Map test coverage to GDD critical paths, find fixed bugs lacking regression tests, flag drift from new features." argument-hint: "[update | audit | report]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, Bash(bash "*/.claude/skills/regression-suite/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow,qa.level,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,qa.level,system_overrides` Resolved above — use as-is. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/release-checklist/SKILL.md b/.claude/skills/release-checklist/SKILL.md index bc8f3c8b..e85f7902 100644 --- a/.claude/skills/release-checklist/SKILL.md +++ b/.claude/skills/release-checklist/SKILL.md @@ -3,10 +3,10 @@ name: release-checklist description: "Pre-release checklist — build verification, certification requirements, store metadata, launch readiness." argument-hint: "[platform: pc|console|mobile|all]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/release-checklist/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys rigor,project.stage,cert_tier,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys rigor,project.stage,cert_tier,automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/retrospective/SKILL.md b/.claude/skills/retrospective/SKILL.md index 9ec5bafa..379203af 100644 --- a/.claude/skills/retrospective/SKILL.md +++ b/.claude/skills/retrospective/SKILL.md @@ -3,11 +3,11 @@ name: retrospective description: "Sprint or milestone retrospective from completed work, velocity, blockers. Actionable insights for the next iteration." argument-hint: "[sprint-N|milestone-name]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Bash, AskUserQuestion, Bash(bash "*/.claude/skills/retrospective/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/reverse-document/SKILL.md b/.claude/skills/reverse-document/SKILL.md index 3500df5a..d3b7bf81 100644 --- a/.claude/skills/reverse-document/SKILL.md +++ b/.claude/skills/reverse-document/SKILL.md @@ -3,7 +3,7 @@ name: reverse-document description: "Generate missing design or architecture docs from existing implementation — works backwards from code and prototypes." argument-hint: " (e.g., 'design src/gameplay/combat' or 'architecture src/core')" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Bash(bash "*/.claude/skills/reverse-document/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet # Read-only diagnostic skill — no specialist agent delegation needed --- @@ -35,7 +35,7 @@ appropriate design or architecture documentation. Use this when: - `src/core/event-system.cpp` → Specific file - `prototypes/stealth-mech/` → Prototype directory -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys workflow,system_overrides,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys workflow,system_overrides,automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/review-all-gdds/SKILL.md b/.claude/skills/review-all-gdds/SKILL.md index 8e213a41..b80f6106 100644 --- a/.claude/skills/review-all-gdds/SKILL.md +++ b/.claude/skills/review-all-gdds/SKILL.md @@ -3,11 +3,11 @@ name: review-all-gdds description: "Holistic cross-GDD review — contradictions between systems, dominant strategies, economic imbalance, cognitive overload, pillar drift." argument-hint: "[focus: full | consistency | design-theory | since-last-review]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash, AskUserQuestion, Agent +allowed-tools: Read, Glob, Grep, Write, Bash, AskUserQuestion, Agent, Bash(bash "*/.claude/skills/review-all-gdds/../../hooks/yaml-helper.sh" resolve_config *) model: opus --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,system_overrides` diff --git a/.claude/skills/security-audit/SKILL.md b/.claude/skills/security-audit/SKILL.md index a774a109..25120d92 100644 --- a/.claude/skills/security-audit/SKILL.md +++ b/.claude/skills/security-audit/SKILL.md @@ -3,11 +3,11 @@ name: security-audit description: "Security audit — save tampering, cheat vectors, network exploits, data exposure, input validation. Before public or multiplayer release." argument-hint: "[full | network | save | input | quick]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write, Agent +allowed-tools: Read, Glob, Grep, Bash, Write, Agent, Bash(bash "*/.claude/skills/security-audit/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/settings/SKILL.md b/.claude/skills/settings/SKILL.md index 6d8e85f6..34fae591 100644 --- a/.claude/skills/settings/SKILL.md +++ b/.claude/skills/settings/SKILL.md @@ -185,7 +185,7 @@ Schema validation: ok Effective config: framework: - version: 1.1.0 (project.yaml, locked) + version: 1.1.1 (project.yaml, locked) modes: review_mode: lean (project.yaml) diff --git a/.claude/skills/setup-engine/SKILL.md b/.claude/skills/setup-engine/SKILL.md index 74c62bb7..dd501489 100644 --- a/.claude/skills/setup-engine/SKILL.md +++ b/.claude/skills/setup-engine/SKILL.md @@ -3,13 +3,13 @@ name: setup-engine description: "Configure engine and version. Pins it in CLAUDE.md; WebSearch fills reference docs when the version is beyond LLM training data." argument-hint: "[engine] | [engine version] | refresh | upgrade [old-version] [new-version] | no args for guided selection" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, WebSearch, WebFetch, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, WebSearch, WebFetch, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/setup-engine/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- When this skill is invoked: -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys workflow` **Tier awareness.** The `workflow` tier resolved above governs which design artifact this skill expects and the finish path it recommends in §12: @@ -703,7 +703,7 @@ Wait for confirmation, then apply based on the file's current state: schema_version: 1 framework: - version: 1.1.0 + version: 1.1.1 last_upgraded: engine: diff --git a/.claude/skills/skill-improve/SKILL.md b/.claude/skills/skill-improve/SKILL.md index 08a87f12..78dba004 100644 --- a/.claude/skills/skill-improve/SKILL.md +++ b/.claude/skills/skill-improve/SKILL.md @@ -3,11 +3,11 @@ name: skill-improve description: "Improve a skill via a test-fix-retest loop — static checks, targeted fixes, keep or revert on score change." argument-hint: "[skill-name]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Bash +allowed-tools: Read, Glob, Grep, Write, Bash, Bash(bash "*/.claude/skills/skill-improve/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/skill-test/SKILL.md b/.claude/skills/skill-test/SKILL.md index 9ef6294f..94d65b19 100644 --- a/.claude/skills/skill-test/SKILL.md +++ b/.claude/skills/skill-test/SKILL.md @@ -3,11 +3,11 @@ name: skill-test description: "Validate skill files for structural compliance and behavioral correctness. Four modes: static linter, spec, category rubric, audit." argument-hint: "static [skill-name | all] | spec [skill-name] | category [skill-name | all] | audit" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/skill-test/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/smoke-check/SKILL.md b/.claude/skills/smoke-check/SKILL.md index b1fb2de7..bafcf352 100644 --- a/.claude/skills/smoke-check/SKILL.md +++ b/.claude/skills/smoke-check/SKILL.md @@ -3,11 +3,11 @@ name: smoke-check description: "Critical-path smoke gate before QA hand-off — runs the automated suite. A failed check means the build is not QA-ready." argument-hint: "[sprint | quick | --platform pc|console|mobile|all]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write, AskUserQuestion +allowed-tools: Read, Glob, Grep, Bash, Write, AskUserQuestion, Bash(bash "*/.claude/skills/smoke-check/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,qa.level,testing.strict` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,qa.level,testing.strict` diff --git a/.claude/skills/soak-test/SKILL.md b/.claude/skills/soak-test/SKILL.md index 7b324878..85467a3e 100644 --- a/.claude/skills/soak-test/SKILL.md +++ b/.claude/skills/soak-test/SKILL.md @@ -3,11 +3,11 @@ name: soak-test description: "Soak test protocol for extended play — what to observe and log for slow leaks, fatigue, late-appearing edge cases." argument-hint: "[duration: 30m | 1h | 2h | 4h] [focus: memory | stability | balance | all]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/soak-test/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/sprint-plan/SKILL.md b/.claude/skills/sprint-plan/SKILL.md index 9a8dcabb..a357580e 100644 --- a/.claude/skills/sprint-plan/SKILL.md +++ b/.claude/skills/sprint-plan/SKILL.md @@ -3,11 +3,11 @@ name: sprint-plan description: "New or updated sprint plan from the current milestone, completed work, and available capacity." argument-hint: "[new|update|status] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/sprint-plan/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,story_granularity,workflow` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,story_granularity,workflow` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/sprint-status/SKILL.md b/.claude/skills/sprint-status/SKILL.md index 09875006..21b53671 100644 --- a/.claude/skills/sprint-status/SKILL.md +++ b/.claude/skills/sprint-status/SKILL.md @@ -3,11 +3,11 @@ name: sprint-status description: "Fast, concise sprint snapshot — burndown and emerging risks for situational awareness. 'How is the sprint going?'" argument-hint: "[sprint-number or blank for current]" user-invocable: true -allowed-tools: Read, Glob, Grep +allowed-tools: Read, Glob, Grep, Bash(bash "*/.claude/skills/sprint-status/../../hooks/yaml-helper.sh" resolve_config *) model: haiku --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys story_granularity` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys story_granularity` diff --git a/.claude/skills/start/SKILL.md b/.claude/skills/start/SKILL.md index 30d2e5d9..13ffc83f 100644 --- a/.claude/skills/start/SKILL.md +++ b/.claude/skills/start/SKILL.md @@ -163,7 +163,7 @@ In `project.yaml`, ensure a `project:` block exists with `stage: [value]`. schema_version: 1 framework: - version: 1.1.0 + version: 1.1.1 last_upgraded: project: diff --git a/.claude/skills/story-done/SKILL.md b/.claude/skills/story-done/SKILL.md index 0a3fd8cd..fd9b974e 100644 --- a/.claude/skills/story-done/SKILL.md +++ b/.claude/skills/story-done/SKILL.md @@ -4,11 +4,11 @@ description: "End-of-story completion review — verifies each acceptance criter argument-hint: "[story-file-path] [--review full|lean|solo]" user-invocable: true disable-model-invocation: true -allowed-tools: Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion, Agent +allowed-tools: Read, Glob, Grep, Bash, Write, Edit, AskUserQuestion, Agent, Bash(bash "*/.claude/skills/story-done/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,story_granularity,qa.level,testing.strict,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,story_granularity,qa.level,testing.strict,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/story-readiness/SKILL.md b/.claude/skills/story-readiness/SKILL.md index 40b2cf33..5d37c20a 100644 --- a/.claude/skills/story-readiness/SKILL.md +++ b/.claude/skills/story-readiness/SKILL.md @@ -3,11 +3,11 @@ name: story-readiness description: "Is a story implementation-ready? Checks clear acceptance criteria, open questions, ADR refs. READY/NEEDS WORK/BLOCKED/NOT ASSESSED." argument-hint: "[story-file-path or 'all' or 'sprint']" user-invocable: true -allowed-tools: Read, Glob, Grep, AskUserQuestion, Agent +allowed-tools: Read, Glob, Grep, AskUserQuestion, Agent, Bash(bash "*/.claude/skills/story-readiness/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,workflow,qa.level,testing.strict,system_overrides` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,workflow,qa.level,testing.strict,system_overrides` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-audio/SKILL.md b/.claude/skills/team-audio/SKILL.md index 7cd6bd44..f18eb4cd 100644 --- a/.claude/skills/team-audio/SKILL.md +++ b/.claude/skills/team-audio/SKILL.md @@ -3,7 +3,7 @@ name: team-audio description: "Orchestrate the audio team — audio-director, sound-designer, technical-artist, gameplay-programmer — direction through implementation." argument-hint: "[feature or area to design audio for] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-audio/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- @@ -24,7 +24,7 @@ in `autonomous` mode it runs end to end, recording each step outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-combat/SKILL.md b/.claude/skills/team-combat/SKILL.md index 121d081e..7f773c1c 100644 --- a/.claude/skills/team-combat/SKILL.md +++ b/.claude/skills/team-combat/SKILL.md @@ -3,7 +3,7 @@ name: team-combat description: "Orchestrate the combat team — game-designer, gameplay-programmer, ai-programmer, technical-artist, sound-designer, qa-tester — design through implement and validate." argument-hint: "[combat feature description] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-combat/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- **Argument check:** If no combat feature description is provided, output: @@ -24,7 +24,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-level/SKILL.md b/.claude/skills/team-level/SKILL.md index d2a248a1..9076df18 100644 --- a/.claude/skills/team-level/SKILL.md +++ b/.claude/skills/team-level/SKILL.md @@ -3,7 +3,7 @@ name: team-level description: "Orchestrate the level team — level-designer, narrative-director, world-builder, art-director, systems-designer, qa-tester — for complete area creation." argument-hint: "[level name or area to design] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-level/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- @@ -21,7 +21,7 @@ in `autonomous` mode it runs end to end, recording each step outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-live-ops/SKILL.md b/.claude/skills/team-live-ops/SKILL.md index 6c579ab8..14e9aede 100644 --- a/.claude/skills/team-live-ops/SKILL.md +++ b/.claude/skills/team-live-ops/SKILL.md @@ -3,7 +3,7 @@ name: team-live-ops description: "Orchestrate the live-ops team — live-ops-designer, economy-designer, analytics-engineer, community-manager, writer — for a season or live event." argument-hint: "[season name or event description] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-live-ops/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- **Argument check:** If no season name or event description is provided, output: @@ -24,7 +24,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-narrative/SKILL.md b/.claude/skills/team-narrative/SKILL.md index c3990161..07a2af3c 100644 --- a/.claude/skills/team-narrative/SKILL.md +++ b/.claude/skills/team-narrative/SKILL.md @@ -3,7 +3,7 @@ name: team-narrative description: "Orchestrate the narrative team — narrative-director, writer, world-builder, level-designer — for story, world lore, narrative-driven levels." argument-hint: "[narrative content description] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-narrative/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- If no argument is provided, output usage guidance and exit without spawning any agents: @@ -23,7 +23,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-polish/SKILL.md b/.claude/skills/team-polish/SKILL.md index 6e2f358b..3594ec02 100644 --- a/.claude/skills/team-polish/SKILL.md +++ b/.claude/skills/team-polish/SKILL.md @@ -3,7 +3,7 @@ name: team-polish description: "Orchestrate the polish team — performance-analyst, technical-artist, sound-designer, qa-tester — to optimize and harden a feature or area." argument-hint: "[feature or area to polish] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-polish/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- If no argument is provided, output usage guidance and exit without spawning any agents: @@ -23,7 +23,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-qa/SKILL.md b/.claude/skills/team-qa/SKILL.md index acb04c4a..b9d09736 100644 --- a/.claude/skills/team-qa/SKILL.md +++ b/.claude/skills/team-qa/SKILL.md @@ -3,7 +3,7 @@ name: team-qa description: "Orchestrate the QA team through a full testing cycle — qa-lead strategy and test plan, qa-tester case writing, execution, sign-off." argument-hint: "[sprint | feature: system-name] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/team-qa/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- @@ -21,7 +21,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-release/SKILL.md b/.claude/skills/team-release/SKILL.md index 39596fd9..8317c2c2 100644 --- a/.claude/skills/team-release/SKILL.md +++ b/.claude/skills/team-release/SKILL.md @@ -3,7 +3,7 @@ name: team-release description: "Orchestrate the release team — release-manager, qa-lead, devops-engineer, producer — to execute a release from candidate to deployment." argument-hint: "[version number or 'next'] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-release/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- **Argument check:** If no version number is provided: @@ -25,7 +25,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/team-ui/SKILL.md b/.claude/skills/team-ui/SKILL.md index 26dee90b..9342e7a4 100644 --- a/.claude/skills/team-ui/SKILL.md +++ b/.claude/skills/team-ui/SKILL.md @@ -3,7 +3,7 @@ name: team-ui description: "Orchestrate the UI team through the UX pipeline — authoring, visual design, implementation, review, polish. Uses /ux-design, /ux-review, studio templates." argument-hint: "[UI feature description] [--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, TaskCreate, TaskGet, TaskList, TaskUpdate, Bash(bash "*/.claude/skills/team-ui/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- When this skill is invoked, orchestrate the UI team through a structured pipeline. @@ -20,7 +20,7 @@ in `autonomous` mode it runs end to end, recording each phase outcome via ## Phase 0: Resolve Config -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation,team.size` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation,team.size` Resolved above — use as-is; `--review` overrides `review_mode`. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/tech-debt/SKILL.md b/.claude/skills/tech-debt/SKILL.md index a419d28b..65f3b7ff 100644 --- a/.claude/skills/tech-debt/SKILL.md +++ b/.claude/skills/tech-debt/SKILL.md @@ -3,11 +3,11 @@ name: tech-debt description: "Track, categorize and prioritize technical debt across the codebase — scans for debt indicators, maintains a register." argument-hint: "[scan|add|prioritize|report]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, AskUserQuestion, Bash(bash "*/.claude/skills/tech-debt/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` diff --git a/.claude/skills/test-evidence-review/SKILL.md b/.claude/skills/test-evidence-review/SKILL.md index 9eafef2b..65f1872d 100644 --- a/.claude/skills/test-evidence-review/SKILL.md +++ b/.claude/skills/test-evidence-review/SKILL.md @@ -3,11 +3,11 @@ name: test-evidence-review description: "Quality review of test files and evidence — goes beyond existence, evaluates assertion coverage. ADEQUATE/INCOMPLETE/MISSING/NOT ASSESSED per story." argument-hint: "[story-path | sprint | system-name]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/test-evidence-review/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/test-flakiness/SKILL.md b/.claude/skills/test-flakiness/SKILL.md index 7c08984d..e3451aa3 100644 --- a/.claude/skills/test-flakiness/SKILL.md +++ b/.claude/skills/test-flakiness/SKILL.md @@ -3,11 +3,11 @@ name: test-flakiness description: "Find flaky tests from CI logs — aggregates pass rates, spots intermittent failures, recommends quarantine. After multiple runs." argument-hint: "[ci-log-path | scan | registry]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Bash(bash "*/.claude/skills/test-flakiness/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/test-helpers/SKILL.md b/.claude/skills/test-helpers/SKILL.md index d50547d0..2b0112b1 100644 --- a/.claude/skills/test-helpers/SKILL.md +++ b/.claude/skills/test-helpers/SKILL.md @@ -3,11 +3,11 @@ name: test-helpers description: "Generate engine-specific test helper libraries — assertion utilities, factory functions, mocks in tests/helpers/. Reduces boilerplate." argument-hint: "[system-name | all | scaffold]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write +allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/test-helpers/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/test-setup/SKILL.md b/.claude/skills/test-setup/SKILL.md index dc5188b5..083461e8 100644 --- a/.claude/skills/test-setup/SKILL.md +++ b/.claude/skills/test-setup/SKILL.md @@ -3,11 +3,11 @@ name: test-setup description: "Scaffold the test framework and CI — tests/ directory, engine test runner, GitHub Actions workflow. Once, before the first sprint." argument-hint: "[force]" user-invocable: true -allowed-tools: Read, Glob, Grep, Bash, Write +allowed-tools: Read, Glob, Grep, Bash, Write, Bash(bash "*/.claude/skills/test-setup/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation` **Automation mode**: Resolve `modes.automation` (`project.local.yaml` → `project.yaml` → default `collaborative`). Every `AskUserQuestion` call and diff --git a/.claude/skills/ux-design/SKILL.md b/.claude/skills/ux-design/SKILL.md index 9a77f5f2..47b3032c 100644 --- a/.claude/skills/ux-design/SKILL.md +++ b/.claude/skills/ux-design/SKILL.md @@ -3,11 +3,11 @@ name: ux-design description: "Section-by-section UX spec authoring for a screen, flow or HUD. Reads the player journey to provide context; also project-wide accessibility." argument-hint: "[screen/flow name] or 'hud' or 'patterns' or 'accessibility'" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, Agent +allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion, Agent, Bash(bash "*/.claude/skills/ux-design/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys automation,workflow,docs.density` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,docs.density` Resolved above — use as-is. No block → defaults in `.claude/docs/config-resolution.md`. diff --git a/.claude/skills/vertical-slice/SKILL.md b/.claude/skills/vertical-slice/SKILL.md index 9b3d821a..3e76d55e 100644 --- a/.claude/skills/vertical-slice/SKILL.md +++ b/.claude/skills/vertical-slice/SKILL.md @@ -3,12 +3,12 @@ name: vertical-slice description: "Pre-production validation — end-to-end build to confirm the full loop is achievable before committing to Production. After GDDs, architecture, UX specs." argument-hint: "[--review full|lean|solo]" user-invocable: true -allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion +allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Agent, AskUserQuestion, Bash(bash "*/.claude/skills/vertical-slice/../../hooks/yaml-helper.sh" resolve_config *) model: sonnet isolation: worktree --- -!`source "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/yaml-helper.sh" 2>/dev/null && resolve_config --keys review_mode,automation` +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys review_mode,automation` diff --git a/CHANGELOG.md b/CHANGELOG.md index b3dedaf3..df1bfc1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,34 @@ existing project on the older config files. --- +## [1.1.1] — 2026-09-24 + +**Skills and agents work again outside auto mode.** A fix release for +[#128](https://github.com/Donchitos/Claude-Code-Game-Studios/issues/128). + +### Fixed + +- **Skills no longer abort before they start.** In 1.1.0, every skill that reads + your config began with a shell command Claude Code refuses to run unless it is + explicitly approved. In the permission mode CCGS ships with (`default`), 66 of + the 74 skills stopped before doing anything, from any subdirectory of your + project, and whenever Claude invoked a skill on its own — in auto mode too. + Each skill now runs the config lookup as one plain command and pre-approves + exactly that command in its own frontmatter. Nothing else is approved. +- **`game-designer` and `creative-director` launch again.** Both preload skills, + so the aborting command stopped them at startup with `Shell command permission + check failed … Contains expansion`. They keep their preloaded skills and still + have no shell access. +- **Config is found from any folder.** Starting Claude Code inside `src/` or + `design/` now reads the project's `project.yaml`, not nothing. +- **`/changelog` works in a repository with no commits yet.** + +Checked on Claude Code 2.1.277 and 2.1.281, in every permission mode, from the +project root and from subdirectories. See `.claude/docs/config-resolution.md` +for the form every skill's config line must take, if you write your own. + +--- + ## [1.1.0] — 2026-09-23 **One config file, and a process weight you choose — one you can see and adjust, diff --git a/UPGRADING.md b/UPGRADING.md index a07d694c..9e3bf709 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -14,6 +14,7 @@ Or check `README.md` for the version badge. ## Table of Contents - [Upgrade Strategies](#upgrade-strategies) +- [v1.1.0 → v1.1.1](#v110--v111) - [v1.0 → v1.1](#v10--v11) - [v1.0.0-beta → v1.0](#v100-beta--v10) - [v0.4.x → v1.0](#v04x--v10) @@ -162,6 +163,58 @@ Best when: you didn't use git to set up the template (just downloaded a zip). --- +## v1.1.0 → v1.1.1 + +**Released:** 2026-09-24 +**Commit range:** `d056997..v1.1.1` +**Key themes:** Fix for skills and agents failing to start outside auto mode ([#128](https://github.com/Donchitos/Claude-Code-Game-Studios/issues/128)) + +### What Changed + +| Category | Changes | +|----------|---------| +| **Skill fix (66 skills)** | The config line at the top of each skill is now one plain `bash` command, pre-approved in that skill's own `allowed-tools`. The 1.1.0 line aborted the skill outside auto mode | +| **Helper** | `.claude/hooks/yaml-helper.sh` can be run directly as `bash yaml-helper.sh resolve_config …`, and finds the project root from its own location | +| **Docs** | `.claude/docs/config-resolution.md` documents the required form and why | + +No settings, config files or agents change. Your `project.yaml` and +`project.local.yaml` are untouched apart from the version stamp. + +--- + +### Files: Safe to Overwrite + +**Existing files to overwrite (no user content):** +``` +.claude/skills/*/SKILL.md ← all skills with a config line (66) +.claude/hooks/yaml-helper.sh ← direct-execution entry point +.claude/docs/config-resolution.md ← corrected "why this command" section +.claude/docs/director-gates.md ← example line updated +``` + +--- + +### Files: Merge Carefully + +**Skills you have edited yourself.** If you customised a skill, keep your +version and change two lines in it — the config line and the `allowed-tools` +entry — to this form, with your skill's folder name in place of ``: + +```markdown +allowed-tools: …, Bash(bash "*/.claude/skills//../../hooks/yaml-helper.sh" resolve_config *) +``` +```markdown +!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys ` +``` + +Both halves are needed: the line without the grant still aborts. The same +applies to any skill you wrote yourself that copied the 1.1.0 line. + +**`project.yaml`** — optionally set `framework.version: 1.1.1`. Nothing reads it +for this release. + +--- + ## v1.0 → v1.1 **Released:** 2026-09-23 diff --git a/project.yaml b/project.yaml index 0b3f4cde..43dddd2b 100644 --- a/project.yaml +++ b/project.yaml @@ -4,8 +4,8 @@ schema_version: 1 framework: - version: 1.1.0 - last_upgraded: 2026-09-23 + version: 1.1.1 + last_upgraded: 2026-09-24 # NOTE: this template ships with no `modes:` block, and the six knobs below must # never be added to one.