simt-dev 0.7.1 → 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 (186) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/README.md +169 -80
  3. package/docs/decisions/ADR-014-workspace-is-configuration.md +1 -1
  4. package/docs/decisions/ADR-025-a-baseline-is-a-region-in-a-file-the-repo-owns.md +1 -1
  5. package/docs/decisions/ADR-026-a-config-without-a-region-is-a-file-the-repo-owns.md +1 -1
  6. package/docs/decisions/ADR-027-the-one-gitattributes-line-that-is-neither-dangerous-nor-empty.md +1 -1
  7. package/docs/decisions/ADR-028-a-base-file-is-a-floor-so-the-disagreement-it-cannot-repair-becomes-a-check.md +1 -1
  8. package/docs/decisions/ADR-029-the-pins-a-repository-declares-are-its-own.md +1 -1
  9. package/docs/decisions/ADR-030-what-a-plan-does-not-ship-is-a-decision-with-a-record.md +1 -1
  10. package/docs/decisions/ADR-048-a-baseline-carries-only-keys-a-reader-honours.md +1 -1
  11. package/docs/decisions/ADR-082-the-tracker-override-is-a-manifest-key.md +1 -1
  12. package/docs/decisions/ADR-126-the-mcp-surface-stays-a-reader-so-there-is-no-write-path-to-build.md +68 -0
  13. package/docs/decisions/ADR-127-the-mcp-tool-list-is-written-by-hand-and-roots-is-not-asked-for.md +65 -0
  14. package/docs/decisions/ADR-128-a-research-plan-is-a-plan-and-the-tracker-reads-it.md +42 -0
  15. package/ecosystems/bun.json +6 -0
  16. package/ecosystems/cargo.json +25 -0
  17. package/ecosystems/composer.json +6 -0
  18. package/ecosystems/dart.json +24 -0
  19. package/ecosystems/deno.json +21 -0
  20. package/ecosystems/devcontainers.json +6 -0
  21. package/ecosystems/docker-compose.json +6 -0
  22. package/ecosystems/docker.json +6 -0
  23. package/ecosystems/dotnet.json +25 -0
  24. package/ecosystems/elixir.json +23 -0
  25. package/ecosystems/gitsubmodule.json +6 -0
  26. package/ecosystems/go.json +25 -0
  27. package/ecosystems/gradle.json +13 -0
  28. package/ecosystems/maven.json +23 -0
  29. package/ecosystems/node.json +25 -0
  30. package/ecosystems/python.json +20 -0
  31. package/ecosystems/ruby.json +23 -0
  32. package/ecosystems/swift.json +25 -0
  33. package/ecosystems/terraform.json +6 -0
  34. package/ecosystems/uv.json +6 -0
  35. package/harnesses/antigravity.json +162 -0
  36. package/harnesses/claude.json +206 -0
  37. package/harnesses/codex.json +136 -0
  38. package/harnesses/copilot.json +88 -0
  39. package/harnesses/cursor.json +140 -0
  40. package/harnesses/deepseek.json +99 -0
  41. package/harnesses/gemini.json +122 -0
  42. package/harnesses/opencode.json +173 -0
  43. package/package.json +3 -1
  44. package/rules/mdc/intake-questions.mdc +8 -0
  45. package/src/advice/advice.mjs +3 -2
  46. package/src/agenthooks/render.mjs +86 -180
  47. package/src/agents/render.mjs +15 -18
  48. package/src/api.mjs +7 -5
  49. package/src/argv.mjs +19 -0
  50. package/src/bench/ablate.mjs +3 -4
  51. package/src/bench/adapters.json +155 -113
  52. package/src/bench/adapters.mjs +466 -0
  53. package/src/bench/arms.mjs +333 -0
  54. package/src/bench/grade.mjs +12 -26
  55. package/src/bench/graders.mjs +42 -0
  56. package/src/bench/mine.mjs +17 -535
  57. package/src/bench/probe-ledger.mjs +149 -0
  58. package/src/bench/probes.catalog.mjs +918 -0
  59. package/src/bench/probes.mjs +15 -1037
  60. package/src/bench/render.mjs +111 -0
  61. package/src/bench/report.mjs +116 -971
  62. package/src/bench/run.mjs +164 -881
  63. package/src/bench/variants.mjs +4 -5
  64. package/src/bench/workspace.mjs +160 -0
  65. package/src/brief/assemble.mjs +11 -13
  66. package/src/ci/dependabot.mjs +25 -55
  67. package/src/commands/agent.mjs +1 -9
  68. package/src/commands/agenthook.mjs +66 -35
  69. package/src/commands/bench.mjs +2 -2
  70. package/src/commands/ci.mjs +11 -13
  71. package/src/commands/docs.mjs +88 -0
  72. package/src/commands/gate.mjs +10 -13
  73. package/src/commands/harness.mjs +3 -3
  74. package/src/commands/help.mjs +44 -3
  75. package/src/commands/hooks.mjs +20 -20
  76. package/src/commands/ignore.mjs +11 -7
  77. package/src/commands/impact.mjs +4 -8
  78. package/src/commands/index.mjs +49 -9
  79. package/src/commands/init-scan.mjs +90 -0
  80. package/src/commands/init.mjs +122 -104
  81. package/src/commands/lease.mjs +67 -18
  82. package/src/commands/map.mjs +10 -5
  83. package/src/commands/mcp.mjs +2 -17
  84. package/src/commands/repoindex.mjs +8 -8
  85. package/src/commands/rules.mjs +8 -4
  86. package/src/commands/shared.mjs +12 -16
  87. package/src/commands/skills.mjs +5 -6
  88. package/src/commands/skillscompile.mjs +3 -3
  89. package/src/commands/skillsinstall.mjs +5 -4
  90. package/src/commands/slice.mjs +199 -64
  91. package/src/commands/spec.mjs +78 -62
  92. package/src/commands/status.mjs +24 -12
  93. package/src/commands/sync.mjs +14 -14
  94. package/src/commands/tests.mjs +12 -12
  95. package/src/commands/tokens.mjs +19 -24
  96. package/src/commands/upgrade.mjs +8 -4
  97. package/src/commands/why.mjs +6 -13
  98. package/src/compare/hooksstate.mjs +2 -6
  99. package/src/compare/learn.mjs +3 -1
  100. package/src/decisions/index.mjs +3 -2
  101. package/src/docs/commands.mjs +65 -0
  102. package/src/ecosystem/records.mjs +219 -0
  103. package/src/explain.mjs +31 -0
  104. package/src/gates/index.mjs +385 -0
  105. package/src/graph/compile.mjs +8 -4
  106. package/src/graph/load.mjs +2 -1
  107. package/src/graph/spec.mjs +10 -8
  108. package/src/harness/records.mjs +143 -0
  109. package/src/hooks/capability.mjs +5 -3
  110. package/src/hooks/dispatcher.mjs +26 -32
  111. package/src/hooks/gates.mjs +12 -2
  112. package/src/hooks/resolve.mjs +2 -7
  113. package/src/hooks/where.mjs +2 -7
  114. package/src/identity.mjs +2 -11
  115. package/src/index/coverage.mjs +58 -0
  116. package/src/index/extract.mjs +6 -16
  117. package/src/index/gate.mjs +1 -1
  118. package/src/index/govern.mjs +26 -9
  119. package/src/index/impact.mjs +4 -8
  120. package/src/index/map.mjs +14 -15
  121. package/src/index/open.mjs +173 -0
  122. package/src/index/persist.mjs +224 -57
  123. package/src/index/store.mjs +82 -39
  124. package/src/index/tests.mjs +2 -6
  125. package/src/journal.mjs +16 -11
  126. package/src/kernel/card.mjs +37 -63
  127. package/src/kernel/checks.mjs +4 -10
  128. package/src/lease.mjs +102 -7
  129. package/src/ledger/index.mjs +124 -17
  130. package/src/mcp/paginate.mjs +33 -0
  131. package/src/mcp/schemas.mjs +512 -0
  132. package/src/mcp/server.mjs +49 -9
  133. package/src/mcp/tools-facts.mjs +326 -0
  134. package/src/mcp/tools-read.mjs +221 -0
  135. package/src/mcp/tools.mjs +4 -1005
  136. package/src/{bench → measure}/corpus.mjs +1 -1
  137. package/src/measure/metrics.mjs +236 -0
  138. package/src/measure/records.mjs +211 -0
  139. package/src/measure/stats.mjs +538 -0
  140. package/src/measure/task-schema.mjs +125 -0
  141. package/src/measure/tasks.mjs +69 -0
  142. package/src/memory/decide.mjs +6 -15
  143. package/src/memory/lesson-text.mjs +61 -0
  144. package/src/memory/lessons.mjs +29 -82
  145. package/src/name.mjs +7 -0
  146. package/src/output/index.mjs +122 -31
  147. package/src/packs/manage.mjs +15 -9
  148. package/src/plan/index.mjs +1 -1
  149. package/src/plugins.mjs +22 -16
  150. package/src/prbody.mjs +7 -11
  151. package/src/projection/loaders.mjs +7 -692
  152. package/src/projection/manifest.mjs +10 -435
  153. package/src/projection/mdc.mjs +7 -8
  154. package/src/projection/project.mjs +126 -221
  155. package/src/projection/region.mjs +561 -0
  156. package/src/projection/rules.mjs +16 -547
  157. package/src/projection/surfaces.mjs +43 -210
  158. package/src/projection/targets.mjs +5 -5
  159. package/src/repo-root.mjs +13 -1
  160. package/src/resolve/eval.mjs +2 -1
  161. package/src/resolve/fingerprint.mjs +0 -7
  162. package/src/resolve/resolve.mjs +1 -41
  163. package/src/review/critic.mjs +8 -12
  164. package/src/run.mjs +98 -0
  165. package/src/secrets.mjs +14 -22
  166. package/src/state/events.mjs +129 -0
  167. package/src/status-snapshot.mjs +233 -0
  168. package/src/status.mjs +2 -6
  169. package/src/sys/git.mjs +82 -0
  170. package/src/{bench/process.mjs → sys/proc.mjs} +28 -5
  171. package/src/testing/parsers.mjs +265 -0
  172. package/src/testing/patches.mjs +23 -0
  173. package/src/testing/paths.mjs +49 -0
  174. package/src/testing/runners.mjs +186 -0
  175. package/src/testing/vault.mjs +68 -0
  176. package/src/text/frontmatter.mjs +49 -0
  177. package/src/text/tokens.mjs +52 -0
  178. package/src/toolwords.mjs +1 -1
  179. package/src/util/fs.mjs +20 -0
  180. package/src/util/sort.mjs +12 -0
  181. package/src/workspace.mjs +3 -1
  182. package/src/write/plan.mjs +82 -0
  183. package/templates/plan/tracker.json +1 -0
  184. package/docs/decisions/ADR-033-three-plan-rows-closed-by-decision-not-by-authoring.md +0 -82
  185. package/docs/decisions/ADR-102-the-two-queued-review-rows-are-closed-by-ruling.md +0 -49
  186. package/src/bench/tasks.mjs +0 -36
@@ -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
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "id": "cursor",
3
+ "loaderOrder": 4,
4
+ "surfaceOrder": 2,
5
+ "surface": {
6
+ "id": "cursor",
7
+ "label": "Cursor rules",
8
+ "readers": "Cursor",
9
+ "primary": null,
10
+ "kind": "file",
11
+ "rule": ".cursor/rules/{name}.mdc",
12
+ "readsAgentsMd": "all",
13
+ "configDirs": [
14
+ ".cursor"
15
+ ],
16
+ "documentedKeys": [
17
+ "description",
18
+ "alwaysApply",
19
+ "globs"
20
+ ],
21
+ "readsPrimary": true,
22
+ "substitutions": {
23
+ "askTool": "Use the interactive `AskQuestion` tool"
24
+ },
25
+ "verified": "Cursor project rules (.cursor/rules/*.mdc, description + alwaysApply + globs); alwaysApply: false with globs is \"auto-attached when a matching file is in context\", and the docs warn that alwaysApply: false with no description is manual @-mention only",
26
+ "note": "The only surface that reads `.mdc`. Every other row here is a plain `.md` or a symlink."
27
+ },
28
+ "loader": {
29
+ "id": "cursor",
30
+ "label": "Cursor",
31
+ "readers": "Cursor",
32
+ "surface": "cursor",
33
+ "start": [
34
+ {
35
+ "scope": "project",
36
+ "path": ".cursor/rules/{name}.mdc",
37
+ "tree": "nested",
38
+ "dir": ".cursor/rules",
39
+ "suffix": ".mdc",
40
+ "frontmatter": {
41
+ "alwaysApply": "true"
42
+ },
43
+ "atStart": true,
44
+ "why": "Cursor rules docs: alwaysApply: true alone means the rule is always included; alwaysApply: false attaches on a matching file, on a description match, or only on an @-mention"
45
+ },
46
+ {
47
+ "scope": "project",
48
+ "path": "AGENTS.md",
49
+ "tree": "chain",
50
+ "atStart": true,
51
+ "why": "Cursor rules docs: AGENTS.md is supported in the project root and in subdirectories, combined with parent files, with the more specific one winning"
52
+ }
53
+ ],
54
+ "alsoReads": [
55
+ {
56
+ "what": ".cursor/rules/*.mdc with alwaysApply: false",
57
+ "atStart": false,
58
+ "why": "Cursor rules docs: globs auto-attach on a matching file, a description lets the model decide, and a rule with neither loads only on an @-mention"
59
+ },
60
+ {
61
+ "what": "team and user rules",
62
+ "atStart": true,
63
+ "why": "Cursor rules docs: precedence is Team Rules, then Project Rules, then User Rules; the latter two are configured in the app, not in a file this tool can project"
64
+ }
65
+ ],
66
+ "order": "team rules, then project rules, then user rules",
67
+ "cap": null,
68
+ "capNote": "no byte cap published; the docs recommend keeping rules under 500 lines, which is guidance and not a limit the reader enforces",
69
+ "imports": {
70
+ "syntax": null,
71
+ "depth": 0,
72
+ "why": "Cursor rules docs: an @file in a rule body is not inlined — \"the file's contents are not inlined into the prompt\""
73
+ },
74
+ "nested": "cumulative — nested AGENTS.md files are combined with their parents and the more specific one wins; .cursor/rules/ may hold folders",
75
+ "skills": [],
76
+ "skillsNote": "no project skill directory is documented for Cursor",
77
+ "hooks": {
78
+ "path": ".cursor/hooks.json",
79
+ "verified": "Cursor agent hooks docs: <project-root>/.cursor/hooks.json and ~/.cursor/hooks.json"
80
+ },
81
+ "agents": {
82
+ "dir": ".cursor/agents",
83
+ "ext": ".md",
84
+ "verified": "Cursor subagents docs (cursor.com/docs/subagents, read 2026-10-30): project subagents are markdown files with name and description frontmatter under .cursor/agents/"
85
+ },
86
+ "mcp": {
87
+ "path": ".cursor/mcp.json",
88
+ "key": null,
89
+ "verified": "Cursor MCP docs (read 2026-10-14): \"Create .cursor/mcp.json in your project\""
90
+ },
91
+ "verified": "Cursor rules documentation (cursor.com/docs/context/rules, read 2026-10-14) — only .cursor/rules/*.mdc is read, a plain .md there is ignored; alwaysApply decides whether a rule costs bytes at start; @file references in a rule body are not inlined; AGENTS.md is read in the project root and in subdirectories, combined with parents",
92
+ "note": "A rule with alwaysApply: false is listed under alsoReads rather than start, because it costs nothing until something matches."
93
+ },
94
+ "scopeKey": true,
95
+ "hooks": {
96
+ "id": "cursor",
97
+ "event": "preToolUse",
98
+ "matcher": "Shell|Write|Edit",
99
+ "denyExit": 2,
100
+ "verified": "cursor.com/docs/agent/hooks, read 2026-10-16",
101
+ "prompt": null,
102
+ "post": null,
103
+ "deny": {
104
+ "permission": "deny",
105
+ "user_message": "__SIMT_TEXT__",
106
+ "agent_message": "__SIMT_TEXT__"
107
+ }
108
+ },
109
+ "payload": {
110
+ "toolKey": "tool_name",
111
+ "inputKey": "tool_input",
112
+ "shellTools": [
113
+ "Shell"
114
+ ],
115
+ "commandKey": "command",
116
+ "writeTools": [
117
+ "Write",
118
+ "Edit"
119
+ ],
120
+ "pathKeys": [
121
+ "file_path",
122
+ "path"
123
+ ],
124
+ "rootKeys": [
125
+ [
126
+ "working_directory"
127
+ ],
128
+ [
129
+ "cwd"
130
+ ]
131
+ ]
132
+ },
133
+ "pluginOrder": 3,
134
+ "plugin": {
135
+ "rootVar": null,
136
+ "projectVar": "CURSOR_PROJECT_DIR",
137
+ "hooksPath": ".cursor/hooks.json",
138
+ "runtimeDir": ".cursor/simt"
139
+ }
140
+ }
@@ -0,0 +1,99 @@
1
+ {
2
+ "id": "deepseek",
3
+ "loaderOrder": 8,
4
+ "loader": {
5
+ "id": "deepseek",
6
+ "label": "DeepSeek harness",
7
+ "readers": "DeepSeek harness",
8
+ "surface": null,
9
+ "chainMerge": "all",
10
+ "dedupe": "trim",
11
+ "start": [
12
+ {
13
+ "scope": "project",
14
+ "path": "AGENTS.md",
15
+ "tree": "chain",
16
+ "atStart": true,
17
+ "why": "DeepSeek harness agent-instructions docs: AGENTS.md is the first base candidate in each directory from the project root down to the session working directory"
18
+ },
19
+ {
20
+ "scope": "project",
21
+ "path": "CLAUDE.md",
22
+ "tree": "chain",
23
+ "atStart": true,
24
+ "why": "DeepSeek harness agent-instructions docs: CLAUDE.md is the second base candidate and loads beside AGENTS.md unless the two are identical after trimming"
25
+ },
26
+ {
27
+ "scope": "project",
28
+ "path": "AGENTS.local.md",
29
+ "tree": "chain",
30
+ "atStart": true,
31
+ "why": "DeepSeek harness agent-instructions docs: AGENTS.local.md is a local overlay loaded after the base candidates in the same directory"
32
+ },
33
+ {
34
+ "scope": "project",
35
+ "path": "CLAUDE.local.md",
36
+ "tree": "chain",
37
+ "atStart": true,
38
+ "why": "DeepSeek harness agent-instructions docs: CLAUDE.local.md is the second local overlay, under the same per-directory trim dedup"
39
+ },
40
+ {
41
+ "scope": "user",
42
+ "path": "~/.dsh/AGENTS.md",
43
+ "tree": "single",
44
+ "atStart": true,
45
+ "why": "DeepSeek harness agent-instructions docs: the user-global file is $DSH_HOME/AGENTS.md, defaulting to ~/.dsh/AGENTS.md"
46
+ },
47
+ {
48
+ "scope": "user",
49
+ "path": "~/.agents/AGENTS.md",
50
+ "tree": "single",
51
+ "atStart": true,
52
+ "why": "DeepSeek harness agent-instructions docs: the shared agents root is $DSH_AGENTS_HOME or ~/.agents, and a copy that matches the harness-home file collapses behind it"
53
+ }
54
+ ],
55
+ "alsoReads": [
56
+ {
57
+ "what": "AGENTS.md below the session working directory",
58
+ "atStart": false,
59
+ "why": "DeepSeek harness agent-instructions docs: a successful read, write or edit that reaches a deeper directory loads that directory's instruction file on the next request; shell navigation does not"
60
+ }
61
+ ],
62
+ "order": "user-global ~/.dsh/AGENTS.md, then ~/.agents/AGENTS.md, then every project candidate from the project root down to the working directory, broad to specific; within one directory, base files then local overlays",
63
+ "cap": {
64
+ "bytes": 65536,
65
+ "scope": "chain",
66
+ "config": "maxBytes",
67
+ "drop": "broader",
68
+ "why": "DeepSeek harness agent-instructions docs: dsh-base sets maxBytes to 65536, and rendering drops whole broader files before truncating the most specific one"
69
+ },
70
+ "alsoCaps": [
71
+ {
72
+ "bytes": 1048576,
73
+ "scope": "file",
74
+ "appliesTo": "one source file before rendering",
75
+ "config": "maxSourceBytes",
76
+ "why": "DeepSeek harness agent-instructions docs: maxSourceBytes defaults to 1048576, and a larger source file is ignored rather than truncated into the chain"
77
+ }
78
+ ],
79
+ "imports": {
80
+ "syntax": null,
81
+ "depth": 0,
82
+ "why": "DeepSeek harness agent-instructions docs: @path imports are not interpreted; a reference inside an instruction file is not an include"
83
+ },
84
+ "nested": "on touch — the baseline is the root-to-cwd chain; a deeper AGENTS.md loads after a successful read, write or edit in that directory, not because the shell changed directory",
85
+ "skills": [],
86
+ "skillsNote": "the agent-instructions package does not document a project skill directory; shared agent configuration lives at ~/.agents, which is user scope and is not measured here",
87
+ "hooks": null,
88
+ "hooksNote": "DeepSeek harness hooks docs: the Claude Code and Codex bridges take an explicit configPath, and project-local hooks.json discovery is still marked TODO, so no repository path is loaded by default",
89
+ "agents": null,
90
+ "agentsNote": "no file-based agents are documented for the DeepSeek harness in any first-party page checked on 2026-10-30",
91
+ "mcp": {
92
+ "path": null,
93
+ "key": "@deepseek-ai/dsh-mcp-client",
94
+ "verified": "DeepSeek harness MCP docs: a server is a profile plugin row (@deepseek-ai/dsh-mcp-client), not a project file this tool can project"
95
+ },
96
+ "verified": "DeepSeek harness agent-instructions package (deepseek-ai/deepseek-harness packages/context/agent-instructions/README.md, read 2026-10-14) — the baseline loads ~/.dsh/AGENTS.md, ~/.agents/AGENTS.md, then AGENTS.md and CLAUDE.md plus the local overlays from the project root down to the working directory; trimmed duplicates in one directory collapse; dsh-base caps the rendered baseline at 65536 bytes and ignores a source file over 1048576 bytes",
97
+ "note": "A drifted CLAUDE.md beside AGENTS.md is loaded in full. A symlink or a byte-identical copy is not. That is why this reader does not share Codex's one-file-per-directory rule."
98
+ }
99
+ }