ctxr-cli 0.4.1 → 0.6.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/dist/adapter.d.ts +0 -1
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js.map +1 -1
  4. package/dist/adapters/builtin/index.d.ts.map +1 -1
  5. package/dist/adapters/builtin/index.js +2 -2
  6. package/dist/adapters/builtin/index.js.map +1 -1
  7. package/dist/adapters/harness/claude-code.d.ts.map +1 -1
  8. package/dist/adapters/harness/claude-code.js +30 -14
  9. package/dist/adapters/harness/claude-code.js.map +1 -1
  10. package/dist/adapters/harness/hermes-agent.d.ts +9 -0
  11. package/dist/adapters/harness/hermes-agent.d.ts.map +1 -0
  12. package/dist/adapters/harness/hermes-agent.js +13 -0
  13. package/dist/adapters/harness/hermes-agent.js.map +1 -0
  14. package/dist/adapters/types.d.ts +39 -18
  15. package/dist/adapters/types.d.ts.map +1 -1
  16. package/dist/adapters/types.js +3 -3
  17. package/dist/adapters/types.js.map +1 -1
  18. package/dist/commands/adapters-generate.d.ts +4 -2
  19. package/dist/commands/adapters-generate.d.ts.map +1 -1
  20. package/dist/commands/adapters-generate.js +14 -6
  21. package/dist/commands/adapters-generate.js.map +1 -1
  22. package/dist/commands/archive.d.ts +4 -2
  23. package/dist/commands/archive.d.ts.map +1 -1
  24. package/dist/commands/archive.js +5 -3
  25. package/dist/commands/archive.js.map +1 -1
  26. package/dist/commands/check.d.ts.map +1 -1
  27. package/dist/commands/check.js +1 -6
  28. package/dist/commands/check.js.map +1 -1
  29. package/dist/commands/init.d.ts +2 -0
  30. package/dist/commands/init.d.ts.map +1 -1
  31. package/dist/commands/init.js +132 -18
  32. package/dist/commands/init.js.map +1 -1
  33. package/dist/commands/publish-check.d.ts +23 -0
  34. package/dist/commands/publish-check.d.ts.map +1 -0
  35. package/dist/commands/publish-check.js +116 -0
  36. package/dist/commands/publish-check.js.map +1 -0
  37. package/dist/commands/publish-gather.d.ts +37 -0
  38. package/dist/commands/publish-gather.d.ts.map +1 -0
  39. package/dist/commands/publish-gather.js +92 -0
  40. package/dist/commands/publish-gather.js.map +1 -0
  41. package/dist/commands/publish-new.d.ts +18 -0
  42. package/dist/commands/publish-new.d.ts.map +1 -0
  43. package/dist/commands/publish-new.js +86 -0
  44. package/dist/commands/publish-new.js.map +1 -0
  45. package/dist/commands/rollup-write.d.ts.map +1 -1
  46. package/dist/commands/rollup-write.js +8 -0
  47. package/dist/commands/rollup-write.js.map +1 -1
  48. package/dist/commands/serve.d.ts +32 -0
  49. package/dist/commands/serve.d.ts.map +1 -0
  50. package/dist/commands/serve.js +170 -0
  51. package/dist/commands/serve.js.map +1 -0
  52. package/dist/commands/update.js +3 -3
  53. package/dist/commands/update.js.map +1 -1
  54. package/dist/commands/verify.d.ts +9 -2
  55. package/dist/commands/verify.d.ts.map +1 -1
  56. package/dist/commands/verify.js +46 -23
  57. package/dist/commands/verify.js.map +1 -1
  58. package/dist/config/defaults.d.ts +53 -15
  59. package/dist/config/defaults.d.ts.map +1 -1
  60. package/dist/config/defaults.js +54 -19
  61. package/dist/config/defaults.js.map +1 -1
  62. package/dist/config/schema.d.ts +49 -12
  63. package/dist/config/schema.d.ts.map +1 -1
  64. package/dist/config/schema.js +115 -23
  65. package/dist/config/schema.js.map +1 -1
  66. package/dist/core/agents-doc.d.ts +63 -12
  67. package/dist/core/agents-doc.d.ts.map +1 -1
  68. package/dist/core/agents-doc.js +191 -41
  69. package/dist/core/agents-doc.js.map +1 -1
  70. package/dist/core/browse/link-resolver.d.ts +12 -0
  71. package/dist/core/browse/link-resolver.d.ts.map +1 -0
  72. package/dist/core/browse/link-resolver.js +12 -0
  73. package/dist/core/browse/link-resolver.js.map +1 -0
  74. package/dist/core/browse/render.d.ts +5 -0
  75. package/dist/core/browse/render.d.ts.map +1 -0
  76. package/dist/core/browse/render.js +66 -0
  77. package/dist/core/browse/render.js.map +1 -0
  78. package/dist/core/browse/routes.d.ts +31 -0
  79. package/dist/core/browse/routes.d.ts.map +1 -0
  80. package/dist/core/browse/routes.js +56 -0
  81. package/dist/core/browse/routes.js.map +1 -0
  82. package/dist/core/browse/templates.d.ts +4 -0
  83. package/dist/core/browse/templates.d.ts.map +1 -0
  84. package/dist/core/browse/templates.js +26 -0
  85. package/dist/core/browse/templates.js.map +1 -0
  86. package/dist/core/checks/harness-portability-checks.d.ts +12 -0
  87. package/dist/core/checks/harness-portability-checks.d.ts.map +1 -0
  88. package/dist/core/checks/harness-portability-checks.js +39 -0
  89. package/dist/core/checks/harness-portability-checks.js.map +1 -0
  90. package/dist/core/checks/integrity-checks.d.ts +43 -3
  91. package/dist/core/checks/integrity-checks.d.ts.map +1 -1
  92. package/dist/core/checks/integrity-checks.js +191 -13
  93. package/dist/core/checks/integrity-checks.js.map +1 -1
  94. package/dist/core/checks/manifest.d.ts.map +1 -1
  95. package/dist/core/checks/manifest.js +2 -0
  96. package/dist/core/checks/manifest.js.map +1 -1
  97. package/dist/core/checks/organize-checks.d.ts +21 -1
  98. package/dist/core/checks/organize-checks.d.ts.map +1 -1
  99. package/dist/core/checks/organize-checks.js +64 -4
  100. package/dist/core/checks/organize-checks.js.map +1 -1
  101. package/dist/core/convention-doc.d.ts +32 -0
  102. package/dist/core/convention-doc.d.ts.map +1 -0
  103. package/dist/core/convention-doc.js +137 -0
  104. package/dist/core/convention-doc.js.map +1 -0
  105. package/dist/core/conventions.d.ts +25 -5
  106. package/dist/core/conventions.d.ts.map +1 -1
  107. package/dist/core/conventions.js +65 -3
  108. package/dist/core/conventions.js.map +1 -1
  109. package/dist/core/disclosure/model.d.ts +11 -0
  110. package/dist/core/disclosure/model.d.ts.map +1 -1
  111. package/dist/core/disclosure/model.js +24 -0
  112. package/dist/core/disclosure/model.js.map +1 -1
  113. package/dist/core/errors.d.ts +27 -41
  114. package/dist/core/errors.d.ts.map +1 -1
  115. package/dist/core/errors.js +76 -119
  116. package/dist/core/errors.js.map +1 -1
  117. package/dist/core/fs/fenced-region.d.ts +38 -0
  118. package/dist/core/fs/fenced-region.d.ts.map +1 -1
  119. package/dist/core/fs/fenced-region.js +88 -2
  120. package/dist/core/fs/fenced-region.js.map +1 -1
  121. package/dist/core/git/repo.d.ts +0 -6
  122. package/dist/core/git/repo.d.ts.map +1 -1
  123. package/dist/core/git/repo.js +0 -13
  124. package/dist/core/git/repo.js.map +1 -1
  125. package/dist/core/git/worktree.d.ts +4 -7
  126. package/dist/core/git/worktree.d.ts.map +1 -1
  127. package/dist/core/git/worktree.js +4 -10
  128. package/dist/core/git/worktree.js.map +1 -1
  129. package/dist/core/graph/model.d.ts +14 -0
  130. package/dist/core/graph/model.d.ts.map +1 -1
  131. package/dist/core/graph/model.js +30 -14
  132. package/dist/core/graph/model.js.map +1 -1
  133. package/dist/core/harness/bridge.d.ts +30 -0
  134. package/dist/core/harness/bridge.d.ts.map +1 -0
  135. package/dist/core/harness/bridge.js +178 -0
  136. package/dist/core/harness/bridge.js.map +1 -0
  137. package/dist/core/json-config-merge.d.ts.map +1 -1
  138. package/dist/core/json-config-merge.js +30 -7
  139. package/dist/core/json-config-merge.js.map +1 -1
  140. package/dist/core/migrations/archive-destination-from-taxonomy.d.ts +35 -0
  141. package/dist/core/migrations/archive-destination-from-taxonomy.d.ts.map +1 -0
  142. package/dist/core/migrations/archive-destination-from-taxonomy.js +109 -0
  143. package/dist/core/migrations/archive-destination-from-taxonomy.js.map +1 -0
  144. package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts +19 -0
  145. package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts.map +1 -0
  146. package/dist/core/migrations/drop-forge-and-workspaces-external.js +49 -0
  147. package/dist/core/migrations/drop-forge-and-workspaces-external.js.map +1 -0
  148. package/dist/core/migrations/registry.d.ts.map +1 -1
  149. package/dist/core/migrations/registry.js +10 -1
  150. package/dist/core/migrations/registry.js.map +1 -1
  151. package/dist/core/migrations/rename-conventions-path.d.ts +26 -0
  152. package/dist/core/migrations/rename-conventions-path.d.ts.map +1 -0
  153. package/dist/core/migrations/rename-conventions-path.js +86 -0
  154. package/dist/core/migrations/rename-conventions-path.js.map +1 -0
  155. package/dist/core/notes/list.d.ts.map +1 -1
  156. package/dist/core/notes/list.js +7 -3
  157. package/dist/core/notes/list.js.map +1 -1
  158. package/dist/core/publish/script-check.d.ts +12 -0
  159. package/dist/core/publish/script-check.d.ts.map +1 -0
  160. package/dist/core/publish/script-check.js +39 -0
  161. package/dist/core/publish/script-check.js.map +1 -0
  162. package/dist/core/reconcile.d.ts +3 -0
  163. package/dist/core/reconcile.d.ts.map +1 -1
  164. package/dist/core/reconcile.js +43 -6
  165. package/dist/core/reconcile.js.map +1 -1
  166. package/dist/core/rollup.d.ts +2 -2
  167. package/dist/core/rollup.d.ts.map +1 -1
  168. package/dist/core/rollup.js +24 -3
  169. package/dist/core/rollup.js.map +1 -1
  170. package/dist/core/session.d.ts +9 -9
  171. package/dist/core/session.js +9 -9
  172. package/dist/core/skills.d.ts +36 -0
  173. package/dist/core/skills.d.ts.map +1 -1
  174. package/dist/core/skills.js +154 -29
  175. package/dist/core/skills.js.map +1 -1
  176. package/dist/core/write-lifecycle/path-gate.d.ts.map +1 -1
  177. package/dist/core/write-lifecycle/path-gate.js +5 -3
  178. package/dist/core/write-lifecycle/path-gate.js.map +1 -1
  179. package/dist/prompt/inquirer-prompter.d.ts.map +1 -1
  180. package/dist/prompt/inquirer-prompter.js +11 -1
  181. package/dist/prompt/inquirer-prompter.js.map +1 -1
  182. package/dist/prompt/prompter.d.ts +16 -0
  183. package/dist/prompt/prompter.d.ts.map +1 -1
  184. package/dist/run.d.ts.map +1 -1
  185. package/dist/run.js +61 -55
  186. package/dist/run.js.map +1 -1
  187. package/dist/taxonomy/profiles.d.ts +11 -0
  188. package/dist/taxonomy/profiles.d.ts.map +1 -1
  189. package/dist/taxonomy/profiles.js +1 -0
  190. package/dist/taxonomy/profiles.js.map +1 -1
  191. package/dist/version.d.ts +1 -1
  192. package/dist/version.js +1 -1
  193. package/package.json +3 -1
  194. package/templates/agents/canonical.md +2 -8
  195. package/templates/agents/{store-conventions.md → conventions.md} +2 -4
  196. package/templates/agents/mission.md +5 -0
  197. package/templates/conventions/baseline-conventions.md +60 -0
  198. package/templates/conventions/house-conventions-seed.md +34 -0
  199. package/templates/hooks/pre-push.sh +1 -1
  200. package/templates/serve/shell.html +15 -0
  201. package/templates/serve/style.css +88 -0
  202. package/templates/skills/ctxr-land.md +32 -18
  203. package/templates/skills/ctxr-organize-audit.md +1 -1
  204. package/templates/skills/ctxr-publish.md +79 -0
  205. package/templates/skills/ctxr-session-capture.md +44 -1
  206. package/templates/skills/ctxr-session-lifecycle.md +20 -1
  207. package/templates/skills/ctxr-submit.md +15 -11
  208. package/templates/vendor/frontend-design/LICENSE.txt +177 -0
  209. package/templates/vendor/frontend-design/SKILL.md +55 -0
  210. package/templates/vendor/frontend-design/provenance.json +7 -0
  211. package/dist/adapters/forge/github.d.ts +0 -12
  212. package/dist/adapters/forge/github.d.ts.map +0 -1
  213. package/dist/adapters/forge/github.js +0 -76
  214. package/dist/adapters/forge/github.js.map +0 -1
  215. package/dist/adapters/forge/types.d.ts +0 -46
  216. package/dist/adapters/forge/types.d.ts.map +0 -1
  217. package/dist/adapters/forge/types.js +0 -2
  218. package/dist/adapters/forge/types.js.map +0 -1
  219. package/dist/commands/session-abandon.d.ts +0 -13
  220. package/dist/commands/session-abandon.d.ts.map +0 -1
  221. package/dist/commands/session-abandon.js +0 -22
  222. package/dist/commands/session-abandon.js.map +0 -1
  223. package/dist/commands/session-land.d.ts +0 -45
  224. package/dist/commands/session-land.d.ts.map +0 -1
  225. package/dist/commands/session-land.js +0 -171
  226. package/dist/commands/session-land.js.map +0 -1
  227. package/dist/commands/session-reap.d.ts +0 -22
  228. package/dist/commands/session-reap.d.ts.map +0 -1
  229. package/dist/commands/session-reap.js +0 -52
  230. package/dist/commands/session-reap.js.map +0 -1
  231. package/dist/commands/session-submit.d.ts +0 -29
  232. package/dist/commands/session-submit.d.ts.map +0 -1
  233. package/dist/commands/session-submit.js +0 -72
  234. package/dist/commands/session-submit.js.map +0 -1
  235. package/templates/agents/store-conventions-empty.md +0 -7
@@ -0,0 +1,86 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { PublishReservedSlugError, PublishSlugExistsError } from '../core/errors.js';
5
+ import { ExitCode } from '../core/exit-codes.js';
6
+ import { writeFileAtomic } from '../core/fs/atomic.js';
7
+ export const requires = { store: 'required' };
8
+ /** publish spec: reserved for frozen snapshots — a living page's slug must never collide with this shape. */
9
+ const RESERVED_SLUG_PATTERN = /^\d{4}-/;
10
+ function pageSkeleton(slug, dateCreated) {
11
+ return [
12
+ '<!doctype html>',
13
+ '<html lang="en">',
14
+ '<head>',
15
+ '<meta charset="utf-8">',
16
+ '<meta name="viewport" content="width=device-width, initial-scale=1">',
17
+ `<title>${slug}</title>`,
18
+ '<style>',
19
+ '@media print {',
20
+ ' .no-print { display: none; }',
21
+ '}',
22
+ '</style>',
23
+ '</head>',
24
+ '<body>',
25
+ `<p class="meta"><span>${dateCreated}</span> &middot; <a href="./README.md">spec</a></p>`,
26
+ '<main>',
27
+ '<!-- Build the bespoke representation here. -->',
28
+ '</main>',
29
+ '</body>',
30
+ '</html>',
31
+ '',
32
+ ].join('\n');
33
+ }
34
+ function readmeSkeleton(slug, dateCreated) {
35
+ return [
36
+ `# ${slug}`,
37
+ '',
38
+ `date-created: ${dateCreated}`,
39
+ '',
40
+ '## Intent',
41
+ '',
42
+ "One sentence: what does this page let the viewer DO that its source notes couldn't?",
43
+ '',
44
+ '## Source notes',
45
+ '',
46
+ 'Wikilinks back into the store. The notes are the source of truth; this page is a representation of them.',
47
+ '',
48
+ '## Audience & use',
49
+ '',
50
+ 'Who is this for, and in what setting will they use it?',
51
+ '',
52
+ '## Spec / prompt',
53
+ '',
54
+ 'The brief that produced index.html. Keep this so the page is regenerable.',
55
+ '',
56
+ ].join('\n');
57
+ }
58
+ /**
59
+ * publish spec: fixes a page's identity once. Refuses a slug that collides
60
+ * with the reserved dated-snapshot naming pattern, and never overwrites an
61
+ * existing page folder — the caller updates in place by editing the
62
+ * existing files directly, never by re-running this command.
63
+ */
64
+ export async function execute(store, flags) {
65
+ if (RESERVED_SLUG_PATTERN.test(flags.slug)) {
66
+ throw new PublishReservedSlugError(flags.slug);
67
+ }
68
+ const relativePath = path.join(store.config.publish.path, flags.slug).split(path.sep).join('/');
69
+ const absolutePath = path.join(store.root, relativePath);
70
+ if (existsSync(absolutePath)) {
71
+ throw new PublishSlugExistsError(flags.slug, relativePath);
72
+ }
73
+ const dateCreated = new Date().toISOString().slice(0, 10);
74
+ await mkdir(absolutePath, { recursive: true });
75
+ await writeFileAtomic(path.join(absolutePath, 'index.html'), pageSkeleton(flags.slug, dateCreated));
76
+ await writeFileAtomic(path.join(absolutePath, 'README.md'), readmeSkeleton(flags.slug, dateCreated));
77
+ return {
78
+ exitCode: ExitCode.Ok,
79
+ data: { slug: flags.slug, path: relativePath },
80
+ findings: [],
81
+ humanSummary: `Created "${relativePath}".`,
82
+ storeRoot: store.root,
83
+ schemaVersion: store.config.schema_version,
84
+ };
85
+ }
86
+ //# sourceMappingURL=publish-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-new.js","sourceRoot":"","sources":["../../src/commands/publish-new.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rollup-write.d.ts","sourceRoot":"","sources":["../../src/commands/rollup-write.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAyB1C"}
1
+ {"version":3,"file":"rollup-write.d.ts","sourceRoot":"","sources":["../../src/commands/rollup-write.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,EAAmB,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAiC1C"}
@@ -1,6 +1,7 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import { readFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
+ import { buildAgentsMissionSection } from '../core/agents-doc.js';
4
5
  import { NoteNotFoundError } from '../core/errors.js';
5
6
  import { ExitCode } from '../core/exit-codes.js';
6
7
  import { writeFileAtomic } from '../core/fs/atomic.js';
@@ -45,6 +46,13 @@ export async function execute(env, store, flags) {
45
46
  const note = await parseNote(absolutePath, relativePath);
46
47
  const frontmatter = { ...note.frontmatter, [ROLLED_UP_FIELD]: env.now().toISOString() };
47
48
  await writeFileAtomic(absolutePath, renderNoteText(frontmatter, note.body));
49
+ // inline-conventions-and-mission: a write to the configured mission path
50
+ // also refreshes AGENTS.md's inlined Mission section in this same
51
+ // operation, so the two never drift apart between this write and the
52
+ // store's next `ctxr update`.
53
+ if (relativePath === store.config.organize.mission_path) {
54
+ await buildAgentsMissionSection(store.root, store.config);
55
+ }
48
56
  }
49
57
  return {
50
58
  exitCode: ExitCode.Ok,
@@ -1 +1 @@
1
- {"version":3,"file":"rollup-write.js","sourceRoot":"","sources":["../../src/commands/rollup-write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rollup-write.js","sourceRoot":"","sources":["../../src/commands/rollup-write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { CommandOutcome, CommandRequires } from '../core/command.js';
2
+ import type { RunEnv } from '../core/env.js';
3
+ import type { Store } from '../core/store.js';
4
+ export declare const requires: CommandRequires;
5
+ export interface ServeFlags {
6
+ port: number;
7
+ host: string;
8
+ }
9
+ export interface ServeData {
10
+ url: string;
11
+ port: number;
12
+ host: string;
13
+ root: string;
14
+ }
15
+ /**
16
+ * Defaults to loopback so an invocation with no `--host` keeps today's
17
+ * behavior exactly. `--host` exists for an operator who has deliberately
18
+ * decided to put something else (a reverse proxy, a tunnel sharing this
19
+ * process's network namespace) in front and knows what binding wider than
20
+ * loopback exposes — this command still applies no requester filtering of
21
+ * its own regardless of bind address; that judgment is entirely the
22
+ * caller's.
23
+ */
24
+ export declare const DEFAULT_HOST = "127.0.0.1";
25
+ /**
26
+ * cli-contract spec (local-browsing-surface D5): resolves the moment the
27
+ * listener is ready, so `runCommand()` emits exactly one envelope before
28
+ * any request is served — the listener itself keeps the process alive
29
+ * afterward, with no change to how `run()`/`bin.ts` end.
30
+ */
31
+ export declare function execute(env: RunEnv, store: Store, flags: ServeFlags): Promise<CommandOutcome<ServeData>>;
32
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AAwIxC;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CA2B9G"}
@@ -0,0 +1,170 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { createServer } from 'node:http';
3
+ import path from 'node:path';
4
+ import { buildLinkResolver } from '../core/browse/link-resolver.js';
5
+ import { escapeHtml, renderNoteBody } from '../core/browse/render.js';
6
+ import { buildRouteTable, publishSlugs } from '../core/browse/routes.js';
7
+ import { readStylesheet, renderShell } from '../core/browse/templates.js';
8
+ import { ExitCode } from '../core/exit-codes.js';
9
+ export const requires = { store: 'required' };
10
+ /**
11
+ * Defaults to loopback so an invocation with no `--host` keeps today's
12
+ * behavior exactly. `--host` exists for an operator who has deliberately
13
+ * decided to put something else (a reverse proxy, a tunnel sharing this
14
+ * process's network namespace) in front and knows what binding wider than
15
+ * loopback exposes — this command still applies no requester filtering of
16
+ * its own regardless of bind address; that judgment is entirely the
17
+ * caller's.
18
+ */
19
+ export const DEFAULT_HOST = '127.0.0.1';
20
+ const CONTENT_TYPES = {
21
+ '.html': 'text/html; charset=utf-8',
22
+ '.css': 'text/css; charset=utf-8',
23
+ '.js': 'text/javascript; charset=utf-8',
24
+ '.mjs': 'text/javascript; charset=utf-8',
25
+ '.json': 'application/json; charset=utf-8',
26
+ '.svg': 'image/svg+xml',
27
+ '.png': 'image/png',
28
+ '.jpg': 'image/jpeg',
29
+ '.jpeg': 'image/jpeg',
30
+ '.gif': 'image/gif',
31
+ '.webp': 'image/webp',
32
+ '.ico': 'image/x-icon',
33
+ '.txt': 'text/plain; charset=utf-8',
34
+ '.md': 'text/markdown; charset=utf-8',
35
+ '.woff': 'font/woff',
36
+ '.woff2': 'font/woff2',
37
+ };
38
+ function contentTypeFor(filePath) {
39
+ return CONTENT_TYPES[path.extname(filePath).toLowerCase()] ?? 'application/octet-stream';
40
+ }
41
+ /** Requirement: an unbuilt derived artifact reports how to build it, rather than an opaque 404. */
42
+ function buildHint(command) {
43
+ return `<div class="ctxr-build-hint">Not built yet. Run <code>${escapeHtml(command)}</code> and reload.</div>`;
44
+ }
45
+ function renderIndex(table) {
46
+ const notes = [...table.notes.keys()].sort();
47
+ const catalogSections = [...table.catalog.keys()].sort();
48
+ const slugs = publishSlugs(table);
49
+ const listItems = (items, hrefFor) => items.length > 0
50
+ ? items.map((item) => `<li><a href="${hrefFor(item)}">${escapeHtml(item)}</a></li>`).join('\n')
51
+ : '<li>none yet</li>';
52
+ return [
53
+ '<h1>contexture</h1>',
54
+ `<p>${notes.length} note(s), ${catalogSections.length} catalog section(s), ${slugs.length} published page(s).</p>`,
55
+ '<h2>Notes</h2>',
56
+ `<ul class="ctxr-index">${listItems(notes, (p) => `/notes/${encodeURI(p)}`)}</ul>`,
57
+ '<h2>Catalog</h2>',
58
+ `<ul class="ctxr-index">${listItems(catalogSections, (id) => `/catalog/${encodeURIComponent(id)}`)}</ul>`,
59
+ '<h2>Graph</h2>',
60
+ '<p><a href="/graph">graph document</a></p>',
61
+ '<h2>Published pages</h2>',
62
+ `<ul class="ctxr-index">${listItems(slugs, (slug) => `/publish/${encodeURIComponent(slug)}/index.html`)}</ul>`,
63
+ ].join('\n');
64
+ }
65
+ function send(res, method, status, contentType, body) {
66
+ const buffer = Buffer.isBuffer(body) ? body : Buffer.from(body, 'utf8');
67
+ res.writeHead(status, { 'Content-Type': contentType, 'Content-Length': buffer.length });
68
+ res.end(method === 'HEAD' ? undefined : buffer);
69
+ }
70
+ /** Reads a derived document, rendering `hint` instead of 404ing when it hasn't been built yet. */
71
+ async function readDerivedDocument(absolutePath) {
72
+ try {
73
+ return { text: await readFile(absolutePath, 'utf8') };
74
+ }
75
+ catch (err) {
76
+ if (err.code === 'ENOENT')
77
+ return { hint: true };
78
+ throw err;
79
+ }
80
+ }
81
+ async function handleRequest(store, stderr, req, res) {
82
+ const method = req.method ?? 'GET';
83
+ const pathname = decodeURIComponent(new URL(req.url ?? '/', 'http://localhost').pathname);
84
+ stderr.write(`${method} ${pathname}\n`);
85
+ if (method !== 'GET' && method !== 'HEAD') {
86
+ send(res, method, 405, 'text/plain; charset=utf-8', 'method not allowed\n');
87
+ return;
88
+ }
89
+ const table = await buildRouteTable(store);
90
+ const resolveLink = buildLinkResolver([...table.notes.values()]);
91
+ if (pathname === '/') {
92
+ send(res, method, 200, 'text/html; charset=utf-8', await renderShell('contexture', renderIndex(table)));
93
+ return;
94
+ }
95
+ if (pathname === '/assets/style.css') {
96
+ send(res, method, 200, 'text/css; charset=utf-8', await readStylesheet());
97
+ return;
98
+ }
99
+ if (pathname === '/graph') {
100
+ const doc = await readDerivedDocument(table.graphDocumentPath);
101
+ const body = 'hint' in doc ? buildHint('ctxr graph build') : renderNoteBody(doc.text, resolveLink);
102
+ send(res, method, 200, 'text/html; charset=utf-8', await renderShell('graph', body));
103
+ return;
104
+ }
105
+ if (pathname.startsWith('/notes/')) {
106
+ const note = table.notes.get(pathname.slice('/notes/'.length));
107
+ if (!note) {
108
+ send(res, method, 404, 'text/plain; charset=utf-8', 'not found\n');
109
+ return;
110
+ }
111
+ send(res, method, 200, 'text/html; charset=utf-8', await renderShell(note.path, renderNoteBody(note.body, resolveLink)));
112
+ return;
113
+ }
114
+ if (pathname.startsWith('/catalog/')) {
115
+ const sectionId = pathname.slice('/catalog/'.length);
116
+ const section = table.catalog.get(sectionId);
117
+ if (!section) {
118
+ send(res, method, 404, 'text/plain; charset=utf-8', 'not found\n');
119
+ return;
120
+ }
121
+ const doc = await readDerivedDocument(section.absolutePath);
122
+ const body = 'hint' in doc ? buildHint('ctxr catalog build') : renderNoteBody(doc.text, resolveLink);
123
+ send(res, method, 200, 'text/html; charset=utf-8', await renderShell(sectionId, body));
124
+ return;
125
+ }
126
+ if (pathname.startsWith('/publish/')) {
127
+ const file = table.publishFiles.get(pathname.slice('/publish/'.length));
128
+ if (!file) {
129
+ send(res, method, 404, 'text/plain; charset=utf-8', 'not found\n');
130
+ return;
131
+ }
132
+ send(res, method, 200, contentTypeFor(file.absolutePath), await readFile(file.absolutePath));
133
+ return;
134
+ }
135
+ send(res, method, 404, 'text/plain; charset=utf-8', 'not found\n');
136
+ }
137
+ /**
138
+ * cli-contract spec (local-browsing-surface D5): resolves the moment the
139
+ * listener is ready, so `runCommand()` emits exactly one envelope before
140
+ * any request is served — the listener itself keeps the process alive
141
+ * afterward, with no change to how `run()`/`bin.ts` end.
142
+ */
143
+ export async function execute(env, store, flags) {
144
+ const server = createServer((req, res) => {
145
+ handleRequest(store, env.io.stderr, req, res).catch((err) => {
146
+ env.io.stderr.write(`serve: ${err instanceof Error ? err.message : String(err)}\n`);
147
+ if (!res.headersSent)
148
+ send(res, req.method ?? 'GET', 500, 'text/plain; charset=utf-8', 'internal error\n');
149
+ else
150
+ res.end();
151
+ });
152
+ });
153
+ const host = flags.host;
154
+ await new Promise((resolve, reject) => {
155
+ server.once('error', reject);
156
+ server.listen(flags.port, host, resolve);
157
+ });
158
+ const address = server.address();
159
+ const port = typeof address === 'object' && address !== null ? address.port : flags.port;
160
+ const url = `http://${host}:${port}/`;
161
+ return {
162
+ exitCode: ExitCode.Ok,
163
+ data: { url, port, host, root: store.root },
164
+ findings: [],
165
+ humanSummary: `serving ${store.root} at ${url}`,
166
+ storeRoot: store.root,
167
+ schemaVersion: store.config.schema_version,
168
+ };
169
+ }
170
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
@@ -10,13 +10,13 @@ export const requires = { store: 'required' };
10
10
  * touched. Idempotent: a current store reports nothing changed.
11
11
  */
12
12
  export async function execute(env, store) {
13
- const { changed } = await reconcileStore(env, store.root, store.config);
14
- const adapterFiles = await generateAdapterOutputs(store);
13
+ const { changed, findings } = await reconcileStore(env, store.root, store.config);
14
+ const adapterFiles = await generateAdapterOutputs(env.git, store);
15
15
  const all = [...new Set([...changed, ...adapterFiles.filter((f) => f.changed).map((f) => f.path)])];
16
16
  return {
17
17
  exitCode: ExitCode.Ok,
18
18
  data: { changed: all },
19
- findings: [],
19
+ findings,
20
20
  humanSummary: all.length === 0 ? 'Store is already up to date.' : `Updated ${all.length} contexture-owned file(s).`,
21
21
  storeRoot: store.root,
22
22
  schemaVersion: store.config.schema_version,
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAO/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAY;IACrD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpG,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QACtB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,MAAM,4BAA4B;QACnH,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAO/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAY;IACrD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpG,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QACtB,QAAQ;QACR,YAAY,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,MAAM,4BAA4B;QACnH,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
@@ -16,8 +16,15 @@ export interface VerifyData {
16
16
  * harness-portability spec: exercises core store operations "from an
17
17
  * environment with no harness-specific state present" — nothing here reads
18
18
  * any harness-specific file or env var, so the property under test holds
19
- * by construction; this command just runs the three named operations in
20
- * order and stops at the first failure, naming it (never running the rest).
19
+ * by construction; this command runs each named operation in order and
20
+ * stops at the first failure, naming it (never running the rest).
21
+ *
22
+ * inline-conventions-and-mission: the old "every skill has an index entry"
23
+ * check is gone along with the index itself. Portability is now verified by
24
+ * confirming every managed AGENTS.md section is present, that its inlined
25
+ * conventions/mission content matches the source files on disk (the same
26
+ * drift `ctxr doctor` checks — see `integrity-checks.ts`), and that a skill
27
+ * is reachable by path at the configured skills path.
21
28
  */
22
29
  export declare function execute(store: Store, _flags?: VerifyFlags): Promise<CommandOutcome<VerifyData>>;
23
30
  //# sourceMappingURL=verify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAU1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAMD;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAkFzG"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAoB1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CA8FzG"}
@@ -1,23 +1,36 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { agentsMdPath } from '../core/agents-doc.js';
3
+ import { AGENTS_MD_CANONICAL_FENCE, AGENTS_MD_CAPTURE_FENCE, AGENTS_MD_CONVENTIONS_FENCE, AGENTS_MD_LEG_ROUTING_FENCE, AGENTS_MD_PLACEMENT_FENCE, agentsMdPath, checkAgentsMdDrift, } from '../core/agents-doc.js';
4
4
  import { readCatalogSection } from '../core/catalog/build.js';
5
5
  import { catalogSectionsFor } from '../core/catalog/model.js';
6
6
  import { ExitCode } from '../core/exit-codes.js';
7
+ import { readFencedRegionFromFile } from '../core/fs/fenced-region.js';
7
8
  import { buildGraphFromNotes, graphBuildOptions } from '../core/graph/model.js';
8
9
  import { writeGraph } from '../core/graph/persist.js';
9
10
  import { listNotes } from '../core/notes/list.js';
10
11
  import { scanSkills } from '../core/skills.js';
11
12
  export const requires = { store: 'required' };
12
- function skillIndexEntry(name, relativePath) {
13
- return `[${name}](${relativePath})`;
14
- }
13
+ /** Every section that renders unconditionally — Mission is checked separately since it's optional. */
14
+ const ALWAYS_PRESENT_SECTIONS = [
15
+ { label: 'store fundamentals', fence: AGENTS_MD_CANONICAL_FENCE },
16
+ { label: 'retrieval routing', fence: AGENTS_MD_LEG_ROUTING_FENCE },
17
+ { label: 'capture', fence: AGENTS_MD_CAPTURE_FENCE },
18
+ { label: 'placement', fence: AGENTS_MD_PLACEMENT_FENCE },
19
+ { label: 'store conventions', fence: AGENTS_MD_CONVENTIONS_FENCE },
20
+ ];
15
21
  /**
16
22
  * harness-portability spec: exercises core store operations "from an
17
23
  * environment with no harness-specific state present" — nothing here reads
18
24
  * any harness-specific file or env var, so the property under test holds
19
- * by construction; this command just runs the three named operations in
20
- * order and stops at the first failure, naming it (never running the rest).
25
+ * by construction; this command runs each named operation in order and
26
+ * stops at the first failure, naming it (never running the rest).
27
+ *
28
+ * inline-conventions-and-mission: the old "every skill has an index entry"
29
+ * check is gone along with the index itself. Portability is now verified by
30
+ * confirming every managed AGENTS.md section is present, that its inlined
31
+ * conventions/mission content matches the source files on disk (the same
32
+ * drift `ctxr doctor` checks — see `integrity-checks.ts`), and that a skill
33
+ * is reachable by path at the configured skills path.
21
34
  */
22
35
  export async function execute(store, _flags = {}) {
23
36
  const steps = [];
@@ -51,33 +64,43 @@ export async function execute(store, _flags = {}) {
51
64
  });
52
65
  return finish(store, steps);
53
66
  }
54
- // 3. Follow one skill via the AGENTS.md index: every canonical skill
55
- // must have an index entry, and at least one must be readable.
56
- let agentsMdContent;
57
- try {
58
- agentsMdContent = await readFile(agentsMdPath(store.root), 'utf8');
67
+ // 3. Every managed AGENTS.md section is present.
68
+ for (const { label, fence } of ALWAYS_PRESENT_SECTIONS) {
69
+ const region = await readFencedRegionFromFile(agentsMdPath(store.root), fence);
70
+ if (region.length === 0) {
71
+ steps.push({
72
+ operation: `AGENTS.md section: ${label}`,
73
+ status: 'fail',
74
+ detail: `The "${label}" section is missing from AGENTS.md — run \`ctxr update\`.`,
75
+ });
76
+ return finish(store, steps);
77
+ }
59
78
  }
60
- catch (err) {
79
+ steps.push({ operation: 'AGENTS.md sections present', status: 'pass' });
80
+ // 4. Inlined conventions/mission content matches its source files.
81
+ const drift = await checkAgentsMdDrift(store.root, store.config);
82
+ if (drift.driftedConventions.length > 0) {
61
83
  steps.push({
62
- operation: 'skill index (AGENTS.md)',
84
+ operation: 'inlined conventions match source',
63
85
  status: 'fail',
64
- detail: err instanceof Error ? err.message : String(err),
86
+ detail: `AGENTS.md's "Store conventions" section no longer matches: ${drift.driftedConventions.join(', ')} — run \`ctxr update\`.`,
65
87
  });
66
88
  return finish(store, steps);
67
89
  }
68
- // entry-doc-generation spec: the index must cover every skill actually on
69
- // disk — shipped seeds and operator-added files alike.
70
- const skills = await scanSkills(store.root, store.config);
71
- for (const skill of skills) {
72
- if (!agentsMdContent.includes(skillIndexEntry(skill.title, skill.path))) {
90
+ steps.push({ operation: 'inlined conventions match source', status: 'pass' });
91
+ if (store.config.organize.mission_path) {
92
+ if (drift.driftedMission) {
73
93
  steps.push({
74
- operation: `skill index entry for "${skill.title}"`,
94
+ operation: 'inlined mission matches source',
75
95
  status: 'fail',
76
- detail: `AGENTS.md's skill index has no entry for "${skill.title}".`,
96
+ detail: `AGENTS.md's "Mission" section no longer matches "${drift.driftedMission}" — run \`ctxr update\`.`,
77
97
  });
78
98
  return finish(store, steps);
79
99
  }
100
+ steps.push({ operation: 'inlined mission matches source', status: 'pass' });
80
101
  }
102
+ // 6. Follow one skill by path at the configured skills path.
103
+ const skills = await scanSkills(store.root, store.config);
81
104
  const first = skills[0];
82
105
  if (!first) {
83
106
  steps.push({
@@ -89,11 +112,11 @@ export async function execute(store, _flags = {}) {
89
112
  }
90
113
  try {
91
114
  await readFile(path.join(store.root, first.path), 'utf8');
92
- steps.push({ operation: `follow skill "${first.title}"`, status: 'pass' });
115
+ steps.push({ operation: `follow skill "${first.title}" by path`, status: 'pass' });
93
116
  }
94
117
  catch (err) {
95
118
  steps.push({
96
- operation: `follow skill "${first.title}"`,
119
+ operation: `follow skill "${first.title}" by path`,
97
120
  status: 'fail',
98
121
  detail: err instanceof Error ? err.message : String(err),
99
122
  });
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}