simt-dev 0.7.0 → 0.8.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 (235) hide show
  1. package/CHANGELOG.md +191 -870
  2. package/README.md +188 -213
  3. package/bin/simt.mjs +19 -55
  4. package/docs/decisions/ADR-014-workspace-is-configuration.md +2 -2
  5. package/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +1 -1
  6. package/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +1 -1
  7. package/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +1 -1
  8. package/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +1 -1
  9. package/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +1 -1
  10. package/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +1 -1
  11. package/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +1 -1
  12. package/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +1 -1
  13. package/docs/decisions/ADR-099-the-release-verifies-served-bytes-and-the-formula-mirrors-them.md +1 -1
  14. package/docs/decisions/ADR-117-the-darwin-release-builds-on-supported-macos-15-runners-and-a-re-run-is-idempotent.md +81 -0
  15. package/docs/decisions/ADR-118-the-bench-corpus-is-keyed-on-history-is-append-only-and-is-portable-as-a-sealed-document.md +91 -0
  16. package/docs/decisions/ADR-119-the-environment-variable-points-into-a-workspace-the-repo-declared.md +90 -0
  17. package/docs/decisions/ADR-120-a-pre-push-whose-tree-is-already-proven-green-skips-the-test-gate-on-that-evidence.md +96 -0
  18. package/docs/decisions/ADR-122-the-shims-move-into-the-state-directory-and-the-legacy-directory-removes-itself.md +94 -0
  19. package/docs/decisions/ADR-123-a-surplus-positional-is-not-refused-because-arity-is-not-in-the-source.md +57 -0
  20. package/docs/decisions/ADR-124-the-manifest-has-a-schema-in-the-tool-and-its-unknown-keys-stay-the-repositorys.md +64 -0
  21. package/docs/decisions/ADR-125-a-shared-context-belongs-to-a-read-and-a-writer-reads-directly.md +65 -0
  22. package/docs/decisions/ADR-126-the-mcp-surface-stays-a-reader-so-there-is-no-write-path-to-build.md +68 -0
  23. package/docs/decisions/ADR-127-the-mcp-tool-list-is-written-by-hand-and-roots-is-not-asked-for.md +65 -0
  24. package/docs/decisions/ADR-128-a-research-plan-is-a-plan-and-the-tracker-reads-it.md +42 -0
  25. package/ecosystems/bun.json +6 -0
  26. package/ecosystems/cargo.json +25 -0
  27. package/ecosystems/composer.json +6 -0
  28. package/ecosystems/dart.json +24 -0
  29. package/ecosystems/deno.json +21 -0
  30. package/ecosystems/devcontainers.json +6 -0
  31. package/ecosystems/docker-compose.json +6 -0
  32. package/ecosystems/docker.json +6 -0
  33. package/ecosystems/dotnet.json +25 -0
  34. package/ecosystems/elixir.json +23 -0
  35. package/ecosystems/gitsubmodule.json +6 -0
  36. package/ecosystems/go.json +25 -0
  37. package/ecosystems/gradle.json +13 -0
  38. package/ecosystems/maven.json +23 -0
  39. package/ecosystems/node.json +25 -0
  40. package/ecosystems/python.json +20 -0
  41. package/ecosystems/ruby.json +23 -0
  42. package/ecosystems/swift.json +25 -0
  43. package/ecosystems/terraform.json +6 -0
  44. package/ecosystems/uv.json +6 -0
  45. package/harnesses/antigravity.json +162 -0
  46. package/harnesses/claude.json +206 -0
  47. package/harnesses/codex.json +136 -0
  48. package/harnesses/copilot.json +88 -0
  49. package/harnesses/cursor.json +140 -0
  50. package/harnesses/deepseek.json +99 -0
  51. package/harnesses/gemini.json +122 -0
  52. package/harnesses/opencode.json +173 -0
  53. package/package.json +12 -2
  54. package/rules/core.md +7 -0
  55. package/rules/mdc/intake-questions.mdc +8 -0
  56. package/rules/mdc/slice-commit.mdc +57 -4
  57. package/src/advice/advice.mjs +3 -2
  58. package/src/agenthooks/prompt.mjs +5 -2
  59. package/src/agenthooks/render.mjs +86 -180
  60. package/src/agenthooks/shim.mjs +1 -1
  61. package/src/agents/render.mjs +15 -18
  62. package/src/api.mjs +31 -0
  63. package/src/argv.mjs +48 -3
  64. package/src/bench/ablate.mjs +3 -4
  65. package/src/bench/adapters.json +163 -105
  66. package/src/bench/adapters.mjs +466 -0
  67. package/src/bench/arms.mjs +333 -0
  68. package/src/bench/grade.mjs +33 -73
  69. package/src/bench/graders.mjs +42 -0
  70. package/src/bench/mine.mjs +121 -475
  71. package/src/bench/probe-ledger.mjs +149 -0
  72. package/src/bench/probes.catalog.mjs +918 -0
  73. package/src/bench/probes.mjs +79 -1064
  74. package/src/bench/render.mjs +111 -0
  75. package/src/bench/report.mjs +120 -962
  76. package/src/bench/run.mjs +185 -802
  77. package/src/bench/variants.mjs +4 -5
  78. package/src/bench/workspace.mjs +160 -0
  79. package/src/brief/assemble.mjs +48 -15
  80. package/src/ci/dependabot.mjs +25 -55
  81. package/src/ci/workflow.mjs +30 -7
  82. package/src/cli.mjs +45 -0
  83. package/src/commands/agent.mjs +4 -13
  84. package/src/commands/agenthook.mjs +70 -40
  85. package/src/commands/bench.mjs +191 -18
  86. package/src/commands/brief.mjs +5 -4
  87. package/src/commands/ci.mjs +13 -14
  88. package/src/commands/compare.mjs +42 -42
  89. package/src/commands/completions.mjs +2 -6
  90. package/src/commands/decide.mjs +4 -4
  91. package/src/commands/distill.mjs +4 -3
  92. package/src/commands/docs.mjs +88 -0
  93. package/src/commands/doctor.mjs +11 -7
  94. package/src/commands/evidence.mjs +6 -9
  95. package/src/commands/explain.mjs +0 -1
  96. package/src/commands/gate.mjs +26 -25
  97. package/src/commands/graph.mjs +2 -3
  98. package/src/commands/harness.mjs +6 -5
  99. package/src/commands/help.mjs +168 -19
  100. package/src/commands/hooks.mjs +119 -49
  101. package/src/commands/ignore.mjs +13 -8
  102. package/src/commands/impact.mjs +8 -15
  103. package/src/commands/index.mjs +318 -193
  104. package/src/commands/init-scan.mjs +90 -0
  105. package/src/commands/init.mjs +124 -105
  106. package/src/commands/lease.mjs +73 -25
  107. package/src/commands/lessons.mjs +10 -9
  108. package/src/commands/local.mjs +3 -3
  109. package/src/commands/map.mjs +24 -14
  110. package/src/commands/mcp.mjs +2 -18
  111. package/src/commands/pack.mjs +9 -6
  112. package/src/commands/plan.mjs +6 -5
  113. package/src/commands/plugin.mjs +2 -2
  114. package/src/commands/prbody.mjs +3 -3
  115. package/src/commands/repoindex.mjs +12 -11
  116. package/src/commands/review.mjs +2 -2
  117. package/src/commands/rules.mjs +37 -16
  118. package/src/commands/shared.mjs +14 -19
  119. package/src/commands/skills.mjs +33 -32
  120. package/src/commands/skillscompile.mjs +7 -8
  121. package/src/commands/skillsinstall.mjs +7 -6
  122. package/src/commands/slice.mjs +220 -74
  123. package/src/commands/spec.mjs +167 -0
  124. package/src/commands/status.mjs +27 -18
  125. package/src/commands/sync.mjs +27 -25
  126. package/src/commands/tests.mjs +18 -21
  127. package/src/commands/tokens.mjs +21 -26
  128. package/src/commands/undo.mjs +5 -15
  129. package/src/commands/upgrade.mjs +15 -7
  130. package/src/commands/why.mjs +15 -21
  131. package/src/compare/hooksstate.mjs +2 -6
  132. package/src/compare/learn.mjs +3 -1
  133. package/src/compare/row.mjs +0 -2
  134. package/src/context.mjs +64 -0
  135. package/src/decisions/index-doc.mjs +46 -0
  136. package/src/decisions/index.mjs +3 -2
  137. package/src/diff.mjs +1 -1
  138. package/src/distill/distill.mjs +14 -1
  139. package/src/distill/engine.mjs +5 -1
  140. package/src/docs/commands.mjs +65 -0
  141. package/src/ecosystem/records.mjs +219 -0
  142. package/src/explain.mjs +31 -0
  143. package/src/gates/index.mjs +385 -0
  144. package/src/graph/compile.mjs +8 -4
  145. package/src/graph/load.mjs +6 -2
  146. package/src/graph/spec.mjs +10 -8
  147. package/src/harness/records.mjs +143 -0
  148. package/src/hooks/capability.mjs +7 -5
  149. package/src/hooks/dispatcher.mjs +209 -60
  150. package/src/hooks/gates.mjs +10 -43
  151. package/src/hooks/resolve.mjs +4 -14
  152. package/src/hooks/shim.mjs +5 -2
  153. package/src/hooks/where.mjs +2 -7
  154. package/src/identity.mjs +31 -12
  155. package/src/index/coverage.mjs +58 -0
  156. package/src/index/extract.mjs +6 -16
  157. package/src/index/gate.mjs +1 -1
  158. package/src/index/govern.mjs +26 -9
  159. package/src/index/impact.mjs +4 -8
  160. package/src/index/map.mjs +14 -15
  161. package/src/index/open.mjs +173 -0
  162. package/src/index/persist.mjs +224 -57
  163. package/src/index/store.mjs +82 -39
  164. package/src/index/tests.mjs +2 -6
  165. package/src/journal.mjs +94 -20
  166. package/src/kernel/card.mjs +37 -63
  167. package/src/kernel/checks.mjs +4 -10
  168. package/src/lease.mjs +102 -7
  169. package/src/ledger/index.mjs +150 -14
  170. package/src/local/client.mjs +4 -6
  171. package/src/locate.mjs +33 -9
  172. package/src/manifest/schema.mjs +213 -0
  173. package/src/mcp/paginate.mjs +33 -0
  174. package/src/mcp/resources.mjs +7 -10
  175. package/src/mcp/schemas.mjs +512 -0
  176. package/src/mcp/server.mjs +119 -25
  177. package/src/mcp/tools-facts.mjs +326 -0
  178. package/src/mcp/tools-read.mjs +221 -0
  179. package/src/mcp/tools.mjs +4 -967
  180. package/src/measure/corpus.mjs +150 -0
  181. package/src/measure/metrics.mjs +236 -0
  182. package/src/measure/records.mjs +211 -0
  183. package/src/measure/session.mjs +3 -2
  184. package/src/measure/stats.mjs +538 -0
  185. package/src/measure/task-schema.mjs +125 -0
  186. package/src/measure/tasks.mjs +69 -0
  187. package/src/memory/decide.mjs +6 -15
  188. package/src/memory/lesson-text.mjs +61 -0
  189. package/src/memory/lessons.mjs +29 -82
  190. package/src/name.mjs +7 -0
  191. package/src/node-version.mjs +37 -0
  192. package/src/output/index.mjs +209 -10
  193. package/src/packs/manage.mjs +32 -12
  194. package/src/packs.mjs +20 -2
  195. package/src/plan/index.mjs +1 -1
  196. package/src/plugins.mjs +22 -16
  197. package/src/prbody.mjs +7 -11
  198. package/src/projection/loaders.mjs +7 -692
  199. package/src/projection/lock.mjs +11 -1
  200. package/src/projection/manifest.mjs +29 -468
  201. package/src/projection/mdc.mjs +7 -8
  202. package/src/projection/project.mjs +126 -221
  203. package/src/projection/region.mjs +561 -0
  204. package/src/projection/rules.mjs +20 -550
  205. package/src/projection/surfaces.mjs +43 -210
  206. package/src/projection/targets.mjs +5 -5
  207. package/src/repo-root.mjs +31 -0
  208. package/src/resolve/eval.mjs +2 -1
  209. package/src/resolve/fingerprint.mjs +19 -22
  210. package/src/resolve/resolve.mjs +1 -41
  211. package/src/review/critic.mjs +10 -13
  212. package/src/run.mjs +98 -0
  213. package/src/secrets.mjs +14 -22
  214. package/src/state/events.mjs +129 -0
  215. package/src/status-snapshot.mjs +233 -0
  216. package/src/status.mjs +2 -6
  217. package/src/sys/git.mjs +82 -0
  218. package/src/sys/proc.mjs +151 -0
  219. package/src/testing/parsers.mjs +265 -0
  220. package/src/testing/patches.mjs +23 -0
  221. package/src/testing/paths.mjs +49 -0
  222. package/src/testing/runners.mjs +186 -0
  223. package/src/testing/vault.mjs +68 -0
  224. package/src/text/frontmatter.mjs +49 -0
  225. package/src/text/tokens.mjs +52 -0
  226. package/src/toolwords.mjs +3 -0
  227. package/src/util/fs.mjs +20 -0
  228. package/src/util/sort.mjs +12 -0
  229. package/src/workspace.mjs +58 -11
  230. package/src/write/plan.mjs +82 -0
  231. package/templates/plan/tracker.json +1 -0
  232. package/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -82
  233. package/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +0 -49
  234. package/docs/decisions/README.md +0 -600
  235. package/src/bench/tasks.mjs +0 -36
@@ -0,0 +1,162 @@
1
+ {
2
+ "id": "antigravity",
3
+ "loaderOrder": 5,
4
+ "surfaceOrder": 4,
5
+ "surface": {
6
+ "id": "antigravity",
7
+ "label": "Antigravity workspace rules",
8
+ "readers": "Antigravity IDE, Antigravity CLI",
9
+ "primary": null,
10
+ "kind": "file",
11
+ "rule": ".agents/rules/{name}.md",
12
+ "readsAgentsMd": "all",
13
+ "configDirs": [
14
+ ".agents"
15
+ ],
16
+ "documentedKeys": [
17
+ "trigger",
18
+ "description",
19
+ "globs",
20
+ "glob"
21
+ ],
22
+ "readsPrimary": true,
23
+ "verified": "Google Antigravity docs, \"Rules\" — .agents/rules/*.md, YAML frontmatter with trigger: always_on | model_decision | glob | manual; missing or invalid frontmatter silently discards the rule; trigger: glob takes comma-separated globs, which the docs require to be quoted so YAML does not read a leading * as an alias anchor; a 24 KB per-file limit and a 20,000-token budget for always_on rules, with automatic demotion to pointers past it",
24
+ "note": "This is why frontmatter is mandatory here and why the trigger value is not guessed: an unrecognised trigger means the rule is dropped with no message."
25
+ },
26
+ "pointerOrder": 2,
27
+ "pointer": {
28
+ "id": "gemini-md",
29
+ "surface": "antigravity",
30
+ "path": "GEMINI.md",
31
+ "to": "AGENTS.md",
32
+ "readers": "Gemini CLI, Antigravity",
33
+ "verified": "Google Antigravity docs, \"Rules\": workspace rules are AGENTS.md or GEMINI.md in the root or any subdirectory; Copilot CLI also discovers GEMINI.md. Gemini CLI, read today: its own docs (core memory index, and the configuration reference) say the memory service loads GEMINI.md hierarchically from the working directory up to the project root and the home directory and also into subdirectories, and that `context.fileName` in settings.json \"accepts either a single string or an array of strings\" naming the context file(s) to load, default undefined",
34
+ "note": "Covers Gemini CLI and gives Antigravity a second, equally-native name for the same file. A repository can also point Gemini CLI at AGENTS.md itself with `context.fileName: [\"AGENTS.md\"]` and need no pointer at all, which is the reason there is no separate Gemini CLI row here: this pointer and a native row would be two ways to hand one reader the same rule."
35
+ },
36
+ "loader": {
37
+ "id": "antigravity",
38
+ "label": "Antigravity",
39
+ "readers": "Antigravity IDE, Antigravity CLI",
40
+ "surface": "antigravity",
41
+ "start": [
42
+ {
43
+ "scope": "project",
44
+ "path": ".agents/rules/{name}.md",
45
+ "tree": "flat",
46
+ "dir": ".agents/rules",
47
+ "suffix": ".md",
48
+ "frontmatter": {
49
+ "trigger": "always_on"
50
+ },
51
+ "atStart": true,
52
+ "why": "Antigravity rules docs: trigger is one of always_on, model_decision, glob, manual; model_decision injects only the path and description"
53
+ },
54
+ {
55
+ "scope": "project",
56
+ "path": "AGENTS.md",
57
+ "tree": "chain",
58
+ "atStart": true,
59
+ "why": "Antigravity rules docs: AGENTS.md, GEMINI.md and .agents/AGENTS.md in the root or any subdirectory are always-on workspace rules, and they take no frontmatter"
60
+ },
61
+ {
62
+ "scope": "user",
63
+ "path": "~/.gemini/config/rules/*.md",
64
+ "tree": "flat",
65
+ "dir": ".gemini/config/rules",
66
+ "atStart": true,
67
+ "why": "Antigravity rules docs: global modular rules at ~/.gemini/config/rules/*.md, alongside ~/.gemini/AGENTS.md and ~/.gemini/config/AGENTS.md"
68
+ }
69
+ ],
70
+ "alsoReads": [
71
+ {
72
+ "what": ".agents/rules/*.md with trigger: model_decision",
73
+ "atStart": false,
74
+ "why": "Antigravity rules docs: progressive disclosure — the path and description are injected and the body is opened on demand"
75
+ },
76
+ {
77
+ "what": ".agents/rules/*.md in nested directories",
78
+ "atStart": false,
79
+ "why": "Antigravity rules docs: .agents/rules/ is scanned flat — nested files are ignored unless registered in .agents/rules.json"
80
+ }
81
+ ],
82
+ "order": "rules are cumulative across the global, workspace and directory scopes; directory scope is resolved by walking up from the edited file to the workspace root",
83
+ "cap": {
84
+ "bytes": 24000,
85
+ "scope": "file",
86
+ "config": "none — a fixed limit",
87
+ "why": "Antigravity rules docs: a rule file is truncated at 24,000 bytes, counted after @[label](path) includes are expanded"
88
+ },
89
+ "alsoCaps": [
90
+ {
91
+ "bytes": 20000,
92
+ "scope": "tokens",
93
+ "appliesTo": "global plus always_on rules combined",
94
+ "why": "Antigravity rules docs: past a 20,000-token budget the largest rules are demoted to a pointer line, \"- <path>: <description>\""
95
+ }
96
+ ],
97
+ "imports": {
98
+ "syntax": "@[label](path)",
99
+ "depth": 0,
100
+ "why": "Antigravity rules docs: @[label](path) inlines the file before the size limits are checked, with its frontmatter stripped; a bare @filename only rewrites to a canonical absolute path"
101
+ },
102
+ "nested": "cumulative — a rule applies to its directory and every subdirectory; the .agents/rules/ scan itself is flat",
103
+ "skills": [],
104
+ "skillsNote": "no skill directory is documented for Antigravity",
105
+ "hooks": {
106
+ "path": ".agents/hooks.json",
107
+ "verified": "Antigravity hooks docs: workspace level .agents/hooks.json, global ~/.gemini/config/hooks.json"
108
+ },
109
+ "agents": {
110
+ "dir": ".agents/agents",
111
+ "ext": ".md",
112
+ "verified": "Google Antigravity subagents docs (antigravity.google/docs/subagents, read 2026-10-30): project subagents are markdown files with name and description frontmatter under .agents/agents/"
113
+ },
114
+ "mcp": {
115
+ "path": ".agents/mcp_config.json",
116
+ "key": null,
117
+ "verified": "Antigravity MCP docs (read 2026-10-14): \"Configured in your workspace under .agents/mcp_config.json\""
118
+ },
119
+ "verified": "Google Antigravity rules documentation (antigravity.google/docs/rules/, read 2026-10-14) — rules are cumulative across global, workspace and directory scope; .agents/rules/*.md requires frontmatter with trigger, and an invalid block silently discards the rule; the directory is scanned flat and nested files are ignored unless registered in .agents/rules.json; each rule file is truncated at 24,000 bytes after includes are expanded, and global plus always_on rules share a 20,000-token budget past which the largest are demoted to pointers",
120
+ "note": "The flat scan is the fact that made the meter wrong before this table existed: a recursive walk of .agents/rules/ counts bytes for files Antigravity never reads."
121
+ },
122
+ "scopeKey": true,
123
+ "hooks": {
124
+ "id": "antigravity",
125
+ "event": "PreToolUse",
126
+ "matcher": "run_command|write_to_file|replace_file_content|multi_replace_file_content",
127
+ "denyExit": 0,
128
+ "verified": "antigravity.google/docs/hooks, read 2026-10-16",
129
+ "prompt": null,
130
+ "post": null,
131
+ "deny": {
132
+ "decision": "deny",
133
+ "reason": "__SIMT_TEXT__"
134
+ }
135
+ },
136
+ "payload": {
137
+ "toolKey": "toolCall",
138
+ "toolNameKey": "name",
139
+ "inputSubKey": "args",
140
+ "shellTools": [
141
+ "run_command"
142
+ ],
143
+ "commandKey": "CommandLine",
144
+ "writeTools": [
145
+ "write_to_file",
146
+ "replace_file_content",
147
+ "multi_replace_file_content"
148
+ ],
149
+ "pathKeys": [
150
+ "TargetFile"
151
+ ],
152
+ "rootKeys": [
153
+ [
154
+ "workspacePaths",
155
+ 0
156
+ ],
157
+ [
158
+ "cwd"
159
+ ]
160
+ ]
161
+ }
162
+ }
@@ -0,0 +1,206 @@
1
+ {
2
+ "id": "claude",
3
+ "loaderOrder": 2,
4
+ "surfaceOrder": 3,
5
+ "surface": {
6
+ "id": "claude",
7
+ "label": "Claude Code rules",
8
+ "readers": "Claude Code",
9
+ "primary": null,
10
+ "kind": "file",
11
+ "rule": ".claude/rules/{name}.md",
12
+ "readsAgentsMd": "some",
13
+ "readsAgentsMdNote": "CLAUDE.md is read first; AGENTS.md is read only when there is no CLAUDE.md, which is why the pointer exists",
14
+ "configDirs": [
15
+ ".claude"
16
+ ],
17
+ "documentedKeys": [
18
+ "paths",
19
+ "description"
20
+ ],
21
+ "readsPrimary": true,
22
+ "substitutions": {
23
+ "askTool": "Use the interactive `AskUserQuestion` tool"
24
+ },
25
+ "verified": "Claude Code, \"Organize rules with .claude/rules/\" — recursive discovery, symlinks supported, no `paths` loads at session start",
26
+ "note": "CLAUDE.md is a separate pointer surface (see POINTERS). A rule file without frontmatter loads eagerly, which is what an always-on rule wants."
27
+ },
28
+ "pointerOrder": 1,
29
+ "pointer": {
30
+ "id": "claude-md",
31
+ "surface": "claude",
32
+ "path": "CLAUDE.md",
33
+ "to": "AGENTS.md",
34
+ "readers": "Claude Code",
35
+ "verified": "Claude Code memory docs: \"A symlink also works\" — `ln -s AGENTS.md CLAUDE.md`; Claude reads CLAUDE.md by default and AGENTS.md only as a fallback",
36
+ "note": "Claude Code reads CLAUDE.md and ignores AGENTS.md when both exist. A pointer is what makes one file answer for both without a second copy."
37
+ },
38
+ "loader": {
39
+ "id": "claude",
40
+ "label": "Claude Code",
41
+ "readers": "Claude Code",
42
+ "surface": "claude",
43
+ "start": [
44
+ {
45
+ "scope": "project",
46
+ "path": "CLAUDE.md",
47
+ "tree": "chain",
48
+ "atStart": true,
49
+ "why": "Claude Code memory docs: CLAUDE.md and CLAUDE.local.md are discovered from the working directory and every directory above it, and all discovered files are concatenated"
50
+ },
51
+ {
52
+ "scope": "project",
53
+ "path": "CLAUDE.local.md",
54
+ "tree": "chain",
55
+ "atStart": true,
56
+ "why": "Claude Code memory docs: CLAUDE.local.md is loaded at each level, after CLAUDE.md from that level"
57
+ },
58
+ {
59
+ "scope": "project",
60
+ "path": "AGENTS.md",
61
+ "tree": "chain",
62
+ "atStart": true,
63
+ "absent": [
64
+ "CLAUDE.md",
65
+ "CLAUDE.local.md"
66
+ ],
67
+ "why": "Claude Code memory docs: AGENTS.md is read directly, but only when there is no CLAUDE.md or CLAUDE.local.md in the working directory or above it"
68
+ },
69
+ {
70
+ "scope": "project",
71
+ "path": ".claude/rules/{name}.md",
72
+ "tree": "nested",
73
+ "dir": ".claude/rules",
74
+ "suffix": ".md",
75
+ "atStart": true,
76
+ "why": "Claude Code memory docs: project rules under .claude/rules/ are discovered recursively and loaded at session start when unscoped"
77
+ },
78
+ {
79
+ "scope": "user",
80
+ "path": "~/.claude/rules/*.md",
81
+ "tree": "flat",
82
+ "dir": ".claude/rules",
83
+ "atStart": true,
84
+ "why": "Claude Code memory docs: user-level rules in ~/.claude/rules/ load before project rules"
85
+ },
86
+ {
87
+ "scope": "project",
88
+ "path": ".claude/skills/{name}/SKILL.md",
89
+ "tree": "nested",
90
+ "dir": ".claude/skills",
91
+ "suffix": "/SKILL.md",
92
+ "atStart": true,
93
+ "metadata": true,
94
+ "why": "Claude Code memory docs: skills are discovered under .claude/skills"
95
+ }
96
+ ],
97
+ "alsoReads": [
98
+ {
99
+ "what": "MEMORY.md (auto memory)",
100
+ "atStart": true,
101
+ "why": "Claude Code memory docs: auto memory loads the first 200 lines or 25 KB, whichever comes first"
102
+ }
103
+ ],
104
+ "order": "filesystem root down to the working directory, CLAUDE.md before CLAUDE.local.md at each level",
105
+ "cap": {
106
+ "bytes": 4194304,
107
+ "scope": "file",
108
+ "config": "none — a fixed limit",
109
+ "why": "Claude Code memory docs: \"Claude Code loads a CLAUDE.md file of up to 4 MiB in full and skips a larger file\""
110
+ },
111
+ "imports": {
112
+ "syntax": "@path",
113
+ "depth": 4,
114
+ "why": "Claude Code memory docs: `@path/to/import` is expanded at launch, resolved relative to the importing file, to a maximum depth of four hops; parsing skips code spans and fenced blocks, `@` inside backticks is literal, quoted paths are not imported, and an import outside the working directory prompts for approval"
115
+ },
116
+ "nested": "on demand — a subdirectory CLAUDE.md loads when Claude reads, writes or edits a file in that directory",
117
+ "skills": [
118
+ ".claude/skills"
119
+ ],
120
+ "hooks": {
121
+ "path": ".claude/settings.json",
122
+ "verified": "Claude Code hooks docs, hook locations: project settings at .claude/settings.json and .claude/settings.local.json, user settings at ~/.claude/settings.json"
123
+ },
124
+ "agents": {
125
+ "dir": ".claude/agents",
126
+ "ext": ".md",
127
+ "verified": "Claude Code subagents docs (code.claude.com/docs/en/sub-agents, read 2026-10-30): project subagents are markdown files with name and description frontmatter under .claude/agents/"
128
+ },
129
+ "mcp": {
130
+ "path": ".mcp.json",
131
+ "key": null,
132
+ "verified": "Claude Code MCP docs (read 2026-10-14): project-scoped servers live in .mcp.json in the project root; local and user scope live in ~/.claude.json"
133
+ },
134
+ "verified": "Claude Code memory docs (docs.claude.com/en/docs/claude-code/memory, read 2026-10-14) — CLAUDE.md and CLAUDE.local.md are concatenated from every directory above the working directory, subdirectory files load on demand, `@path` imports expand to four hops, a CLAUDE.md larger than 4 MiB is skipped, and AGENTS.md is read only when no CLAUDE.md exists above the working directory",
135
+ "note": "The AGENTS.md row carries an `absent` condition because the vendor documents it as one. A repository holding both files is read by Claude Code for the CLAUDE.md alone, which is why the pointer surface exists."
136
+ },
137
+ "hooks": {
138
+ "id": "claude",
139
+ "event": "PreToolUse",
140
+ "matcher": "Bash|Edit|Write|MultiEdit|NotebookEdit",
141
+ "denyExit": 2,
142
+ "verified": "docs.claude.com/en/docs/claude-code/hooks, read 2026-10-16",
143
+ "prompt": {
144
+ "event": "UserPromptSubmit",
145
+ "verified": "code.claude.com/docs/en/hooks, read 2026-10-19",
146
+ "delivery": {
147
+ "hookSpecificOutput": {
148
+ "hookEventName": "UserPromptSubmit",
149
+ "additionalContext": "__SIMT_TEXT__"
150
+ }
151
+ }
152
+ },
153
+ "post": {
154
+ "event": "PostToolUse",
155
+ "matcher": "Bash",
156
+ "verified": "code.claude.com/docs/en/hooks, read 2026-10-19",
157
+ "delivery": {
158
+ "hookSpecificOutput": {
159
+ "hookEventName": "PostToolUse",
160
+ "additionalContext": "__SIMT_TEXT__"
161
+ }
162
+ }
163
+ },
164
+ "deny": {
165
+ "hookSpecificOutput": {
166
+ "hookEventName": "PreToolUse",
167
+ "permissionDecision": "deny",
168
+ "permissionDecisionReason": "__SIMT_TEXT__"
169
+ }
170
+ }
171
+ },
172
+ "payload": {
173
+ "toolKey": "tool_name",
174
+ "inputKey": "tool_input",
175
+ "shellTools": [
176
+ "Bash"
177
+ ],
178
+ "commandKey": "command",
179
+ "writeTools": [
180
+ "Edit",
181
+ "Write",
182
+ "MultiEdit",
183
+ "NotebookEdit"
184
+ ],
185
+ "pathKeys": [
186
+ "file_path"
187
+ ],
188
+ "pathOverrides": {
189
+ "NotebookEdit": [
190
+ "notebook_path"
191
+ ]
192
+ },
193
+ "rootKeys": [
194
+ [
195
+ "cwd"
196
+ ]
197
+ ]
198
+ },
199
+ "pluginOrder": 1,
200
+ "plugin": {
201
+ "rootVar": "CLAUDE_PLUGIN_ROOT",
202
+ "projectVar": "CLAUDE_PROJECT_DIR",
203
+ "hooksPath": "hooks/hooks.json",
204
+ "runtimeDir": "."
205
+ }
206
+ }
@@ -0,0 +1,136 @@
1
+ {
2
+ "id": "codex",
3
+ "loaderOrder": 3,
4
+ "loader": {
5
+ "id": "codex",
6
+ "label": "Codex CLI",
7
+ "readers": "Codex CLI, Codex IDE extension",
8
+ "surface": null,
9
+ "start": [
10
+ {
11
+ "scope": "project",
12
+ "path": "AGENTS.override.md",
13
+ "tree": "chain",
14
+ "atStart": true,
15
+ "why": "Codex AGENTS.md docs: each directory from the project root to the working directory is checked for AGENTS.override.md first, then AGENTS.md, then the configured fallback filenames, and at most one file per directory is used"
16
+ },
17
+ {
18
+ "scope": "project",
19
+ "path": "AGENTS.md",
20
+ "tree": "chain",
21
+ "atStart": true,
22
+ "why": "Codex AGENTS.md docs: AGENTS.md is the second precedence in the same per-directory search"
23
+ },
24
+ {
25
+ "scope": "user",
26
+ "path": "~/.codex/AGENTS.override.md",
27
+ "tree": "single",
28
+ "atStart": true,
29
+ "why": "Codex AGENTS.md docs: the global file is AGENTS.override.md if non-empty, otherwise AGENTS.md; CODEX_HOME overrides the home directory"
30
+ },
31
+ {
32
+ "scope": "user",
33
+ "path": "~/.codex/AGENTS.md",
34
+ "tree": "single",
35
+ "atStart": true,
36
+ "why": "Codex AGENTS.md docs: AGENTS.md is the global fallback when AGENTS.override.md is empty or absent"
37
+ }
38
+ ],
39
+ "alsoReads": [
40
+ {
41
+ "what": "project_doc_fallback_filenames",
42
+ "atStart": true,
43
+ "why": "Codex config reference: an array of additional filenames checked per directory after AGENTS.override.md and AGENTS.md"
44
+ },
45
+ {
46
+ "what": "model_instructions_file",
47
+ "atStart": true,
48
+ "why": "Codex config reference: a file that replaces AGENTS.md as the project instructions source"
49
+ }
50
+ ],
51
+ "order": "project root down to the working directory, merged in that order and joined with blank lines",
52
+ "cap": {
53
+ "bytes": 32768,
54
+ "scope": "chain",
55
+ "config": "project_doc_max_bytes",
56
+ "why": "Codex AGENTS.md docs: empty files are skipped and Codex stops adding files once the combined size reaches project_doc_max_bytes, which defaults to 32 KiB"
57
+ },
58
+ "imports": {
59
+ "syntax": null,
60
+ "depth": 0,
61
+ "why": "no import syntax documented for AGENTS.md; a reference to another file is an instruction to the model, not an include"
62
+ },
63
+ "nested": "cumulative — every directory from the project root to the working directory is merged, and the cap applies to the merge",
64
+ "skills": [],
65
+ "skillsNote": "no skill directory is documented for Codex, so the cell is empty rather than borrowed from another reader",
66
+ "hooks": {
67
+ "path": ".codex/hooks.json",
68
+ "verified": "Codex hooks docs: <repo>/.codex/hooks.json or ~/.codex/hooks.json, or inline [hooks] tables in config.toml"
69
+ },
70
+ "agents": {
71
+ "dir": ".codex/agents",
72
+ "ext": ".toml",
73
+ "verified": "Codex custom agents docs (developers.openai.com/codex/subagents, read 2026-10-30): standalone TOML files under .codex/agents/ defining name, description and developer_instructions"
74
+ },
75
+ "mcp": {
76
+ "path": ".codex/config.toml",
77
+ "key": "mcp_servers",
78
+ "verified": "Codex MCP docs (read 2026-10-14): MCP configuration is stored in config.toml, ~/.codex/config.toml by default"
79
+ },
80
+ "verified": "Codex AGENTS.md documentation and configuration reference (developers.openai.com/codex, read 2026-10-14) — the project scope walks from the project root to the working directory, taking at most one file per directory in the order AGENTS.override.md, AGENTS.md, project_doc_fallback_filenames; the merge runs root to cwd and stops adding files at project_doc_max_bytes, 32 KiB by default",
81
+ "note": "This is the row that made the table worth building: `cap.scope` is `chain`, so a repository can be inside 32 KiB in every file and still lose the tail of its deepest instruction file to the merge."
82
+ },
83
+ "hooks": {
84
+ "id": "codex",
85
+ "event": "PreToolUse",
86
+ "matcher": "Bash|apply_patch",
87
+ "denyExit": 2,
88
+ "verified": "developers.openai.com/codex/hooks, read 2026-10-16",
89
+ "trust": "Codex skips a hook nobody has trusted: review it with /hooks, or the entry stays inert.",
90
+ "prompt": {
91
+ "event": "UserPromptSubmit",
92
+ "verified": "developers.openai.com/codex/hooks, read 2026-10-19",
93
+ "delivery": {
94
+ "hookSpecificOutput": {
95
+ "hookEventName": "UserPromptSubmit",
96
+ "additionalContext": "__SIMT_TEXT__"
97
+ }
98
+ }
99
+ },
100
+ "post": {
101
+ "event": "PostToolUse",
102
+ "matcher": "Bash",
103
+ "verified": "developers.openai.com/codex/hooks, read 2026-10-19",
104
+ "delivery": {
105
+ "hookSpecificOutput": {
106
+ "hookEventName": "PostToolUse",
107
+ "additionalContext": "__SIMT_TEXT__"
108
+ }
109
+ }
110
+ },
111
+ "deny": {
112
+ "hookSpecificOutput": {
113
+ "hookEventName": "PreToolUse",
114
+ "permissionDecision": "deny",
115
+ "permissionDecisionReason": "__SIMT_TEXT__"
116
+ }
117
+ }
118
+ },
119
+ "payload": {
120
+ "toolKey": "tool_name",
121
+ "inputKey": "tool_input",
122
+ "shellTools": [
123
+ "Bash"
124
+ ],
125
+ "commandKey": "command",
126
+ "writeTools": [
127
+ "apply_patch"
128
+ ],
129
+ "writesFrom": "patch",
130
+ "rootKeys": [
131
+ [
132
+ "cwd"
133
+ ]
134
+ ]
135
+ }
136
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "id": "copilot",
3
+ "loaderOrder": 7,
4
+ "surfaceOrder": 5,
5
+ "surface": {
6
+ "id": "copilot",
7
+ "label": "GitHub Copilot instructions",
8
+ "readers": "GitHub Copilot chat, Copilot CLI, Copilot code review, Copilot cloud agent",
9
+ "primary": null,
10
+ "kind": "file",
11
+ "rule": ".github/instructions/{name}.instructions.md",
12
+ "readsAgentsMd": "some",
13
+ "readsAgentsMdNote": "Copilot CLI reads AGENTS.md; the editor, code review and the cloud agent do not",
14
+ "configDirs": [
15
+ ".github"
16
+ ],
17
+ "documentedKeys": [
18
+ "applyTo",
19
+ "excludeAgent"
20
+ ],
21
+ "verified": "GitHub docs, \"Adding repository custom instructions\" — .github/instructions/NAME.instructions.md with applyTo globs; `applyTo: \"**\"` is the documented example, and a comma-separated pattern list is how more than one is named",
22
+ "note": "Copilot reads AGENTS.md itself through Copilot CLI, but the editor and code review do not; this is the channel they use."
23
+ },
24
+ "loader": {
25
+ "id": "copilot",
26
+ "label": "GitHub Copilot",
27
+ "readers": "Copilot CLI, Copilot chat, Copilot code review, Copilot cloud agent",
28
+ "surface": "copilot",
29
+ "start": [
30
+ {
31
+ "scope": "project",
32
+ "path": ".github/copilot-instructions.md",
33
+ "tree": "single",
34
+ "atStart": true,
35
+ "why": "GitHub Copilot docs, adding repository instructions: .github/copilot-instructions.md applies to every request in the repository"
36
+ },
37
+ {
38
+ "scope": "project",
39
+ "path": ".github/instructions/**/*.instructions.md",
40
+ "tree": "nested",
41
+ "dir": ".github/instructions",
42
+ "suffix": ".instructions.md",
43
+ "frontmatter": {
44
+ "applyTo": "**"
45
+ },
46
+ "atStart": true,
47
+ "why": "GitHub Copilot docs: a path-specific file is applied when a file matching applyTo is in context, and applyTo: \"**\" matches every file at session start"
48
+ },
49
+ {
50
+ "scope": "project",
51
+ "path": "AGENTS.md",
52
+ "tree": "chain",
53
+ "atStart": true,
54
+ "why": "GitHub Copilot docs, agent instructions: one or more AGENTS.md anywhere in the repository, the nearest to the file in play wins, or a single CLAUDE.md or GEMINI.md at the root"
55
+ }
56
+ ],
57
+ "alsoReads": [
58
+ {
59
+ "what": ".github/instructions/**/*.instructions.md",
60
+ "atStart": false,
61
+ "why": "GitHub Copilot docs: applyTo globs select the files, and excludeAgent keeps the file away from code review or the cloud agent"
62
+ }
63
+ ],
64
+ "order": "personal instructions, then repository instructions, then organization instructions",
65
+ "cap": null,
66
+ "capNote": "no byte cap published for Copilot instructions",
67
+ "imports": {
68
+ "syntax": null,
69
+ "depth": 0,
70
+ "why": "no import syntax documented for Copilot instruction files"
71
+ },
72
+ "nested": "nearest wins — AGENTS.md files anywhere in the repository are candidates and the nearest one to the file in play is used; .github/instructions/ may hold subdirectories",
73
+ "skills": [],
74
+ "skillsNote": "no project skill directory is documented for Copilot",
75
+ "hooks": null,
76
+ "hooksNote": "no hooks file is documented for Copilot in any first-party page checked on 2026-10-14",
77
+ "agents": null,
78
+ "agentsNote": "no file-based agents are documented for Copilot in any first-party page checked on 2026-10-30",
79
+ "mcp": {
80
+ "path": ".vscode/mcp.json",
81
+ "key": null,
82
+ "verified": "GitHub Copilot MCP docs (read 2026-10-14): the VS Code extension reads .vscode/mcp.json; Copilot CLI reads .mcp.json, .github/mcp.json or ~/.copilot/mcp-config.json; a repository-level configuration entered on github.com is not a file at all"
83
+ },
84
+ "verified": "GitHub Copilot documentation (docs.github.com/en/copilot, read 2026-10-14) — repository-wide instructions live at .github/copilot-instructions.md; path-specific instructions live at .github/instructions/**/NAME.instructions.md with applyTo globs and an optional excludeAgent; agent instructions are one or more AGENTS.md anywhere in the repository, nearest wins, or a single root CLAUDE.md or GEMINI.md; no byte cap is published",
85
+ "note": "Which Copilot reader consumes these differs — the cloud agent and code review are documented as reading repository and path-specific instructions — so the row is one reader with a split, the same split `surfaces.mjs` records on the copilot row."
86
+ },
87
+ "scopeKey": true
88
+ }