@nexus-cortex/core 4.53.0 → 4.54.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.
@@ -0,0 +1,14 @@
1
+ export interface CanonArtifactsOptions {
2
+ store?: string;
3
+ home?: string;
4
+ dryRun?: boolean;
5
+ repoUrl?: string;
6
+ }
7
+ export interface CanonArtifactsResult {
8
+ captured: number;
9
+ unchanged: number;
10
+ kinds: Record<string, number>;
11
+ pushed: boolean;
12
+ }
13
+ export declare function canonArtifacts(o?: CanonArtifactsOptions): Promise<CanonArtifactsResult>;
14
+ //# sourceMappingURL=canonArtifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonArtifacts.d.ts","sourceRoot":"","sources":["../../src/canon/canonArtifacts.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;CACjB;AAuCD,wBAAsB,cAAc,CAAC,CAAC,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqLjG"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * canonArtifacts — the capability/artifact dimension capture leg
3
+ * (CANON_CROSS_HARNESS_PLAN.md §27p; Phase C part 2, leg 3).
4
+ *
5
+ * Discovers native capability artifacts and the intent layer, normalizes each
6
+ * into the store's taxonomy dirs (the CAPTURE side of the per-kind layout
7
+ * adapters: skill-dir → /skills/<id>/, agent-file → /agents/<id>.md,
8
+ * mcp/plugin registries → normalized JSON, project manifests → JSON with a
9
+ * thin `state` field), and writes one ArtifactManifest record per artifact
10
+ * under /canon/artifacts/<kind>/<id>.json. Content is blob-addressed with git
11
+ * blob SHAs computed locally (sha1 of "blob <len>\0"+bytes — identical to
12
+ * git's object id, so provenance survives any clone). Secret scrub at the
13
+ * push boundary, same pattern set as canonSync. Absences are VISIBLE in
14
+ * /canon/artifacts/ARTIFACTS.md (D8: never silent). Incremental via
15
+ * ~/.canon/artifacts-manifest.json keyed by primary-file blob refs.
16
+ * Projection-BACK (store → receiving harness layout) arrives with the
17
+ * artifact pull leg; stated in ARTIFACTS.md rather than implied.
18
+ *
19
+ * @module canon/canonArtifacts
20
+ */
21
+ import * as crypto from 'node:crypto';
22
+ import * as fs from 'node:fs';
23
+ import * as path from 'node:path';
24
+ import { execFileSync } from 'node:child_process';
25
+ const SECRET_PATTERNS = [
26
+ [/sk-[A-Za-z0-9_-]{16,}/g, '[redacted:sk]'],
27
+ [/ghp_[A-Za-z0-9]{20,}/g, '[redacted:ghp]'],
28
+ [/github_pat_[A-Za-z0-9_]{20,}/g, '[redacted:ghpat]'],
29
+ [/hf_[A-Za-z0-9]{20,}/g, '[redacted:hf]'],
30
+ [/AIza[A-Za-z0-9_-]{20,}/g, '[redacted:aiza]'],
31
+ [/xai-[A-Za-z0-9]{20,}/g, '[redacted:xai]'],
32
+ [/nar_[A-Za-z0-9]{16,}/g, '[redacted:nar]'],
33
+ [/gsk_[A-Za-z0-9]{20,}/g, '[redacted:gsk]'],
34
+ [/xox[bpars]-[A-Za-z0-9-]{10,}/g, '[redacted:slack]'],
35
+ [/AKIA[A-Z0-9]{16}/g, '[redacted:akia]'],
36
+ [/eyJ[A-Za-z0-9_-]{20,}\.eyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}/g, '[redacted:jwt]'],
37
+ ];
38
+ const scrub = (s) => SECRET_PATTERNS.reduce((v, [re, sub]) => v.replace(re, sub), s);
39
+ /** git blob id (12 hex) computed locally — identical to `git hash-object`. */
40
+ const blobRef = (content) => {
41
+ const buf = Buffer.isBuffer(content) ? content : Buffer.from(content);
42
+ return crypto.createHash('sha1')
43
+ .update(`blob ${buf.length}\0`).update(buf).digest('hex').slice(0, 12);
44
+ };
45
+ const walkFiles = (dir) => {
46
+ const out = [];
47
+ const rec = (d) => {
48
+ let es = [];
49
+ try {
50
+ es = fs.readdirSync(d, { withFileTypes: true });
51
+ }
52
+ catch {
53
+ return;
54
+ }
55
+ for (const e of es) {
56
+ const p = path.join(d, e.name);
57
+ if (e.isDirectory())
58
+ rec(p);
59
+ else if (e.isFile())
60
+ out.push(p);
61
+ }
62
+ };
63
+ rec(dir);
64
+ return out.sort();
65
+ };
66
+ export async function canonArtifacts(o = {}) {
67
+ const HOME = o.home ?? process.env.HOME ?? '/home/runner/workspace';
68
+ const DRY = o.dryRun ?? false;
69
+ const STORE = o.store ?? '/tmp/canon-store';
70
+ const MANIFEST_PATH = path.join(HOME, '.canon', 'artifacts-manifest.json');
71
+ const CANON_REPO = o.repoUrl ?? process.env.CANON_REPO ?? 'https://github.com/Spitfire-Products/nexus-canon-store';
72
+ const env = { ...process.env, GIT_TERMINAL_PROMPT: '0' };
73
+ if (!fs.existsSync(path.join(STORE, '.git'))) {
74
+ console.log(`[canon-artifacts] no store at ${STORE} — cloning ${CANON_REPO}`);
75
+ execFileSync('git', ['clone', '-q', CANON_REPO, STORE], { encoding: 'utf8', env });
76
+ }
77
+ const incr = fs.existsSync(MANIFEST_PATH)
78
+ ? JSON.parse(fs.readFileSync(MANIFEST_PATH, 'utf8')) : {};
79
+ let captured = 0, unchanged = 0;
80
+ const kinds = {};
81
+ const absences = [];
82
+ /** Normalize one artifact into the store + write its manifest record. */
83
+ const capture = (m, files) => {
84
+ const primaryFile = files.find((f) => f.rel === m.primary);
85
+ if (!primaryFile)
86
+ return;
87
+ const version = blobRef(primaryFile.bytes);
88
+ const key = `${m.kind}/${m.id}`;
89
+ kinds[m.kind] = (kinds[m.kind] ?? 0) + 1;
90
+ if (incr[key] === version) {
91
+ unchanged++;
92
+ return;
93
+ }
94
+ if (!DRY) {
95
+ const destRoot = m.kind === 'skill' || m.kind === 'plugin'
96
+ ? path.join(STORE, m.kind + 's', m.id)
97
+ : path.join(STORE, m.kind === 'mcp' ? 'mcp' : m.kind + 's');
98
+ const content = [];
99
+ for (const f of files) {
100
+ const scrubbed = Buffer.from(scrub(f.bytes.toString('utf8')));
101
+ const dest = m.kind === 'skill' || m.kind === 'plugin'
102
+ ? path.join(destRoot, f.rel)
103
+ : path.join(destRoot, f.rel);
104
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
105
+ fs.writeFileSync(dest, scrubbed);
106
+ content.push({ path: f.rel, ref: blobRef(scrubbed), bytes: scrubbed.length });
107
+ }
108
+ const record = {
109
+ recordKind: 'artifact-manifest',
110
+ ...m,
111
+ version,
112
+ timestamp: new Date().toISOString(),
113
+ content,
114
+ };
115
+ const recPath = path.join(STORE, 'canon', 'artifacts', m.kind, `${m.id}.json`);
116
+ fs.mkdirSync(path.dirname(recPath), { recursive: true });
117
+ fs.writeFileSync(recPath, JSON.stringify(record, null, 2) + '\n');
118
+ }
119
+ incr[key] = version;
120
+ captured++;
121
+ };
122
+ // ── skills: dir + SKILL.md (layout adapter: skill-dir → /skills/<id>/) ─────
123
+ for (const [harness, root] of [['claude-code', path.join(HOME, '.claude', 'skills')], ['agents-dir', path.join(HOME, '.agents', 'skills')]]) {
124
+ let entries = [];
125
+ try {
126
+ entries = fs.readdirSync(root);
127
+ }
128
+ catch {
129
+ absences.push(`${harness} skills root absent (${root})`);
130
+ continue;
131
+ }
132
+ for (const name of entries.sort()) {
133
+ const dir = path.join(root, name);
134
+ if (!fs.existsSync(path.join(dir, 'SKILL.md')))
135
+ continue;
136
+ const files = walkFiles(dir).map((p) => ({ rel: path.relative(dir, p), bytes: fs.readFileSync(p) }));
137
+ const desc = /^description:\s*(.+)$/m.exec(fs.readFileSync(path.join(dir, 'SKILL.md'), 'utf8'))?.[1];
138
+ capture({
139
+ kind: 'skill', id: name, name, description: desc?.slice(0, 200), primary: 'SKILL.md',
140
+ provenance: { harness, native: dir, ref: blobRef(fs.readFileSync(path.join(dir, 'SKILL.md'))) },
141
+ harnessCompat: { 'claude-code': 'supported', 'nexus-cortex': 'supported' },
142
+ projectionRules: { 'claude-code': '.claude/skills/<id>/', 'agents-dir': '.agents/skills/<id>/' },
143
+ }, files);
144
+ }
145
+ }
146
+ // ── agents: single .md w/ frontmatter (layout adapter: file → /agents/) ────
147
+ const agentsRoot = path.join(HOME, '.claude', 'agents');
148
+ let agentFiles = [];
149
+ try {
150
+ agentFiles = fs.readdirSync(agentsRoot).filter((f) => f.endsWith('.md')).sort();
151
+ }
152
+ catch {
153
+ absences.push(`claude-code agents root absent (${agentsRoot})`);
154
+ }
155
+ for (const f of agentFiles) {
156
+ const abs = path.join(agentsRoot, f);
157
+ const bytes = fs.readFileSync(abs);
158
+ const id = path.basename(f, '.md');
159
+ const desc = /^description:\s*(.+)$/m.exec(bytes.toString('utf8'))?.[1];
160
+ capture({
161
+ kind: 'agent', id, name: id, description: desc?.slice(0, 200), primary: f,
162
+ provenance: { harness: 'claude-code', native: abs, ref: blobRef(bytes) },
163
+ harnessCompat: { 'claude-code': 'supported' },
164
+ projectionRules: { 'claude-code': '.claude/agents/<id>.md' },
165
+ }, [{ rel: f, bytes }]);
166
+ }
167
+ // ── mcp: config registries (normalized json) ───────────────────────────────
168
+ const mcpSources = [
169
+ ['workspace', path.join(HOME, '.mcp.json')],
170
+ ['nexus-terminal', path.join(HOME, 'nexus-terminal', '.mcp.json')],
171
+ ['omniclaude-v4', path.join(HOME, 'omniclaude-v4', '.mcp.json')],
172
+ ];
173
+ for (const [label, p] of mcpSources) {
174
+ if (!fs.existsSync(p)) {
175
+ absences.push(`mcp config absent (${p})`);
176
+ continue;
177
+ }
178
+ const bytes = fs.readFileSync(p);
179
+ capture({
180
+ kind: 'mcp', id: label, name: `${label} MCP servers`, primary: `${label}.json`,
181
+ provenance: { harness: 'claude-code', native: p, ref: blobRef(bytes) },
182
+ projectionRules: { 'claude-code': '.mcp.json' },
183
+ }, [{ rel: `${label}.json`, bytes }]);
184
+ }
185
+ // ── plugins: registry snapshot (bundle capture = follow-up, stated) ────────
186
+ const pluginsReg = path.join(HOME, '.claude', 'plugins', 'installed_plugins.json');
187
+ if (fs.existsSync(pluginsReg)) {
188
+ const bytes = fs.readFileSync(pluginsReg);
189
+ capture({
190
+ kind: 'plugin', id: 'installed-registry', name: 'Installed plugins registry', primary: 'installed_plugins.json',
191
+ provenance: { harness: 'claude-code', native: pluginsReg, ref: blobRef(bytes) },
192
+ projectionRules: { 'claude-code': '.claude/plugins/installed_plugins.json' },
193
+ }, [{ rel: 'installed_plugins.json', bytes }]);
194
+ }
195
+ else
196
+ absences.push(`plugins registry absent (${pluginsReg})`);
197
+ // ── plans: doc-snapshot + thin state (fork 1 — never an event log) ─────────
198
+ const plansRoot = path.join(HOME, '.claude', 'plans');
199
+ let planFiles = [];
200
+ try {
201
+ planFiles = fs.readdirSync(plansRoot).filter((f) => f.endsWith('.md')).sort();
202
+ }
203
+ catch {
204
+ absences.push(`plans root absent (${plansRoot})`);
205
+ }
206
+ for (const f of planFiles) {
207
+ const abs = path.join(plansRoot, f);
208
+ const bytes = fs.readFileSync(abs);
209
+ const id = path.basename(f, '.md');
210
+ capture({
211
+ kind: 'plan', id, primary: f,
212
+ provenance: { harness: 'claude-code', native: abs, ref: blobRef(bytes) },
213
+ state: { status: 'snapshot', capturedFrom: 'claude-code-plans' },
214
+ }, [{ rel: f, bytes }]);
215
+ }
216
+ // ── projects: manifests for known roots (roots + per-harness session dirs) ─
217
+ const projects = [
218
+ ['workspace', HOME],
219
+ ['omniclaude-v4', path.join(HOME, 'omniclaude-v4')],
220
+ ['nexus-terminal', path.join(HOME, 'nexus-terminal')],
221
+ ];
222
+ for (const [id, root] of projects) {
223
+ if (!fs.existsSync(root))
224
+ continue;
225
+ const doc = JSON.stringify({
226
+ id, root,
227
+ sessionDirs: { 'nexus-cortex': path.join(root, '.cortex', 'sessions'), 'claude-code': `~/.claude/projects/${root.replace(/\//g, '-')}` },
228
+ }, null, 2) + '\n';
229
+ capture({
230
+ kind: 'project', id, primary: `${id}.json`,
231
+ provenance: { harness: 'workspace', native: root, ref: blobRef(doc) },
232
+ state: { status: 'active' },
233
+ }, [{ rel: `${id}.json`, bytes: Buffer.from(doc) }]);
234
+ }
235
+ // ── visibility doc + commit ────────────────────────────────────────────────
236
+ const summary = `${captured} captured, ${unchanged} unchanged (${Object.entries(kinds).map(([k, n]) => `${k}:${n}`).join(', ') || 'none'})`;
237
+ let pushed = false;
238
+ if (!DRY) {
239
+ const md = `# /canon/artifacts — ArtifactManifest records (§27p second record kind)\n\n` +
240
+ `One JSON manifest per artifact: identity, content-derived version (primary-file git\n` +
241
+ `blob ref), blob-addressed content listing, provenance, harnessCompat, projectionRules.\n` +
242
+ `Bytes live in the store taxonomy dirs (/skills /agents /mcp /plugins /plans /projects).\n\n` +
243
+ `## Not captured this run (visible, never silent — D8)\n` +
244
+ (absences.length ? absences.map((a) => `- ${a}\n`).join('') : '- none\n') +
245
+ `\n## Projection-back\nRendering artifacts INTO a receiving harness's layout (the pull side of the\n` +
246
+ `per-kind layout adapters) arrives with the artifact pull leg; until then its\nabsence is stated here rather than implied.\n`;
247
+ const mdPath = path.join(STORE, 'canon', 'artifacts', 'ARTIFACTS.md');
248
+ fs.mkdirSync(path.dirname(mdPath), { recursive: true });
249
+ fs.writeFileSync(mdPath, md);
250
+ fs.mkdirSync(path.dirname(MANIFEST_PATH), { recursive: true });
251
+ fs.writeFileSync(MANIFEST_PATH, JSON.stringify(incr));
252
+ const git = (a) => execFileSync('git', a, { cwd: STORE, encoding: 'utf8', env });
253
+ git(['add', '-A']);
254
+ if (git(['status', '--porcelain']).trim()) {
255
+ git(['commit', '-q', '-m', `canon-artifacts: ${summary}`]);
256
+ git(['push', '-q', 'origin', 'main']);
257
+ console.log(`[canon-artifacts] pushed: ${summary}`);
258
+ pushed = true;
259
+ }
260
+ else {
261
+ console.log(`[canon-artifacts] no changes (${summary})`);
262
+ }
263
+ }
264
+ else {
265
+ console.log(`[canon-artifacts DRY] would capture ${captured}, unchanged ${unchanged}`);
266
+ }
267
+ return { captured, unchanged, kinds, pushed };
268
+ }
269
+ //# sourceMappingURL=canonArtifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonArtifacts.js","sourceRoot":"","sources":["../../src/canon/canonArtifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type CanonSession } from './canonPull.js';
2
+ export interface ProjectEntry {
3
+ id: string;
4
+ /** Best-effort decoded root (claude-code encoding is lossy on dashes — encoded form is authoritative). */
5
+ root: string;
6
+ /** Store-relative canon session dir prefixes per harness. */
7
+ sessionPaths: Record<string, string[]>;
8
+ sessionCounts: Record<string, number>;
9
+ }
10
+ /** Derive the authoritative project ↔ session-path map from store paths. */
11
+ export declare function deriveProjectSessionMap(store: string): Record<string, ProjectEntry>;
12
+ /** Resolve which project a canon session belongs to (by path prefix). */
13
+ export declare function sessionProject(projects: Record<string, ProjectEntry>, s: CanonSession): string | undefined;
14
+ export interface CanonGraphOptions {
15
+ store?: string;
16
+ /** Limit to one project id (default: all mapped projects). */
17
+ project?: string;
18
+ /** Path to an external (graphify) node-link graph.json to fold into each project graph. */
19
+ mergeGraph?: string;
20
+ dryRun?: boolean;
21
+ }
22
+ export interface CanonGraphResult {
23
+ projects: string[];
24
+ nodes: number;
25
+ links: number;
26
+ pushed: boolean;
27
+ }
28
+ /** Generate /projects/<id>.json manifests + /projects/<id>/graph.json (node-link, 🔒 criteria). */
29
+ export declare function canonGraph(o?: CanonGraphOptions): Promise<CanonGraphResult>;
30
+ //# sourceMappingURL=canonGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonGraph.d.ts","sourceRoot":"","sources":["../../src/canon/canonGraph.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI1E,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,0GAA0G;IAC1G,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAcD,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAiCnF;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAO1G;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAsB,UAAU,CAAC,CAAC,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkGrF"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * canonGraph — the §27l knowledge-graph leg (Phase C part 2, leg 4) plus the
3
+ * project↔session normalization it requires.
4
+ *
5
+ * PROJECT MAP (the prerequisite): project identity in the store is implicit
6
+ * and split across two conventions — Claude Code's normalized-path dirs
7
+ * (`-home-runner-workspace-nexus-terminal`) and canonSync's CORTEX_ROOTS
8
+ * labels (`nexus-terminal`). `deriveProjectSessionMap` joins them, DERIVED
9
+ * entirely from store paths (never hand-maintained — §27l's rule): known
10
+ * roots match exactly by their encoded form; UNKNOWN claude-code dirs become
11
+ * their own project (closing the hand-listed-roots blind spot: new roots
12
+ * surface instead of vanishing). No `project` field is added to Message
13
+ * records — that would break the verbatim-superset rule; the map is a
14
+ * derived artifact written to /projects/<id>.json.
15
+ *
16
+ * GRAPH (🔒 v1 acceptance criteria, non-negotiable): the writer emits
17
+ * NetworkX node-link JSON ({directed, multigraph, graph, nodes, links}) and
18
+ * stamps EVERY edge with confidence ∈ {EXTRACTED, INFERRED, AMBIGUOUS} plus
19
+ * numeric confidence_score {1.0, 0.5, 0.2} — baked in at genesis, never
20
+ * retrofitted. Nodes carry graphify-compatible fields (id, label, file_type,
21
+ * source_file, source_location) and canon ids are NAMESPACED (sess:/art:/
22
+ * proj:) to dodge graphify's stem-id collisions. The HISTORY half consumes
23
+ * BOTH canonical record kinds (Message sessions + ArtifactManifests); the
24
+ * CODE half is graphify's job (adopted at arm's length, mode A): pass
25
+ * `mergeGraph` to fold a graphify graph.json into the same node-link
26
+ * structure, joined on source_file. graphify stays replaceable; never Penpax.
27
+ *
28
+ * @module canon/canonGraph
29
+ */
30
+ import * as fs from 'node:fs';
31
+ import * as path from 'node:path';
32
+ import { execFileSync } from 'node:child_process';
33
+ import { discoverCanonSessions } from './canonPull.js';
34
+ const CONFIDENCE_SCORE = { EXTRACTED: 1.0, INFERRED: 0.5, AMBIGUOUS: 0.2 };
35
+ /** Known roots: exact encoded-form matches. Everything else derives its own entry. */
36
+ const KNOWN_ROOTS = [
37
+ ['workspace', '/home/runner/workspace'],
38
+ ['omniclaude-v4', '/home/runner/workspace/omniclaude-v4'],
39
+ ['nexus-terminal', '/home/runner/workspace/nexus-terminal'],
40
+ ];
41
+ const encodeCC = (root) => root.replace(/[/.]/g, '-');
42
+ /** cortex label → project id (labels that are sub-roots of a project). */
43
+ const CORTEX_LABEL_PROJECT = {
44
+ workspace: 'workspace', 'omniclaude-v4': 'omniclaude-v4', server: 'omniclaude-v4', 'nexus-terminal': 'nexus-terminal',
45
+ };
46
+ /** Derive the authoritative project ↔ session-path map from store paths. */
47
+ export function deriveProjectSessionMap(store) {
48
+ const projects = {};
49
+ const entry = (id, root) => (projects[id] ??= { id, root, sessionPaths: {}, sessionCounts: {} });
50
+ const add = (id, root, harness, rel) => {
51
+ const e = entry(id, root);
52
+ (e.sessionPaths[harness] ??= []).push(rel);
53
+ e.sessionCounts[harness] = (e.sessionCounts[harness] ?? 0) + 0; // counts filled from sessions below
54
+ };
55
+ const ccByEncoding = new Map(KNOWN_ROOTS.map(([id, root]) => [encodeCC(root), { id, root }]));
56
+ const wsPrefix = encodeCC('/home/runner/workspace') + '-';
57
+ const ccRoot = path.join(store, 'canon', 'claude-code');
58
+ let ccDirs = [];
59
+ try {
60
+ ccDirs = fs.readdirSync(ccRoot).filter((d) => fs.statSync(path.join(ccRoot, d)).isDirectory());
61
+ }
62
+ catch { /* none */ }
63
+ for (const dir of ccDirs.sort()) {
64
+ const known = ccByEncoding.get(dir);
65
+ if (known)
66
+ add(known.id, known.root, 'claude-code', path.join('claude-code', dir));
67
+ else if (dir.startsWith(wsPrefix)) {
68
+ // Unknown root — surfaces as its OWN project (blind-spot closure).
69
+ const id = dir.slice(wsPrefix.length);
70
+ add(id, `/home/runner/workspace/${id}` /* best-effort decode */, 'claude-code', path.join('claude-code', dir));
71
+ }
72
+ else
73
+ add(dir, dir, 'claude-code', path.join('claude-code', dir));
74
+ }
75
+ const cxRoot = path.join(store, 'canon', 'nexus-cortex');
76
+ let cxDirs = [];
77
+ try {
78
+ cxDirs = fs.readdirSync(cxRoot).filter((d) => fs.statSync(path.join(cxRoot, d)).isDirectory());
79
+ }
80
+ catch { /* none */ }
81
+ for (const label of cxDirs.sort()) {
82
+ const id = CORTEX_LABEL_PROJECT[label] ?? label;
83
+ const root = projects[id]?.root ?? KNOWN_ROOTS.find(([k]) => k === id)?.[1] ?? label;
84
+ add(id, root, 'nexus-cortex', path.join('nexus-cortex', label));
85
+ }
86
+ return projects;
87
+ }
88
+ /** Resolve which project a canon session belongs to (by path prefix). */
89
+ export function sessionProject(projects, s) {
90
+ for (const p of Object.values(projects)) {
91
+ for (const prefixes of Object.values(p.sessionPaths)) {
92
+ if (prefixes.some((pre) => s.rel.startsWith(pre + path.sep)))
93
+ return p.id;
94
+ }
95
+ }
96
+ return undefined;
97
+ }
98
+ /** Generate /projects/<id>.json manifests + /projects/<id>/graph.json (node-link, 🔒 criteria). */
99
+ export async function canonGraph(o = {}) {
100
+ const STORE = o.store ?? '/tmp/canon-store';
101
+ const env = { ...process.env, GIT_TERMINAL_PROMPT: '0' };
102
+ const projects = deriveProjectSessionMap(STORE);
103
+ const sessions = discoverCanonSessions(STORE);
104
+ for (const s of sessions) {
105
+ const pid = sessionProject(projects, s);
106
+ if (pid)
107
+ projects[pid].sessionCounts[s.harness] = (projects[pid].sessionCounts[s.harness] ?? 0) + 1;
108
+ }
109
+ // Load artifact manifests (the second record kind).
110
+ const artRoot = path.join(STORE, 'canon', 'artifacts');
111
+ const artifacts = [];
112
+ const walkJson = (d) => {
113
+ let es = [];
114
+ try {
115
+ es = fs.readdirSync(d, { withFileTypes: true });
116
+ }
117
+ catch {
118
+ return;
119
+ }
120
+ for (const e of es) {
121
+ const p = path.join(d, e.name);
122
+ if (e.isDirectory())
123
+ walkJson(p);
124
+ else if (e.name.endsWith('.json')) {
125
+ try {
126
+ artifacts.push({ ...JSON.parse(fs.readFileSync(p, 'utf8')), _manifestPath: path.relative(STORE, p) });
127
+ }
128
+ catch { /* lint's job */ }
129
+ }
130
+ }
131
+ };
132
+ walkJson(artRoot);
133
+ let head = '';
134
+ try {
135
+ head = execFileSync('git', ['rev-parse', 'HEAD'], { cwd: STORE, encoding: 'utf8', env }).trim();
136
+ }
137
+ catch { /* untracked */ }
138
+ const wanted = o.project ? [o.project] : Object.keys(projects).sort();
139
+ let totalNodes = 0, totalLinks = 0;
140
+ const built = [];
141
+ for (const pid of wanted) {
142
+ const proj = projects[pid];
143
+ if (!proj)
144
+ continue;
145
+ const nodes = [];
146
+ const links = [];
147
+ const edge = (source, target, relation, confidence, source_file) => links.push({ source, target, relation, confidence, confidence_score: CONFIDENCE_SCORE[confidence], source_file, source_location: '', weight: 1.0 });
148
+ const projNodeId = `proj:${pid}`;
149
+ nodes.push({ id: projNodeId, label: pid, file_type: 'concept', source_file: `projects/${pid}.json`, source_location: '', community: 0 });
150
+ for (const s of sessions) {
151
+ if (sessionProject(projects, s) !== pid)
152
+ continue;
153
+ const nid = `sess:${s.uuid}`;
154
+ nodes.push({ id: nid, label: s.title ?? s.uuid.slice(0, 8), file_type: 'document', source_file: path.join('canon', s.rel), source_location: '', harness: s.harness, bytes: s.bytes });
155
+ edge(projNodeId, nid, 'contains', 'EXTRACTED', path.join('canon', s.rel));
156
+ }
157
+ for (const a of artifacts) {
158
+ const nid = `art:${a.kind}:${a.id}`;
159
+ nodes.push({ id: nid, label: a.name ?? a.id, file_type: a.kind === 'plan' || a.kind === 'project' ? 'document' : 'concept', source_file: a._manifestPath, source_location: '', kind: a.kind, version: a.version });
160
+ // User-scope artifacts are AVAILABLE to every project (inferred), except
161
+ // project manifests which bind exactly to their project (extracted).
162
+ if (a.kind === 'project') {
163
+ if (a.id === pid)
164
+ edge(nid, projNodeId, 'describes', 'EXTRACTED', a._manifestPath);
165
+ }
166
+ else
167
+ edge(nid, projNodeId, 'available_to', 'INFERRED', a._manifestPath);
168
+ }
169
+ // Optional CODE half: fold an external graphify node-link graph (mode A join).
170
+ if (o.mergeGraph && fs.existsSync(o.mergeGraph)) {
171
+ try {
172
+ const g = JSON.parse(fs.readFileSync(o.mergeGraph, 'utf8'));
173
+ for (const n of g.nodes ?? [])
174
+ nodes.push(n); // graphify ids are un-namespaced; canon ids can't collide (namespaced)
175
+ for (const l of g.links ?? g.edges ?? []) {
176
+ if (l.confidence_score === undefined)
177
+ l.confidence_score = CONFIDENCE_SCORE[l.confidence ?? 'EXTRACTED'] ?? 1.0;
178
+ links.push(l);
179
+ }
180
+ }
181
+ catch { /* malformed external graph — skip, lint covers our own outputs */ }
182
+ }
183
+ const graph = { directed: true, multigraph: false, graph: {}, nodes, links };
184
+ if (head)
185
+ graph.built_at_commit = head;
186
+ totalNodes += nodes.length;
187
+ totalLinks += links.length;
188
+ built.push(pid);
189
+ if (!o.dryRun) {
190
+ const pj = path.join(STORE, 'projects', `${pid}.json`);
191
+ fs.mkdirSync(path.dirname(pj), { recursive: true });
192
+ fs.writeFileSync(pj, JSON.stringify(proj, null, 2) + '\n');
193
+ const gp = path.join(STORE, 'projects', pid, 'graph.json');
194
+ fs.mkdirSync(path.dirname(gp), { recursive: true });
195
+ fs.writeFileSync(gp, JSON.stringify(graph, null, 2) + '\n');
196
+ }
197
+ }
198
+ let pushed = false;
199
+ const summary = `${built.length} project graph(s), ${totalNodes} nodes, ${totalLinks} links`;
200
+ if (!o.dryRun) {
201
+ const git = (a) => execFileSync('git', a, { cwd: STORE, encoding: 'utf8', env });
202
+ git(['add', '-A']);
203
+ if (git(['status', '--porcelain']).trim()) {
204
+ git(['commit', '-q', '-m', `canon-graph: ${summary}`]);
205
+ git(['push', '-q', 'origin', 'main']);
206
+ console.log(`[canon-graph] pushed: ${summary}`);
207
+ pushed = true;
208
+ }
209
+ else
210
+ console.log(`[canon-graph] no changes (${summary})`);
211
+ }
212
+ else
213
+ console.log(`[canon-graph DRY] ${summary}`);
214
+ return { projects: built, nodes: totalNodes, links: totalLinks, pushed };
215
+ }
216
+ //# sourceMappingURL=canonGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonGraph.js","sourceRoot":"","sources":["../../src/canon/canonGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface CanonStoreOptions {
2
+ /** Canon store working clone (default /tmp/canon-store — off-quota; auto-cloned). */
3
+ store?: string;
4
+ /** Store remote for the auto-clone (default env CANON_REPO or the canonical repo). */
5
+ repoUrl?: string;
6
+ }
7
+ export interface CanonSession {
8
+ uuid: string;
9
+ rel: string;
10
+ parts: string[];
11
+ bytes: number;
12
+ harness: string;
13
+ title?: string;
14
+ }
15
+ export interface CanonPullOptions extends CanonStoreOptions {
16
+ /** Session uuid (or unique prefix) to materialize. */
17
+ session: string;
18
+ /** Destination directory (default {home}/omniclaude-v4/.cortex/sessions). */
19
+ to?: string;
20
+ /** Overwrite an existing local session file (default false — pull is a branch, never a clobber). */
21
+ force?: boolean;
22
+ home?: string;
23
+ }
24
+ export interface CanonPullResult {
25
+ /** 0 = materialized; 1 = not found / ambiguous / exists-without-force. */
26
+ code: 0 | 1;
27
+ dest?: string;
28
+ session?: CanonSession;
29
+ }
30
+ /** Discover canon sessions (part-aware; titles recovered from event sidecars). */
31
+ export declare function discoverCanonSessions(store: string): CanonSession[];
32
+ /** List canon sessions (prints rows; returns them). `all` includes <4KB sessions. */
33
+ export declare function canonList(o?: CanonStoreOptions & {
34
+ all?: boolean;
35
+ }): Promise<CanonSession[]>;
36
+ /** Materialize one canon session into a native session directory. */
37
+ export declare function canonPull(o: CanonPullOptions): Promise<CanonPullResult>;
38
+ //# sourceMappingURL=canonPull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonPull.d.ts","sourceRoot":"","sources":["../../src/canon/canonPull.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oGAAoG;IACpG,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAcD,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAoCnE;AAED,qFAAqF;AACrF,wBAAsB,SAAS,CAAC,CAAC,GAAE,iBAAiB,GAAG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAWtG;AAED,qEAAqE;AACrE,wBAAsB,SAAS,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8B7E"}