@jaybeeuu/agent-cortex 1.39.0 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.agents/skills/style-versioning/SKILL.md +1 -1
  2. package/.github/workflows/ci.yml +47 -14
  3. package/AGENTS.md +35 -8
  4. package/CHANGELOG.md +60 -0
  5. package/README.md +174 -97
  6. package/agents/README.md +14 -11
  7. package/bin/agent-cortex.mjs +55 -10
  8. package/bin/installers/claude.mjs +674 -174
  9. package/bin/installers/copilot.mjs +13 -18
  10. package/bin/installers/pi.mjs +293 -51
  11. package/claude/settings.json +4 -0
  12. package/{claude → claude-extras}/scripts/statusline-command.sh +32 -4
  13. package/docs/claude-hooks.md +15 -3
  14. package/docs/ideas/ban-content-assertion-tests.md +73 -0
  15. package/docs/ideas/bead-progress-notes-for-session-resumption.md +75 -0
  16. package/docs/ideas/classify-beads-via-deterministic-script-with-agent-fallback.md +70 -0
  17. package/docs/ideas/ctx-alias-version-and-update-commands.md +65 -0
  18. package/docs/ideas/ctx-feedback-command-for-capturing-ideas-from-any-machine.md +67 -0
  19. package/docs/ideas/deployment-beads-for-post-merge-pipelines.md +36 -0
  20. package/docs/ideas/design-and-delivery-as-separate-bead-trees/design-and-delivery-as-separate-bead-trees.md +99 -0
  21. package/docs/ideas/enable-signed-commit-enforcement-changesets-bot-commits-must-be-signed.md +33 -0
  22. package/docs/ideas/extension-manifests.md +55 -14
  23. package/docs/ideas/improve-pi-system-prompt.md +5 -2
  24. package/docs/ideas/map-every-cortex-tool-to-a-real-pi-equivalent.md +95 -0
  25. package/docs/ideas/record-idea-implementation-questions.md +68 -0
  26. package/docs/ideas/self-flushing-session.md +72 -0
  27. package/docs/ideas/state-in-beads-not-md.md +69 -0
  28. package/docs/ideas/task-session-context.local.md +95 -0
  29. package/docs/ideas/test-data-creation-helpers.md +92 -0
  30. package/docs/ideas/test-planning-stage-bead-in-feature-planning.md +68 -0
  31. package/docs/ideas/worktree-housekeeping-for-closed-beads.md +39 -0
  32. package/docs/technical-direction/harness-config.md +161 -0
  33. package/docs/technical-direction/migration-execution-labels.md +60 -23
  34. package/extensions/agent-guardrails/README.md +45 -0
  35. package/extensions/agent-guardrails/guardrails.test.ts +42 -0
  36. package/extensions/agent-guardrails/guardrails.ts +66 -0
  37. package/extensions/agent-guardrails/index.ts +22 -0
  38. package/extensions/agent-guardrails/node_modules/.bin/pi +21 -0
  39. package/extensions/agent-guardrails/node_modules/.bin/tsc +21 -0
  40. package/extensions/agent-guardrails/node_modules/.bin/tsserver +21 -0
  41. package/extensions/agent-guardrails/node_modules/.bin/tsx +21 -0
  42. package/extensions/agent-guardrails/package.json +19 -0
  43. package/extensions/agent-guardrails/tsconfig.json +12 -0
  44. package/extensions/agent-modes/README.md +12 -5
  45. package/extensions/agent-modes/discover.test.ts +30 -7
  46. package/extensions/agent-modes/discover.ts +1 -1
  47. package/extensions/agent-modes/index.test.ts +208 -0
  48. package/extensions/agent-modes/index.ts +23 -6
  49. package/extensions/agent-modes/package.json +1 -1
  50. package/extensions/skill-stats/index.test.ts +3 -2
  51. package/lib/cli.mjs +30 -12
  52. package/lib/pi-packages.mjs +169 -0
  53. package/package.json +8 -4
  54. package/pi/settings.json +23 -12
  55. package/plugin.json +1 -1
  56. package/scripts/build-copilot-agents.mjs +1 -1
  57. package/scripts/check-no-sync.mjs +49 -0
  58. package/scripts/lib/compose-agent.mjs +32 -14
  59. package/scripts/lib/fs.mjs +31 -0
  60. package/skills/engineering/grill-with-docs/SKILL.md +1 -1
  61. package/skills/planning/classify-bead/REFERENCE.md +85 -0
  62. package/skills/planning/classify-bead/SKILL.md +32 -36
  63. package/skills/planning/classify-bead/scripts/classify-bead.mjs +292 -0
  64. package/skills/planning/create-task/SKILL.md +19 -10
  65. package/skills/planning/write-a-prd/SKILL.md +2 -2
  66. package/skills/style/style-code/REFERENCE.md +32 -2
  67. package/skills/style/style-code/SKILL.md +5 -21
  68. package/skills/style/style-tests/SKILL.md +69 -17
  69. package/skills/workflow/hitl-collab/SKILL.md +1 -1
  70. package/skills/workflow/run-pipeline-stage/SKILL.md +13 -1
  71. package/skills/workflow/run-pipeline-stage/prompts/stage-runner.md +12 -0
  72. package/test/classify-bead.test.mjs +277 -0
  73. package/test/claude-installer.test.mjs +199 -139
  74. package/test/cli.test.mjs +95 -41
  75. package/test/copilot-installer.test.mjs +92 -82
  76. package/test/fs.test.mjs +76 -0
  77. package/test/helpers/fake-claude.mjs +152 -0
  78. package/test/installer.test.mjs +542 -57
  79. package/test/pi-installer.test.mjs +457 -102
  80. package/test/pi-packages.test.mjs +295 -0
  81. package/token-map.README.md +23 -12
  82. package/token-map.json +8 -7
  83. package/.claude-plugin/marketplace.json +0 -16
  84. package/claude/.claude-plugin/plugin.json +0 -11
  85. package/claude/agents/plan.md +0 -58
  86. package/claude/agents/ralph-plan.md +0 -121
  87. package/claude/agents/ralph.md +0 -193
  88. package/claude/agents/strategy.md +0 -111
  89. package/claude/hooks/scripts/notify.mjs +0 -54
  90. package/claude/hooks.json +0 -38
  91. /package/{claude → claude-extras}/.mcp.json +0 -0
@@ -64,7 +64,7 @@ Fix status bead showing wrong priority after update
64
64
  The `release` job in `.github/workflows/ci.yml` handles everything automatically:
65
65
 
66
66
  1. **Detects new changesets** on main
67
- 2. **Creates a "Version Packages" PR** — the `version` step runs `pnpm version-packages`, which bumps `package.json`, syncs `plugin.json` (via `scripts/sync-plugin-version.sh`), updates `CHANGELOG.md`, and regenerates the committed generated output (`pnpm build:claude`, `pnpm build:copilot`) so the drift gates never fail on a version bump
67
+ 2. **Creates a "Version Packages" PR** — the `version` step runs `pnpm version-packages`, which bumps `package.json`, syncs `plugin.json` (via `scripts/sync-plugin-version.sh`), updates `CHANGELOG.md`, and regenerates the committed Copilot output (`pnpm build:copilot`; the Claude plugin is materialised at install time with the package version, so it has no committed output to regenerate) so the drift gates never fail on a version bump
68
68
  3. **When "Version Packages" is merged**:
69
69
  - Creates a git tag
70
70
  - Publishes to npm — `pnpm publish-package` packs with `pnpm pack` and publishes with `npm publish --provenance --access public`. Authenticates via npm Trusted Publishing (OIDC): the release job's `id-token` permission lets npm exchange a GitHub OIDC token for a short-lived npm token at publish time, so no `NPM_TOKEN` secret or `.npmrc` auth config is required — only the one-time npm-side Trusted Publishing setup on npmjs.com (package → Access → Trusted Publishing → GitHub repo `jaybeeuu/agent-cortex` + workflow `.github/workflows/ci.yml`)
@@ -146,7 +146,7 @@ jobs:
146
146
  run: pnpm test
147
147
 
148
148
  claude-plugin-check:
149
- name: Claude plugin check
149
+ name: Claude plugin materialiser check
150
150
  needs: setup
151
151
  runs-on: ubuntu-latest
152
152
  steps:
@@ -175,16 +175,48 @@ jobs:
175
175
  - name: Install dependencies
176
176
  run: pnpm install --frozen-lockfile
177
177
 
178
- # `pnpm build:claude` is an alias of `agent-cortex install claude` (both run
179
- # bin/installers/claude.mjs), so this drift check proves the committed subtree
180
- # equals the installer's output — stale output or hand-edits to generated
181
- # files fail the build. The subtree stays committed because the marketplace
182
- # install flow reads it straight from the working tree (fresh clone installs
183
- # as-is).
184
- - name: Check generated Claude plugin is up to date
178
+ # The claude/ subtree is retired — the installer is the only generator
179
+ # (plain `agent-cortex install claude` materialises ~/.agent-cortex/claude;
180
+ # `--output <dir>` is generate-only for tests). There is no committed
181
+ # output to diff, so this job validates the materialiser itself: it must
182
+ # produce a complete, structural plugin (generated + hand-authored pieces),
183
+ # no symlinks, no literal {{TOOL:/{{PATH:/{{SECTION: tokens, and a
184
+ # plugin.json version tracking the package — exactly what a real install
185
+ # would ship.
186
+ - name: Materialise the Claude plugin and run structural checks
185
187
  run: |
186
- pnpm build:claude
187
- git diff --exit-code claude/agents/ claude/skills/ claude/.claude-plugin/plugin.json claude/hooks.json claude/hooks/
188
+ set -euo pipefail
189
+ OUT="$RUNNER_TEMP/claude-plugin-check"
190
+ node bin/agent-cortex.mjs install claude --output "$OUT"
191
+
192
+ # structure: generated + hand-authored pieces all present
193
+ test -f "$OUT/.claude-plugin/plugin.json"
194
+ test -f "$OUT/agents/plan.md"
195
+ test -f "$OUT/agents/ralph.md"
196
+ test -f "$OUT/skills/tdd/SKILL.md"
197
+ test -f "$OUT/hooks.json"
198
+ test -f "$OUT/hooks/scripts/notify.mjs"
199
+ test -f "$OUT/.mcp.json"
200
+ test -f "$OUT/scripts/statusline-command.sh"
201
+
202
+ # flat-copy guarantee: no symlinks in the materialised tree
203
+ if [ -n "$(find "$OUT" -type l)" ]; then
204
+ echo "::error::symlinks found in materialised Claude plugin"
205
+ exit 1
206
+ fi
207
+
208
+ # token substitution: no literal tokens survive materialisation
209
+ TOKENS=$(grep -rlE '\{\{(TOOL|PATH|SECTION):' "$OUT" || true)
210
+ if [ -n "$TOKENS" ]; then
211
+ echo "::error::literal substitution tokens in materialised Claude plugin:"
212
+ echo "$TOKENS"
213
+ exit 1
214
+ fi
215
+
216
+ # plugin version tracks the package (never stale)
217
+ PKG_VERSION=$(node -p "require('./package.json').version")
218
+ PLUGIN_VERSION=$(node -p "require('$OUT/.claude-plugin/plugin.json').version")
219
+ test "$PKG_VERSION" = "$PLUGIN_VERSION"
188
220
 
189
221
  - name: Check generated Copilot agent files are up to date
190
222
  run: |
@@ -239,10 +271,11 @@ jobs:
239
271
  # the string is split by argStringToArray on whitespace (single quotes
240
272
  # survive literally), so each must be a single unquoted command token
241
273
  # that runs a pnpm script. version-packages bumps versions, syncs
242
- # plugin.json, THEN regenerates the committed generated output
243
- # (build:claude writes claude/.claude-plugin/plugin.json with the NEW
244
- # version, build:copilot re-derives agents/*.agent.md) before the action
245
- # commits, so the Version Packages PR always passes the drift gates.
274
+ # plugin.json, THEN regenerates the committed Copilot output
275
+ # (build:copilot re-derives agents/*.agent.md; the Claude plugin is
276
+ # materialised at install time with the package version, so nothing
277
+ # committed needs regenerating) before the action commits, so the
278
+ # Version Packages PR always passes the drift gates.
246
279
  version: pnpm version-packages
247
280
  publish: pnpm publish-package
248
281
  commit: "chore: version packages"
package/AGENTS.md CHANGED
@@ -13,7 +13,7 @@ available in the author's coding sessions.
13
13
 
14
14
  ```
15
15
  agent-cortex/
16
- ├── package.json # PI package manifest (pi: { extensions, skills })
16
+ ├── package.json # PI package manifest (pi: { extensions, skills, packages })
17
17
  ├── plugin.json # GitHub Copilot plugin manifest — agents, skills, MCP servers
18
18
  ├── agents/ # Custom agents — canonical composable <name>/ dirs
19
19
  │ ├── *.agent.md # generated from <name>/ by scripts/build-copilot-agents.mjs
@@ -33,8 +33,12 @@ agent-cortex/
33
33
  │ ├── README.md # Installation & usage
34
34
  │ └── index.ts # Extension entrypoint
35
35
  ├── hooks/ # Canonical Claude Code hooks (hooks.json + scripts — see docs/claude-hooks.md)
36
- │ └── claude/ # generated into claude/hooks.json + claude/hooks/ by bin/installers/claude.mjs
37
- └── package.json # PI package manifest (pi: { extensions, skills })
36
+ │ └── claude/ # generated into the plugin's hooks.json + hooks/ by bin/installers/claude.mjs
37
+ ├── claude/ # Committed Claude user-settings template — merged into ~/.claude/settings.json on install
38
+ ├── claude-extras/ # Hand-authored Claude plugin extras
39
+ │ ├── .mcp.json # MCP servers (context7, github) — copied into installs
40
+ │ └── scripts/ # statusline-command.sh — copied into installs (executable)
41
+ └── package.json # PI package manifest (pi: { extensions, skills, packages })
38
42
  ```
39
43
 
40
44
  ## Versioning
@@ -47,11 +51,24 @@ See the `style-versioning` skill for the full workflow.
47
51
 
48
52
  Generated automatically by changesets. Do not edit `CHANGELOG.md` manually.
49
53
 
54
+ ## Coding Conventions
55
+
56
+ - **Never block the main thread**: no `*Sync` functions (`readFileSync`, `spawnSync`, …).
57
+ Tooling code in `bin/`, `scripts/`, `lib/`, `hooks/`, and `test/` must be async —
58
+ enforced by `scripts/check-no-sync.mjs` (runs via `pnpm lint`). Skill-owned
59
+ scripts (`skills/*/scripts`) and `extensions/` are the remaining sync surfaces.
60
+ - **Share generic tooling helpers in `scripts/lib/`**: tooling code (installers under
61
+ `bin/installers/`, hooks, other scripts) imports shared utilities from `scripts/lib/`
62
+ (e.g. `compose-agent.mjs`, `fs.mjs`) rather than redefining them inline.
63
+
50
64
  ## Skill Conventions
51
65
 
52
66
  - `SKILL.md` must include a YAML front-matter block with `name` and `description`.
53
67
  - `description` must be ≤ 1024 characters. First sentence: what it does. Second: "Use when…".
54
- - Keep `SKILL.md` under ~100 lines. Overflow into `REFERENCE.md` for rarely-needed detail.
68
+ - Keep `SKILL.md` near the ~150-line target in `docs/skills/skill-anatomy.md`, overflowing into
69
+ purpose-named support files (`REFERENCE.md`, `EXAMPLES.md`, `FORMAT.md`). `style-tests`
70
+ deliberately sits at the top of that range rather than splitting — its principles must load
71
+ automatically with the skill.
55
72
  - Add utility scripts to `scripts/` when an operation is deterministic and would otherwise be
56
73
  regenerated each time (e.g. install scripts, scanners).
57
74
  - Skill names use kebab-case and are grouped by prefix where related (e.g. `review-security`,
@@ -66,10 +83,17 @@ Generated automatically by changesets. Do not edit `CHANGELOG.md` manually.
66
83
  from the canonical directories by the shared `bin/installers/copilot.mjs` code path behind both
67
84
  `agent-cortex install copilot` and `scripts/build-copilot-agents.mjs` (thin wrapper), and
68
85
  committed for Copilot CLI (plugin.json `agents: "agents/"` scans for `*.agent.md`); never edit
69
- them by hand. The `claude/` subtree is generated by the install-time generator
70
- `bin/installers/claude.mjs` (a plain `agent-cortex install claude` also registers the plugin
71
- with Claude Code via the `claude plugin` CLI; `pnpm build:claude` is the generate-only alias,
72
- running `agent-cortex install claude --output claude`; `ralph`
86
+ them by hand. The Claude plugin is materialised by the install-time generator
87
+ `bin/installers/claude.mjs`: a plain `agent-cortex install claude` copies it into
88
+ `~/.agent-cortex/claude` (skills copied flat with `{{TOOL:...}}`/`{{PATH:...}}` substituted,
89
+ never symlinked), writes the marketplace manifest at
90
+ `~/.agent-cortex/.claude-plugin/marketplace.json`, merges the committed `claude/settings.json`
91
+ template into `~/.claude/settings.json`, and registers it with Claude Code via the
92
+ `claude plugin` CLI. The settings merge preserves personal config: the CLI owns exactly
93
+ `enabledPlugins` + `extraKnownMarketplaces`, and every other key is left untouched. Only
94
+ that settings template is committed under `claude/` — the generated plugin subtree is not;
95
+ hand-authored plugin extras live in `claude-extras/` (`.mcp.json`, `scripts/`), and
96
+ `--output <dir>` is the generate-only form (tests/CI materialiser checks); `ralph`
73
97
  is authored natively in `agents-native/` and copied verbatim; the other agents compose from their
74
98
  `claude/` harness dirs).
75
99
  - Keep orchestration logic in the agent file; extract shared per-task workflow into a skill
@@ -82,6 +106,9 @@ Generated automatically by changesets. Do not edit `CHANGELOG.md` manually.
82
106
  - Extensions are auto-discovered when the repo is installed as a PI package via `pi install`.
83
107
  - Keep extensions lightweight: no internal LLM calls. Extensions observe events and provide
84
108
  commands — they should not add token overhead.
109
+ - Register CLI flags from the extension factory (load time), never from a `session_start`
110
+ handler: PI matches parsed CLI flags against the extensions loaded at startup, so late
111
+ registration makes the flag fail with `Unknown option`.
85
112
  - Extensions that persist data should write to `~/.pi/agent-cortex/` (global, cross-project)
86
113
  and tag records with the project path for per-project slicing.
87
114
  - PI extensions with Claude Code equivalents are ported to `hooks/claude/`; the port/reject
package/CHANGELOG.md CHANGED
@@ -1,5 +1,65 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.41.0
4
+
5
+ ### Minor Changes
6
+
7
+ - a6b1929: `agent-cortex install pi` now materialises the pi config files as real CLI-managed files, replacing the legacy symlinks into the repo's `pi/` directory. `settings.json` is merged — the committed template supplies defaults, values already present (personal config and anything pi wrote) win, and the CLI owns the `packages` list with the repo path entry resolved against the settings file — so personal config survives re-install. `keybindings.json` is written from the template, refreshed when the template changes, and left alone once edited by hand. The generated header lives in a top-level `"//"` key because pi parses both files with a bare `JSON.parse`. `--dry-run` prints the plan (including "would remove symlink …") and `--output <dir>` keeps the generate-only semantics. Two caveats: because the live value wins, a changed default in the committed template only reaches fresh installs (edit the live file to adopt it); and `packages` is rebuilt from the template, so any `npm:` package added to the live file with `pi install npm:<pkg>` is dropped on the next install — declare long-lived packages in the repo template. An unparseable live `settings.json` is warned about and overwritten.
8
+ - d6ac5a5: Provision the pi packages agent-cortex needs (pi-questions for `ask_questions`, pi-web-access for `fetch_content`) on `agent-cortex install pi`. The package manifest now declares them under `pi.packages`, the installer installs any that the pi user scope is missing via the pi CLI (idempotent, warns and continues on failure), and `--no-provision` opts an offline machine out. The token-map `ask_user` / `web_fetch` mappings are no longer no-ops on a clean `~/.pi`.
9
+ - daa77c8: Encode test-quality rules into `style-tests`: the full agreed principle set (behaviour over
10
+ implementation, mocking only at external edges, module-boundary units, realistic
11
+ LocalStack/TestContainers integration, test independence, CI-only truth, spec-by-test, and
12
+ more), a blanket ban on asserting the static contents of a file (config, markdown, terraform,
13
+ snapshots) with the behaviour-not-inventory distinction, and test-data construction rules —
14
+ inline data, no shared mutable top-level fixtures, and small configurable factories over
15
+ repeated full literals. The content-assertion ban and the test-data rules land as red-flag rows
16
+ plus verification-checklist items. `style-tests/SKILL.md` deliberately occupies the full
17
+ ~150-line `SKILL.md` budget so the principles load automatically, rather than splitting into
18
+ `REFERENCE.md`.
19
+
20
+ ### Patch Changes
21
+
22
+ - 3e2d149: Add the `agent-guardrails` pi extension: it appends behavioural circuit-breakers to the PI
23
+ system prompt once per user prompt — two-strikes retry limits, explicit check-in triggers, and
24
+ atomic-change discipline (first slice of `docs/ideas/improve-pi-system-prompt.md`).
25
+ - a6b1929: The bundled `agent-modes` pi extension now registers its `--agent <name>` CLI flag while the extension loads, instead of from its `session_start` handler. PI validates parsed CLI flags against the extensions present at startup, so the late registration meant `pi --agent <name>` failed with `Unknown option: --agent`. Registration is extracted into a `registerAgentFlag(pi, agents)` helper called directly by the extension factory.
26
+ - a6b1929: Materialise `~/.claude/settings.json` from a new committed `claude/settings.json` template when
27
+ `agent-cortex install claude` runs (parity with the pi installer's merge-keep-personal contract).
28
+ The template supplies defaults and personal values win; the installer owns exactly
29
+ `enabledPlugins` + `extraKnownMarketplaces`, so `permissions`, `hooks`, `env`, `statusLine` and
30
+ unknown keys are never touched. A legacy symlinked settings file is replaced with a real file,
31
+ `--dry-run` plans without writing, and `--output <dir>` leaves the user's Claude config alone.
32
+ - 140d9d4: Add a deterministic classifier to the `classify-bead` skill
33
+ (`skills/planning/classify-bead/scripts/classify-bead.mjs`). One command resolves an
34
+ existing `implementation-type` label, the legacy `## Type` field, then conservative
35
+ heuristic signals, and applies the label itself; only beads with no deterministic signal
36
+ escalate to the rubric subagent. `create-task` and `write-a-prd` now run the classifier
37
+ before spawning a subagent, and `--audit` reports the deterministic-vs-rubric split
38
+ over recent beads.
39
+ - e055123: Extract the generic async `isFile`/`isDirectory` stat wrappers into a shared `scripts/lib/fs.mjs` and import them from the claude, copilot, and pi installers instead of redefining them inline.
40
+ - 720d678: Add a milestone-notes discipline to the `run-pipeline-stage` skill: the stage-runner prompt and
41
+ SKILL.md now instruct agents to append a short checkpoint to the bead's notes (`bd update <id>
42
+ --append-notes`) at stage start and at each milestone, so a fresh session can resume from
43
+ `bd show <id>` alone if the original session dies mid-stage.
44
+ - 515b75e: Document why the pi installer's substituted skills are the sole pi skill source (the local pi/settings.json packages filter `{ source, "skills": [] }` keeps raw package skills out) and update pi/settings.json to the current runtime config (models, packages, compaction, TUI prefs).
45
+ - 11f9a36: Add a class-over-factory rule to `style-code`: when a module holds mutable state and exposes
46
+ methods that transform or manage it, model it as a class with public methods and native
47
+ `#private` fields rather than a factory function returning a closure of methods (TypeScript's
48
+ `private` modifier is compile-time only). Existing functional guidance for stateless components,
49
+ hooks, and pure transforms is unchanged.
50
+
51
+ ## 1.40.0
52
+
53
+ ### Minor Changes
54
+
55
+ - 1b6b8b8: `agent-cortex install claude` now materialises the plugin: home-scoped install into `~/.agent-cortex/claude`, copied (token-substituted, no symlinks) skills, marketplace manifest, and automatic registration with Claude Code. Installer toolchain is fully async (no `*Sync` — never block the main thread), enforced by a `check-no-sync` lint scanner.
56
+ - 65119b8: Map `ask_user` → `ask_questions` (pi-questions package) and `skill` → `read` in the pi column of token-map.json: pi agent modes regain interactive questioning (`ask_questions`) instead of dropping the tool with a startup warning, and skill references resolve to reading their SKILL.md. Notes and docs updated to record that `ask_questions` is provided by the pi-questions package.
57
+ - 1b6b8b8: Retire the committed `claude/` plugin subtree: `agent-cortex install claude` into `~/.agent-cortex/claude` (with automatic marketplace registration) is now the only way to build the Claude Code plugin. Hand-authored extras moved to `claude-extras/`, the `build:claude` script is removed, and CI validates the installer instead of diffing committed output.
58
+
59
+ ### Patch Changes
60
+
61
+ - fcb16d7: Fix grill-with-docs failing to load: quote the front-matter description so skill parsers accept it.
62
+
3
63
  ## 1.39.0
4
64
 
5
65
  ### Minor Changes