@chimix/agentscan 1.1.0 → 2.0.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 (4) hide show
  1. package/CHANGELOG.md +391 -0
  2. package/README.md +377 -154
  3. package/dist/cli.js +6422 -5421
  4. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -11,6 +11,397 @@ and [v0.4.0](https://github.com/SimaAlexandru99/agentscan/releases/tag/v0.4.0).
11
11
  (the published package version). A separate 1.0.1 npm tag would need an
12
12
  intermediate commit that this train does not cut.
13
13
 
14
+ ## Unreleased
15
+
16
+ ## 2.0.0 — 2026-11-12
17
+
18
+ Breaking for configs that still name the 0.7 rule ids or the old threshold
19
+ keys. `ignoreRules`, `ignoreFindings`, and `explain` accept only the printed
20
+ ids (`claude.hook.missing-script`, not `hook.missing-script`).
21
+ `thresholds.skillDescriptionBytes` and `thresholds.skills` are rejected; the
22
+ listing budget is `thresholds.skillListingChars`. **143 checks**, **647 tests**.
23
+
24
+ - Kiro agents: `.kiro/agents/**/*.json` and `*.md` on the ancestor walk, and
25
+ `~/.kiro/agents/` under `--global`. The name is the path relative to that
26
+ directory, without the extension. A nearer workspace file shadows a farther
27
+ workspace file and a global file with the same name. No field is required.
28
+ No new rule id. A `.json` and a `.md` with the same stem in one directory
29
+ are both kept.
30
+ - Antigravity rules and skills. Workspace `GEMINI.md` and `.agents/GEMINI.md`,
31
+ one level of `.agents/rules/*.md` and legacy `.agent/rules/*.md`, and
32
+ `.agents/rules.json` as shape only (`inherits` and `entries` paths are not
33
+ opened). `--global` adds `~/.gemini/AGENTS.md`, `~/.gemini/GEMINI.md`,
34
+ `~/.gemini/config/AGENTS.md`, `~/.gemini/config/GEMINI.md`,
35
+ `~/.gemini/config/rules/*.md`, and `~/.gemini/config/skills/`. Workspace
36
+ `AGENTS.md` stays the portable policy file, so the 24,000-byte check does
37
+ not apply to it. The byte check counts the raw file, before
38
+ `@[label](path)` expansion. The 20,000-token aggregate is not checked.
39
+ Plugin rules and plugin skills stay unread, as do
40
+ `~/.gemini/antigravity-cli/skills/`, `~/.gemini/skills/`, and
41
+ `~/.gemini/antigravity/skills/`. Global skills use the Agent Skills
42
+ contract. New: `antigravity.rule.missing-trigger`,
43
+ `antigravity.rule.invalid-trigger`,
44
+ `antigravity.rule.missing-description`, `antigravity.rule.missing-globs`,
45
+ `antigravity.rule.too-large`.
46
+ - Antigravity hooks: `.agents/hooks.json` on the ancestor walk, and
47
+ `~/.gemini/config/hooks.json` under `--global`. The file maps hook names to
48
+ definitions. Direct handlers and matcher groups are both valid. `enabled:
49
+ false` skips a definition. `type` defaults to `command`. Six events.
50
+ Plugin hooks stay unread. New: `antigravity.hook.unknown-event`,
51
+ `antigravity.hook.missing-script`, `antigravity.hook.invalid-group`,
52
+ `antigravity.hook.command-without-command`,
53
+ `antigravity.hook.unknown-handler-type`.
54
+ - Codex hooks: project `.codex/hooks.json` and inline `[hooks]` in
55
+ `.codex/config.toml`, plus the same two files under `$CODEX_HOME` or
56
+ `~/.codex` with `--global`. Both files in a layer are inventoried. Fourteen
57
+ events. `command` and `mcp_tool` run; `prompt` and `agent` are parsed but
58
+ skipped; `SessionEnd` does not run `mcp_tool`. SessionEnd and Interrupt
59
+ timeouts must be 1–3 seconds. Other events are not timeout-checked.
60
+ Plugins, `requirements.toml`, and the trust gate stay unread. New:
61
+ `codex.hook.unknown-event`, `codex.hook.missing-script`,
62
+ `codex.hook.invalid-group`, `codex.hook.command-without-command`,
63
+ `codex.hook.mcp-tool-without-server-or-tool`,
64
+ `codex.hook.unknown-handler-type`, `codex.hook.incompatible-handler`,
65
+ `codex.hook.timeout-out-of-bounds`.
66
+ - Cursor user MCP under `--global`: `~/.cursor/mcp.json` uses the same
67
+ `cursor-json` profile as the project file. A missing `version` is not a
68
+ finding.
69
+ - Kiro hook triggers `SessionEnd`, `PreCompact`, and `PostCompact`, quoted
70
+ on the types page (2026-11-12). `PreTaskExec` and `PostTaskExec` stay:
71
+ that table still lists Pre/Post Task Execution and does not quote a
72
+ replacement token.
73
+ - `CLAUDE_CONFIG_DIR` also relocates `~/.claude.json` to
74
+ `$CLAUDE_CONFIG_DIR/.claude.json` under `--global`. Unset, the file stays
75
+ `~/.claude.json`.
76
+ - Devin CLI, beside the legacy Windsurf contract: `.devin/hooks.v1.json`
77
+ and `"hooks"` in `.devin/config.json` / `config.local.json` (user
78
+ `~/.config/devin/config.json` under `--global`); MCP
79
+ `.devin/mcp_config.json`, `.devin/mcp_config.local.json`, and a
80
+ `mcpServers` key still sitting in those config files. Launch is `command`
81
+ or `url` (`sse` is a valid transport, not a check). Skills:
82
+ `.devin/skills` and `--global` `~/.config/devin/skills`. New:
83
+ `devin.hook.unknown-event`, `devin.hook.missing-script`,
84
+ `devin.hook.invalid-group`, `devin.hook.command-without-command`,
85
+ `devin.hook.prompt-without-prompt`, `devin.hook.unknown-handler-type`,
86
+ `devin.mcp.no-launch`. `.windsurf/hooks.json` and
87
+ `~/.codeium/windsurf/mcp_config.json` stay the Cascade contract.
88
+ `.claude/settings.json` stays Claude.
89
+ - Antigravity MCP: `url` is an alias of `serverUrl`. `httpUrl` alone is
90
+ still `antigravity.mcp.no-launch`.
91
+ - Copilot portable user MCP under `--global`: `$COPILOT_HOME/mcp-config.json`
92
+ or `~/.copilot/mcp-config.json` (`mcpServers`, `command` or `url`),
93
+ reported as `vscode.mcp.no-launch`. `.vscode/mcp.json` stays the `servers`
94
+ file. Legacy Local hooks stay the eight PascalCase command-only events;
95
+ `version: 1` stays Copilot.
96
+
97
+ - Kiro hooks (`.kiro/hooks/*.json`, `--global` `~/.kiro/hooks/`) on their
98
+ own profile: 13 PascalCase triggers, `command` /
99
+ `agent` actions, array-of-hooks files. New: `kiro.hook.unknown-event`,
100
+ `kiro.hook.missing-script`, `kiro.hook.command-without-command`,
101
+ `kiro.hook.prompt-without-prompt`, `kiro.hook.unknown-handler-type`,
102
+ `kiro.hook.invalid-group`. Agents are inventoried on their own walk
103
+ (above). Skills: `.kiro/skills` as Agent Skills.
104
+ - Cline / Roo / Kilo / Junie skill directories (`.cline/skills`,
105
+ `.roo/skills`, `.kilo/skills`, `.junie/skills`, plus `--global` home
106
+ copies). Junie does not require `description` and does not require
107
+ `name` to match the folder. Cline hooks and Cline agents stay unread.
108
+ - VS Code `.github/agents/*.agent.md` frontmatter hooks parse as
109
+ vscode-native. Marketplace plugin `hooks.json` stays unread.
110
+ - `--global` Cursor `~/.cursor/hooks.json`, Gemini
111
+ `~/.gemini/settings.json` (hooks and MCP together), and Antigravity
112
+ `~/.gemini/config/mcp_config.json`. Credential siblings are never
113
+ opened. Copilot-consumed `.claude/settings.json` stays Claude.
114
+ - Spec provenance: VS Code hooks-reference, geminicli.com (GitHub MCP
115
+ page kept for the underscore warning), both OpenCode MCP URLs.
116
+
117
+ - Claude user `~/.claude/settings.json` hooks under `--global` /
118
+ `includeGlobal`. Same Claude schema as project settings;
119
+ `${CLAUDE_PROJECT_DIR}` resolves against the scanned project. Same-event
120
+ user and project hooks coexist. Managed policy and marketplace plugins
121
+ stay unread.
122
+ - Claude user `~/.claude.json` MCP under `--global` / `includeGlobal`:
123
+ top-level `mcpServers` (user) and matching
124
+ `projects.<scanned-path>.mcpServers` (local). Absent keys are not
125
+ `config.unreadable`. Same-name project, user, and local servers are
126
+ all inventoried. Other projects' local servers stay unread.
127
+ - Claude `--global` user agents, `CLAUDE.md`, rules, and commands
128
+ (`$CLAUDE_CONFIG_DIR` or `~/.claude`). `CLAUDE_CONFIG_DIR` relocates
129
+ that directory; `~/.claude.json` stays in the home directory.
130
+ - Project `.claude/commands/*.md` inventoried as Claude slash commands;
131
+ frontmatter hooks use the skill source. In-tree plugin `skills/`,
132
+ root `SKILL.md`, `agents/` (no frontmatter hooks), `commands/`, and
133
+ `.mcp.json` (`claude-json`). Marketplace plugins stay unread.
134
+ - Gemini CLI hooks: the `hooks` object in project `.gemini/settings.json`,
135
+ the same file the MCP scan already opens. Nested `{ matcher?, sequential?,
136
+ hooks: [...] }` groups, required `type` whose only documented value is
137
+ `command`, and `$GEMINI_PROJECT_DIR` script resolution. Eleven events
138
+ (`SessionStart`, `SessionEnd`, `BeforeAgent`, `AfterAgent`, `BeforeModel`,
139
+ `AfterModel`, `BeforeToolSelection`, `BeforeTool`, `AfterTool`,
140
+ `PreCompress`, `Notification`) on their own profile — Claude's names are
141
+ never accepted here, and Gemini's are never validated against Claude's.
142
+ New: `gemini.hook.unknown-event`, `gemini.hook.missing-script`,
143
+ `gemini.hook.invalid-group`, `gemini.hook.command-without-command`,
144
+ `gemini.hook.unknown-handler-type`. User `~/.gemini/settings.json` is
145
+ opened under `--global` together with that file's MCP servers.
146
+ `/etc/gemini-cli/settings.json` and extension hooks stay unread.
147
+ - Cursor hooks: project `.cursor/hooks.json`. Flat arrays, not Claude groups;
148
+ `command` required on every entry, `type` optional and defaulting to
149
+ `command` (`command` / `prompt`), scripts resolved against the project root
150
+ as the page documents. Twenty-one camelCase events across agent, Tab, and
151
+ app-lifecycle families. New: `cursor.hook.unknown-event`,
152
+ `cursor.hook.missing-script`, `cursor.hook.command-without-command`,
153
+ `cursor.hook.unknown-handler-type`. User `~/.cursor/hooks.json` is opened
154
+ under `--global`. MDM paths and dashboard-synced team hooks stay unread.
155
+ - `spec:check` now diffs the Gemini, Cursor, and Kiro event sets against
156
+ their live pages, and those pages are tracked by content hash.
157
+ - Every finding now says where its rule comes from. `StructuralCheck` gains a
158
+ required `source`: either `{ kind: "spec", url, capture }` naming the vendor
159
+ page and the `docs/spec` file holding the verbatim quote, or
160
+ `{ kind: "derived", detail }` stating plainly that no vendor page asserts it.
161
+ Required, so a new rule that cannot say where it came from does not compile.
162
+ `make()` copies it, with `provenance` and `lastVerified`, onto every finding.
163
+ - Default report: one dim line per rule group —
164
+ `spec-required · cursor.com/docs/hooks · read 2026-09-03`, or
165
+ `internal-consistency · no vendor page · agentscan inference`.
166
+ - `explain`: adds `provenance:`, the full `source:` URL, and `capture:`.
167
+ - `--json`: three new keys per finding (`provenance`, `source`,
168
+ `lastVerified`). Additive; no key renamed or removed.
169
+ - `--output prompt`: a `Source:` bullet, so a fixing agent can read the page
170
+ before editing the config the rule is about.
171
+ - `agentscan rules` gains provenance and source columns and a `--json` flag
172
+ (it previously accepted no flags at all).
173
+ - All 28 pages cited by a rule are already in `SPEC_SURFACES`, so every source
174
+ a user sees is re-fetched and hash-compared by `bun run spec:check`. A test
175
+ enforces it, along with: every capture file exists, the capture names the
176
+ rule, `lastVerified` matches the capture's `**Read:**` date, and a
177
+ `spec-required` rule may not claim it has no source.
178
+ - `bun run readme:rules` generates the README rule table from the registry;
179
+ a test fails the build when it drifts. This recovers the three
180
+ `windsurf.hook.*` rows the hand-maintained table had been missing since #13,
181
+ and the check count is now asserted against the registry in the three README
182
+ places it is written by hand. `site/lib/site.ts` deliberately stays at the
183
+ published release's count; the test only forbids the site advertising more
184
+ checks than the registry holds.
185
+
186
+ ### Removed
187
+
188
+ - `ignoreRules`, `ignoreFindings`, and `explain` no longer accept 0.7 rule
189
+ ids (`hook.missing-script`, `skill.missing-frontmatter`, and the rest of
190
+ that set). Use the id the finding prints (`claude.hook.missing-script`).
191
+ - `thresholds.skillDescriptionBytes` and `thresholds.skills` are rejected.
192
+ The listing budget key is `thresholds.skillListingChars`.
193
+ - The README "Catches" column is the registry description. `bun run
194
+ readme:rules` no longer keeps a second, hand-written sentence.
195
+
196
+ ### Changed
197
+
198
+ - An explicit `--config <path>` that does not exist now exits 2 with
199
+ `config file not found: <path>` instead of silently scanning with defaults.
200
+ A missing implicit `.agentscanrc.json` still means defaults. A config that
201
+ parses as JSON but breaks the schema exits 2 with
202
+ `Invalid config at <path>: <key>: <problem>` instead of a raw zod dump.
203
+
204
+ ### Fixed
205
+
206
+ - 54 rules recorded a `lastVerified` older than the `**Read:**` date of the
207
+ capture they rest on: the 2026-09-03 re-read of those pages never reached the
208
+ registry. Synced, with a test that keeps the two in step.
209
+ - Three `tests/unit/codex-mcp.test.ts` cases failed on any machine with
210
+ `CODEX_HOME` exported: they mock `os.homedir()`, but `codexHomeDir()`
211
+ correctly prefers the env override. A `tests/helpers/env.ts` preload clears
212
+ `CODEX_HOME`, `GROK_HOME`, `CLAUDE_CONFIG_DIR`, and `COPILOT_HOME` for the
213
+ whole suite; the tests that need one still set and restore it themselves.
214
+
215
+ ## 1.4.0 — 2026-09-02
216
+
217
+ Closes two coverage gaps left after the 2026-09-02 re-verification, then
218
+ ships everything that sat in Unreleased: the seven false-positive
219
+ corrections, plan 038 content hashes and verbatim fixtures, and #13
220
+ Windsurf Cascade hooks / skills. **103 checks**, **532 tests**.
221
+
222
+ ### Added
223
+
224
+ - Copilot CLI inline `hooks` in `.github/copilot/settings.json` and
225
+ `.github/copilot/settings.local.json` (always `copilot-cli`, source
226
+ `copilot-settings`). User `$COPILOT_HOME/settings.json` or
227
+ `~/.copilot/settings.json` under `--global`. Same-event hooks from
228
+ settings and `.github/hooks` coexist. `$COPILOT_HOME` is honored for
229
+ user hook files too. `.claude/settings.json` stays on the Claude
230
+ profile. Policy and plugin hook files stay unread.
231
+ - `mcp.literal-credential` (security, warning): secret-named string values
232
+ under MCP `headers`, `http_headers`, or `auth` that are not
233
+ interpolation. Field paths only; values never echoed. Grok `{{var}}`,
234
+ Gemini `%VAR%`, and the existing `${VAR}` / `${env:}` / `${input:}`
235
+ forms are interpolation. Token-shaped literals still fire
236
+ `security.hardcoded-secret` first.
237
+
238
+ - `bun run spec:check` hashes the prose of every source page in
239
+ `scripts/spec-surfaces.ts` (35 unique URLs) and compares against
240
+ `scripts/spec-hashes.json`; a changed page is reported as drift with the
241
+ recorded date and URL. `bun run spec:record` rewrites the baseline after a
242
+ human has re-read the page. Page text is never stored. GitHub blob URLs are
243
+ fetched as raw files. Offline tests cover normalisation, hashing, and the
244
+ baseline file's shape.
245
+ - Conformance fixtures carry the vendors' own examples verbatim: Claude
246
+ `type: "http"` / `"streamable-http"` MCP entries and the five documented
247
+ hook handler examples (command exec form, http, mcp_tool, prompt, agent);
248
+ Copilot CLI `exec`, `http`, `prompt`, and the PascalCase lifecycle names;
249
+ Gemini `httpUrl`, SSE `url`, and `%VAR_NAME%` env; the Command Code agents
250
+ page's full frontmatter example; the Agent Skills optional-fields example
251
+ with its referenced files; the VS Code OS-override example with its scripts.
252
+ With the pre-fix checks these fixtures fail on `claude-json`,
253
+ `copilot-hooks`, and `gemini-json`.
254
+ - The conformance test pins a minimum fact count per fixture, so a discovery
255
+ regression that silently drops a file cannot keep a fixture green.
256
+
257
+ ### Fixed
258
+
259
+ - `commandcode.mcp.invalid-transport` no longer fires on `"type":
260
+ "streamable-http"` in a shared `.mcp.json` — Claude Code documents it as an
261
+ alias for `http`. It also no longer fires on `sse` in Command Code-only
262
+ files, which the Command Code MCP page names as a transport it connects to
263
+ (skip, not a claim of support).
264
+ - `agent-skills.skill.invalid-name` accepts lowercase letters from any script
265
+ (`résumé-builder`), matching the spec's "unicode lowercase alphanumeric" and
266
+ the `skills-ref` reference validator. Uppercase, underscores, spaces, and
267
+ hyphen placement are still rejected.
268
+ - `copilot.hook.command-without-command` accepts the documented `exec` (+
269
+ `args`) form as a complete command handler; `exec` paths are existence-
270
+ checked like any other launch.
271
+ - `copilot.hook.unknown-event` accepts the PascalCase spellings the Copilot
272
+ reference documents for Copilot-only events in `version: 1` files:
273
+ `SessionEnd`, `PostToolUseFailure`, `ErrorOccurred`, `PermissionRequest`.
274
+ Native VS Code files still reject them.
275
+ - `mcp.literal-env` treats Gemini CLI's documented Windows `%VAR_NAME%` form as
276
+ interpolation, not a literal secret.
277
+ - `commandcode.agent.invalid-permission-mode` accepts `inherit`, the value the
278
+ agents page lists as the field's default.
279
+
280
+ ### Changed
281
+
282
+ - All `docs/spec/*.md` captures whose source page was re-read carry
283
+ `**Read:** 2026-09-02`; `scripts/spec-surfaces.ts` and the registry's
284
+ `lastVerified` match. Six discovery-only surfaces that were not re-opened
285
+ keep their earlier date.
286
+ - `bun run spec:check` now also diffs the Copilot PascalCase aliases against
287
+ the live page, and exits 1 when any source page's content hash has moved.
288
+ - New captured lines: Claude hook `args` exec form and `${CLAUDE_PLUGIN_DATA}`;
289
+ Claude sub-agent skip list; VS Code agent-scoped and plugin hook locations;
290
+ Command Code `reasoningEffort` (documented, invalid values fall back and
291
+ load — no check); Antigravity "legacy fields like `url` or `httpUrl` are not
292
+ supported"; Continue `uses:` cited from the config reference.
293
+
294
+ ### From #13 — true findings and Windsurf Cascade hooks / skills
295
+
296
+ - `.agentscan-root` now stops walk-up, so a dirty `/tmp/.git` cannot become the
297
+ scan root for fixtures or nested checkouts.
298
+ - Fenced `SKILL.md` examples: a bundled path on the second line of a code
299
+ fence is not `skill.broken-reference`.
300
+ - Unclosed YAML `---` is `config.unreadable`, not `*.skill.missing-frontmatter`.
301
+ - Invalid Windsurf rule YAML is not `windsurf.rule.missing-trigger`.
302
+ - `node .` / `"."` is not a missing hook script or MCP command.
303
+ - Skill-directory symlinks that leave the scan root are not inventoried.
304
+ - `--global` copy names Copilot hooks and Windsurf user files; Action
305
+ `bun-version` defaults to `1.4.0` (CI pin).
306
+ - Windsurf Cascade hooks: `.windsurf/hooks.json` and `--global`
307
+ `~/.codeium/windsurf/hooks.json`. 12 snake_case events; `command` /
308
+ `powershell`; `windsurf.hook.unknown-event`, `missing-script`,
309
+ `command-without-command`.
310
+ - Windsurf Cascade skills: `.windsurf/skills` and `--global`
311
+ `~/.codeium/windsurf/skills`. Agent Skills contract (page cites
312
+ agentskills.io). System skill dirs unread.
313
+
314
+ ## 1.3.0 — 2026-08-31
315
+
316
+ Native Windsurf / Cascade coverage against 2026-08-31 official docs.
317
+ **99 checks**, **457 tests**.
318
+
319
+ ### Added
320
+
321
+ - Spec captures `docs/spec/windsurf-rules.md`, `windsurf-agents-md.md`,
322
+ `windsurf-mcp.md`.
323
+ - Workspace rules: `.devin/rules/*.md` (preferred), `.windsurf/rules/*.md`
324
+ (fallback), subdirectory-scoped trees, legacy `.windsurfrules`.
325
+ `.devin` is a scan-root signal.
326
+ - Character budgets: `windsurf.rule.too-large` (12,000) and
327
+ `windsurf.rule.global-too-large` (6,000). Never `cursor.rule.too-large`.
328
+ - `windsurf.rule.missing-trigger` on workspace `.devin` / `.windsurf` rules
329
+ that omit frontmatter `trigger`. Not on `.windsurfrules`,
330
+ `global_rules.md`, or `AGENTS.md`.
331
+ - Portable lowercase `agents.md` (same `sourceProvider: unknown` as
332
+ `AGENTS.md`).
333
+ - `--global` Cascade MCP at `~/.codeium/windsurf/mcp_config.json`
334
+ (`windsurf-json`). Launch is `command` or `serverUrl` or `url`.
335
+ `windsurf.mcp.no-launch` when none are set. Never
336
+ `claude.mcp.url-without-type`.
337
+ - `--global` `~/.codeium/windsurf/memories/global_rules.md` only. Other
338
+ files in that memories directory stay unread.
339
+
340
+ ### Unread (intentional)
341
+
342
+ - Devin Local CLI MCP (no published path).
343
+ - Auto-generated memories other than `global_rules.md`.
344
+ - System / enterprise rule directories.
345
+ - Project MCP (none quoted).
346
+ - Marketplace, admin allowlists, OAuth stores.
347
+
348
+ ## 1.2.1 — 2026-08-31
349
+
350
+ Codex user MCP under `--global`. **95 checks**, **441 tests**.
351
+
352
+ ### Added
353
+
354
+ - `$CODEX_HOME/config.toml` (default `~/.codex/config.toml`) is opened only
355
+ with `--global`. Same `codex-toml` shape as project `.codex/config.toml`.
356
+ - Same-name user and project servers both stay in the inventory. The
357
+ published page does not quote a replace-entirely rule, so this scanner
358
+ does not invent `codexEffective`.
359
+ - Spec recapture `docs/spec/codex-mcp.md` (user path, `CODEX_HOME`, unread
360
+ system / managed / requirements / profiles / plugins / trust / `auth.json`).
361
+
362
+ ### Unread (intentional)
363
+
364
+ - System `/etc/codex/config.toml`, managed preferences, `requirements.toml`,
365
+ profile files, plugin MCP, `trust_level`.
366
+ - User-file `project_doc_*` knobs.
367
+ - Claude global settings; Command Code `projects/{slug}/mcp.json`.
368
+
369
+ ## 1.2.0 — 2026-08-31
370
+
371
+ Native Grok Build provider against 2026-08-31 official docs. **95 checks**,
372
+ **435 tests**. Compatibility with Claude or Cursor is not schema identity.
373
+
374
+ ### Added
375
+
376
+ - Spec captures `docs/spec/grok-mcp.md`, `grok-hooks.md`, `grok-skills.md`,
377
+ `grok-rules.md`, `grok-agents.md`.
378
+ - Profiles: `grok-toml` MCP, `grok` hook and skill schemas.
379
+ `inferHookSchemaProfile("grok")` is `"grok"`, not `"claude"`.
380
+ - Project `.grok/config.toml` walk-up (cwd → scan boundary). User
381
+ `$GROK_HOME/config.toml` or `~/.grok/config.toml` under `--global`.
382
+ Same-name project replaces user; closer project file wins.
383
+ `grok.mcp.no-launch` when neither `command` nor `url` is set. Never
384
+ `claude.mcp.url-without-type` on `grok-toml`.
385
+ - `.grok/hooks/*.json` and user hooks under `--global`. Fourteen events;
386
+ handlers `command` / `http`. Copilot `version: 1` remap is not applied.
387
+ - `.grok/skills` (and user skills under `--global`). Frontmatter required;
388
+ `name` / `description` optional. Agent Skills directory-match and Claude
389
+ listing-budget checks do not run.
390
+ - `.grok/rules/*.md` with no size cap. `Agents.md` and `AGENT.md` as Grok
391
+ instruction files beside `AGENTS.md`.
392
+ - Conformance fixture `tests/fixtures/conformance/grok-toml/`.
393
+ - `spec:check` drifts Grok hook event names against the live hooks page.
394
+
395
+ ### Unread (intentional)
396
+
397
+ - Managed / requirements TOML, plugins, marketplaces, personas, LSP,
398
+ `sandbox.toml`, `pager.toml`.
399
+ - `[skills] paths` (no quoted resolution base).
400
+ - `.grok/agents/` (directory named, no filename pattern).
401
+ - Claude / Cursor / `.mcp.json` as Grok-consumed.
402
+ - `.gitignore` skip for instruction files.
403
+ - Credential files (`auth.json`, `mcp_credentials.json`).
404
+
14
405
  ## 1.1.0 — 2026-08-31
15
406
 
16
407
  Native Command Code provider, then a correctness pass over every registered