@nepopsx/cli 0.0.23 → 0.0.25

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 (132) hide show
  1. package/dist/commands/guard.d.ts +10 -0
  2. package/dist/commands/guard.d.ts.map +1 -0
  3. package/dist/commands/guard.js +63 -0
  4. package/dist/commands/guard.js.map +1 -0
  5. package/dist/commands/import-agents.d.ts +17 -0
  6. package/dist/commands/import-agents.d.ts.map +1 -0
  7. package/dist/commands/import-agents.js +166 -0
  8. package/dist/commands/import-agents.js.map +1 -0
  9. package/dist/commands/import.d.ts +19 -0
  10. package/dist/commands/import.d.ts.map +1 -0
  11. package/dist/commands/import.js +175 -0
  12. package/dist/commands/import.js.map +1 -0
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +22 -14
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/install.js +4 -4
  17. package/dist/commands/install.js.map +1 -1
  18. package/dist/commands/login.d.ts +3 -3
  19. package/dist/commands/login.d.ts.map +1 -1
  20. package/dist/commands/login.js +26 -70
  21. package/dist/commands/login.js.map +1 -1
  22. package/dist/commands/push-learnings.js +1 -1
  23. package/dist/commands/push-learnings.js.map +1 -1
  24. package/dist/commands/sync.d.ts.map +1 -1
  25. package/dist/commands/sync.js +7 -2
  26. package/dist/commands/sync.js.map +1 -1
  27. package/dist/commands/up.js +2 -2
  28. package/dist/commands/up.js.map +1 -1
  29. package/dist/config/api-config.d.ts +7 -0
  30. package/dist/config/api-config.d.ts.map +1 -1
  31. package/dist/config/api-config.js +9 -1
  32. package/dist/config/api-config.js.map +1 -1
  33. package/dist/config/global-config.d.ts +52 -0
  34. package/dist/config/global-config.d.ts.map +1 -0
  35. package/dist/config/global-config.js +161 -0
  36. package/dist/config/global-config.js.map +1 -0
  37. package/dist/config/global-config.test.d.ts +2 -0
  38. package/dist/config/global-config.test.d.ts.map +1 -0
  39. package/dist/config/global-config.test.js +62 -0
  40. package/dist/config/global-config.test.js.map +1 -0
  41. package/dist/guard/policy.d.ts +38 -0
  42. package/dist/guard/policy.d.ts.map +1 -0
  43. package/dist/guard/policy.js +62 -0
  44. package/dist/guard/policy.js.map +1 -0
  45. package/dist/guard/policy.test.d.ts +2 -0
  46. package/dist/guard/policy.test.d.ts.map +1 -0
  47. package/dist/guard/policy.test.js +47 -0
  48. package/dist/guard/policy.test.js.map +1 -0
  49. package/dist/hooks/capture-hooks.d.ts.map +1 -1
  50. package/dist/hooks/capture-hooks.js +36 -1
  51. package/dist/hooks/capture-hooks.js.map +1 -1
  52. package/dist/import/adapter.d.ts +82 -0
  53. package/dist/import/adapter.d.ts.map +1 -0
  54. package/dist/import/adapter.js +111 -0
  55. package/dist/import/adapter.js.map +1 -0
  56. package/dist/import/adapter.test.d.ts +2 -0
  57. package/dist/import/adapter.test.d.ts.map +1 -0
  58. package/dist/import/adapter.test.js +100 -0
  59. package/dist/import/adapter.test.js.map +1 -0
  60. package/dist/import/agents/agent-adapter.d.ts +83 -0
  61. package/dist/import/agents/agent-adapter.d.ts.map +1 -0
  62. package/dist/import/agents/agent-adapter.js +66 -0
  63. package/dist/import/agents/agent-adapter.js.map +1 -0
  64. package/dist/import/agents/agent-adapter.test.d.ts +2 -0
  65. package/dist/import/agents/agent-adapter.test.d.ts.map +1 -0
  66. package/dist/import/agents/agent-adapter.test.js +99 -0
  67. package/dist/import/agents/agent-adapter.test.js.map +1 -0
  68. package/dist/import/agents/artifact-parser.d.ts +26 -0
  69. package/dist/import/agents/artifact-parser.d.ts.map +1 -0
  70. package/dist/import/agents/artifact-parser.js +40 -0
  71. package/dist/import/agents/artifact-parser.js.map +1 -0
  72. package/dist/import/agents/assembler.d.ts +32 -0
  73. package/dist/import/agents/assembler.d.ts.map +1 -0
  74. package/dist/import/agents/assembler.js +62 -0
  75. package/dist/import/agents/assembler.js.map +1 -0
  76. package/dist/import/agents/assembler.test.d.ts +2 -0
  77. package/dist/import/agents/assembler.test.d.ts.map +1 -0
  78. package/dist/import/agents/assembler.test.js +115 -0
  79. package/dist/import/agents/assembler.test.js.map +1 -0
  80. package/dist/import/agents/claude-code-adapter.d.ts +11 -0
  81. package/dist/import/agents/claude-code-adapter.d.ts.map +1 -0
  82. package/dist/import/agents/claude-code-adapter.js +67 -0
  83. package/dist/import/agents/claude-code-adapter.js.map +1 -0
  84. package/dist/import/agents/copilot-agent-adapter.d.ts +12 -0
  85. package/dist/import/agents/copilot-agent-adapter.d.ts.map +1 -0
  86. package/dist/import/agents/copilot-agent-adapter.js +89 -0
  87. package/dist/import/agents/copilot-agent-adapter.js.map +1 -0
  88. package/dist/import/agents/scanner.d.ts +15 -0
  89. package/dist/import/agents/scanner.d.ts.map +1 -0
  90. package/dist/import/agents/scanner.js +87 -0
  91. package/dist/import/agents/scanner.js.map +1 -0
  92. package/dist/import/agents/secret-scan.d.ts +14 -0
  93. package/dist/import/agents/secret-scan.d.ts.map +1 -0
  94. package/dist/import/agents/secret-scan.js +64 -0
  95. package/dist/import/agents/secret-scan.js.map +1 -0
  96. package/dist/import/agents/secret-scan.test.d.ts +2 -0
  97. package/dist/import/agents/secret-scan.test.d.ts.map +1 -0
  98. package/dist/import/agents/secret-scan.test.js +41 -0
  99. package/dist/import/agents/secret-scan.test.js.map +1 -0
  100. package/dist/import/claude-memory-adapter.d.ts +20 -0
  101. package/dist/import/claude-memory-adapter.d.ts.map +1 -0
  102. package/dist/import/claude-memory-adapter.js +87 -0
  103. package/dist/import/claude-memory-adapter.js.map +1 -0
  104. package/dist/import/copilot-adapter.d.ts +13 -0
  105. package/dist/import/copilot-adapter.d.ts.map +1 -0
  106. package/dist/import/copilot-adapter.js +75 -0
  107. package/dist/import/copilot-adapter.js.map +1 -0
  108. package/dist/index.js +28 -7
  109. package/dist/index.js.map +1 -1
  110. package/dist/learnings/memory-index.d.ts +17 -0
  111. package/dist/learnings/memory-index.d.ts.map +1 -0
  112. package/dist/learnings/memory-index.js +73 -0
  113. package/dist/learnings/memory-index.js.map +1 -0
  114. package/dist/licensing/index.d.ts +1 -1
  115. package/dist/licensing/index.d.ts.map +1 -1
  116. package/dist/licensing/index.js +1 -1
  117. package/dist/licensing/index.js.map +1 -1
  118. package/dist/licensing/installer.d.ts +7 -8
  119. package/dist/licensing/installer.d.ts.map +1 -1
  120. package/dist/licensing/installer.js +9 -17
  121. package/dist/licensing/installer.js.map +1 -1
  122. package/dist/licensing/license-manager.d.ts +25 -51
  123. package/dist/licensing/license-manager.d.ts.map +1 -1
  124. package/dist/licensing/license-manager.js +54 -275
  125. package/dist/licensing/license-manager.js.map +1 -1
  126. package/dist/licensing/workspace-name.d.ts +1 -1
  127. package/dist/licensing/workspace-name.js +1 -1
  128. package/dist/mcp/config-generator.d.ts +6 -6
  129. package/dist/mcp/config-generator.d.ts.map +1 -1
  130. package/dist/mcp/config-generator.js +4 -4
  131. package/dist/mcp/config-generator.js.map +1 -1
  132. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-adapter.d.ts","sourceRoot":"","sources":["../../../src/import/agents/agent-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAEnE,0FAA0F;AAC1F,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE5C,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uEAAuE;IACvE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,mBAAmB,CAAC;IACpC,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,mBAAmB,CAAC;IACxB,kFAAkF;IAClF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,mFAAmF;IACnF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC5E;AAID,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAY/D;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAIrD;AAED,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,EAAE,CAc1D;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtE"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Agent comprehension — the import-side inverse of the renderer.
3
+ *
4
+ * Parses a foreign agent file (`.claude/agents/*.md`, `.github/agents/*.agent.md`)
5
+ * into a {@link RawAgent}: a lossless, provider-neutral view that serializes into the
6
+ * backend Agent IR. This mirrors the memory {@link MemoryAdapter}/{@link RawLearning}
7
+ * pattern (import/adapter.ts) one level up — from a single learning to a whole agent.
8
+ *
9
+ * Foreign agents are UNTRUSTED: like the memory import, they land PENDING for review
10
+ * on the backend (never auto-blessed). Capture-all: `raw` preserves the verbatim
11
+ * source so nothing is lost even for fields we don't yet normalize.
12
+ */
13
+ import { existsSync, readdirSync, statSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { toGlobList } from '../adapter.js';
16
+ // ─── Shared parse helpers ───────────────────────────────────────────────────
17
+ /** List files one level under `dir` whose name ends with `suffix`. Safe if absent. */
18
+ export function listFiles(dir, suffix) {
19
+ if (!existsSync(dir))
20
+ return [];
21
+ const out = [];
22
+ for (const entry of readdirSync(dir)) {
23
+ const full = join(dir, entry);
24
+ try {
25
+ if (statSync(full).isFile() && entry.endsWith(suffix))
26
+ out.push(full);
27
+ }
28
+ catch {
29
+ /* ignore unreadable entries — comprehension is best-effort */
30
+ }
31
+ }
32
+ return out.sort();
33
+ }
34
+ /** Coerce a frontmatter value to string[] (a list, a comma-string, or a lone string). */
35
+ export function toStringList(value) {
36
+ if (Array.isArray(value))
37
+ return value.filter((v) => typeof v === 'string');
38
+ if (typeof value === 'string')
39
+ return toGlobList(value);
40
+ return [];
41
+ }
42
+ /** Normalize a `handoffs:` frontmatter block into RawHandoff[] (drops entries with no agent). */
43
+ export function parseHandoffs(value) {
44
+ if (!Array.isArray(value))
45
+ return [];
46
+ const out = [];
47
+ for (const entry of value) {
48
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry))
49
+ continue;
50
+ const e = entry;
51
+ if (typeof e.agent !== 'string')
52
+ continue;
53
+ out.push({
54
+ agent: e.agent,
55
+ label: typeof e.label === 'string' ? e.label : undefined,
56
+ prompt: typeof e.prompt === 'string' ? e.prompt : undefined,
57
+ });
58
+ }
59
+ return out;
60
+ }
61
+ /** The agent's base name: strip directories and a known suffix (`.agent.md`, `.md`, …). */
62
+ export function agentBaseName(filePath, suffix) {
63
+ const base = filePath.split(/[\\/]/).pop() ?? filePath;
64
+ return base.endsWith(suffix) ? base.slice(0, -suffix.length) : base.replace(/\.md$/, '');
65
+ }
66
+ //# sourceMappingURL=agent-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../../src/import/agents/agent-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAuE3C,+EAA+E;AAE/E,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,MAAc;IACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACzF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QAC1E,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,SAAS;QAC1C,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACxD,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAAc;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-adapter.test.d.ts","sourceRoot":"","sources":["../../../src/import/agents/agent-adapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { describe, it } from 'node:test';
3
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ import { claudeCodeAgentAdapter } from './claude-code-adapter.js';
7
+ import { copilotAgentAdapter } from './copilot-agent-adapter.js';
8
+ const CLAUDE_AGENT = `---
9
+ name: reviewer
10
+ description: Read-only code reviewer
11
+ model: claude-opus-4-8
12
+ permissionMode: plan
13
+ maxTurns: 8
14
+ tools: Read, Grep, Glob
15
+ ---
16
+ You are a meticulous reviewer. Do not edit files.
17
+ `;
18
+ const COPILOT_WORKER = `---
19
+ description: "[FF] Developer"
20
+ user-invocable: false
21
+ model: "claude-sonnet-4-6"
22
+ tools:
23
+ - search/codebase
24
+ - edit/editFiles
25
+ ---
26
+ Implement the task.
27
+ `;
28
+ const COPILOT_ORCH = `---
29
+ description: Plan Orchestrator
30
+ infer: false
31
+ agents:
32
+ - ff-strategist
33
+ - ff-architect
34
+ handoffs:
35
+ - label: Start
36
+ agent: ff-implement
37
+ ---
38
+ Coordinate discovery and planning.
39
+ `;
40
+ describe('claudeCodeAgentAdapter.parse', () => {
41
+ it('comprehends a Claude subagent and preserves expanded fields in extra', () => {
42
+ const a = claudeCodeAgentAdapter.parse('/repo/.claude/agents/reviewer.md', CLAUDE_AGENT, '/repo');
43
+ assert.ok(a);
44
+ assert.equal(a.kind, 'agent');
45
+ assert.equal(a.name, 'reviewer');
46
+ assert.equal(a.slug, 'reviewer');
47
+ assert.equal(a.originProvider, 'claude-code');
48
+ assert.deepEqual(a.tools, ['Read', 'Grep', 'Glob']);
49
+ assert.equal(a.extra.permissionMode, 'plan'); // expanded field preserved
50
+ assert.equal(a.extra.maxTurns, 8);
51
+ assert.equal(a.importedFrom, '.claude/agents/reviewer.md');
52
+ assert.match(a.instructions, /meticulous reviewer/);
53
+ assert.equal(a.raw, CLAUDE_AGENT); // byte-lossless
54
+ });
55
+ it('flags tool inheritance when no tools are listed', () => {
56
+ const a = claudeCodeAgentAdapter.parse('/repo/.claude/agents/x.md', '---\ndescription: x\n---\nbody', '/repo');
57
+ assert.ok(a);
58
+ assert.deepEqual(a.tools, []);
59
+ assert.ok(a.fidelity.some((f) => f.field === 'tools'));
60
+ });
61
+ });
62
+ describe('copilotAgentAdapter.parse', () => {
63
+ it('comprehends a worker agent', () => {
64
+ const a = copilotAgentAdapter.parse('/repo/.github/agents/ff-developer.agent.md', COPILOT_WORKER, '/repo');
65
+ assert.ok(a);
66
+ assert.equal(a.kind, 'agent');
67
+ assert.equal(a.name, 'ff-developer');
68
+ assert.equal(a.userInvocable, false);
69
+ assert.deepEqual(a.tools, ['search/codebase', 'edit/editFiles']);
70
+ assert.equal(a.originProvider, 'github-copilot');
71
+ });
72
+ it('detects orchestrators (agents:) as commands, captures handoffs, maps retired infer', () => {
73
+ const a = copilotAgentAdapter.parse('/repo/.github/agents/orch.agent.md', COPILOT_ORCH, '/repo');
74
+ assert.ok(a);
75
+ assert.equal(a.kind, 'command');
76
+ assert.deepEqual(a.subAgents, ['ff-strategist', 'ff-architect']);
77
+ assert.equal(a.handoffs.length, 1);
78
+ assert.equal(a.handoffs[0].agent, 'ff-implement');
79
+ assert.equal(a.userInvocable, false); // infer:false → user-invocable:false
80
+ assert.ok(a.fidelity.some((f) => f.field === 'infer'));
81
+ });
82
+ });
83
+ describe('agent adapters — detect', () => {
84
+ it('finds agent files for each provider', () => {
85
+ const root = mkdtempSync(join(tmpdir(), 'agentimport-'));
86
+ try {
87
+ mkdirSync(join(root, '.claude', 'agents'), { recursive: true });
88
+ writeFileSync(join(root, '.claude', 'agents', 'sage.md'), CLAUDE_AGENT);
89
+ mkdirSync(join(root, '.github', 'agents'), { recursive: true });
90
+ writeFileSync(join(root, '.github', 'agents', 'dev.agent.md'), COPILOT_WORKER);
91
+ assert.equal(claudeCodeAgentAdapter.detect(root).length, 1);
92
+ assert.equal(copilotAgentAdapter.detect(root).length, 1);
93
+ }
94
+ finally {
95
+ rmSync(root, { recursive: true, force: true });
96
+ }
97
+ });
98
+ });
99
+ //# sourceMappingURL=agent-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-adapter.test.js","sourceRoot":"","sources":["../../../src/import/agents/agent-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Light parsers for the non-agent artifacts an agent bundle links to: Skills
3
+ * (`SKILL.md`) and commands (`.claude/commands/*.md`, `.github/prompts/*.prompt.md`).
4
+ *
5
+ * Skill identity is the open-standard rule: a skill's name is its DIRECTORY name,
6
+ * NOT its frontmatter `name`. (MCP/hooks/settings parsing arrives with slice 3, which
7
+ * pairs them with secret redaction.)
8
+ */
9
+ import { type AgentOriginProvider } from './agent-adapter.js';
10
+ export type ArtifactKind = 'skill' | 'command';
11
+ export interface RawArtifact {
12
+ kind: ArtifactKind;
13
+ /** Skill: kebab of the directory name. Command: kebab of the file stem. */
14
+ slug: string;
15
+ name: string;
16
+ description?: string;
17
+ body: string;
18
+ raw: string;
19
+ importedFrom: string;
20
+ originProvider: AgentOriginProvider;
21
+ }
22
+ /** Parse a SKILL.md. `dirName` is the skill's directory — its canonical identity. */
23
+ export declare function parseSkill(content: string, dirName: string, originProvider: AgentOriginProvider, importedFrom: string): RawArtifact;
24
+ /** Parse a slash command / prompt file. */
25
+ export declare function parseCommand(filePath: string, content: string, suffix: string, originProvider: AgentOriginProvider, importedFrom: string): RawArtifact;
26
+ //# sourceMappingURL=artifact-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-parser.d.ts","sourceRoot":"","sources":["../../../src/import/agents/artifact-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,mBAAmB,EAAiB,MAAM,oBAAoB,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,YAAY,CAAC;IACnB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,mBAAmB,CAAC;CACrC;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,mBAAmB,EACnC,YAAY,EAAE,MAAM,GACnB,WAAW,CAYb;AAED,2CAA2C;AAC3C,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,mBAAmB,EACnC,YAAY,EAAE,MAAM,GACnB,WAAW,CAab"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Light parsers for the non-agent artifacts an agent bundle links to: Skills
3
+ * (`SKILL.md`) and commands (`.claude/commands/*.md`, `.github/prompts/*.prompt.md`).
4
+ *
5
+ * Skill identity is the open-standard rule: a skill's name is its DIRECTORY name,
6
+ * NOT its frontmatter `name`. (MCP/hooks/settings parsing arrives with slice 3, which
7
+ * pairs them with secret redaction.)
8
+ */
9
+ import { parseFrontmatter, kebab } from '../adapter.js';
10
+ import { agentBaseName } from './agent-adapter.js';
11
+ /** Parse a SKILL.md. `dirName` is the skill's directory — its canonical identity. */
12
+ export function parseSkill(content, dirName, originProvider, importedFrom) {
13
+ const { data, body } = parseFrontmatter(content);
14
+ return {
15
+ kind: 'skill',
16
+ slug: kebab(dirName),
17
+ name: typeof data.name === 'string' && data.name.trim() ? data.name.trim() : dirName,
18
+ description: typeof data.description === 'string' ? data.description : undefined,
19
+ body: body.trim(),
20
+ raw: content,
21
+ importedFrom,
22
+ originProvider,
23
+ };
24
+ }
25
+ /** Parse a slash command / prompt file. */
26
+ export function parseCommand(filePath, content, suffix, originProvider, importedFrom) {
27
+ const { data, body } = parseFrontmatter(content);
28
+ const name = agentBaseName(filePath, suffix);
29
+ return {
30
+ kind: 'command',
31
+ slug: kebab(name),
32
+ name,
33
+ description: typeof data.description === 'string' ? data.description : undefined,
34
+ body: body.trim(),
35
+ raw: content,
36
+ importedFrom,
37
+ originProvider,
38
+ };
39
+ }
40
+ //# sourceMappingURL=artifact-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-parser.js","sourceRoot":"","sources":["../../../src/import/agents/artifact-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAA4B,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgB7E,qFAAqF;AACrF,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,OAAe,EACf,cAAmC,EACnC,YAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;QACpB,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO;QACpF,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QAChF,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACjB,GAAG,EAAE,OAAO;QACZ,YAAY;QACZ,cAAc;KACf,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,OAAe,EACf,MAAc,EACd,cAAmC,EACnC,YAAoB;IAEpB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;QACjB,IAAI;QACJ,WAAW,EAAE,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;QAChF,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;QACjB,GAAG,EAAE,OAAO;QACZ,YAAY;QACZ,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Bundle assembler — turn a flat scan into agent-centric bundles.
3
+ *
4
+ * Each agent becomes a bundle: the agent + the artifacts it pulls in (per-agent skills)
5
+ * + its orchestration graph (sub-agent + handoff edges). Every edge is resolved against
6
+ * the comprehended set; a target that isn't present is flagged DANGLING (a `warn`
7
+ * fidelity note) rather than silently dropped — so the reviewer sees a partial import.
8
+ */
9
+ import { type AgentFidelityNote, type RawAgent } from './agent-adapter.js';
10
+ import { type RawArtifact } from './artifact-parser.js';
11
+ import { type ScanResult } from './scanner.js';
12
+ export interface GraphEdge {
13
+ /** Source agent slug. */
14
+ from: string;
15
+ /** Target agent slug (kebab of the referenced name). */
16
+ to: string;
17
+ kind: 'subagent' | 'handoff';
18
+ /** Whether `to` resolves to an agent present in the import set. */
19
+ resolvedInSet: boolean;
20
+ }
21
+ export interface AgentBundle {
22
+ agent: RawAgent;
23
+ /** Per-agent skills this agent links to (Claude `skills:`); shared skills resolved by slug/name. */
24
+ skills: RawArtifact[];
25
+ commands: RawArtifact[];
26
+ graph: GraphEdge[];
27
+ /** Bundle-level fidelity notes (e.g. dangling references). */
28
+ fidelity: AgentFidelityNote[];
29
+ }
30
+ /** Assemble agent-centric bundles from a repo scan. */
31
+ export declare function assembleBundles(scan: ScanResult): AgentBundle[];
32
+ //# sourceMappingURL=assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.d.ts","sourceRoot":"","sources":["../../../src/import/agents/assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAgB,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,mEAAmE;IACnE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,oGAAoG;IACpG,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE,CAuD/D"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Bundle assembler — turn a flat scan into agent-centric bundles.
3
+ *
4
+ * Each agent becomes a bundle: the agent + the artifacts it pulls in (per-agent skills)
5
+ * + its orchestration graph (sub-agent + handoff edges). Every edge is resolved against
6
+ * the comprehended set; a target that isn't present is flagged DANGLING (a `warn`
7
+ * fidelity note) rather than silently dropped — so the reviewer sees a partial import.
8
+ */
9
+ import { kebab } from '../adapter.js';
10
+ import { toStringList } from './agent-adapter.js';
11
+ /** Assemble agent-centric bundles from a repo scan. */
12
+ export function assembleBundles(scan) {
13
+ // Known identifiers an edge can resolve to — both names and slugs of every agent.
14
+ const known = new Set();
15
+ for (const a of scan.agents) {
16
+ known.add(a.name);
17
+ known.add(a.slug);
18
+ }
19
+ const resolves = (ref) => known.has(ref) || known.has(kebab(ref));
20
+ const skillBySlug = new Map(scan.skills.map((s) => [s.slug, s]));
21
+ const skillByName = new Map(scan.skills.map((s) => [s.name, s]));
22
+ return scan.agents.map((agent) => {
23
+ const graph = [];
24
+ const fidelity = [];
25
+ for (const sub of agent.subAgents) {
26
+ const resolvedInSet = resolves(sub);
27
+ graph.push({ from: agent.slug, to: kebab(sub), kind: 'subagent', resolvedInSet });
28
+ if (!resolvedInSet) {
29
+ fidelity.push({
30
+ field: 'subAgents',
31
+ severity: 'warn',
32
+ detail: `Sub-agent "${sub}" is referenced but not in the import set (dangling).`,
33
+ });
34
+ }
35
+ }
36
+ for (const ho of agent.handoffs) {
37
+ const resolvedInSet = resolves(ho.agent);
38
+ graph.push({ from: agent.slug, to: kebab(ho.agent), kind: 'handoff', resolvedInSet });
39
+ if (!resolvedInSet) {
40
+ fidelity.push({
41
+ field: 'handoffs',
42
+ severity: 'warn',
43
+ detail: `Handoff target "${ho.agent}" is not in the import set (dangling).`,
44
+ });
45
+ }
46
+ }
47
+ // Per-agent skill linking: Claude subagents can list `skills:` (now in `extra`).
48
+ // Match by skill slug or frontmatter name; de-dupe.
49
+ const want = toStringList(agent.extra.skills);
50
+ const seen = new Set();
51
+ const skills = [];
52
+ for (const ref of want) {
53
+ const hit = skillBySlug.get(ref) ?? skillByName.get(ref) ?? skillBySlug.get(kebab(ref));
54
+ if (hit && !seen.has(hit.slug)) {
55
+ seen.add(hit.slug);
56
+ skills.push(hit);
57
+ }
58
+ }
59
+ return { agent, skills, commands: [], graph, fidelity };
60
+ });
61
+ }
62
+ //# sourceMappingURL=assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../../src/import/agents/assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=assembler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.test.d.ts","sourceRoot":"","sources":["../../../src/import/agents/assembler.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { strict as assert } from 'node:assert';
2
+ import { describe, it } from 'node:test';
3
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ import { assembleBundles } from './assembler.js';
7
+ import { scanRepo } from './scanner.js';
8
+ function agent(partial) {
9
+ return {
10
+ kind: 'agent',
11
+ description: undefined,
12
+ modelRaw: undefined,
13
+ tools: [],
14
+ disallowedTools: [],
15
+ handoffs: [],
16
+ subAgents: [],
17
+ userInvocable: undefined,
18
+ target: undefined,
19
+ extra: {},
20
+ instructions: '',
21
+ originProvider: 'github-copilot',
22
+ importedFrom: `x/${partial.slug}.agent.md`,
23
+ raw: '',
24
+ fidelity: [],
25
+ ...partial,
26
+ };
27
+ }
28
+ function skill(slug, name) {
29
+ return {
30
+ kind: 'skill',
31
+ slug,
32
+ name: name ?? slug,
33
+ description: undefined,
34
+ body: '',
35
+ raw: '',
36
+ importedFrom: `.claude/skills/${slug}/SKILL.md`,
37
+ originProvider: 'claude-code',
38
+ };
39
+ }
40
+ describe('assembleBundles — orchestration graph + dangling detection', () => {
41
+ it('resolves sub-agent + handoff edges that are present in the set', () => {
42
+ const scan = {
43
+ agents: [
44
+ agent({ slug: 'orch', name: 'orch', kind: 'command', subAgents: ['worker-a', 'worker-b'], handoffs: [{ agent: 'finisher' }] }),
45
+ agent({ slug: 'worker-a', name: 'worker-a' }),
46
+ agent({ slug: 'worker-b', name: 'worker-b' }),
47
+ agent({ slug: 'finisher', name: 'finisher' }),
48
+ ],
49
+ skills: [],
50
+ commands: [],
51
+ };
52
+ const bundles = assembleBundles(scan);
53
+ const orch = bundles.find((b) => b.agent.slug === 'orch');
54
+ assert.equal(orch.graph.length, 3);
55
+ assert.ok(orch.graph.every((e) => e.resolvedInSet));
56
+ assert.equal(orch.fidelity.length, 0); // no dangling
57
+ });
58
+ it('flags a sub-agent and a handoff target that are NOT in the set as dangling', () => {
59
+ const scan = {
60
+ agents: [
61
+ agent({ slug: 'orch', name: 'orch', kind: 'command', subAgents: ['present', 'ghost'], handoffs: [{ agent: 'missing-finisher' }] }),
62
+ agent({ slug: 'present', name: 'present' }),
63
+ ],
64
+ skills: [],
65
+ commands: [],
66
+ };
67
+ const orch = assembleBundles(scan).find((b) => b.agent.slug === 'orch');
68
+ const ghost = orch.graph.find((e) => e.to === 'ghost');
69
+ const finisher = orch.graph.find((e) => e.to === 'missing-finisher');
70
+ assert.equal(ghost.resolvedInSet, false);
71
+ assert.equal(finisher.resolvedInSet, false);
72
+ assert.equal(orch.graph.find((e) => e.to === 'present').resolvedInSet, true);
73
+ // two dangling notes (one sub-agent, one handoff)
74
+ assert.equal(orch.fidelity.filter((f) => f.severity === 'warn').length, 2);
75
+ });
76
+ it('links per-agent Claude skills by slug/name', () => {
77
+ const scan = {
78
+ agents: [agent({ slug: 'sage', name: 'sage', originProvider: 'claude-code', extra: { skills: ['spec-driven-development', 'tdd'] } })],
79
+ skills: [skill('spec-driven-development'), skill('tdd', 'Test Driven Development'), skill('unused')],
80
+ commands: [],
81
+ };
82
+ const sage = assembleBundles(scan)[0];
83
+ assert.deepEqual(sage.skills.map((s) => s.slug).sort(), ['spec-driven-development', 'tdd']);
84
+ });
85
+ });
86
+ describe('scanRepo — discovers agents, skills, commands across both ecosystems', () => {
87
+ it('finds all artifact types', () => {
88
+ const root = mkdtempSync(join(tmpdir(), 'scan-'));
89
+ try {
90
+ mkdirSync(join(root, '.claude', 'agents'), { recursive: true });
91
+ writeFileSync(join(root, '.claude', 'agents', 'rev.md'), '---\ndescription: reviewer\ntools: Read\n---\nbody');
92
+ mkdirSync(join(root, '.github', 'agents'), { recursive: true });
93
+ writeFileSync(join(root, '.github', 'agents', 'orch.agent.md'), '---\ndescription: o\nagents:\n - rev\n---\nbody');
94
+ mkdirSync(join(root, '.claude', 'skills', 'tdd'), { recursive: true });
95
+ writeFileSync(join(root, '.claude', 'skills', 'tdd', 'SKILL.md'), '---\nname: tdd\ndescription: test first\n---\nbody');
96
+ mkdirSync(join(root, '.claude', 'commands', 'ff'), { recursive: true });
97
+ writeFileSync(join(root, '.claude', 'commands', 'ff', 'start.md'), 'start command');
98
+ mkdirSync(join(root, '.github', 'prompts'), { recursive: true });
99
+ writeFileSync(join(root, '.github', 'prompts', 'go.prompt.md'), 'go');
100
+ const scan = scanRepo(root);
101
+ assert.equal(scan.agents.length, 2);
102
+ assert.equal(scan.skills.length, 1);
103
+ assert.equal(scan.skills[0].slug, 'tdd');
104
+ assert.equal(scan.commands.length, 2); // namespaced .claude/commands/ff/start.md + go.prompt.md
105
+ // assemble: the Copilot orchestrator's sub-agent "rev" resolves to the Claude agent
106
+ const orch = assembleBundles(scan).find((b) => b.agent.kind === 'command');
107
+ assert.equal(orch.graph.length, 1);
108
+ assert.equal(orch.graph[0].resolvedInSet, true);
109
+ }
110
+ finally {
111
+ rmSync(root, { recursive: true, force: true });
112
+ }
113
+ });
114
+ });
115
+ //# sourceMappingURL=assembler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.test.js","sourceRoot":"","sources":["../../../src/import/agents/assembler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Comprehend Claude Code subagents (`.claude/agents/*.md`).
3
+ *
4
+ * Frontmatter is Claude-native (name, description, tools, model, color, plus the
5
+ * expanded set: permissionMode, disallowedTools, maxTurns, effort, isolation, skills,
6
+ * mcpServers, hooks, memory, background, …). Known keys are normalized; everything
7
+ * else is preserved verbatim in `extra`. The body IS the agent's system prompt.
8
+ */
9
+ import { type AgentAdapter } from './agent-adapter.js';
10
+ export declare const claudeCodeAgentAdapter: AgentAdapter;
11
+ //# sourceMappingURL=claude-code-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-adapter.d.ts","sourceRoot":"","sources":["../../../src/import/agents/claude-code-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EACL,KAAK,YAAY,EAKlB,MAAM,oBAAoB,CAAC;AAK5B,eAAO,MAAM,sBAAsB,EAAE,YA0DpC,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Comprehend Claude Code subagents (`.claude/agents/*.md`).
3
+ *
4
+ * Frontmatter is Claude-native (name, description, tools, model, color, plus the
5
+ * expanded set: permissionMode, disallowedTools, maxTurns, effort, isolation, skills,
6
+ * mcpServers, hooks, memory, background, …). Known keys are normalized; everything
7
+ * else is preserved verbatim in `extra`. The body IS the agent's system prompt.
8
+ */
9
+ import { join, relative } from 'node:path';
10
+ import { parseFrontmatter, kebab } from '../adapter.js';
11
+ import { agentBaseName, listFiles, toStringList, } from './agent-adapter.js';
12
+ /** Keys mapped to first-class RawAgent fields; the rest flow into `extra`. */
13
+ const KNOWN_CLAUDE_KEYS = new Set(['name', 'description', 'tools', 'disallowedTools', 'model']);
14
+ export const claudeCodeAgentAdapter = {
15
+ id: 'claude-code',
16
+ detect(rootDir) {
17
+ return listFiles(join(rootDir, '.claude', 'agents'), '.md');
18
+ },
19
+ parse(filePath, content, rootDir) {
20
+ const { data, body } = parseFrontmatter(content);
21
+ const fidelity = [];
22
+ const name = typeof data.name === 'string' && data.name.trim()
23
+ ? data.name.trim()
24
+ : agentBaseName(filePath, '.md');
25
+ const description = typeof data.description === 'string' ? data.description : undefined;
26
+ if (!description) {
27
+ fidelity.push({
28
+ field: 'description',
29
+ severity: 'warn',
30
+ detail: 'No description — the agent may not route/auto-invoke correctly.',
31
+ });
32
+ }
33
+ const tools = toStringList(data.tools);
34
+ if (!('tools' in data)) {
35
+ fidelity.push({
36
+ field: 'tools',
37
+ severity: 'info',
38
+ detail: 'No tools listed — a Claude subagent inherits all tools.',
39
+ });
40
+ }
41
+ const extra = {};
42
+ for (const [k, v] of Object.entries(data)) {
43
+ if (!KNOWN_CLAUDE_KEYS.has(k))
44
+ extra[k] = v;
45
+ }
46
+ return {
47
+ kind: 'agent', // Claude subagents don't declare a sub-agent graph in frontmatter
48
+ slug: kebab(name),
49
+ name,
50
+ description,
51
+ modelRaw: data.model,
52
+ tools,
53
+ disallowedTools: toStringList(data.disallowedTools),
54
+ handoffs: [],
55
+ subAgents: [],
56
+ userInvocable: undefined,
57
+ target: undefined,
58
+ extra,
59
+ instructions: body.trim(),
60
+ originProvider: 'claude-code',
61
+ importedFrom: relative(rootDir, filePath).replace(/\\/g, '/'),
62
+ raw: content,
63
+ fidelity,
64
+ };
65
+ },
66
+ };
67
+ //# sourceMappingURL=claude-code-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-adapter.js","sourceRoot":"","sources":["../../../src/import/agents/claude-code-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAGL,aAAa,EACb,SAAS,EACT,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhG,MAAM,CAAC,MAAM,sBAAsB,GAAiB;IAClD,EAAE,EAAE,aAAa;IAEjB,MAAM,CAAC,OAAO;QACZ,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO;QAC9B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAwB,EAAE,CAAC;QAEzC,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAC/C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAClB,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,iEAAiE;aAC1E,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,MAAM;gBAChB,MAAM,EAAE,yDAAyD;aAClE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO;YACL,IAAI,EAAE,OAAO,EAAE,kEAAkE;YACjF,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;YACjB,IAAI;YACJ,WAAW;YACX,QAAQ,EAAE,IAAI,CAAC,KAAK;YACpB,KAAK;YACL,eAAe,EAAE,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;YACnD,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,SAAS;YACxB,MAAM,EAAE,SAAS;YACjB,KAAK;YACL,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE;YACzB,cAAc,EAAE,aAAa;YAC7B,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;YAC7D,GAAG,EAAE,OAAO;YACZ,QAAQ;SACT,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Comprehend GitHub Copilot custom agents (`.github/agents/*.agent.md`) and the
3
+ * legacy `.github/chatmodes/*.chatmode.md` (renamed to custom agents in VS Code 1.106;
4
+ * still auto-loaded).
5
+ *
6
+ * Frontmatter is Copilot-shaped (description, name, model, tools, agents, handoffs,
7
+ * user-invocable, disable-model-invocation, retired `infer`, target, mcp-servers,
8
+ * metadata, …). An agent that declares `agents:` is an orchestrator → `command` kind.
9
+ */
10
+ import { type AgentAdapter } from './agent-adapter.js';
11
+ export declare const copilotAgentAdapter: AgentAdapter;
12
+ //# sourceMappingURL=copilot-agent-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-agent-adapter.d.ts","sourceRoot":"","sources":["../../../src/import/agents/copilot-agent-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,KAAK,YAAY,EAMlB,MAAM,oBAAoB,CAAC;AAe5B,eAAO,MAAM,mBAAmB,EAAE,YAsEjC,CAAC"}