@nepopsx/cli 0.0.24 → 0.0.26

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 (139) hide show
  1. package/dist/agents/remote-config.d.ts +12 -0
  2. package/dist/agents/remote-config.d.ts.map +1 -1
  3. package/dist/agents/remote-config.js +19 -0
  4. package/dist/agents/remote-config.js.map +1 -1
  5. package/dist/commands/guard.d.ts +10 -0
  6. package/dist/commands/guard.d.ts.map +1 -0
  7. package/dist/commands/guard.js +63 -0
  8. package/dist/commands/guard.js.map +1 -0
  9. package/dist/commands/import-agents.d.ts +17 -0
  10. package/dist/commands/import-agents.d.ts.map +1 -0
  11. package/dist/commands/import-agents.js +192 -0
  12. package/dist/commands/import-agents.js.map +1 -0
  13. package/dist/commands/import.d.ts +19 -0
  14. package/dist/commands/import.d.ts.map +1 -0
  15. package/dist/commands/import.js +182 -0
  16. package/dist/commands/import.js.map +1 -0
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +21 -13
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/install.d.ts.map +1 -1
  21. package/dist/commands/install.js +12 -1
  22. package/dist/commands/install.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +15 -37
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/push-learnings.d.ts.map +1 -1
  27. package/dist/commands/push-learnings.js +8 -1
  28. package/dist/commands/push-learnings.js.map +1 -1
  29. package/dist/commands/scan.d.ts.map +1 -1
  30. package/dist/commands/scan.js +17 -0
  31. package/dist/commands/scan.js.map +1 -1
  32. package/dist/commands/sync.d.ts.map +1 -1
  33. package/dist/commands/sync.js +29 -4
  34. package/dist/commands/sync.js.map +1 -1
  35. package/dist/commands/up.d.ts.map +1 -1
  36. package/dist/commands/up.js +92 -9
  37. package/dist/commands/up.js.map +1 -1
  38. package/dist/config/api-config.d.ts +5 -7
  39. package/dist/config/api-config.d.ts.map +1 -1
  40. package/dist/config/api-config.js +2 -3
  41. package/dist/config/api-config.js.map +1 -1
  42. package/dist/config/global-config.d.ts +52 -0
  43. package/dist/config/global-config.d.ts.map +1 -0
  44. package/dist/config/global-config.js +161 -0
  45. package/dist/config/global-config.js.map +1 -0
  46. package/dist/config/global-config.test.d.ts +2 -0
  47. package/dist/config/global-config.test.d.ts.map +1 -0
  48. package/dist/config/global-config.test.js +62 -0
  49. package/dist/config/global-config.test.js.map +1 -0
  50. package/dist/enrichment/workflow.d.ts.map +1 -1
  51. package/dist/enrichment/workflow.js +8 -1
  52. package/dist/enrichment/workflow.js.map +1 -1
  53. package/dist/guard/policy.d.ts +38 -0
  54. package/dist/guard/policy.d.ts.map +1 -0
  55. package/dist/guard/policy.js +62 -0
  56. package/dist/guard/policy.js.map +1 -0
  57. package/dist/guard/policy.test.d.ts +2 -0
  58. package/dist/guard/policy.test.d.ts.map +1 -0
  59. package/dist/guard/policy.test.js +47 -0
  60. package/dist/guard/policy.test.js.map +1 -0
  61. package/dist/hooks/capture-hooks.d.ts.map +1 -1
  62. package/dist/hooks/capture-hooks.js +36 -1
  63. package/dist/hooks/capture-hooks.js.map +1 -1
  64. package/dist/import/adapter.d.ts +82 -0
  65. package/dist/import/adapter.d.ts.map +1 -0
  66. package/dist/import/adapter.js +111 -0
  67. package/dist/import/adapter.js.map +1 -0
  68. package/dist/import/adapter.test.d.ts +2 -0
  69. package/dist/import/adapter.test.d.ts.map +1 -0
  70. package/dist/import/adapter.test.js +100 -0
  71. package/dist/import/adapter.test.js.map +1 -0
  72. package/dist/import/agents/agent-adapter.d.ts +83 -0
  73. package/dist/import/agents/agent-adapter.d.ts.map +1 -0
  74. package/dist/import/agents/agent-adapter.js +66 -0
  75. package/dist/import/agents/agent-adapter.js.map +1 -0
  76. package/dist/import/agents/agent-adapter.test.d.ts +2 -0
  77. package/dist/import/agents/agent-adapter.test.d.ts.map +1 -0
  78. package/dist/import/agents/agent-adapter.test.js +99 -0
  79. package/dist/import/agents/agent-adapter.test.js.map +1 -0
  80. package/dist/import/agents/artifact-parser.d.ts +26 -0
  81. package/dist/import/agents/artifact-parser.d.ts.map +1 -0
  82. package/dist/import/agents/artifact-parser.js +40 -0
  83. package/dist/import/agents/artifact-parser.js.map +1 -0
  84. package/dist/import/agents/assembler.d.ts +32 -0
  85. package/dist/import/agents/assembler.d.ts.map +1 -0
  86. package/dist/import/agents/assembler.js +0 -0
  87. package/dist/import/agents/assembler.js.map +1 -0
  88. package/dist/import/agents/assembler.test.d.ts +2 -0
  89. package/dist/import/agents/assembler.test.d.ts.map +1 -0
  90. package/dist/import/agents/assembler.test.js +115 -0
  91. package/dist/import/agents/assembler.test.js.map +1 -0
  92. package/dist/import/agents/claude-code-adapter.d.ts +11 -0
  93. package/dist/import/agents/claude-code-adapter.d.ts.map +1 -0
  94. package/dist/import/agents/claude-code-adapter.js +84 -0
  95. package/dist/import/agents/claude-code-adapter.js.map +1 -0
  96. package/dist/import/agents/copilot-agent-adapter.d.ts +12 -0
  97. package/dist/import/agents/copilot-agent-adapter.d.ts.map +1 -0
  98. package/dist/import/agents/copilot-agent-adapter.js +89 -0
  99. package/dist/import/agents/copilot-agent-adapter.js.map +1 -0
  100. package/dist/import/agents/scanner.d.ts +15 -0
  101. package/dist/import/agents/scanner.d.ts.map +1 -0
  102. package/dist/import/agents/scanner.js +87 -0
  103. package/dist/import/agents/scanner.js.map +1 -0
  104. package/dist/import/agents/secret-scan.d.ts +14 -0
  105. package/dist/import/agents/secret-scan.d.ts.map +1 -0
  106. package/dist/import/agents/secret-scan.js +64 -0
  107. package/dist/import/agents/secret-scan.js.map +1 -0
  108. package/dist/import/agents/secret-scan.test.d.ts +2 -0
  109. package/dist/import/agents/secret-scan.test.d.ts.map +1 -0
  110. package/dist/import/agents/secret-scan.test.js +41 -0
  111. package/dist/import/agents/secret-scan.test.js.map +1 -0
  112. package/dist/import/claude-memory-adapter.d.ts +20 -0
  113. package/dist/import/claude-memory-adapter.d.ts.map +1 -0
  114. package/dist/import/claude-memory-adapter.js +87 -0
  115. package/dist/import/claude-memory-adapter.js.map +1 -0
  116. package/dist/import/copilot-adapter.d.ts +13 -0
  117. package/dist/import/copilot-adapter.d.ts.map +1 -0
  118. package/dist/import/copilot-adapter.js +75 -0
  119. package/dist/import/copilot-adapter.js.map +1 -0
  120. package/dist/index.js +61 -2
  121. package/dist/index.js.map +1 -1
  122. package/dist/learnings/memory-index.d.ts +17 -0
  123. package/dist/learnings/memory-index.d.ts.map +1 -0
  124. package/dist/learnings/memory-index.js +73 -0
  125. package/dist/learnings/memory-index.js.map +1 -0
  126. package/dist/licensing/installer.d.ts.map +1 -1
  127. package/dist/licensing/installer.js +3 -5
  128. package/dist/licensing/installer.js.map +1 -1
  129. package/dist/licensing/license-manager.d.ts +6 -5
  130. package/dist/licensing/license-manager.d.ts.map +1 -1
  131. package/dist/licensing/license-manager.js +10 -8
  132. package/dist/licensing/license-manager.js.map +1 -1
  133. package/dist/licensing/workspace-name.d.ts +1 -1
  134. package/dist/licensing/workspace-name.js +1 -1
  135. package/dist/utils/fetch.d.ts +8 -0
  136. package/dist/utils/fetch.d.ts.map +1 -1
  137. package/dist/utils/fetch.js +35 -0
  138. package/dist/utils/fetch.js.map +1 -1
  139. package/package.json +2 -2
@@ -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,CAgE/D"}
Binary file
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,SAAS,KAAK,CAAC,OAA2D;IACxE,OAAO;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,EAAE;QACnB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,gBAAgB;QAChC,YAAY,EAAE,KAAK,OAAO,CAAC,IAAI,WAAW;QAC1C,GAAG,EAAE,EAAE;QACP,QAAQ,EAAE,EAAE;QACZ,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,IAAa;IACxC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI;QACJ,IAAI,EAAE,IAAI,IAAI,IAAI;QAClB,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,EAAE;QACP,YAAY,EAAE,kBAAkB,IAAI,WAAW;QAC/C,cAAc,EAAE,aAAa;KAC9B,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,4DAA4D,EAAE,GAAG,EAAE;IAC1E,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAe;YACvB,MAAM,EAAE;gBACN,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;gBAC9H,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC7C,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC7C,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;aAC9C;YACD,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAE,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,IAAI,GAAe;YACvB,MAAM,EAAE;gBACN,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;gBAClI,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aAC5C;YACD,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAE,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAE,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC9E,kDAAkD;QAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAe;YACvB,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,yBAAyB,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACrI,MAAM,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,yBAAyB,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpG,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sEAAsE,EAAE,GAAG,EAAE;IACpF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,oDAAoD,CAAC,CAAC;YAC/G,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,kDAAkD,CAAC,CAAC;YACpH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,oDAAoD,CAAC,CAAC;YACxH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,eAAe,CAAC,CAAC;YACpF,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;YAEtE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,yDAAyD;YAEhG,oFAAoF;YACpF,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAE,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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,EAMlB,MAAM,oBAAoB,CAAC;AAkB5B,eAAO,MAAM,sBAAsB,EAAE,YA+DpC,CAAC"}
@@ -0,0 +1,84 @@
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, parseHandoffs, toStringList, } from './agent-adapter.js';
12
+ /**
13
+ * Keys mapped to first-class RawAgent fields; the rest flow into `extra`.
14
+ * `agents`/`handoffs` are first-class so a Claude orchestrator keeps its sub-agent
15
+ * graph (an agent that declares `agents:` is an orchestrator → `command` kind),
16
+ * mirroring the Copilot adapter — otherwise the graph would be silently lost.
17
+ */
18
+ const KNOWN_CLAUDE_KEYS = new Set([
19
+ 'name',
20
+ 'description',
21
+ 'tools',
22
+ 'disallowedTools',
23
+ 'model',
24
+ 'agents',
25
+ 'handoffs',
26
+ ]);
27
+ export const claudeCodeAgentAdapter = {
28
+ id: 'claude-code',
29
+ detect(rootDir) {
30
+ return listFiles(join(rootDir, '.claude', 'agents'), '.md');
31
+ },
32
+ parse(filePath, content, rootDir) {
33
+ const { data, body } = parseFrontmatter(content);
34
+ const fidelity = [];
35
+ const name = typeof data.name === 'string' && data.name.trim()
36
+ ? data.name.trim()
37
+ : agentBaseName(filePath, '.md');
38
+ const description = typeof data.description === 'string' ? data.description : undefined;
39
+ if (!description) {
40
+ fidelity.push({
41
+ field: 'description',
42
+ severity: 'warn',
43
+ detail: 'No description — the agent may not route/auto-invoke correctly.',
44
+ });
45
+ }
46
+ const tools = toStringList(data.tools);
47
+ if (!('tools' in data)) {
48
+ fidelity.push({
49
+ field: 'tools',
50
+ severity: 'info',
51
+ detail: 'No tools listed — a Claude subagent inherits all tools.',
52
+ });
53
+ }
54
+ // A Claude agent that declares `agents:` is an orchestrator; preserve its graph.
55
+ const subAgents = toStringList(data.agents);
56
+ const handoffs = parseHandoffs(data.handoffs);
57
+ const kind = subAgents.length > 0 ? 'command' : 'agent';
58
+ const extra = {};
59
+ for (const [k, v] of Object.entries(data)) {
60
+ if (!KNOWN_CLAUDE_KEYS.has(k))
61
+ extra[k] = v;
62
+ }
63
+ return {
64
+ kind,
65
+ slug: kebab(name),
66
+ name,
67
+ description,
68
+ modelRaw: data.model,
69
+ tools,
70
+ disallowedTools: toStringList(data.disallowedTools),
71
+ handoffs,
72
+ subAgents,
73
+ userInvocable: undefined,
74
+ target: undefined,
75
+ extra,
76
+ instructions: body.trim(),
77
+ originProvider: 'claude-code',
78
+ importedFrom: relative(rootDir, filePath).replace(/\\/g, '/'),
79
+ raw: content,
80
+ fidelity,
81
+ };
82
+ },
83
+ };
84
+ //# 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":"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"}
@@ -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"}
@@ -0,0 +1,89 @@
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 { join, relative } from 'node:path';
11
+ import { parseFrontmatter, kebab } from '../adapter.js';
12
+ import { agentBaseName, listFiles, parseHandoffs, toStringList, } from './agent-adapter.js';
13
+ const KNOWN_COPILOT_KEYS = new Set([
14
+ 'name',
15
+ 'description',
16
+ 'tools',
17
+ 'model',
18
+ 'agents',
19
+ 'handoffs',
20
+ 'user-invocable',
21
+ 'disable-model-invocation',
22
+ 'infer',
23
+ 'target',
24
+ ]);
25
+ export const copilotAgentAdapter = {
26
+ id: 'github-copilot',
27
+ detect(rootDir) {
28
+ return [
29
+ ...listFiles(join(rootDir, '.github', 'agents'), '.agent.md'),
30
+ ...listFiles(join(rootDir, '.github', 'chatmodes'), '.chatmode.md'),
31
+ ];
32
+ },
33
+ parse(filePath, content, rootDir) {
34
+ const { data, body } = parseFrontmatter(content);
35
+ const fidelity = [];
36
+ const suffix = filePath.endsWith('.chatmode.md') ? '.chatmode.md' : '.agent.md';
37
+ const name = typeof data.name === 'string' && data.name.trim()
38
+ ? data.name.trim()
39
+ : agentBaseName(filePath, suffix);
40
+ const description = typeof data.description === 'string' ? data.description : undefined;
41
+ const subAgents = toStringList(data.agents);
42
+ const handoffs = parseHandoffs(data.handoffs);
43
+ const kind = subAgents.length > 0 ? 'command' : 'agent';
44
+ // user-invocable / disable-model-invocation / retired `infer`.
45
+ let userInvocable;
46
+ if (typeof data['user-invocable'] === 'boolean')
47
+ userInvocable = data['user-invocable'];
48
+ if (userInvocable === undefined && data.infer === false) {
49
+ userInvocable = false;
50
+ fidelity.push({
51
+ field: 'infer',
52
+ severity: 'info',
53
+ detail: 'Retired `infer: false` mapped forward to user-invocable: false.',
54
+ });
55
+ }
56
+ if (suffix === '.chatmode.md') {
57
+ fidelity.push({
58
+ field: 'format',
59
+ severity: 'info',
60
+ detail: 'Imported from a legacy .chatmode.md (renamed to custom agents).',
61
+ });
62
+ }
63
+ const extra = {};
64
+ for (const [k, v] of Object.entries(data)) {
65
+ if (!KNOWN_COPILOT_KEYS.has(k))
66
+ extra[k] = v;
67
+ }
68
+ return {
69
+ kind,
70
+ slug: kebab(name),
71
+ name,
72
+ description,
73
+ modelRaw: data.model,
74
+ tools: toStringList(data.tools),
75
+ disallowedTools: [],
76
+ handoffs,
77
+ subAgents,
78
+ userInvocable,
79
+ target: typeof data.target === 'string' ? data.target : undefined,
80
+ extra,
81
+ instructions: body.trim(),
82
+ originProvider: 'github-copilot',
83
+ importedFrom: relative(rootDir, filePath).replace(/\\/g, '/'),
84
+ raw: content,
85
+ fidelity,
86
+ };
87
+ },
88
+ };
89
+ //# sourceMappingURL=copilot-agent-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-agent-adapter.js","sourceRoot":"","sources":["../../../src/import/agents/copilot-agent-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Repo scanner — sweep both ecosystems for every comprehensible artifact in one pass.
3
+ *
4
+ * Runs all agent adapters, then discovers the Skills and commands an agent bundle can
5
+ * link to. (MCP/hooks/settings + `~/.claude`/`~/.copilot` user scopes land in slice 3.)
6
+ */
7
+ import { type RawAgent } from './agent-adapter.js';
8
+ import { type RawArtifact } from './artifact-parser.js';
9
+ export interface ScanResult {
10
+ agents: RawAgent[];
11
+ skills: RawArtifact[];
12
+ commands: RawArtifact[];
13
+ }
14
+ export declare function scanRepo(rootDir: string): ScanResult;
15
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/import/agents/scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAA4B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO,EAAE,KAAK,WAAW,EAA4B,MAAM,sBAAsB,CAAC;AAIlF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AA2CD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA+BpD"}