@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,172 @@
1
+ /**
2
+ * Codex target adapter (Phase 8 C2 — lands here as the "trivial case" of the
3
+ * stdio shim unification; absorbs roadmap 3.6).
4
+ *
5
+ * Codex layout (ground truth: `docs/research/phase-3-ecc-install-patterns.md`
6
+ * § "Codex — concrete format"):
7
+ * A. skills → `~/.codex/skills/<name>/SKILL.md` (+ bundle files)
8
+ * B. commands → `~/.codex/prompts/<name>.md` (YAML frontmatter stripped)
9
+ * C. MCP → TOML `~/.codex/config.toml` `[mcp_servers.*]` sections —
10
+ * **stdio-only** (Codex refuses `url` keys), which is exactly
11
+ * what the `hnx mcp serve` shim entry is.
12
+ *
13
+ * Deferred (unverified home-install shapes): rules (Codex wants AGENTS.md at a
14
+ * PROJECT root; a global write is not established), sub_agents, hooks — all
15
+ * surface as skipped warnings.
16
+ *
17
+ * The TOML merge is add/overwrite-only text surgery (like ECC's
18
+ * merge-mcp-config.js): our `[mcp_servers.harness-nexus-<slug>]` section is
19
+ * replaced idempotently; every other byte of the user's config is preserved.
20
+ */
21
+ import fs from 'node:fs';
22
+ import path from 'node:path';
23
+ import { createTargetAdapter } from '../adapter-factory.js';
24
+ import { hnxExecutablePath } from '../../config.js';
25
+ /** The install-state ledger filename inside the Codex home. */
26
+ const INSTALL_STATE_FILENAME = 'harness-nexus-install-state.json';
27
+ /** A resource kind this adapter cannot emit (yet). */
28
+ const SKIPPED_KINDS = new Set(['rule', 'sub_agent', 'hook']);
29
+ const SKIP_REASONS = {
30
+ rule: 'Codex rules live in a project-root AGENTS.md — global install shape unverified',
31
+ sub_agent: 'Codex has no file-based sub-agent format',
32
+ hook: 'Codex has no declarative hooks format',
33
+ };
34
+ function slugify(name) {
35
+ return (name
36
+ .toLowerCase()
37
+ .replace(/[^a-z0-9]+/g, '-')
38
+ .replace(/^-+|-+$/g, '')
39
+ .slice(0, 64) || 'harness-nexus-profile');
40
+ }
41
+ // ---- TOML text surgery (no TOML parser dependency — our payload is plain) ----
42
+ /** JSON string escaping is valid TOML basic-string escaping for our charset. */
43
+ function tomlString(value) {
44
+ return JSON.stringify(value);
45
+ }
46
+ /**
47
+ * Replace (or append) one `[section]` in a TOML document, preserving every
48
+ * other line. Re-running with the same section is idempotent — an overwrite,
49
+ * unlike ECC's strictly add-only merge, matching our "plans are idempotent
50
+ * overwrites" upgrade semantics.
51
+ */
52
+ export function mergeTomlSection(existing, section, body) {
53
+ const headerRe = /^\s*\[[^\]]+\]\s*$/;
54
+ const target = `[${section}]`;
55
+ const kept = [];
56
+ let skipping = false;
57
+ for (const line of existing.split('\n')) {
58
+ if (headerRe.test(line))
59
+ skipping = line.trim() === target;
60
+ if (!skipping)
61
+ kept.push(line);
62
+ }
63
+ const base = kept.join('\n').replace(/\s+$/, '');
64
+ return `${base}${base.length > 0 ? '\n\n' : ''}${target}\n${body}`;
65
+ }
66
+ /** Serialize the shim entry's `[mcp_servers.<key>]` body. */
67
+ function shimSectionBody(resolved, serverBase) {
68
+ const args = ['mcp', 'serve', '--profile', resolved.profile.id, '--server', serverBase];
69
+ return [
70
+ `command = ${tomlString(hnxExecutablePath())}`,
71
+ `args = [${args.map(tomlString).join(', ')}]`,
72
+ ].join('\n');
73
+ }
74
+ /** Strip a leading YAML frontmatter block (Codex prompts are plain markdown). */
75
+ function stripFrontmatter(content) {
76
+ if (!content.startsWith('---\n'))
77
+ return content;
78
+ const end = content.indexOf('\n---\n', 4);
79
+ if (end === -1)
80
+ return content;
81
+ return content.slice(end + 5);
82
+ }
83
+ /** Extract a Resource's inline file set (same policy as the Hermes adapter). */
84
+ function resourceFiles(artifact) {
85
+ if (artifact.kind === 'mcp')
86
+ return [];
87
+ const src = artifact.resource.source;
88
+ if (src.type === 'inline') {
89
+ return [{ relativePath: 'SKILL.md', content: src.content }];
90
+ }
91
+ if (src.type === 'inline-bundle') {
92
+ return Object.entries(src.files).map(([rel, content]) => ({ relativePath: rel, content }));
93
+ }
94
+ return [];
95
+ }
96
+ export const codexAdapter = createTargetAdapter({
97
+ id: 'codex-home',
98
+ target: 'codex',
99
+ kind: 'home',
100
+ rootSegments: ['.codex'],
101
+ planOperations(resolved, input, adapter) {
102
+ const root = adapter.resolveRoot(input);
103
+ const slug = slugify(resolved.profile.name);
104
+ const operations = [];
105
+ const skipped = [];
106
+ // ---- A. skills → ~/.codex/skills/<name>/ ----
107
+ for (const a of resolved.artifacts) {
108
+ if (a.kind !== 'skill')
109
+ continue;
110
+ const files = resourceFiles(a);
111
+ if (files.length === 0) {
112
+ skipped.push(`skill:${a.resource.key} (non-inline source not fetchable by CLI)`);
113
+ continue;
114
+ }
115
+ for (const f of files) {
116
+ operations.push({
117
+ kind: 'write-file',
118
+ content: f.content,
119
+ destinationPath: path.join(root, 'skills', a.resource.name, f.relativePath),
120
+ });
121
+ }
122
+ }
123
+ // ---- B. commands → ~/.codex/prompts/<name>.md ----
124
+ for (const a of resolved.artifacts) {
125
+ if (a.kind !== 'command')
126
+ continue;
127
+ const files = resourceFiles(a);
128
+ const content = files[0]?.content;
129
+ if (content === undefined) {
130
+ skipped.push(`command:${a.resource.key} (non-inline source not fetchable by CLI)`);
131
+ continue;
132
+ }
133
+ operations.push({
134
+ kind: 'write-file',
135
+ content: stripFrontmatter(content),
136
+ destinationPath: path.join(root, 'prompts', `${a.resource.name}.md`),
137
+ });
138
+ }
139
+ // ---- C. MCP → config.toml [mcp_servers.harness-nexus-<slug>] ----
140
+ const serverBase = process.env.HN_SERVER ?? 'https://harness-nexus.example.com';
141
+ const hasMcp = resolved.artifacts.some((a) => a.kind === 'mcp');
142
+ let needsHnx = false;
143
+ if (hasMcp) {
144
+ const cfgPath = path.join(root, 'config.toml');
145
+ const existing = fs.existsSync(cfgPath) ? fs.readFileSync(cfgPath, 'utf8') : '';
146
+ const merged = mergeTomlSection(existing, `mcp_servers.harness-nexus-${slug}`, shimSectionBody(resolved, serverBase));
147
+ operations.push({ kind: 'write-file', content: merged, destinationPath: cfgPath });
148
+ needsHnx = true;
149
+ }
150
+ // ---- skipped kinds ----
151
+ for (const a of resolved.artifacts) {
152
+ if (a.kind === 'mcp')
153
+ continue;
154
+ if (SKIPPED_KINDS.has(a.kind)) {
155
+ skipped.push(`${a.kind}:${a.resource.key} (${SKIP_REASONS[a.kind]})`);
156
+ }
157
+ }
158
+ lastPlanWarnings = { skipped, needsHnx };
159
+ return {
160
+ adapter: { id: adapter.id, target: adapter.target, kind: adapter.kind },
161
+ targetRoot: root,
162
+ installStatePath: path.join(root, INSTALL_STATE_FILENAME),
163
+ operations,
164
+ sensitive: false,
165
+ };
166
+ },
167
+ });
168
+ let lastPlanWarnings = { skipped: [], needsHnx: false };
169
+ export function getCodexPlanWarnings() {
170
+ return lastPlanWarnings;
171
+ }
172
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/install/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,+DAA+D;AAC/D,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAElE,sDAAsD;AACtD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7D,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,gFAAgF;IACtF,SAAS,EAAE,0CAA0C;IACrD,IAAI,EAAE,uCAAuC;CAC9C,CAAC;AAEF,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,CACL,IAAI;SACD,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,uBAAuB,CAC3C,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,gFAAgF;AAChF,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAY;IAC9E,MAAM,QAAQ,GAAG,oBAAoB,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,OAAO,GAAG,CAAC;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;QAC3D,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,6DAA6D;AAC7D,SAAS,eAAe,CAAC,QAAyB,EAAE,UAAkB;IACpE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACxF,OAAO;QACL,aAAa,UAAU,CAAC,iBAAiB,EAAE,CAAC,EAAE;QAC9C,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,iFAAiF;AACjF,SAAS,gBAAgB,CAAC,OAAe;IACvC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,gFAAgF;AAChF,SAAS,aAAa,CAAC,QAA0B;IAC/C,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IACrC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAkB,mBAAmB,CAAC;IAC7D,EAAE,EAAE,YAAY;IAChB,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,CAAC,QAAQ,CAAC;IAExB,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,gDAAgD;QAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,SAAS;YACjC,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,2CAA2C,CAAC,CAAC;gBACjF,SAAS;YACX,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC;iBAC5E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;gBAAE,SAAS;YACnC,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;YAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,2CAA2C,CAAC,CAAC;gBACnF,SAAS;YACX,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;gBAClC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;QAED,oEAAoE;QACpE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,mCAAmC,CAAC;QAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,MAAM,GAAG,gBAAgB,CAC7B,QAAQ,EACR,6BAA6B,IAAI,EAAE,EACnC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CACtC,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;YACnF,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;gBAAE,SAAS;YAC/B,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,gBAAgB,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAEzC,OAAO;YACL,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;YACvE,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC;YACzD,UAAU;YACV,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAOH,IAAI,gBAAgB,GAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC3E,MAAM,UAAU,oBAAoB;IAClC,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ResolvedProfile, TargetAdapter } from '../types.js';
2
+ /**
3
+ * Guarantee the frontmatter dsh requires. Existing frontmatter lines are kept
4
+ * verbatim (dsh tolerates extra metadata keys); only `name` (must be kebab)
5
+ * and `description` (non-empty) are completed or corrected. JSON string
6
+ * quoting is valid YAML 1.2 double-quoting — the escape hatch for arbitrary
7
+ * description text.
8
+ */
9
+ export declare function ensureDshFrontmatter(content: string, slug: string, description: string): string;
10
+ /**
11
+ * Replace (or append) this profile's managed region in the home patch,
12
+ * preserving every other byte — including other profiles' regions. Re-running
13
+ * with the same slug is idempotent, matching "plans are idempotent
14
+ * overwrites" upgrade semantics.
15
+ */
16
+ export declare function mergeManagedPatchRegion(existing: string, slug: string, block: string): string;
17
+ /** Serialize this profile's `- insert:` block for the home patch. */
18
+ export declare function managedPatchBlock(resolved: ResolvedProfile, serverBase: string): string;
19
+ export declare const deepseekAdapter: TargetAdapter;
20
+ /** Warnings from the most recent deepseek plan (read by the CLI for output). */
21
+ export interface DeepseekPlanWarnings {
22
+ skipped: string[];
23
+ needsHnx: boolean;
24
+ }
25
+ export declare function getDeepseekPlanWarnings(): DeepseekPlanWarnings;
26
+ //# sourceMappingURL=deepseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../../src/install/adapters/deepseek.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAA+B,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuD/F;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAyB/F;AAOD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAa7F;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAevF;AAeD,eAAO,MAAM,eAAe,EAAE,aAyF5B,CAAC;AAEH,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * DeepSeek Harness (dsh) target adapter (Phase 8 T1).
3
+ *
4
+ * dsh layout (ground truth: `docs/research/phase-8-t1-deepseek-harness.md`,
5
+ * pinned to dsh v0.1.2-rc.1):
6
+ * A. skills → `~/.dsh/skills/<name>/SKILL.md` (+ bundle files) — the Agent
7
+ * Skills format, but dsh REQUIRES YAML frontmatter
8
+ * `name` + `description` (files without it are ignored) and
9
+ * kebab-case names `^[a-z0-9]+(?:-[a-z0-9]+)*$`; the adapter
10
+ * guarantees both (frontmatter synthesis).
11
+ * B. commands → flat `~/.dsh/skills/<name>.md` — dsh's slash-command
12
+ * surface IS the skill surface (`/name`); frontmatter is kept
13
+ * and completed, unlike the Codex adapter which strips it.
14
+ * C. MCP → home-level `~/.dsh/cordis.patch.yml` — a managed
15
+ * `- insert:` row per profile mounting
16
+ * `'@deepseek-ai/dsh-mcp-client'` with the stdio
17
+ * `hnx mcp serve` shim. The row sits between per-profile
18
+ * marker comments; re-planning replaces only THIS profile's
19
+ * marked region (idempotent overwrite — other profiles'
20
+ * regions and user rows stay byte-for-byte), and dsh
21
+ * hot-reloads the home patch without a restart.
22
+ *
23
+ * Deferred (no verified declarative shape — see research): rules (the dsh
24
+ * persona is a config row; overwriting a user's is destructive), sub_agents
25
+ * (programmatic provider registry), hooks (CC/Codex bridges are opt-in
26
+ * packages) — all surface as skipped warnings.
27
+ */
28
+ import fs from 'node:fs';
29
+ import path from 'node:path';
30
+ import { createTargetAdapter } from '../adapter-factory.js';
31
+ import { hnxExecutablePath } from '../../config.js';
32
+ /** The install-state ledger filename inside the dsh home. */
33
+ const INSTALL_STATE_FILENAME = 'harness-nexus-install-state.json';
34
+ /** dsh home patch file — applied to EVERY profile and hot-reloaded live. */
35
+ const PATCH_FILENAME = 'cordis.patch.yml';
36
+ /** dsh `serverName` constraint: `[A-Za-z0-9_-]{1,32}`. */
37
+ const MAX_SERVER_NAME = 32;
38
+ const SERVER_NAME_PREFIX = 'harness-nexus';
39
+ /** A resource kind this adapter cannot emit (yet). */
40
+ const SKIPPED_KINDS = new Set(['rule', 'sub_agent', 'hook']);
41
+ const SKIP_REASONS = {
42
+ rule: 'dsh has no user-scope rules file — the persona is a config row hnx will not overwrite',
43
+ sub_agent: 'dsh sub-agents are programmatic providers, not files',
44
+ hook: 'dsh hook bridges are opt-in per-profile packages an install cannot wire',
45
+ };
46
+ /** dsh skill names are kebab-case `^[a-z0-9]+(?:-[a-z0-9]+)*$`. */
47
+ const KEBAB_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
48
+ function slugify(name) {
49
+ const slug = name
50
+ .toLowerCase()
51
+ .replace(/[^a-z0-9]+/g, '-')
52
+ .replace(/^-+|-+$/g, '')
53
+ .replace(/-{2,}/g, '-')
54
+ .slice(0, 64);
55
+ return slug === '' ? 'harness-nexus' : slug;
56
+ }
57
+ /** Cap a `harness-nexus-<slug>` server name to dsh's 32-char constraint. */
58
+ function serverNameFor(slug) {
59
+ return `${SERVER_NAME_PREFIX}-${slug}`.slice(0, MAX_SERVER_NAME);
60
+ }
61
+ // ---- frontmatter (dsh ignores skill files without name + description) ----
62
+ function splitFrontmatter(content) {
63
+ const lines = content.split('\n');
64
+ if (lines[0] === undefined || lines[0].trim() !== '---')
65
+ return null;
66
+ const end = lines.findIndex((l, i) => i > 0 && l.trim() === '---');
67
+ if (end === -1)
68
+ return null;
69
+ return { lines: lines.slice(1, end), body: lines.slice(end + 1).join('\n') };
70
+ }
71
+ /** Value of a `key: value` scalar line, surrounding quotes stripped. */
72
+ function scalarValue(line, key) {
73
+ const v = line.slice(key.length + 1).trim();
74
+ return v.replace(/^['"]|['"]$/g, '');
75
+ }
76
+ /**
77
+ * Guarantee the frontmatter dsh requires. Existing frontmatter lines are kept
78
+ * verbatim (dsh tolerates extra metadata keys); only `name` (must be kebab)
79
+ * and `description` (non-empty) are completed or corrected. JSON string
80
+ * quoting is valid YAML 1.2 double-quoting — the escape hatch for arbitrary
81
+ * description text.
82
+ */
83
+ export function ensureDshFrontmatter(content, slug, description) {
84
+ const fallback = JSON.stringify(description.trim().split('\n')[0] || slug);
85
+ const fm = splitFrontmatter(content);
86
+ if (fm === null) {
87
+ return `---\nname: ${slug}\ndescription: ${fallback}\n---\n\n${content}`;
88
+ }
89
+ const lines = [...fm.lines];
90
+ const nameIdx = lines.findIndex((l) => /^name:/.test(l));
91
+ if (nameIdx === -1) {
92
+ lines.unshift(`name: ${slug}`);
93
+ }
94
+ else if (!KEBAB_NAME.test(scalarValue(lines[nameIdx], 'name'))) {
95
+ lines[nameIdx] = `name: ${slug}`;
96
+ }
97
+ const descIdx = lines.findIndex((l) => /^description:/.test(l));
98
+ if (descIdx === -1) {
99
+ const afterName = lines.findIndex((l) => /^name:/.test(l)) + 1;
100
+ lines.splice(afterName, 0, `description: ${fallback}`);
101
+ }
102
+ else if (scalarValue(lines[descIdx], 'description') === '') {
103
+ // Block indicators (`>-`, `|`) count as present — only truly empty loses.
104
+ lines[descIdx] = `description: ${fallback}`;
105
+ }
106
+ return `---\n${lines.join('\n')}\n---\n${fm.body}`;
107
+ }
108
+ // ---- cordis patch surgery (per-profile managed region, no YAML parser) ----
109
+ const beginMarker = (slug) => `# BEGIN harness-nexus:${slug} (managed)`;
110
+ const endMarker = (slug) => `# END harness-nexus:${slug} (managed)`;
111
+ /**
112
+ * Replace (or append) this profile's managed region in the home patch,
113
+ * preserving every other byte — including other profiles' regions. Re-running
114
+ * with the same slug is idempotent, matching "plans are idempotent
115
+ * overwrites" upgrade semantics.
116
+ */
117
+ export function mergeManagedPatchRegion(existing, slug, block) {
118
+ const begin = beginMarker(slug);
119
+ const end = endMarker(slug);
120
+ let base = existing;
121
+ const b = base.indexOf(begin);
122
+ if (b !== -1) {
123
+ const e = base.indexOf(end, b);
124
+ if (e !== -1) {
125
+ base = base.slice(0, b) + base.slice(e + end.length).replace(/^\n+/, '');
126
+ }
127
+ }
128
+ base = base.replace(/\s+$/, '');
129
+ return `${base}${base.length > 0 ? '\n\n' : ''}${block}\n`;
130
+ }
131
+ /** Serialize this profile's `- insert:` block for the home patch. */
132
+ export function managedPatchBlock(resolved, serverBase) {
133
+ const slug = slugify(resolved.profile.name);
134
+ const args = ['mcp', 'serve', '--profile', resolved.profile.id, '--server', serverBase];
135
+ return [
136
+ `${beginMarker(slug)} — rewritten by hnx; keep edits outside the markers`,
137
+ `- insert:`,
138
+ ` - id: hnx-mcp-${slug}`,
139
+ ` name: '@deepseek-ai/dsh-mcp-client'`,
140
+ ` config:`,
141
+ ` serverName: ${serverNameFor(slug)}`,
142
+ ` transport: stdio`,
143
+ ` command: ${JSON.stringify(hnxExecutablePath())}`,
144
+ ` args: [${args.map((a) => JSON.stringify(a)).join(', ')}]`,
145
+ endMarker(slug),
146
+ ].join('\n');
147
+ }
148
+ /** Extract a Resource's inline file set (same policy as the other adapters). */
149
+ function resourceFiles(artifact) {
150
+ if (artifact.kind === 'mcp')
151
+ return [];
152
+ const src = artifact.resource.source;
153
+ if (src.type === 'inline') {
154
+ return [{ relativePath: 'SKILL.md', content: src.content }];
155
+ }
156
+ if (src.type === 'inline-bundle') {
157
+ return Object.entries(src.files).map(([rel, content]) => ({ relativePath: rel, content }));
158
+ }
159
+ return [];
160
+ }
161
+ export const deepseekAdapter = createTargetAdapter({
162
+ id: 'deepseek-home',
163
+ target: 'deepseek',
164
+ kind: 'home',
165
+ rootSegments: ['.dsh'],
166
+ planOperations(resolved, input, adapter) {
167
+ const root = adapter.resolveRoot(input);
168
+ const operations = [];
169
+ const skipped = [];
170
+ // ---- A. skills → ~/.dsh/skills/<name>/ (+ bundle files) ----
171
+ for (const a of resolved.artifacts) {
172
+ if (a.kind !== 'skill')
173
+ continue;
174
+ const files = resourceFiles(a);
175
+ if (files.length === 0) {
176
+ skipped.push(`skill:${a.resource.key} (non-inline source not fetchable by CLI)`);
177
+ continue;
178
+ }
179
+ const slug = slugify(a.resource.name);
180
+ const description = a.resource.description ?? a.resource.name;
181
+ if (!files.some((f) => f.relativePath === 'SKILL.md')) {
182
+ skipped.push(`skill:${a.resource.key} (bundle has no SKILL.md at root)`);
183
+ continue;
184
+ }
185
+ for (const f of files) {
186
+ const content = f.relativePath === 'SKILL.md'
187
+ ? ensureDshFrontmatter(f.content, slug, description)
188
+ : f.content;
189
+ operations.push({
190
+ kind: 'write-file',
191
+ content,
192
+ destinationPath: path.join(root, 'skills', slug, f.relativePath),
193
+ });
194
+ }
195
+ }
196
+ // ---- B. commands → flat ~/.dsh/skills/<name>.md (the /name surface) ----
197
+ for (const a of resolved.artifacts) {
198
+ if (a.kind !== 'command')
199
+ continue;
200
+ const files = resourceFiles(a);
201
+ const content = files[0]?.content;
202
+ if (content === undefined) {
203
+ skipped.push(`command:${a.resource.key} (non-inline source not fetchable by CLI)`);
204
+ continue;
205
+ }
206
+ const slug = slugify(a.resource.name);
207
+ operations.push({
208
+ kind: 'write-file',
209
+ content: ensureDshFrontmatter(content, slug, a.resource.description ?? a.resource.name),
210
+ destinationPath: path.join(root, 'skills', `${slug}.md`),
211
+ });
212
+ }
213
+ // ---- C. MCP → home cordis.patch.yml managed region ----
214
+ const serverBase = process.env.HN_SERVER ?? 'https://harness-nexus.example.com';
215
+ const hasMcp = resolved.artifacts.some((a) => a.kind === 'mcp');
216
+ let needsHnx = false;
217
+ if (hasMcp) {
218
+ const patchPath = path.join(root, PATCH_FILENAME);
219
+ const existing = fs.existsSync(patchPath) ? fs.readFileSync(patchPath, 'utf8') : '';
220
+ const merged = mergeManagedPatchRegion(existing, slugify(resolved.profile.name), managedPatchBlock(resolved, serverBase));
221
+ operations.push({ kind: 'write-file', content: merged, destinationPath: patchPath });
222
+ needsHnx = true;
223
+ }
224
+ // ---- skipped kinds ----
225
+ for (const a of resolved.artifacts) {
226
+ if (a.kind === 'mcp')
227
+ continue;
228
+ if (SKIPPED_KINDS.has(a.kind)) {
229
+ skipped.push(`${a.kind}:${a.resource.key} (${SKIP_REASONS[a.kind]})`);
230
+ }
231
+ }
232
+ lastPlanWarnings = { skipped, needsHnx };
233
+ return {
234
+ adapter: { id: adapter.id, target: adapter.target, kind: adapter.kind },
235
+ targetRoot: root,
236
+ installStatePath: path.join(root, INSTALL_STATE_FILENAME),
237
+ operations,
238
+ sensitive: false,
239
+ };
240
+ },
241
+ });
242
+ let lastPlanWarnings = { skipped: [], needsHnx: false };
243
+ export function getDeepseekPlanWarnings() {
244
+ return lastPlanWarnings;
245
+ }
246
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../../src/install/adapters/deepseek.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { TargetAdapter } from '../types.js';
2
+ /**
3
+ * The Hermes adapter. Overrides `planOperations` to emit the plugin bundle,
4
+ * the config.yaml MCP merge, and the AGENTS.md rule file.
5
+ */
6
+ export declare const hermesAdapter: TargetAdapter;
7
+ /** Warnings from the most recent hermes planInstall (read by the CLI for output). */
8
+ export interface HermesPlanWarnings {
9
+ skipped: string[];
10
+ /** True when the plan carries a `hnx mcp serve` shim entry. */
11
+ needsHnx: boolean;
12
+ pluginSlug: string;
13
+ needsPluginEnable: boolean;
14
+ }
15
+ export declare function getHermesPlanWarnings(): HermesPlanWarnings;
16
+ //# sourceMappingURL=hermes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../../src/install/adapters/hermes.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAMV,aAAa,EACd,MAAM,aAAa,CAAC;AAsIrB;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAuH1B,CAAC;AAEH,qFAAqF;AACrF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAOD,wBAAgB,qBAAqB,IAAI,kBAAkB,CAE1D"}