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.
- package/dist/adapter.d.ts +0 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/builtin/index.d.ts.map +1 -1
- package/dist/adapters/builtin/index.js +2 -2
- package/dist/adapters/builtin/index.js.map +1 -1
- package/dist/adapters/harness/claude-code.d.ts.map +1 -1
- package/dist/adapters/harness/claude-code.js +30 -14
- package/dist/adapters/harness/claude-code.js.map +1 -1
- package/dist/adapters/harness/hermes-agent.d.ts +9 -0
- package/dist/adapters/harness/hermes-agent.d.ts.map +1 -0
- package/dist/adapters/harness/hermes-agent.js +13 -0
- package/dist/adapters/harness/hermes-agent.js.map +1 -0
- package/dist/adapters/types.d.ts +39 -18
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js +3 -3
- package/dist/adapters/types.js.map +1 -1
- package/dist/commands/adapters-generate.d.ts +4 -2
- package/dist/commands/adapters-generate.d.ts.map +1 -1
- package/dist/commands/adapters-generate.js +14 -6
- package/dist/commands/adapters-generate.js.map +1 -1
- package/dist/commands/archive.d.ts +4 -2
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +5 -3
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +1 -6
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +132 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/publish-check.d.ts +23 -0
- package/dist/commands/publish-check.d.ts.map +1 -0
- package/dist/commands/publish-check.js +116 -0
- package/dist/commands/publish-check.js.map +1 -0
- package/dist/commands/publish-gather.d.ts +37 -0
- package/dist/commands/publish-gather.d.ts.map +1 -0
- package/dist/commands/publish-gather.js +92 -0
- package/dist/commands/publish-gather.js.map +1 -0
- package/dist/commands/publish-new.d.ts +18 -0
- package/dist/commands/publish-new.d.ts.map +1 -0
- package/dist/commands/publish-new.js +86 -0
- package/dist/commands/publish-new.js.map +1 -0
- package/dist/commands/rollup-write.d.ts.map +1 -1
- package/dist/commands/rollup-write.js +8 -0
- package/dist/commands/rollup-write.js.map +1 -1
- package/dist/commands/serve.d.ts +32 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +170 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/update.js +3 -3
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.d.ts +9 -2
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +46 -23
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/defaults.d.ts +53 -15
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +54 -19
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +49 -12
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +115 -23
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agents-doc.d.ts +63 -12
- package/dist/core/agents-doc.d.ts.map +1 -1
- package/dist/core/agents-doc.js +191 -41
- package/dist/core/agents-doc.js.map +1 -1
- package/dist/core/browse/link-resolver.d.ts +12 -0
- package/dist/core/browse/link-resolver.d.ts.map +1 -0
- package/dist/core/browse/link-resolver.js +12 -0
- package/dist/core/browse/link-resolver.js.map +1 -0
- package/dist/core/browse/render.d.ts +5 -0
- package/dist/core/browse/render.d.ts.map +1 -0
- package/dist/core/browse/render.js +66 -0
- package/dist/core/browse/render.js.map +1 -0
- package/dist/core/browse/routes.d.ts +31 -0
- package/dist/core/browse/routes.d.ts.map +1 -0
- package/dist/core/browse/routes.js +56 -0
- package/dist/core/browse/routes.js.map +1 -0
- package/dist/core/browse/templates.d.ts +4 -0
- package/dist/core/browse/templates.d.ts.map +1 -0
- package/dist/core/browse/templates.js +26 -0
- package/dist/core/browse/templates.js.map +1 -0
- package/dist/core/checks/harness-portability-checks.d.ts +12 -0
- package/dist/core/checks/harness-portability-checks.d.ts.map +1 -0
- package/dist/core/checks/harness-portability-checks.js +39 -0
- package/dist/core/checks/harness-portability-checks.js.map +1 -0
- package/dist/core/checks/integrity-checks.d.ts +43 -3
- package/dist/core/checks/integrity-checks.d.ts.map +1 -1
- package/dist/core/checks/integrity-checks.js +191 -13
- package/dist/core/checks/integrity-checks.js.map +1 -1
- package/dist/core/checks/manifest.d.ts.map +1 -1
- package/dist/core/checks/manifest.js +2 -0
- package/dist/core/checks/manifest.js.map +1 -1
- package/dist/core/checks/organize-checks.d.ts +21 -1
- package/dist/core/checks/organize-checks.d.ts.map +1 -1
- package/dist/core/checks/organize-checks.js +64 -4
- package/dist/core/checks/organize-checks.js.map +1 -1
- package/dist/core/convention-doc.d.ts +32 -0
- package/dist/core/convention-doc.d.ts.map +1 -0
- package/dist/core/convention-doc.js +137 -0
- package/dist/core/convention-doc.js.map +1 -0
- package/dist/core/conventions.d.ts +25 -5
- package/dist/core/conventions.d.ts.map +1 -1
- package/dist/core/conventions.js +65 -3
- package/dist/core/conventions.js.map +1 -1
- package/dist/core/disclosure/model.d.ts +11 -0
- package/dist/core/disclosure/model.d.ts.map +1 -1
- package/dist/core/disclosure/model.js +24 -0
- package/dist/core/disclosure/model.js.map +1 -1
- package/dist/core/errors.d.ts +27 -41
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +76 -119
- package/dist/core/errors.js.map +1 -1
- package/dist/core/fs/fenced-region.d.ts +38 -0
- package/dist/core/fs/fenced-region.d.ts.map +1 -1
- package/dist/core/fs/fenced-region.js +88 -2
- package/dist/core/fs/fenced-region.js.map +1 -1
- package/dist/core/git/repo.d.ts +0 -6
- package/dist/core/git/repo.d.ts.map +1 -1
- package/dist/core/git/repo.js +0 -13
- package/dist/core/git/repo.js.map +1 -1
- package/dist/core/git/worktree.d.ts +4 -7
- package/dist/core/git/worktree.d.ts.map +1 -1
- package/dist/core/git/worktree.js +4 -10
- package/dist/core/git/worktree.js.map +1 -1
- package/dist/core/graph/model.d.ts +14 -0
- package/dist/core/graph/model.d.ts.map +1 -1
- package/dist/core/graph/model.js +30 -14
- package/dist/core/graph/model.js.map +1 -1
- package/dist/core/harness/bridge.d.ts +30 -0
- package/dist/core/harness/bridge.d.ts.map +1 -0
- package/dist/core/harness/bridge.js +178 -0
- package/dist/core/harness/bridge.js.map +1 -0
- package/dist/core/json-config-merge.d.ts.map +1 -1
- package/dist/core/json-config-merge.js +30 -7
- package/dist/core/json-config-merge.js.map +1 -1
- package/dist/core/migrations/archive-destination-from-taxonomy.d.ts +35 -0
- package/dist/core/migrations/archive-destination-from-taxonomy.d.ts.map +1 -0
- package/dist/core/migrations/archive-destination-from-taxonomy.js +109 -0
- package/dist/core/migrations/archive-destination-from-taxonomy.js.map +1 -0
- package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts +19 -0
- package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts.map +1 -0
- package/dist/core/migrations/drop-forge-and-workspaces-external.js +49 -0
- package/dist/core/migrations/drop-forge-and-workspaces-external.js.map +1 -0
- package/dist/core/migrations/registry.d.ts.map +1 -1
- package/dist/core/migrations/registry.js +10 -1
- package/dist/core/migrations/registry.js.map +1 -1
- package/dist/core/migrations/rename-conventions-path.d.ts +26 -0
- package/dist/core/migrations/rename-conventions-path.d.ts.map +1 -0
- package/dist/core/migrations/rename-conventions-path.js +86 -0
- package/dist/core/migrations/rename-conventions-path.js.map +1 -0
- package/dist/core/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +7 -3
- package/dist/core/notes/list.js.map +1 -1
- package/dist/core/publish/script-check.d.ts +12 -0
- package/dist/core/publish/script-check.d.ts.map +1 -0
- package/dist/core/publish/script-check.js +39 -0
- package/dist/core/publish/script-check.js.map +1 -0
- package/dist/core/reconcile.d.ts +3 -0
- package/dist/core/reconcile.d.ts.map +1 -1
- package/dist/core/reconcile.js +43 -6
- package/dist/core/reconcile.js.map +1 -1
- package/dist/core/rollup.d.ts +2 -2
- package/dist/core/rollup.d.ts.map +1 -1
- package/dist/core/rollup.js +24 -3
- package/dist/core/rollup.js.map +1 -1
- package/dist/core/session.d.ts +9 -9
- package/dist/core/session.js +9 -9
- package/dist/core/skills.d.ts +36 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +154 -29
- package/dist/core/skills.js.map +1 -1
- package/dist/core/write-lifecycle/path-gate.d.ts.map +1 -1
- package/dist/core/write-lifecycle/path-gate.js +5 -3
- package/dist/core/write-lifecycle/path-gate.js.map +1 -1
- package/dist/prompt/inquirer-prompter.d.ts.map +1 -1
- package/dist/prompt/inquirer-prompter.js +11 -1
- package/dist/prompt/inquirer-prompter.js.map +1 -1
- package/dist/prompt/prompter.d.ts +16 -0
- package/dist/prompt/prompter.d.ts.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +61 -55
- package/dist/run.js.map +1 -1
- package/dist/taxonomy/profiles.d.ts +11 -0
- package/dist/taxonomy/profiles.d.ts.map +1 -1
- package/dist/taxonomy/profiles.js +1 -0
- package/dist/taxonomy/profiles.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -1
- package/templates/agents/canonical.md +2 -8
- package/templates/agents/{store-conventions.md → conventions.md} +2 -4
- package/templates/agents/mission.md +5 -0
- package/templates/conventions/baseline-conventions.md +60 -0
- package/templates/conventions/house-conventions-seed.md +34 -0
- package/templates/hooks/pre-push.sh +1 -1
- package/templates/serve/shell.html +15 -0
- package/templates/serve/style.css +88 -0
- package/templates/skills/ctxr-land.md +32 -18
- package/templates/skills/ctxr-organize-audit.md +1 -1
- package/templates/skills/ctxr-publish.md +79 -0
- package/templates/skills/ctxr-session-capture.md +44 -1
- package/templates/skills/ctxr-session-lifecycle.md +20 -1
- package/templates/skills/ctxr-submit.md +15 -11
- package/templates/vendor/frontend-design/LICENSE.txt +177 -0
- package/templates/vendor/frontend-design/SKILL.md +55 -0
- package/templates/vendor/frontend-design/provenance.json +7 -0
- package/dist/adapters/forge/github.d.ts +0 -12
- package/dist/adapters/forge/github.d.ts.map +0 -1
- package/dist/adapters/forge/github.js +0 -76
- package/dist/adapters/forge/github.js.map +0 -1
- package/dist/adapters/forge/types.d.ts +0 -46
- package/dist/adapters/forge/types.d.ts.map +0 -1
- package/dist/adapters/forge/types.js +0 -2
- package/dist/adapters/forge/types.js.map +0 -1
- package/dist/commands/session-abandon.d.ts +0 -13
- package/dist/commands/session-abandon.d.ts.map +0 -1
- package/dist/commands/session-abandon.js +0 -22
- package/dist/commands/session-abandon.js.map +0 -1
- package/dist/commands/session-land.d.ts +0 -45
- package/dist/commands/session-land.d.ts.map +0 -1
- package/dist/commands/session-land.js +0 -171
- package/dist/commands/session-land.js.map +0 -1
- package/dist/commands/session-reap.d.ts +0 -22
- package/dist/commands/session-reap.d.ts.map +0 -1
- package/dist/commands/session-reap.js +0 -52
- package/dist/commands/session-reap.js.map +0 -1
- package/dist/commands/session-submit.d.ts +0 -29
- package/dist/commands/session-submit.d.ts.map +0 -1
- package/dist/commands/session-submit.js +0 -72
- package/dist/commands/session-submit.js.map +0 -1
- 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> · <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":"
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
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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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -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;
|
|
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
|
|
20
|
-
*
|
|
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;
|
|
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"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -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
|
-
|
|
13
|
-
|
|
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
|
|
20
|
-
*
|
|
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.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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: '
|
|
84
|
+
operation: 'inlined conventions match source',
|
|
63
85
|
status: 'fail',
|
|
64
|
-
detail:
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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:
|
|
94
|
+
operation: 'inlined mission matches source',
|
|
75
95
|
status: 'fail',
|
|
76
|
-
detail: `AGENTS.md's
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|