ctxr-cli 0.8.0 → 0.10.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/README.md +313 -22
- package/dist/adapters/types.d.ts +0 -5
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/commands/adapters-generate.d.ts.map +1 -1
- package/dist/commands/adapters-generate.js +2 -3
- package/dist/commands/adapters-generate.js.map +1 -1
- package/dist/commands/context-gather.d.ts +22 -0
- package/dist/commands/context-gather.d.ts.map +1 -0
- package/dist/commands/context-gather.js +36 -0
- package/dist/commands/context-gather.js.map +1 -0
- package/dist/commands/graph-query.d.ts.map +1 -1
- package/dist/commands/graph-query.js +6 -8
- package/dist/commands/graph-query.js.map +1 -1
- package/dist/commands/ingest.d.ts +22 -9
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +86 -24
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/publish-check.d.ts.map +1 -1
- package/dist/commands/publish-check.js +8 -0
- package/dist/commands/publish-check.js.map +1 -1
- package/dist/commands/publish-new.d.ts.map +1 -1
- package/dist/commands/publish-new.js +15 -0
- package/dist/commands/publish-new.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +33 -11
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +9 -1
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/source-check.d.ts.map +1 -1
- package/dist/commands/source-check.js +52 -9
- package/dist/commands/source-check.js.map +1 -1
- package/dist/commands/source-stamp.d.ts +6 -5
- package/dist/commands/source-stamp.d.ts.map +1 -1
- package/dist/commands/source-stamp.js +8 -7
- package/dist/commands/source-stamp.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +7 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/verify.d.ts +11 -2
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +86 -5
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/version.d.ts +31 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +87 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config/defaults.d.ts +113 -4
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +83 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/load.d.ts +2 -2
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +13 -3
- package/dist/config/load.js.map +1 -1
- package/dist/config/render.d.ts +5 -0
- package/dist/config/render.d.ts.map +1 -1
- package/dist/config/render.js +62 -3
- package/dist/config/render.js.map +1 -1
- package/dist/config/schema.d.ts +47 -76
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +171 -134
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agents-doc.d.ts.map +1 -1
- package/dist/core/agents-doc.js +4 -1
- package/dist/core/agents-doc.js.map +1 -1
- package/dist/core/browse/nav.d.ts.map +1 -1
- package/dist/core/browse/nav.js +4 -1
- package/dist/core/browse/nav.js.map +1 -1
- package/dist/core/browse/preferences.d.ts +26 -0
- package/dist/core/browse/preferences.d.ts.map +1 -0
- package/dist/core/browse/preferences.js +74 -0
- package/dist/core/browse/preferences.js.map +1 -0
- package/dist/core/browse/routes.d.ts +10 -8
- package/dist/core/browse/routes.d.ts.map +1 -1
- package/dist/core/browse/routes.js +113 -24
- package/dist/core/browse/routes.js.map +1 -1
- package/dist/core/browse/templates.d.ts +14 -4
- package/dist/core/browse/templates.d.ts.map +1 -1
- package/dist/core/browse/templates.js +22 -4
- package/dist/core/browse/templates.js.map +1 -1
- package/dist/core/checks/harness-portability-checks.d.ts +22 -1
- package/dist/core/checks/harness-portability-checks.d.ts.map +1 -1
- package/dist/core/checks/harness-portability-checks.js +48 -4
- package/dist/core/checks/harness-portability-checks.js.map +1 -1
- package/dist/core/checks/integrity-checks.d.ts +0 -2
- package/dist/core/checks/integrity-checks.d.ts.map +1 -1
- package/dist/core/checks/integrity-checks.js +2 -27
- 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 +11 -1
- package/dist/core/checks/organize-checks.d.ts.map +1 -1
- package/dist/core/checks/organize-checks.js +42 -12
- package/dist/core/checks/organize-checks.js.map +1 -1
- package/dist/core/checks/retrieval-checks.d.ts +9 -0
- package/dist/core/checks/retrieval-checks.d.ts.map +1 -0
- package/dist/core/checks/retrieval-checks.js +30 -0
- package/dist/core/checks/retrieval-checks.js.map +1 -0
- package/dist/core/command.d.ts +6 -0
- package/dist/core/command.d.ts.map +1 -1
- package/dist/core/content/canonicalize.d.ts +10 -0
- package/dist/core/content/canonicalize.d.ts.map +1 -1
- package/dist/core/content/canonicalize.js +12 -0
- package/dist/core/content/canonicalize.js.map +1 -1
- package/dist/core/env.d.ts +5 -0
- package/dist/core/env.d.ts.map +1 -1
- package/dist/core/env.js +3 -0
- package/dist/core/env.js.map +1 -1
- package/dist/core/environment/probe.d.ts +12 -0
- package/dist/core/environment/probe.d.ts.map +1 -0
- package/dist/core/environment/probe.js +36 -0
- package/dist/core/environment/probe.js.map +1 -0
- package/dist/core/errors.d.ts +32 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +81 -3
- package/dist/core/errors.js.map +1 -1
- package/dist/core/fs/prefix.d.ts +13 -0
- package/dist/core/fs/prefix.d.ts.map +1 -0
- package/dist/core/fs/prefix.js +22 -0
- package/dist/core/fs/prefix.js.map +1 -0
- package/dist/core/git/worktree.d.ts +22 -0
- package/dist/core/git/worktree.d.ts.map +1 -1
- package/dist/core/git/worktree.js +34 -0
- package/dist/core/git/worktree.js.map +1 -1
- package/dist/core/graph/persist.d.ts +13 -0
- package/dist/core/graph/persist.d.ts.map +1 -1
- package/dist/core/graph/persist.js +24 -0
- package/dist/core/graph/persist.js.map +1 -1
- package/dist/core/harness/isolated-run.d.ts +52 -0
- package/dist/core/harness/isolated-run.d.ts.map +1 -0
- package/dist/core/harness/isolated-run.js +100 -0
- package/dist/core/harness/isolated-run.js.map +1 -0
- package/dist/core/hooks.d.ts +3 -12
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/hooks.js +24 -20
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/ingest/capture-hash.d.ts +16 -0
- package/dist/core/ingest/capture-hash.d.ts.map +1 -0
- package/dist/core/ingest/capture-hash.js +34 -0
- package/dist/core/ingest/capture-hash.js.map +1 -0
- package/dist/core/ingest/identity.d.ts +7 -1
- package/dist/core/ingest/identity.d.ts.map +1 -1
- package/dist/core/ingest/identity.js +16 -1
- package/dist/core/ingest/identity.js.map +1 -1
- package/dist/core/ingest/model.d.ts +17 -2
- package/dist/core/ingest/model.d.ts.map +1 -1
- package/dist/core/ingest/model.js +5 -0
- package/dist/core/ingest/model.js.map +1 -1
- package/dist/core/install-kind.d.ts +25 -0
- package/dist/core/install-kind.d.ts.map +1 -0
- package/dist/core/install-kind.js +56 -0
- package/dist/core/install-kind.js.map +1 -0
- package/dist/core/notes/list.d.ts +20 -0
- package/dist/core/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +27 -6
- package/dist/core/notes/list.js.map +1 -1
- package/dist/core/publish/script-check.d.ts +5 -2
- package/dist/core/publish/script-check.d.ts.map +1 -1
- package/dist/core/publish/script-check.js +5 -2
- package/dist/core/publish/script-check.js.map +1 -1
- package/dist/core/records.d.ts +7 -0
- package/dist/core/records.d.ts.map +1 -1
- package/dist/core/records.js +12 -2
- package/dist/core/records.js.map +1 -1
- package/dist/core/registry.d.ts +40 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +55 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/retrieval/pass.d.ts +66 -0
- package/dist/core/retrieval/pass.d.ts.map +1 -0
- package/dist/core/retrieval/pass.js +171 -0
- package/dist/core/retrieval/pass.js.map +1 -0
- package/dist/core/root.d.ts +11 -5
- package/dist/core/root.d.ts.map +1 -1
- package/dist/core/root.js +20 -8
- package/dist/core/root.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +7 -0
- package/dist/core/skills.js.map +1 -1
- package/dist/core/version-check.d.ts +63 -0
- package/dist/core/version-check.d.ts.map +1 -0
- package/dist/core/version-check.js +181 -0
- package/dist/core/version-check.js.map +1 -0
- package/dist/core/write-lifecycle/path-gate.d.ts +2 -2
- package/dist/core/write-lifecycle/path-gate.d.ts.map +1 -1
- package/dist/core/write-lifecycle/path-gate.js +9 -10
- package/dist/core/write-lifecycle/path-gate.js.map +1 -1
- package/dist/run.d.ts +1 -6
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +76 -19
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +8 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +8 -1
- package/dist/version.js.map +1 -1
- package/package.json +12 -4
- package/templates/agents/canonical.md +1 -1
- package/templates/agents/capture-and-ingest.md +27 -8
- package/templates/agents/retrieval-leg-routing.md +34 -8
- package/templates/hooks/_resolve-ctxr.sh +37 -0
- package/templates/hooks/claude-code-write-gate.sh +34 -6
- package/templates/hooks/pre-commit.sh +15 -8
- package/templates/serve/shell.html +16 -2
- package/templates/serve/style.css +145 -3
- package/templates/skills/ctxr-connection-finding.md +7 -5
- package/templates/skills/ctxr-ingest-orchestration.md +15 -9
- package/templates/skills/ctxr-publish.md +7 -8
- package/templates/skills/ctxr-session-lifecycle.md +20 -0
- package/templates/skills/ctxr-upgrade.md +44 -0
- package/dist/commands/migrate.d.ts +0 -30
- package/dist/commands/migrate.d.ts.map +0 -1
- package/dist/commands/migrate.js +0 -56
- package/dist/commands/migrate.js.map +0 -1
- package/dist/core/migrations/add-explanation-craft-skill.d.ts +0 -26
- package/dist/core/migrations/add-explanation-craft-skill.d.ts.map +0 -1
- package/dist/core/migrations/add-explanation-craft-skill.js +0 -94
- package/dist/core/migrations/add-explanation-craft-skill.js.map +0 -1
- package/dist/core/migrations/archive-destination-from-taxonomy.d.ts +0 -35
- package/dist/core/migrations/archive-destination-from-taxonomy.d.ts.map +0 -1
- package/dist/core/migrations/archive-destination-from-taxonomy.js +0 -109
- package/dist/core/migrations/archive-destination-from-taxonomy.js.map +0 -1
- package/dist/core/migrations/drop-access-axes.d.ts +0 -24
- package/dist/core/migrations/drop-access-axes.d.ts.map +0 -1
- package/dist/core/migrations/drop-access-axes.js +0 -54
- package/dist/core/migrations/drop-access-axes.js.map +0 -1
- package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts +0 -19
- package/dist/core/migrations/drop-forge-and-workspaces-external.d.ts.map +0 -1
- package/dist/core/migrations/drop-forge-and-workspaces-external.js +0 -49
- package/dist/core/migrations/drop-forge-and-workspaces-external.js.map +0 -1
- package/dist/core/migrations/registry.d.ts +0 -16
- package/dist/core/migrations/registry.d.ts.map +0 -1
- package/dist/core/migrations/registry.js +0 -30
- package/dist/core/migrations/registry.js.map +0 -1
- package/dist/core/migrations/rename-conventions-path.d.ts +0 -26
- package/dist/core/migrations/rename-conventions-path.d.ts.map +0 -1
- package/dist/core/migrations/rename-conventions-path.js +0 -86
- package/dist/core/migrations/rename-conventions-path.js.map +0 -1
- package/dist/core/migrations/rename-procedures-path.d.ts +0 -17
- package/dist/core/migrations/rename-procedures-path.d.ts.map +0 -1
- package/dist/core/migrations/rename-procedures-path.js +0 -45
- package/dist/core/migrations/rename-procedures-path.js.map +0 -1
- package/dist/core/migrations/types.d.ts +0 -27
- package/dist/core/migrations/types.d.ts.map +0 -1
- package/dist/core/migrations/types.js +0 -2
- package/dist/core/migrations/types.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-check.d.ts","sourceRoot":"","sources":["../../src/commands/source-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"source-check.d.ts","sourceRoot":"","sources":["../../src/commands/source-check.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,EAA4C,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE3G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAqDnE;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAkC1C"}
|
|
@@ -1,15 +1,60 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
1
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
2
|
+
import { hashOfCapture } from '../core/ingest/capture-hash.js';
|
|
4
3
|
import { NoteNotFoundError } from '../core/errors.js';
|
|
5
4
|
import { ExitCode } from '../core/exit-codes.js';
|
|
5
|
+
import { hasAssignedIdentity } from '../core/ingest/identity.js';
|
|
6
6
|
import { evaluateSourceCheck } from '../core/ingest/model.js';
|
|
7
|
-
import { listNotes } from '../core/notes/list.js';
|
|
7
|
+
import { listCaptures, listNotes } from '../core/notes/list.js';
|
|
8
8
|
export const requires = { store: 'required' };
|
|
9
9
|
function toStoreRelativePath(env, store, givenPath) {
|
|
10
10
|
const absolute = path.isAbsolute(givenPath) ? givenPath : path.resolve(env.cwd, givenPath);
|
|
11
11
|
return path.relative(store.root, absolute).split(path.sep).join('/');
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* retain-captures-as-provenance: the index is the union of the capture tier
|
|
15
|
+
* and the notes still carrying identity from before it existed. `listNotes`
|
|
16
|
+
* alone would return nothing at all, since the capture root is a declared
|
|
17
|
+
* retrieval exclusion. This includes the candidate itself — see
|
|
18
|
+
* `excludeUnassignedCandidate`, applied by the caller, for whether and when
|
|
19
|
+
* that self-record is removed before evaluation.
|
|
20
|
+
*/
|
|
21
|
+
async function identityRecords(store) {
|
|
22
|
+
const [captures, notes] = await Promise.all([
|
|
23
|
+
listCaptures(store.root, store.config),
|
|
24
|
+
listNotes(store.root, store.config),
|
|
25
|
+
]);
|
|
26
|
+
// One file is one record. A store that has not (yet) excluded its capture
|
|
27
|
+
// root would otherwise have every capture enumerated twice, and two records
|
|
28
|
+
// sharing a source-id is exactly the `multiple_matches` refusal — a config
|
|
29
|
+
// gap must not read as an ambiguity in the material.
|
|
30
|
+
const byPath = new Map();
|
|
31
|
+
for (const record of [...captures, ...notes])
|
|
32
|
+
byPath.set(record.path, record);
|
|
33
|
+
return [...byPath.values()];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* exclude-candidate-from-source-check: the candidate is always present in
|
|
37
|
+
* `identityRecords()`'s result (it is itself a capture or a note), so
|
|
38
|
+
* without this it is always a candidate for matching itself. Whether that
|
|
39
|
+
* self-match is a bug depends on whether the candidate has been assigned
|
|
40
|
+
* identity by ingest (`source_hash` or `ingested` present):
|
|
41
|
+
*
|
|
42
|
+
* - Not assigned: a capture pipeline is permitted to pre-know its own
|
|
43
|
+
* `source_type`/`source_id` at capture time, before it has ever been
|
|
44
|
+
* ingested. Matching it against itself would report `already_ingested`
|
|
45
|
+
* for material that has never been ingested — the candidate is excluded.
|
|
46
|
+
* - Already assigned: the candidate genuinely has been ingested (or
|
|
47
|
+
* stamped). Re-checking it against its own identity is a legitimate
|
|
48
|
+
* question — "has this been ingested?" — and the honest answer is yes,
|
|
49
|
+
* naming itself. It stays in the comparison set.
|
|
50
|
+
*/
|
|
51
|
+
function excludeUnassignedCandidate(records, candidatePath) {
|
|
52
|
+
const candidate = records.find((record) => record.path === candidatePath);
|
|
53
|
+
if (candidate && !hasAssignedIdentity(candidate)) {
|
|
54
|
+
return records.filter((record) => record.path !== candidatePath);
|
|
55
|
+
}
|
|
56
|
+
return [...records];
|
|
57
|
+
}
|
|
13
58
|
/**
|
|
14
59
|
* context-ingest spec: evaluate, in order, source-id match then content-
|
|
15
60
|
* hash match, never proceeding past a stage with more than one match. Only
|
|
@@ -19,19 +64,17 @@ function toStoreRelativePath(env, store, givenPath) {
|
|
|
19
64
|
*/
|
|
20
65
|
export async function execute(env, store, flags) {
|
|
21
66
|
const relativePath = toStoreRelativePath(env, store, flags.path);
|
|
22
|
-
|
|
23
|
-
let raw;
|
|
67
|
+
let hash;
|
|
24
68
|
try {
|
|
25
|
-
|
|
69
|
+
({ hash } = await hashOfCapture(store.root, relativePath));
|
|
26
70
|
}
|
|
27
71
|
catch (err) {
|
|
28
72
|
if (err.code === 'ENOENT')
|
|
29
73
|
throw new NoteNotFoundError(relativePath);
|
|
30
74
|
throw err;
|
|
31
75
|
}
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const result = evaluateSourceCheck(notes, hash, flags.sourceId, store.config.ingest.tracking_params);
|
|
76
|
+
const records = excludeUnassignedCandidate(await identityRecords(store), relativePath);
|
|
77
|
+
const result = evaluateSourceCheck(records, hash, flags.sourceId, store.config.ingest.tracking_params);
|
|
35
78
|
const findings = result.verdict === 'multiple_matches'
|
|
36
79
|
? [
|
|
37
80
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-check.js","sourceRoot":"","sources":["../../src/commands/source-check.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"source-check.js","sourceRoot":"","sources":["../../src/commands/source-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,12 @@ export interface SourceStampData {
|
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* context-ingest spec (store-primitives-from-migration-audit D2): records
|
|
17
|
-
* source identity on a
|
|
18
|
-
* a legacy note that predates identity fields,
|
|
19
|
-
*
|
|
20
|
-
* defaults to the
|
|
21
|
-
*
|
|
17
|
+
* source identity on a record directly — the opportunistic-backfill path for
|
|
18
|
+
* a legacy note that predates identity fields, a capture an operator filed by
|
|
19
|
+
* hand, or anything else dedupe should recognize without re-running full
|
|
20
|
+
* ingest. `--hash` defaults to the record's CURRENT content hash, computed by
|
|
21
|
+
* the same sidecar-aware primitive `ingest` uses, so stamping a sidecar
|
|
22
|
+
* records its subject's bytes rather than its own prose.
|
|
22
23
|
*/
|
|
23
24
|
export declare function execute(env: RunEnv, store: Store, flags: SourceStampFlags): Promise<CommandOutcome<SourceStampData>>;
|
|
24
25
|
//# sourceMappingURL=source-stamp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-stamp.d.ts","sourceRoot":"","sources":["../../src/commands/source-stamp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD
|
|
1
|
+
{"version":3,"file":"source-stamp.d.ts","sourceRoot":"","sources":["../../src/commands/source-stamp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD;;;;;;;;GAQG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAwB1H"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { hashOfCapture } from '../core/ingest/capture-hash.js';
|
|
3
3
|
import { NoteNotFoundError } from '../core/errors.js';
|
|
4
4
|
import { ExitCode } from '../core/exit-codes.js';
|
|
5
5
|
import { writeFileAtomic } from '../core/fs/atomic.js';
|
|
@@ -13,11 +13,12 @@ function toStoreRelativePath(env, store, givenPath) {
|
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* context-ingest spec (store-primitives-from-migration-audit D2): records
|
|
16
|
-
* source identity on a
|
|
17
|
-
* a legacy note that predates identity fields,
|
|
18
|
-
*
|
|
19
|
-
* defaults to the
|
|
20
|
-
*
|
|
16
|
+
* source identity on a record directly — the opportunistic-backfill path for
|
|
17
|
+
* a legacy note that predates identity fields, a capture an operator filed by
|
|
18
|
+
* hand, or anything else dedupe should recognize without re-running full
|
|
19
|
+
* ingest. `--hash` defaults to the record's CURRENT content hash, computed by
|
|
20
|
+
* the same sidecar-aware primitive `ingest` uses, so stamping a sidecar
|
|
21
|
+
* records its subject's bytes rather than its own prose.
|
|
21
22
|
*/
|
|
22
23
|
export async function execute(env, store, flags) {
|
|
23
24
|
const relativePath = toStoreRelativePath(env, store, flags.path);
|
|
@@ -31,7 +32,7 @@ export async function execute(env, store, flags) {
|
|
|
31
32
|
throw new NoteNotFoundError(relativePath);
|
|
32
33
|
throw err;
|
|
33
34
|
}
|
|
34
|
-
const sourceHash = flags.hash ??
|
|
35
|
+
const sourceHash = flags.hash ?? (await hashOfCapture(store.root, relativePath)).hash;
|
|
35
36
|
const frontmatter = { ...note.frontmatter, [SOURCE_ID_FIELD]: flags.id, [SOURCE_HASH_FIELD]: sourceHash };
|
|
36
37
|
await writeFileAtomic(absolutePath, renderNoteText(frontmatter, note.body));
|
|
37
38
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-stamp.js","sourceRoot":"","sources":["../../src/commands/source-stamp.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"source-stamp.js","sourceRoot":"","sources":["../../src/commands/source-stamp.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,MAAM,CAAC,MAAM,QAAQ,GAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAc/D,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAY,EAAE,SAAiB;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAY,EAAE,KAAuB;IAC9E,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEzD,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAChG,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC;IAC1G,MAAM,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5E,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE;QAC5D,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,YAAY,YAAY,kBAAkB,KAAK,CAAC,EAAE,IAAI;QACpE,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAI9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,uGAAuG;IACvG,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAmB5F"}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ExitCode } from '../core/exit-codes.js';
|
|
2
2
|
import { reconcileStore } from '../core/reconcile.js';
|
|
3
|
+
import { updateAdvisory } from '../core/version-check.js';
|
|
3
4
|
import { generateAdapterOutputs } from './adapters-generate.js';
|
|
4
5
|
export const requires = { store: 'required' };
|
|
5
6
|
/**
|
|
@@ -13,10 +14,15 @@ export async function execute(env, store) {
|
|
|
13
14
|
const { changed, findings } = await reconcileStore(env, store.root, store.config);
|
|
14
15
|
const adapterFiles = await generateAdapterOutputs(env.git, store);
|
|
15
16
|
const all = [...new Set([...changed, ...adapterFiles.filter((f) => f.changed).map((f) => f.path)])];
|
|
17
|
+
// cli-contract: the human path for the release advisory. This is the command
|
|
18
|
+
// someone runs right AFTER upgrading, so "you have not upgraded" is at its
|
|
19
|
+
// most actionable here. It never changes this command's exit code.
|
|
20
|
+
const advisory = await updateAdvisory(env, store);
|
|
16
21
|
return {
|
|
17
22
|
exitCode: ExitCode.Ok,
|
|
18
23
|
data: { changed: all },
|
|
19
|
-
findings,
|
|
24
|
+
findings: [...findings, ...advisory.findings],
|
|
25
|
+
notices: advisory.notice ? [advisory.notice] : undefined,
|
|
20
26
|
humanSummary: all.length === 0 ? 'Store is already up to date.' : `Updated ${all.length} contexture-owned file(s).`,
|
|
21
27
|
storeRoot: store.root,
|
|
22
28
|
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,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;
|
|
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,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,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,6EAA6E;IAC7E,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAElD,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QACtB,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC7C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,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,4 +1,5 @@
|
|
|
1
1
|
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { RunEnv } from '../core/env.js';
|
|
2
3
|
import type { Store } from '../core/store.js';
|
|
3
4
|
export declare const requires: CommandRequires;
|
|
4
5
|
export interface VerifyFlags {
|
|
@@ -6,11 +7,19 @@ export interface VerifyFlags {
|
|
|
6
7
|
}
|
|
7
8
|
export interface VerifyStepResult {
|
|
8
9
|
operation: string;
|
|
9
|
-
|
|
10
|
+
/**
|
|
11
|
+
* isolate-the-portability-test: `skip` is reported when an operation has
|
|
12
|
+
* nothing to exercise in this store — a conditional artifact that is not
|
|
13
|
+
* configured. Only `fail` decides the exit code, so a skipped step is
|
|
14
|
+
* visible in the envelope without ever changing the verdict.
|
|
15
|
+
*/
|
|
16
|
+
status: 'pass' | 'fail' | 'skip';
|
|
10
17
|
detail?: string;
|
|
11
18
|
}
|
|
12
19
|
export interface VerifyData {
|
|
13
20
|
steps: VerifyStepResult[];
|
|
21
|
+
/** Present only in portable mode: the commit the disposable checkout was made from. */
|
|
22
|
+
commit?: string;
|
|
14
23
|
}
|
|
15
24
|
/**
|
|
16
25
|
* harness-portability spec: exercises core store operations "from an
|
|
@@ -26,5 +35,5 @@ export interface VerifyData {
|
|
|
26
35
|
* drift `ctxr doctor` checks — see `integrity-checks.ts`), and that a skill
|
|
27
36
|
* is reachable by path at the configured skills path.
|
|
28
37
|
*/
|
|
29
|
-
export declare function execute(store: Store,
|
|
38
|
+
export declare function execute(env: RunEnv, store: Store, flags?: VerifyFlags): Promise<CommandOutcome<VerifyData>>;
|
|
30
39
|
//# 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;AAsB1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,eAAO,MAAM,QAAQ,EAAE,eAAuC,CAAC;AAS/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CA6HrH"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -8,8 +8,19 @@ import { readFencedRegionFromFile } from '../core/fs/fenced-region.js';
|
|
|
8
8
|
import { buildGraphFromNotes, graphBuildOptions } from '../core/graph/model.js';
|
|
9
9
|
import { writeGraph } from '../core/graph/persist.js';
|
|
10
10
|
import { listNotes } from '../core/notes/list.js';
|
|
11
|
+
import { resolveOnPath } from '../core/environment/probe.js';
|
|
11
12
|
import { scanSkills } from '../core/skills.js';
|
|
13
|
+
import { sanctionedPath } from '../core/write-lifecycle/path-gate.js';
|
|
14
|
+
import { NoCommitToVerifyError } from '../core/errors.js';
|
|
15
|
+
import { runIsolatedVerify } from '../core/harness/isolated-run.js';
|
|
16
|
+
import { resolveHead } from '../core/git/worktree.js';
|
|
12
17
|
export const requires = { store: 'required' };
|
|
18
|
+
/**
|
|
19
|
+
* The tool `templates/skills/ctxr-submit.md` and `ctxr-land.md` drive. Hardcoded
|
|
20
|
+
* on purpose: accepting a tool name from configuration would let a store point
|
|
21
|
+
* the check at something it knows is present (D4).
|
|
22
|
+
*/
|
|
23
|
+
const WRITE_PATH_TOOL = 'gh';
|
|
13
24
|
/** Every section that renders unconditionally — Mission is checked separately since it's optional. */
|
|
14
25
|
const ALWAYS_PRESENT_SECTIONS = [
|
|
15
26
|
{ label: 'store fundamentals', fence: AGENTS_MD_CANONICAL_FENCE },
|
|
@@ -32,7 +43,9 @@ const ALWAYS_PRESENT_SECTIONS = [
|
|
|
32
43
|
* drift `ctxr doctor` checks — see `integrity-checks.ts`), and that a skill
|
|
33
44
|
* is reachable by path at the configured skills path.
|
|
34
45
|
*/
|
|
35
|
-
export async function execute(store,
|
|
46
|
+
export async function execute(env, store, flags = {}) {
|
|
47
|
+
if (flags.portable)
|
|
48
|
+
return executePortable(env, store);
|
|
36
49
|
const steps = [];
|
|
37
50
|
// 1. A retrieval query — reading a catalog section works even before any
|
|
38
51
|
// build has ever run (an empty, valid section), so this genuinely proves
|
|
@@ -121,9 +134,38 @@ export async function execute(store, _flags = {}) {
|
|
|
121
134
|
detail: err instanceof Error ? err.message : String(err),
|
|
122
135
|
});
|
|
123
136
|
}
|
|
137
|
+
// 7. The write-path gate — the store's surviving refusal mechanism. Every
|
|
138
|
+
// other operation here is a happy path; this one asks whether the gate still
|
|
139
|
+
// says no. The path escapes the store, which `sanctionedPath` refuses
|
|
140
|
+
// unconditionally: its sanctioned-location rule is inert until
|
|
141
|
+
// `write_lifecycle.writable_paths` is declared, so a step built on that half
|
|
142
|
+
// would pass vacuously on a default store (D3).
|
|
143
|
+
const gated = await sanctionedPath(store.config, store.root, path.join('..', 'outside.md'));
|
|
144
|
+
if (gated.ok || gated.reason === undefined) {
|
|
145
|
+
steps.push({
|
|
146
|
+
operation: 'write-path gate refuses an escaping path',
|
|
147
|
+
status: 'fail',
|
|
148
|
+
detail: 'the gate produced no refusal for a path resolving outside the store',
|
|
149
|
+
});
|
|
150
|
+
return finish(store, steps);
|
|
151
|
+
}
|
|
152
|
+
steps.push({ operation: 'write-path gate refuses an escaping path', status: 'pass' });
|
|
153
|
+
// 8. The external tooling the shipped write-path skills invoke. Presence
|
|
154
|
+
// only — nothing is executed, and no tool name comes from configuration.
|
|
155
|
+
const resolved = await resolveOnPath(WRITE_PATH_TOOL, env.env);
|
|
156
|
+
if (resolved === null) {
|
|
157
|
+
steps.push({
|
|
158
|
+
operation: `write-path prerequisite "${WRITE_PATH_TOOL}" on PATH`,
|
|
159
|
+
status: 'fail',
|
|
160
|
+
detail: `"${WRITE_PATH_TOOL}" is not on PATH; the shipped submit and land skills invoke it.`,
|
|
161
|
+
});
|
|
162
|
+
return finish(store, steps);
|
|
163
|
+
}
|
|
164
|
+
steps.push({ operation: `write-path prerequisite "${WRITE_PATH_TOOL}" on PATH`, status: 'pass' });
|
|
124
165
|
return finish(store, steps);
|
|
125
166
|
}
|
|
126
|
-
function finish(store, steps) {
|
|
167
|
+
function finish(store, steps, commit) {
|
|
168
|
+
// Only `fail` is failing — a skipped operation never changes the exit code.
|
|
127
169
|
const failed = steps.find((s) => s.status === 'fail');
|
|
128
170
|
const findings = failed
|
|
129
171
|
? [
|
|
@@ -135,15 +177,54 @@ function finish(store, steps) {
|
|
|
135
177
|
},
|
|
136
178
|
]
|
|
137
179
|
: [];
|
|
180
|
+
// D2: a portable pass is a statement about the recorded commit, never about
|
|
181
|
+
// the working tree, so the summary always names which commit it was.
|
|
182
|
+
const at = commit === undefined ? '' : ` at commit ${commit.slice(0, 12)}`;
|
|
183
|
+
const mode = commit === undefined ? 'verify' : 'verify --portable';
|
|
138
184
|
return {
|
|
139
185
|
exitCode: failed ? ExitCode.CheckFailed : ExitCode.Ok,
|
|
140
|
-
data: { steps },
|
|
186
|
+
data: commit === undefined ? { steps } : { steps, commit },
|
|
141
187
|
findings,
|
|
142
188
|
humanSummary: failed
|
|
143
|
-
?
|
|
144
|
-
:
|
|
189
|
+
? `${mode} failed${at} at: ${failed.operation}`
|
|
190
|
+
: `${mode}${at}: all ${steps.length} operation(s) succeeded.`,
|
|
145
191
|
storeRoot: store.root,
|
|
146
192
|
schemaVersion: store.config.schema_version,
|
|
147
193
|
};
|
|
148
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* D1/D2: verifies the store's RECORDED COMMIT in a disposable checkout, in a
|
|
197
|
+
* child process with no harness state reachable. The refusal below is a value
|
|
198
|
+
* check on `resolveHead` rather than a caught git error, and it runs before
|
|
199
|
+
* anything is created — an unborn HEAD leaves no checkout behind.
|
|
200
|
+
*/
|
|
201
|
+
async function executePortable(env, store) {
|
|
202
|
+
const commit = await resolveHead(env.git, store.root);
|
|
203
|
+
if (commit === null)
|
|
204
|
+
throw new NoCommitToVerifyError();
|
|
205
|
+
const isolated = await runIsolatedVerify(env.git, store.root, env.env, commit);
|
|
206
|
+
const steps = isolated.steps.map((step) => ({
|
|
207
|
+
operation: step.operation,
|
|
208
|
+
status: step.status === 'fail' ? 'fail' : step.status === 'skip' ? 'skip' : 'pass',
|
|
209
|
+
...(step.detail === undefined ? {} : { detail: step.detail }),
|
|
210
|
+
}));
|
|
211
|
+
// The requirement's "no harness state" clause, enforced: if the child wrote
|
|
212
|
+
// into the scrubbed home, the run was not isolated from what it claimed.
|
|
213
|
+
if (!isolated.homeWasEmpty) {
|
|
214
|
+
steps.push({
|
|
215
|
+
operation: 'isolated run leaves no harness state',
|
|
216
|
+
status: 'fail',
|
|
217
|
+
detail: 'the child wrote into the scrubbed home directory, so the run was not isolated from harness state',
|
|
218
|
+
});
|
|
219
|
+
return finish(store, steps, isolated.commit);
|
|
220
|
+
}
|
|
221
|
+
if (steps.length === 0) {
|
|
222
|
+
steps.push({
|
|
223
|
+
operation: 'isolated run',
|
|
224
|
+
status: 'fail',
|
|
225
|
+
detail: `the isolated child produced no verifiable output (exit ${isolated.exitCode})`,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return finish(store, steps, isolated.commit);
|
|
229
|
+
}
|
|
149
230
|
//# sourceMappingURL=verify.js.map
|
|
@@ -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,EACL,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC3B,yBAAyB,EACzB,YAAY,EACZ,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CommandOutcome, CommandRequires } from '../core/command.js';
|
|
2
|
+
import type { RunEnv } from '../core/env.js';
|
|
3
|
+
import type { InstallKind } from '../core/install-kind.js';
|
|
4
|
+
/**
|
|
5
|
+
* cli-contract: the CLI reports its own version and how it was installed.
|
|
6
|
+
* `store: 'absent'` — the version of the running executable is a fact about
|
|
7
|
+
* the installation, not about any store, so this must answer from a directory
|
|
8
|
+
* that resolves to no store root at all.
|
|
9
|
+
*/
|
|
10
|
+
export declare const requires: CommandRequires;
|
|
11
|
+
export type ReleaseStatus = 'current' | 'newer-available' | 'undetermined';
|
|
12
|
+
export interface VersionData {
|
|
13
|
+
version: string;
|
|
14
|
+
install_path: string;
|
|
15
|
+
install_kind: InstallKind;
|
|
16
|
+
/** Only present with --check. Null when the published version could not be resolved. */
|
|
17
|
+
latest?: string | null;
|
|
18
|
+
release_status?: ReleaseStatus;
|
|
19
|
+
}
|
|
20
|
+
export interface VersionFlags {
|
|
21
|
+
check?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Unlike the session-start/update advisory, this check IS the command's whole
|
|
25
|
+
* purpose, so it fails loud: an answer that could not be determined exits with
|
|
26
|
+
* the usage code naming what was missing, rather than degrading to "current".
|
|
27
|
+
* It also reads the registry directly, never the cache — an operator who asks
|
|
28
|
+
* explicitly is asking about now.
|
|
29
|
+
*/
|
|
30
|
+
export declare function execute(env: RunEnv, flags?: VersionFlags): Promise<CommandOutcome<VersionData>>;
|
|
31
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAM3D;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,eAAqC,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAE3E,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,WAAW,CAAC;IAC1B,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAuDzG"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ExitCode } from '../core/exit-codes.js';
|
|
2
|
+
import { resolveInstallLocation } from '../core/install-kind.js';
|
|
3
|
+
import { ownPackageName } from '../core/registry.js';
|
|
4
|
+
import { compareRelease } from '../core/version-check.js';
|
|
5
|
+
import { CLI_VERSION } from '../version.js';
|
|
6
|
+
/**
|
|
7
|
+
* cli-contract: the CLI reports its own version and how it was installed.
|
|
8
|
+
* `store: 'absent'` — the version of the running executable is a fact about
|
|
9
|
+
* the installation, not about any store, so this must answer from a directory
|
|
10
|
+
* that resolves to no store root at all.
|
|
11
|
+
*/
|
|
12
|
+
export const requires = { store: 'absent' };
|
|
13
|
+
/**
|
|
14
|
+
* Unlike the session-start/update advisory, this check IS the command's whole
|
|
15
|
+
* purpose, so it fails loud: an answer that could not be determined exits with
|
|
16
|
+
* the usage code naming what was missing, rather than degrading to "current".
|
|
17
|
+
* It also reads the registry directly, never the cache — an operator who asks
|
|
18
|
+
* explicitly is asking about now.
|
|
19
|
+
*/
|
|
20
|
+
export async function execute(env, flags = {}) {
|
|
21
|
+
const install = resolveInstallLocation(env.execPath);
|
|
22
|
+
const base = {
|
|
23
|
+
version: CLI_VERSION,
|
|
24
|
+
install_path: install.path,
|
|
25
|
+
install_kind: install.kind,
|
|
26
|
+
};
|
|
27
|
+
if (!flags.check) {
|
|
28
|
+
return {
|
|
29
|
+
exitCode: ExitCode.Ok,
|
|
30
|
+
data: base,
|
|
31
|
+
findings: [],
|
|
32
|
+
humanSummary: CLI_VERSION,
|
|
33
|
+
storeRoot: null,
|
|
34
|
+
schemaVersion: null,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const lookup = await env.registry.latestVersion(ownPackageName());
|
|
38
|
+
if (lookup.kind === 'undetermined') {
|
|
39
|
+
return undetermined(base, `the latest published version could not be determined: ${lookup.reason}`);
|
|
40
|
+
}
|
|
41
|
+
const comparison = compareRelease(CLI_VERSION, lookup.version);
|
|
42
|
+
if (comparison.kind === 'undetermined') {
|
|
43
|
+
return undetermined({ ...base, latest: lookup.version }, comparison.reason);
|
|
44
|
+
}
|
|
45
|
+
if (comparison.kind === 'newer-available') {
|
|
46
|
+
const finding = {
|
|
47
|
+
code: 'cli.update_available',
|
|
48
|
+
severity: 'info',
|
|
49
|
+
message: `ctxr ${comparison.installed} is installed; ${comparison.latest} is available.`,
|
|
50
|
+
subject: ownPackageName(),
|
|
51
|
+
details: { installed: comparison.installed, latest: comparison.latest },
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
exitCode: ExitCode.CheckFailed,
|
|
55
|
+
data: { ...base, latest: lookup.version, release_status: 'newer-available' },
|
|
56
|
+
findings: [finding],
|
|
57
|
+
humanSummary: `ctxr ${comparison.installed} is installed; ${comparison.latest} is available.`,
|
|
58
|
+
storeRoot: null,
|
|
59
|
+
schemaVersion: null,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
exitCode: ExitCode.Ok,
|
|
64
|
+
data: { ...base, latest: lookup.version, release_status: 'current' },
|
|
65
|
+
findings: [],
|
|
66
|
+
humanSummary: `ctxr ${CLI_VERSION} is the latest published version.`,
|
|
67
|
+
storeRoot: null,
|
|
68
|
+
schemaVersion: null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function undetermined(data, reason) {
|
|
72
|
+
const finding = {
|
|
73
|
+
code: 'cli.update_check_failed',
|
|
74
|
+
severity: 'info',
|
|
75
|
+
message: reason,
|
|
76
|
+
subject: ownPackageName(),
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
exitCode: ExitCode.Usage,
|
|
80
|
+
data: { ...data, latest: data.latest ?? null, release_status: 'undetermined' },
|
|
81
|
+
findings: [finding],
|
|
82
|
+
humanSummary: `error: ${reason}`,
|
|
83
|
+
storeRoot: null,
|
|
84
|
+
schemaVersion: null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"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"}
|