@harness-nexus/cli 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/config.d.ts +24 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +38 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/daemon/acp/adapters.d.ts +7 -0
  8. package/dist/daemon/acp/adapters.d.ts.map +1 -0
  9. package/dist/daemon/acp/adapters.js +34 -0
  10. package/dist/daemon/acp/adapters.js.map +1 -0
  11. package/dist/daemon/acp/agent-connection.d.ts +45 -0
  12. package/dist/daemon/acp/agent-connection.d.ts.map +1 -0
  13. package/dist/daemon/acp/agent-connection.js +158 -0
  14. package/dist/daemon/acp/agent-connection.js.map +1 -0
  15. package/dist/daemon/chat.d.ts +22 -0
  16. package/dist/daemon/chat.d.ts.map +1 -0
  17. package/dist/daemon/chat.js +280 -0
  18. package/dist/daemon/chat.js.map +1 -0
  19. package/dist/daemon/client.d.ts +23 -0
  20. package/dist/daemon/client.d.ts.map +1 -0
  21. package/dist/daemon/client.js +117 -0
  22. package/dist/daemon/client.js.map +1 -0
  23. package/dist/daemon/jobs.d.ts +19 -0
  24. package/dist/daemon/jobs.d.ts.map +1 -0
  25. package/dist/daemon/jobs.js +65 -0
  26. package/dist/daemon/jobs.js.map +1 -0
  27. package/dist/errors.d.ts +11 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +11 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +481 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/install/adapter-factory.d.ts +24 -0
  36. package/dist/install/adapter-factory.d.ts.map +1 -0
  37. package/dist/install/adapter-factory.js +80 -0
  38. package/dist/install/adapter-factory.js.map +1 -0
  39. package/dist/install/adapters/codex.d.ts +16 -0
  40. package/dist/install/adapters/codex.d.ts.map +1 -0
  41. package/dist/install/adapters/codex.js +172 -0
  42. package/dist/install/adapters/codex.js.map +1 -0
  43. package/dist/install/adapters/deepseek.d.ts +26 -0
  44. package/dist/install/adapters/deepseek.d.ts.map +1 -0
  45. package/dist/install/adapters/deepseek.js +246 -0
  46. package/dist/install/adapters/deepseek.js.map +1 -0
  47. package/dist/install/adapters/hermes.d.ts +16 -0
  48. package/dist/install/adapters/hermes.d.ts.map +1 -0
  49. package/dist/install/adapters/hermes.js +267 -0
  50. package/dist/install/adapters/hermes.js.map +1 -0
  51. package/dist/install/adapters/stub.d.ts +2 -0
  52. package/dist/install/adapters/stub.d.ts.map +1 -0
  53. package/dist/install/adapters/stub.js +22 -0
  54. package/dist/install/adapters/stub.js.map +1 -0
  55. package/dist/install/install-state.d.ts +31 -0
  56. package/dist/install/install-state.d.ts.map +1 -0
  57. package/dist/install/install-state.js +29 -0
  58. package/dist/install/install-state.js.map +1 -0
  59. package/dist/install/installer.d.ts +16 -0
  60. package/dist/install/installer.d.ts.map +1 -0
  61. package/dist/install/installer.js +96 -0
  62. package/dist/install/installer.js.map +1 -0
  63. package/dist/install/planner.d.ts +26 -0
  64. package/dist/install/planner.d.ts.map +1 -0
  65. package/dist/install/planner.js +25 -0
  66. package/dist/install/planner.js.map +1 -0
  67. package/dist/install/registry.d.ts +21 -0
  68. package/dist/install/registry.d.ts.map +1 -0
  69. package/dist/install/registry.js +31 -0
  70. package/dist/install/registry.js.map +1 -0
  71. package/dist/install/resolver.d.ts +15 -0
  72. package/dist/install/resolver.d.ts.map +1 -0
  73. package/dist/install/resolver.js +57 -0
  74. package/dist/install/resolver.js.map +1 -0
  75. package/dist/install/types.d.ts +93 -0
  76. package/dist/install/types.d.ts.map +1 -0
  77. package/dist/install/types.js +2 -0
  78. package/dist/install/types.js.map +1 -0
  79. package/dist/install/uninstaller.d.ts +29 -0
  80. package/dist/install/uninstaller.d.ts.map +1 -0
  81. package/dist/install/uninstaller.js +107 -0
  82. package/dist/install/uninstaller.js.map +1 -0
  83. package/dist/inventory/common.d.ts +86 -0
  84. package/dist/inventory/common.d.ts.map +1 -0
  85. package/dist/inventory/common.js +137 -0
  86. package/dist/inventory/common.js.map +1 -0
  87. package/dist/inventory/scan.d.ts +23 -0
  88. package/dist/inventory/scan.d.ts.map +1 -0
  89. package/dist/inventory/scan.js +117 -0
  90. package/dist/inventory/scan.js.map +1 -0
  91. package/dist/inventory/scanners/claude-code.d.ts +3 -0
  92. package/dist/inventory/scanners/claude-code.d.ts.map +1 -0
  93. package/dist/inventory/scanners/claude-code.js +191 -0
  94. package/dist/inventory/scanners/claude-code.js.map +1 -0
  95. package/dist/inventory/scanners/codex.d.ts +14 -0
  96. package/dist/inventory/scanners/codex.d.ts.map +1 -0
  97. package/dist/inventory/scanners/codex.js +201 -0
  98. package/dist/inventory/scanners/codex.js.map +1 -0
  99. package/dist/inventory/scanners/deepseek.d.ts +9 -0
  100. package/dist/inventory/scanners/deepseek.d.ts.map +1 -0
  101. package/dist/inventory/scanners/deepseek.js +200 -0
  102. package/dist/inventory/scanners/deepseek.js.map +1 -0
  103. package/dist/inventory/scanners/hermes.d.ts +3 -0
  104. package/dist/inventory/scanners/hermes.d.ts.map +1 -0
  105. package/dist/inventory/scanners/hermes.js +194 -0
  106. package/dist/inventory/scanners/hermes.js.map +1 -0
  107. package/dist/inventory/types.d.ts +33 -0
  108. package/dist/inventory/types.d.ts.map +1 -0
  109. package/dist/inventory/types.js +2 -0
  110. package/dist/inventory/types.js.map +1 -0
  111. package/dist/mcp/serve.d.ts +8 -0
  112. package/dist/mcp/serve.d.ts.map +1 -0
  113. package/dist/mcp/serve.js +118 -0
  114. package/dist/mcp/serve.js.map +1 -0
  115. package/package.json +50 -0
@@ -0,0 +1,117 @@
1
+ import { homedir } from 'node:os';
2
+ import { isPlatformPath, readLedger } from './common.js';
3
+ import { claudeCodeScanner } from './scanners/claude-code.js';
4
+ import { codexScanner } from './scanners/codex.js';
5
+ import { hermesScanner } from './scanners/hermes.js';
6
+ import { deepseekScanner } from './scanners/deepseek.js';
7
+ /**
8
+ * Inventory scan entry point (Phase 8 C3). Owns the cross-scanner assembly:
9
+ * origin resolution (ledger paths + scanner markers), (kind, name) dedupe,
10
+ * snapshot shaping, and the collect fan-out. Kept in lockstep with the
11
+ * server's SCANNABLE_TARGETS (modules/inventory.ts).
12
+ */
13
+ export const SCANNERS = [
14
+ claudeCodeScanner,
15
+ codexScanner,
16
+ hermesScanner,
17
+ deepseekScanner,
18
+ ];
19
+ export function scannerFor(target) {
20
+ return SCANNERS.find((s) => s.target === target);
21
+ }
22
+ function toWireItem(item, platform) {
23
+ return {
24
+ kind: item.kind,
25
+ name: item.name,
26
+ origin: platform ? 'platform' : 'local',
27
+ path: item.relPath,
28
+ ...(item.summary ? { summary: item.summary } : {}),
29
+ ...(item.preview ? { contentPreview: item.preview } : {}),
30
+ importable: item.importable,
31
+ ...(item.note ? { note: item.note } : {}),
32
+ ...(item.meta ? { meta: item.meta } : {}),
33
+ };
34
+ }
35
+ /** Scan one target. A missing agent home still reports an (empty) snapshot. */
36
+ export function scanTarget(target, homeDir = homedir()) {
37
+ const scanner = scannerFor(target);
38
+ if (!scanner) {
39
+ throw new Error(`no scanner for target '${target}'`);
40
+ }
41
+ const home = scanner.homeOf(homeDir);
42
+ const ledger = readLedger(home);
43
+ const markers = scanner.platformMarkers(home);
44
+ const discovered = scanner.discover(home) ?? [];
45
+ // (kind, name) must address items uniquely — first occurrence wins, later
46
+ // duplicates (e.g. the same skill name in two Hermes plugins) are dropped.
47
+ const items = [];
48
+ const seen = new Set();
49
+ for (const d of discovered) {
50
+ const key = `${d.kind}:${d.name}`;
51
+ if (seen.has(key))
52
+ continue;
53
+ seen.add(key);
54
+ items.push(toWireItem(d, d.platform === true || isPlatformPath(d.absPath, ledger)));
55
+ }
56
+ // Platform evidence: ledger destinations, shim/marketplace MCP names, or any
57
+ // item already resolved as platform-written. No evidence ⇒ false (definitely
58
+ // nothing of ours), never a guess.
59
+ const platformApplied = ledger.platformPaths.size > 0 ||
60
+ markers.length > 0 ||
61
+ items.some((i) => i.origin === 'platform');
62
+ return {
63
+ target,
64
+ scannedAt: new Date().toISOString(),
65
+ agents: [
66
+ {
67
+ name: `~${home.slice(homeDir.length)}`,
68
+ directory: home,
69
+ profileApplied: platformApplied,
70
+ items,
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ /** Scan every supported target (daemon start / default scan request). */
76
+ export function scanAllTargets(homeDir = homedir()) {
77
+ return SCANNERS.map((s) => scanTarget(s.target, homeDir));
78
+ }
79
+ /**
80
+ * Collect bodies for a selection. Paths are re-derived by a FRESH discover —
81
+ * the daemon never trusts server-supplied paths.
82
+ */
83
+ export async function collectItems(target, selections, homeDir = homedir()) {
84
+ const scanner = scannerFor(target);
85
+ if (!scanner) {
86
+ return selections.map((s) => ({
87
+ kind: s.kind,
88
+ name: s.name,
89
+ ok: false,
90
+ error: 'unknown target',
91
+ }));
92
+ }
93
+ const home = scanner.homeOf(homeDir);
94
+ const discovered = scanner.discover(home) ?? [];
95
+ const byKey = new Map(discovered.map((d) => [`${d.kind}:${d.name}`, d]));
96
+ const out = [];
97
+ for (const sel of selections) {
98
+ const item = byKey.get(`${sel.kind}:${sel.name}`);
99
+ if (!item) {
100
+ out.push({ kind: sel.kind, name: sel.name, ok: false, error: 'not found in fresh scan' });
101
+ continue;
102
+ }
103
+ try {
104
+ out.push(await scanner.collect(home, item));
105
+ }
106
+ catch (e) {
107
+ out.push({
108
+ kind: sel.kind,
109
+ name: sel.name,
110
+ ok: false,
111
+ error: e instanceof Error ? e.message : String(e),
112
+ });
113
+ }
114
+ }
115
+ return out;
116
+ }
117
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/inventory/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TargetScanner } from '../types.js';
2
+ export declare const claudeCodeScanner: TargetScanner;
3
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/inventory/scanners/claude-code.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,aAAa,CAAC;AA8D9D,eAAO,MAAM,iBAAiB,EAAE,aAsI/B,CAAC"}
@@ -0,0 +1,191 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { MAX_ITEM_BYTES, isPlatformMcpName, mcpMeta, previewOf, readTextBounded, redactSecretMap, skillDirFiles, summarize, } from '../common.js';
4
+ /**
5
+ * Claude Code scanner (Phase 8 C3). Ground truth mirrors what our adapters and
6
+ * the marketplace emitter write:
7
+ * skills → ~/.claude/skills/<name>/SKILL.md (+ bundle files)
8
+ * commands → ~/.claude/commands/<name>.md
9
+ * agents → ~/.claude/agents/<name>.md
10
+ * mcp → `mcpServers` in ~/.claude.json (user scope — OUTSIDE ~/.claude)
11
+ * Rules and hooks are not scanned (no established global rules dir; CC's hook
12
+ * matcher format is lossy vs the 4.5 event map). `~/.claude/plugins`
13
+ * (marketplace installs) are out of scope for C3.
14
+ */
15
+ const CLAUDE_JSON_LIMIT = 4 * 1024 * 1024;
16
+ function parseClaudeJson(homeDir) {
17
+ // NB: ~/.claude.json holds CC's full state (projects, history) — bound the
18
+ // read and tolerate garbage; MCP absence is not an error.
19
+ const file = path.join(homeDir, '.claude.json');
20
+ try {
21
+ const stat = fs.statSync(file);
22
+ if (!stat.isFile() || stat.size > CLAUDE_JSON_LIMIT)
23
+ return {};
24
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
25
+ return parsed.mcpServers ?? {};
26
+ }
27
+ catch {
28
+ return {};
29
+ }
30
+ }
31
+ /** Scan one directory of sibling markdown artifacts (commands/, agents/). */
32
+ function scanMarkdownDir(dir, relBase, kind, ext) {
33
+ if (!fs.existsSync(dir))
34
+ return [];
35
+ const items = [];
36
+ for (const entry of fs
37
+ .readdirSync(dir, { withFileTypes: true })
38
+ .sort((a, b) => a.name.localeCompare(b.name))) {
39
+ if (!entry.isFile() || !entry.name.endsWith(ext))
40
+ continue;
41
+ const name = entry.name.slice(0, -ext.length);
42
+ if (!name)
43
+ continue;
44
+ const abs = path.join(dir, entry.name);
45
+ const text = readTextBounded(abs);
46
+ items.push({
47
+ kind,
48
+ name,
49
+ absPath: abs,
50
+ relPath: `${relBase}/${entry.name}`,
51
+ importable: text.ok,
52
+ ...(text.ok ? { summary: summarize(text.content) } : { note: text.error }),
53
+ ...(text.ok ? { preview: previewOf(text.content) } : {}),
54
+ });
55
+ }
56
+ return items;
57
+ }
58
+ export const claudeCodeScanner = {
59
+ target: 'claude-code',
60
+ homeOf: (homeDir) => path.join(homeDir, '.claude'),
61
+ discover(home) {
62
+ // ~/.claude.json lives at HOME root; the home dir itself may be absent
63
+ // while user-scope MCP servers still exist — scan both independently.
64
+ const homeDir = path.dirname(home);
65
+ const items = [];
66
+ const homeExists = fs.existsSync(home);
67
+ if (homeExists) {
68
+ const skillsDir = path.join(home, 'skills');
69
+ if (fs.existsSync(skillsDir)) {
70
+ for (const entry of fs
71
+ .readdirSync(skillsDir, { withFileTypes: true })
72
+ .sort((a, b) => a.name.localeCompare(b.name))) {
73
+ if (!entry.isDirectory())
74
+ continue;
75
+ const dir = path.join(skillsDir, entry.name);
76
+ const files = skillDirFiles(dir);
77
+ const skillMd = readTextBounded(path.join(dir, 'SKILL.md'));
78
+ if (!skillMd.ok) {
79
+ items.push({
80
+ kind: 'skill',
81
+ name: entry.name,
82
+ absPath: dir,
83
+ relPath: `skills/${entry.name}`,
84
+ importable: false,
85
+ note: files.length === 0 ? 'empty' : `SKILL.md ${skillMd.error}`,
86
+ });
87
+ continue;
88
+ }
89
+ const totalBytes = files.reduce((sum, f) => sum + fs.statSync(path.join(dir, f)).size, 0);
90
+ items.push({
91
+ kind: 'skill',
92
+ name: entry.name,
93
+ absPath: dir,
94
+ relPath: `skills/${entry.name}`,
95
+ importable: totalBytes <= MAX_ITEM_BYTES,
96
+ ...(totalBytes > MAX_ITEM_BYTES ? { note: 'too-large' } : {}),
97
+ summary: summarize(skillMd.content),
98
+ preview: previewOf(skillMd.content),
99
+ meta: { multi: files.length > 1 },
100
+ });
101
+ }
102
+ }
103
+ items.push(...scanMarkdownDir(path.join(home, 'commands'), 'commands', 'command', '.md'));
104
+ items.push(...scanMarkdownDir(path.join(home, 'agents'), 'agents', 'sub_agent', '.md'));
105
+ }
106
+ for (const [key, entry] of Object.entries(parseClaudeJson(homeDir))) {
107
+ if (!entry || typeof entry !== 'object')
108
+ continue;
109
+ items.push({
110
+ kind: 'mcp',
111
+ name: key,
112
+ absPath: path.join(homeDir, '.claude.json'),
113
+ relPath: '~/.claude.json#mcpServers',
114
+ importable: Boolean(entry.command ?? entry.url),
115
+ ...((entry.command ?? entry.url) ? {} : { note: 'unsupported shape' }),
116
+ meta: mcpMeta(entry),
117
+ ...(isPlatformMcpName(key) ? { platform: true } : {}),
118
+ });
119
+ }
120
+ return homeExists || items.length > 0 ? items : null;
121
+ },
122
+ platformMarkers(home) {
123
+ const homeDir = path.dirname(home);
124
+ return Object.keys(parseClaudeJson(homeDir)).filter(isPlatformMcpName);
125
+ },
126
+ async collect(home, item) {
127
+ if (item.kind === 'skill') {
128
+ const files = {};
129
+ for (const rel of skillDirFiles(item.absPath)) {
130
+ const text = readTextBounded(path.join(item.absPath, rel));
131
+ if (!text.ok)
132
+ return { kind: 'skill', name: item.name, ok: false, error: `${rel}: ${text.error}` };
133
+ files[rel] = text.content;
134
+ }
135
+ if (!('SKILL.md' in files)) {
136
+ return { kind: 'skill', name: item.name, ok: false, error: 'SKILL.md missing' };
137
+ }
138
+ return { kind: 'skill', name: item.name, ok: true, artifact: { kind: 'skill', files } };
139
+ }
140
+ if (item.kind === 'command' || item.kind === 'sub_agent') {
141
+ const text = readTextBounded(item.absPath);
142
+ if (!text.ok)
143
+ return { kind: item.kind, name: item.name, ok: false, error: text.error };
144
+ return {
145
+ kind: item.kind,
146
+ name: item.name,
147
+ ok: true,
148
+ artifact: { kind: item.kind, content: text.content },
149
+ };
150
+ }
151
+ // mcp — re-read ~/.claude.json, redact env/header values daemon-side.
152
+ const homeDir = path.dirname(home);
153
+ const entry = parseClaudeJson(homeDir)[item.name];
154
+ if (!entry)
155
+ return { kind: 'mcp', name: item.name, ok: false, error: 'entry missing' };
156
+ if (entry.command) {
157
+ return {
158
+ kind: 'mcp',
159
+ name: item.name,
160
+ ok: true,
161
+ artifact: {
162
+ kind: 'mcp',
163
+ transport: {
164
+ type: 'stdio',
165
+ command: entry.command,
166
+ ...(entry.args ? { args: entry.args } : {}),
167
+ ...(entry.env ? { env: redactSecretMap(entry.env) } : {}),
168
+ },
169
+ },
170
+ };
171
+ }
172
+ if (entry.url) {
173
+ const type = entry.type === 'sse' ? 'sse' : 'streamable-http';
174
+ return {
175
+ kind: 'mcp',
176
+ name: item.name,
177
+ ok: true,
178
+ artifact: {
179
+ kind: 'mcp',
180
+ transport: {
181
+ type,
182
+ url: entry.url,
183
+ ...(entry.headers ? { headers: redactSecretMap(entry.headers) } : {}),
184
+ },
185
+ },
186
+ };
187
+ }
188
+ return { kind: 'mcp', name: item.name, ok: false, error: 'unsupported shape' };
189
+ },
190
+ };
191
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/inventory/scanners/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { RawMcpEntry, TargetScanner } from '../types.js';
2
+ /**
3
+ * Codex scanner (Phase 8 C3). Ground truth mirrors the C2 adapter:
4
+ * skills → ~/.codex/skills/<name>/SKILL.md (+ bundle files)
5
+ * commands → ~/.codex/prompts/<name>.md
6
+ * mcp → `[mcp_servers.<name>]` sections in ~/.codex/config.toml (stdio-only
7
+ * in practice, but url sections parse too)
8
+ * Rules (project-root AGENTS.md), sub-agents and hooks have no verified global
9
+ * home shape — not scanned.
10
+ */
11
+ /** Parse `[mcp_servers.<name>]` sections: our payloads are plain strings / string arrays. */
12
+ export declare function parseCodexMcpServers(toml: string): Record<string, RawMcpEntry>;
13
+ export declare const codexScanner: TargetScanner;
14
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/inventory/scanners/codex.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;;;;;GAQG;AAEH,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAoC9E;AAUD,eAAO,MAAM,YAAY,EAAE,aAuI1B,CAAC"}
@@ -0,0 +1,201 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { MAX_ITEM_BYTES, isPlatformMcpName, mcpMeta, previewOf, readTextBounded, skillDirFiles, summarize, } from '../common.js';
4
+ /**
5
+ * Codex scanner (Phase 8 C3). Ground truth mirrors the C2 adapter:
6
+ * skills → ~/.codex/skills/<name>/SKILL.md (+ bundle files)
7
+ * commands → ~/.codex/prompts/<name>.md
8
+ * mcp → `[mcp_servers.<name>]` sections in ~/.codex/config.toml (stdio-only
9
+ * in practice, but url sections parse too)
10
+ * Rules (project-root AGENTS.md), sub-agents and hooks have no verified global
11
+ * home shape — not scanned.
12
+ */
13
+ /** Parse `[mcp_servers.<name>]` sections: our payloads are plain strings / string arrays. */
14
+ export function parseCodexMcpServers(toml) {
15
+ const out = {};
16
+ let current = null;
17
+ for (const raw of toml.split('\n')) {
18
+ const line = raw.trim();
19
+ const section = /^\[([^\]]+)\]$/.exec(line);
20
+ if (section) {
21
+ const parts = section[1].split('.');
22
+ if (parts.length === 2 && parts[0] === 'mcp_servers') {
23
+ const name = parts[1].replace(/^"|"$/g, '');
24
+ const entry = {};
25
+ out[name] = entry;
26
+ current = { name, entry };
27
+ }
28
+ else {
29
+ current = null;
30
+ }
31
+ continue;
32
+ }
33
+ if (!current || !line || line.startsWith('#'))
34
+ continue;
35
+ const kv = /^([A-Za-z0-9_-]+)\s*=\s*(.+)$/.exec(line);
36
+ if (!kv)
37
+ continue;
38
+ const [, key, rawValue] = kv;
39
+ const value = rawValue.trim();
40
+ if (value.startsWith('"')) {
41
+ const str = /^"((?:[^"\\]|\\.)*)"/.exec(value)?.[1];
42
+ if (str === undefined)
43
+ continue;
44
+ const unescaped = str.replace(/\\(["\\])/g, '$1');
45
+ if (key === 'command')
46
+ current.entry.command = unescaped;
47
+ else if (key === 'url')
48
+ current.entry.url = unescaped;
49
+ }
50
+ else if (value.startsWith('[')) {
51
+ const items = value.match(/"((?:[^"\\]|\\.)*)"/g) ?? [];
52
+ const arr = items.map((q) => q.slice(1, -1).replace(/\\(["\\])/g, '$1'));
53
+ if (key === 'args')
54
+ current.entry.args = arr;
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ function readConfigToml(home) {
60
+ try {
61
+ return fs.readFileSync(path.join(home, 'config.toml'), 'utf8');
62
+ }
63
+ catch {
64
+ return '';
65
+ }
66
+ }
67
+ export const codexScanner = {
68
+ target: 'codex',
69
+ homeOf: (homeDir) => path.join(homeDir, '.codex'),
70
+ discover(home) {
71
+ if (!fs.existsSync(home))
72
+ return null;
73
+ const items = [];
74
+ const skillsDir = path.join(home, 'skills');
75
+ if (fs.existsSync(skillsDir)) {
76
+ for (const entry of fs
77
+ .readdirSync(skillsDir, { withFileTypes: true })
78
+ .sort((a, b) => a.name.localeCompare(b.name))) {
79
+ if (!entry.isDirectory())
80
+ continue;
81
+ const dir = path.join(skillsDir, entry.name);
82
+ const files = skillDirFiles(dir);
83
+ const skillMd = readTextBounded(path.join(dir, 'SKILL.md'));
84
+ if (!skillMd.ok) {
85
+ items.push({
86
+ kind: 'skill',
87
+ name: entry.name,
88
+ absPath: dir,
89
+ relPath: `skills/${entry.name}`,
90
+ importable: false,
91
+ note: files.length === 0 ? 'empty' : `SKILL.md ${skillMd.error}`,
92
+ });
93
+ continue;
94
+ }
95
+ const totalBytes = files.reduce((sum, f) => sum + fs.statSync(path.join(dir, f)).size, 0);
96
+ items.push({
97
+ kind: 'skill',
98
+ name: entry.name,
99
+ absPath: dir,
100
+ relPath: `skills/${entry.name}`,
101
+ importable: totalBytes <= MAX_ITEM_BYTES,
102
+ ...(totalBytes > MAX_ITEM_BYTES ? { note: 'too-large' } : {}),
103
+ summary: summarize(skillMd.content),
104
+ preview: previewOf(skillMd.content),
105
+ meta: { multi: files.length > 1 },
106
+ });
107
+ }
108
+ }
109
+ const promptsDir = path.join(home, 'prompts');
110
+ if (fs.existsSync(promptsDir)) {
111
+ for (const entry of fs
112
+ .readdirSync(promptsDir, { withFileTypes: true })
113
+ .sort((a, b) => a.name.localeCompare(b.name))) {
114
+ if (!entry.isFile() || !entry.name.endsWith('.md'))
115
+ continue;
116
+ const name = entry.name.slice(0, -3);
117
+ const abs = path.join(promptsDir, entry.name);
118
+ const text = readTextBounded(abs);
119
+ items.push({
120
+ kind: 'command',
121
+ name,
122
+ absPath: abs,
123
+ relPath: `prompts/${entry.name}`,
124
+ importable: text.ok,
125
+ ...(text.ok ? { summary: summarize(text.content) } : { note: text.error }),
126
+ ...(text.ok ? { preview: previewOf(text.content) } : {}),
127
+ });
128
+ }
129
+ }
130
+ for (const [key, entry] of Object.entries(parseCodexMcpServers(readConfigToml(home)))) {
131
+ items.push({
132
+ kind: 'mcp',
133
+ name: key,
134
+ absPath: path.join(home, 'config.toml'),
135
+ relPath: 'config.toml#mcp_servers',
136
+ importable: Boolean(entry.command ?? entry.url),
137
+ ...((entry.command ?? entry.url) ? {} : { note: 'unsupported shape' }),
138
+ meta: mcpMeta(entry),
139
+ ...(isPlatformMcpName(key) ? { platform: true } : {}),
140
+ });
141
+ }
142
+ return items;
143
+ },
144
+ platformMarkers(home) {
145
+ return Object.keys(parseCodexMcpServers(readConfigToml(home))).filter(isPlatformMcpName);
146
+ },
147
+ async collect(home, item) {
148
+ if (item.kind === 'skill') {
149
+ const files = {};
150
+ for (const rel of skillDirFiles(item.absPath)) {
151
+ const text = readTextBounded(path.join(item.absPath, rel));
152
+ if (!text.ok)
153
+ return { kind: 'skill', name: item.name, ok: false, error: `${rel}: ${text.error}` };
154
+ files[rel] = text.content;
155
+ }
156
+ if (!('SKILL.md' in files)) {
157
+ return { kind: 'skill', name: item.name, ok: false, error: 'SKILL.md missing' };
158
+ }
159
+ return { kind: 'skill', name: item.name, ok: true, artifact: { kind: 'skill', files } };
160
+ }
161
+ if (item.kind === 'command') {
162
+ const text = readTextBounded(item.absPath);
163
+ if (!text.ok)
164
+ return { kind: 'command', name: item.name, ok: false, error: text.error };
165
+ return {
166
+ kind: 'command',
167
+ name: item.name,
168
+ ok: true,
169
+ artifact: { kind: 'command', content: text.content },
170
+ };
171
+ }
172
+ const entry = parseCodexMcpServers(readConfigToml(home))[item.name];
173
+ if (!entry)
174
+ return { kind: 'mcp', name: item.name, ok: false, error: 'entry missing' };
175
+ if (entry.command) {
176
+ return {
177
+ kind: 'mcp',
178
+ name: item.name,
179
+ ok: true,
180
+ artifact: {
181
+ kind: 'mcp',
182
+ transport: {
183
+ type: 'stdio',
184
+ command: entry.command,
185
+ ...(entry.args ? { args: entry.args } : {}),
186
+ },
187
+ },
188
+ };
189
+ }
190
+ if (entry.url) {
191
+ return {
192
+ kind: 'mcp',
193
+ name: item.name,
194
+ ok: true,
195
+ artifact: { kind: 'mcp', transport: { type: 'streamable-http', url: entry.url } },
196
+ };
197
+ }
198
+ return { kind: 'mcp', name: item.name, ok: false, error: 'unsupported shape' };
199
+ },
200
+ };
201
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/inventory/scanners/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RawMcpEntry, TargetScanner } from '../types.js';
2
+ /**
3
+ * Extract dsh-mcp-client mount rows from a cordis patch document, keyed by
4
+ * `serverName` (the user-meaningful server name; tools surface as
5
+ * `mcp__<serverName>__<tool>`).
6
+ */
7
+ export declare function parseDeepseekMcpServers(patch: string): Record<string, RawMcpEntry>;
8
+ export declare const deepseekScanner: TargetScanner;
9
+ //# sourceMappingURL=deepseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../../src/inventory/scanners/deepseek.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkB9D;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAkClF;AAUD,eAAO,MAAM,eAAe,EAAE,aAmI7B,CAAC"}