@vpxa/aikit 0.1.73 → 0.1.75

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 (142) hide show
  1. package/package.json +9 -1
  2. package/packages/cli/dist/index.js +2 -2
  3. package/packages/cli/dist/{init-D_OGLUN1.js → init-CuRXmyD9.js} +4 -4
  4. package/packages/cli/dist/scaffold-WMQ2uQ48.js +2 -0
  5. package/packages/cli/dist/{templates-DJ7EC5vw.js → templates-ArdAVWoY.js} +13 -3
  6. package/packages/cli/dist/user-vbJwa7x2.js +5 -0
  7. package/packages/dashboard/dist/assets/index-C6D-PCp0.js.map +1 -1
  8. package/packages/flows/dist/index.d.ts +29 -0
  9. package/packages/flows/dist/index.js +1 -1
  10. package/packages/server/dist/index.js +1 -1
  11. package/packages/server/dist/{server-B9Mx1aK-.js → server-CVhVH5cT.js} +127 -127
  12. package/packages/tools/dist/index.d.ts +19 -1
  13. package/packages/tools/dist/index.js +39 -39
  14. package/scaffold/dist/adapters/claude-code.mjs +4 -0
  15. package/scaffold/dist/adapters/copilot.mjs +75 -0
  16. package/scaffold/dist/adapters/flows.mjs +1 -0
  17. package/scaffold/dist/adapters/skills.mjs +1 -0
  18. package/scaffold/dist/compiled/flows-data.mjs +1429 -0
  19. package/scaffold/dist/compiled/skills-data.mjs +9951 -0
  20. package/scaffold/dist/definitions/agents.mjs +9 -0
  21. package/scaffold/{definitions → dist/definitions}/bodies.mjs +6 -229
  22. package/scaffold/dist/definitions/exclusions.mjs +1 -0
  23. package/scaffold/dist/definitions/hooks.mjs +1 -0
  24. package/scaffold/dist/definitions/models.mjs +1 -0
  25. package/scaffold/dist/definitions/plugins.mjs +1 -0
  26. package/scaffold/{definitions → dist/definitions}/prompts.mjs +9 -149
  27. package/scaffold/{definitions → dist/definitions}/protocols.mjs +9 -37
  28. package/scaffold/dist/definitions/tools.mjs +1 -0
  29. package/packages/cli/dist/scaffold-CJwkHf-q.js +0 -2
  30. package/packages/cli/dist/user-BEmVW8Tp.js +0 -5
  31. package/scaffold/adapters/claude-code.mjs +0 -73
  32. package/scaffold/adapters/copilot.mjs +0 -292
  33. package/scaffold/definitions/agents.mjs +0 -266
  34. package/scaffold/definitions/hooks.mjs +0 -43
  35. package/scaffold/definitions/models.mjs +0 -84
  36. package/scaffold/definitions/plugins.mjs +0 -147
  37. package/scaffold/definitions/tools.mjs +0 -250
  38. package/scaffold/flows/_epilogue/steps/docs-sync/README.md +0 -120
  39. package/scaffold/flows/aikit-advanced/README.md +0 -70
  40. package/scaffold/flows/aikit-advanced/flow.json +0 -69
  41. package/scaffold/flows/aikit-advanced/steps/design/README.md +0 -178
  42. package/scaffold/flows/aikit-advanced/steps/execute/README.md +0 -145
  43. package/scaffold/flows/aikit-advanced/steps/plan/README.md +0 -122
  44. package/scaffold/flows/aikit-advanced/steps/spec/README.md +0 -121
  45. package/scaffold/flows/aikit-advanced/steps/task/README.md +0 -119
  46. package/scaffold/flows/aikit-advanced/steps/verify/README.md +0 -145
  47. package/scaffold/flows/aikit-basic/README.md +0 -51
  48. package/scaffold/flows/aikit-basic/flow.json +0 -45
  49. package/scaffold/flows/aikit-basic/steps/assess/README.md +0 -109
  50. package/scaffold/flows/aikit-basic/steps/design/README.md +0 -116
  51. package/scaffold/flows/aikit-basic/steps/implement/README.md +0 -131
  52. package/scaffold/flows/aikit-basic/steps/verify/README.md +0 -123
  53. package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +0 -132
  54. package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +0 -132
  55. package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +0 -112
  56. package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +0 -112
  57. package/scaffold/general/agents/Debugger.agent.md +0 -412
  58. package/scaffold/general/agents/Documenter.agent.md +0 -468
  59. package/scaffold/general/agents/Explorer.agent.md +0 -76
  60. package/scaffold/general/agents/Frontend.agent.md +0 -440
  61. package/scaffold/general/agents/Implementer.agent.md +0 -425
  62. package/scaffold/general/agents/Orchestrator.agent.md +0 -452
  63. package/scaffold/general/agents/Planner.agent.md +0 -481
  64. package/scaffold/general/agents/README.md +0 -57
  65. package/scaffold/general/agents/Refactor.agent.md +0 -435
  66. package/scaffold/general/agents/Researcher-Alpha.agent.md +0 -151
  67. package/scaffold/general/agents/Researcher-Beta.agent.md +0 -152
  68. package/scaffold/general/agents/Researcher-Delta.agent.md +0 -153
  69. package/scaffold/general/agents/Researcher-Gamma.agent.md +0 -152
  70. package/scaffold/general/agents/Security.agent.md +0 -433
  71. package/scaffold/general/agents/_shared/architect-reviewer-base.md +0 -104
  72. package/scaffold/general/agents/_shared/code-agent-base.md +0 -366
  73. package/scaffold/general/agents/_shared/code-reviewer-base.md +0 -87
  74. package/scaffold/general/agents/_shared/decision-protocol.md +0 -27
  75. package/scaffold/general/agents/_shared/forge-protocol.md +0 -90
  76. package/scaffold/general/agents/_shared/researcher-base.md +0 -114
  77. package/scaffold/general/agents/templates/adr-template.md +0 -28
  78. package/scaffold/general/agents/templates/execution-state.md +0 -26
  79. package/scaffold/general/prompts/aikit-ask.prompt.md +0 -13
  80. package/scaffold/general/prompts/aikit-debug.prompt.md +0 -15
  81. package/scaffold/general/prompts/aikit-design.prompt.md +0 -15
  82. package/scaffold/general/prompts/aikit-flow-add.prompt.md +0 -84
  83. package/scaffold/general/prompts/aikit-flow-create.prompt.md +0 -80
  84. package/scaffold/general/prompts/aikit-flow-manage.prompt.md +0 -24
  85. package/scaffold/general/prompts/aikit-implement.prompt.md +0 -17
  86. package/scaffold/general/prompts/aikit-plan.prompt.md +0 -15
  87. package/scaffold/general/prompts/aikit-review.prompt.md +0 -24
  88. package/scaffold/general/skills/adr-skill/SKILL.md +0 -335
  89. package/scaffold/general/skills/adr-skill/assets/templates/adr-madr.md +0 -89
  90. package/scaffold/general/skills/adr-skill/assets/templates/adr-readme.md +0 -20
  91. package/scaffold/general/skills/adr-skill/assets/templates/adr-simple.md +0 -46
  92. package/scaffold/general/skills/adr-skill/references/adr-conventions.md +0 -95
  93. package/scaffold/general/skills/adr-skill/references/examples.md +0 -193
  94. package/scaffold/general/skills/adr-skill/references/review-checklist.md +0 -77
  95. package/scaffold/general/skills/adr-skill/references/template-variants.md +0 -52
  96. package/scaffold/general/skills/adr-skill/scripts/bootstrap_adr.js +0 -259
  97. package/scaffold/general/skills/adr-skill/scripts/new_adr.js +0 -391
  98. package/scaffold/general/skills/adr-skill/scripts/set_adr_status.js +0 -169
  99. package/scaffold/general/skills/aikit/SKILL.md +0 -754
  100. package/scaffold/general/skills/brainstorming/SKILL.md +0 -265
  101. package/scaffold/general/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  102. package/scaffold/general/skills/c4-architecture/SKILL.md +0 -389
  103. package/scaffold/general/skills/c4-architecture/references/advanced-patterns.md +0 -552
  104. package/scaffold/general/skills/c4-architecture/references/c4-syntax.md +0 -510
  105. package/scaffold/general/skills/c4-architecture/references/common-mistakes.md +0 -437
  106. package/scaffold/general/skills/c4-architecture/references/html-design-system.md +0 -337
  107. package/scaffold/general/skills/c4-architecture/references/html-template.html +0 -627
  108. package/scaffold/general/skills/docs/SKILL.md +0 -553
  109. package/scaffold/general/skills/docs/references/diataxis-anti-patterns.md +0 -147
  110. package/scaffold/general/skills/docs/references/diataxis-compass.md +0 -123
  111. package/scaffold/general/skills/docs/references/diataxis-quadrants.md +0 -192
  112. package/scaffold/general/skills/docs/references/diataxis-quality.md +0 -76
  113. package/scaffold/general/skills/docs/references/diataxis-templates.md +0 -120
  114. package/scaffold/general/skills/docs/references/flow-artifacts-guide.md +0 -70
  115. package/scaffold/general/skills/docs/references/project-knowledge-gotchas.md +0 -32
  116. package/scaffold/general/skills/docs/references/project-knowledge-templates.md +0 -281
  117. package/scaffold/general/skills/docs/references/project-knowledge-workflow.md +0 -80
  118. package/scaffold/general/skills/frontend-design/SKILL.md +0 -237
  119. package/scaffold/general/skills/lesson-learned/SKILL.md +0 -113
  120. package/scaffold/general/skills/lesson-learned/references/anti-patterns.md +0 -55
  121. package/scaffold/general/skills/lesson-learned/references/se-principles.md +0 -109
  122. package/scaffold/general/skills/multi-agents-development/SKILL.md +0 -448
  123. package/scaffold/general/skills/multi-agents-development/architecture-review-prompt.md +0 -81
  124. package/scaffold/general/skills/multi-agents-development/code-quality-review-prompt.md +0 -91
  125. package/scaffold/general/skills/multi-agents-development/implementer-prompt.md +0 -93
  126. package/scaffold/general/skills/multi-agents-development/parallel-dispatch-example.md +0 -167
  127. package/scaffold/general/skills/multi-agents-development/spec-review-prompt.md +0 -81
  128. package/scaffold/general/skills/present/SKILL.md +0 -616
  129. package/scaffold/general/skills/react/SKILL.md +0 -309
  130. package/scaffold/general/skills/repo-access/SKILL.md +0 -178
  131. package/scaffold/general/skills/repo-access/references/error-patterns.md +0 -116
  132. package/scaffold/general/skills/repo-access/references/platform-matrix.md +0 -142
  133. package/scaffold/general/skills/requirements-clarity/SKILL.md +0 -333
  134. package/scaffold/general/skills/session-handoff/SKILL.md +0 -199
  135. package/scaffold/general/skills/session-handoff/references/handoff-template.md +0 -139
  136. package/scaffold/general/skills/session-handoff/references/resume-checklist.md +0 -80
  137. package/scaffold/general/skills/session-handoff/scripts/check_staleness.js +0 -269
  138. package/scaffold/general/skills/session-handoff/scripts/create_handoff.js +0 -299
  139. package/scaffold/general/skills/session-handoff/scripts/list_handoffs.js +0 -113
  140. package/scaffold/general/skills/session-handoff/scripts/validate_handoff.js +0 -241
  141. package/scaffold/general/skills/typescript/SKILL.md +0 -405
  142. package/scaffold/generate.mjs +0 -82
@@ -1,12 +1,4 @@
1
- /**
2
- * Shared protocol content — base instructions referenced by multiple agents.
3
- *
4
- * Keys map to filenames: 'code-agent-base' → '_shared/code-agent-base.md'
5
- * Content is IDE-agnostic markdown, but adapters may wrap it differently.
6
- */
7
-
8
- export const PROTOCOLS = {
9
- 'code-agent-base': `# Code Agent — Shared Base Instructions
1
+ const e={"code-agent-base":`# Code Agent — Shared Base Instructions
10
2
 
11
3
  > This file contains shared protocols for all code-modifying agents (Implementer, Frontend, Refactor, Debugger). Each agent's definition file contains only its unique identity, constraints, and workflow. **Do not duplicate this content in agent files.**
12
4
 
@@ -371,9 +363,7 @@ Always return this structure when invoked as a sub-agent:
371
363
  <blockers>{any blocking issues}</blockers>
372
364
  </handoff>
373
365
  \`\`\`
374
- `,
375
-
376
- 'researcher-base': `# Researcher — Shared Base Instructions
366
+ `,"researcher-base":`# Researcher — Shared Base Instructions
377
367
 
378
368
  > Shared methodology for all Researcher variants. Each variant's definition contains only its unique identity and model assignment. **Do not duplicate.**
379
369
 
@@ -486,9 +476,7 @@ For questions that require trying approach A vs approach B in isolation:
486
476
  4. Apply approach B mentally; record observations
487
477
  5. \`lane({ action:'diff', names:['approach-a','approach-b'] })\` — compare
488
478
  6. Include the diff summary in your output; do NOT merge lanes back (read-only role)
489
- `,
490
-
491
- 'code-reviewer-base': `# Code-Reviewer — Shared Base Instructions
479
+ `,"code-reviewer-base":`# Code-Reviewer — Shared Base Instructions
492
480
 
493
481
  > Shared methodology for all Code-Reviewer variants. Each variant's definition contains only identity and model. **Do not duplicate.**
494
482
 
@@ -574,9 +562,7 @@ Do NOT:
574
562
  - Create a new \`evidence_map\` (the Orchestrator already did)
575
563
  - Run \`evidence_map({action:'gate'})\` yourself — the Orchestrator owns the gate
576
564
  - Duplicate findings into the map that weren't CRITICAL/HIGH
577
- `,
578
-
579
- 'architect-reviewer-base': `# Architect-Reviewer — Shared Base Instructions
565
+ `,"architect-reviewer-base":`# Architect-Reviewer — Shared Base Instructions
580
566
 
581
567
  > Shared methodology for all Architect-Reviewer variants. Each variant's definition contains only identity and model. **Do not duplicate.**
582
568
 
@@ -679,9 +665,7 @@ to the Evidence Map per the tier protocol above.
679
665
 
680
666
  **Do NOT use \`shortest_path\`** — that action does not exist. Use \`depth_traverse\`
681
667
  or repeated \`neighbors\` calls.
682
- `,
683
-
684
- 'decision-protocol': `# Multi-Model Decision Protocol
668
+ `,"decision-protocol":`# Multi-Model Decision Protocol
685
669
 
686
670
  The Orchestrator uses **multi-model decision analysis** to resolve non-trivial technical choices. This is the autonomous decision-making process — distinct from the interactive brainstorming skill.
687
671
 
@@ -707,9 +691,7 @@ Trigger the decision protocol when there is an **unresolved non-trivial technica
707
691
  - Never make a non-trivial technical decision without multi-model analysis
708
692
  - **Produce an ADR** after every decision resolution
709
693
  - \`remember\` the decision for future recall
710
- `,
711
-
712
- 'forge-protocol': `# FORGE Protocol — Quality Overlay
694
+ `,"forge-protocol":`# FORGE Protocol — Quality Overlay
713
695
 
714
696
  > Follow the FORGE (Fact-Oriented Reasoning with Graduated Evidence) protocol for all code generation and modification tasks.
715
697
 
@@ -798,14 +780,7 @@ evidence_map({ action: "gate", task_id: "add-user-api" }) → YIELD ✅
798
780
  3. **Standard**: \`evidence_map create\` → add 3-8 claims during work → \`evidence_map gate\`
799
781
  4. **Critical**: Full 4-phase flow with comprehensive evidence
800
782
  5. **After gate**: YIELD = done, HOLD = fix + re-gate, HARD_BLOCK = escalate
801
- `,
802
- };
803
-
804
- // ─── Templates ──────────────────────────────────────────────────────────────
805
- // Keys map to filenames under agents/templates/
806
-
807
- export const TEMPLATES = {
808
- 'execution-state': `# Execution State: {Task Title}
783
+ `},t={"execution-state":`# Execution State: {Task Title}
809
784
 
810
785
  **Status:** PLANNING | IN_PROGRESS | REVIEW | COMPLETED | BLOCKED
811
786
  **Started:** {timestamp}
@@ -830,9 +805,7 @@ export const TEMPLATES = {
830
805
 
831
806
  | Issue | Severity | Assigned |
832
807
  |-------|----------|----------|
833
- `,
834
-
835
- 'adr-template': `# DR-NNN: {Short Title}
808
+ `,"adr-template":`# DR-NNN: {Short Title}
836
809
 
837
810
  **Status:** Proposed | Accepted | Rejected | Deprecated | Superseded
838
811
  **Date:** YYYY-MM-DD
@@ -859,5 +832,4 @@ export const TEMPLATES = {
859
832
 
860
833
  ## Alternatives Considered
861
834
  {Other approaches evaluated and why they were rejected — keeps the "why not" alongside the "why"}
862
- `,
863
- };
835
+ `};export{e as PROTOCOLS,t as TEMPLATES};
@@ -0,0 +1 @@
1
+ const e=`analyze_dependencies.analyze_diagram.analyze_entry_points.analyze_patterns.analyze_structure.analyze_symbols.audit.batch.blast_radius.brainstorm.changelog.check.checkpoint.codemod.compact.config.data_transform.dead_symbols.delegate.describe_tool.diff_parse.digest.encode.env.eval.evidence_map.file_summary.find.flow_add.flow_info.flow_list.flow_read_instruction.flow_remove.flow_reset.flow_start.flow_status.flow_step.flow_update.forge_classify.forge_ground.forget.git_context.graph.guide.health.http.lane.list.list_tools.lookup.measure.onboard.parse_output.present.process.produce_knowledge.queue.read.regex_test.reindex.remember.rename.replay.restore.schema_validate.scope_map.search.search_tools.session_digest.snippet.stash.status.stratum_card.symbol.test_run.time.trace.update.watch.web_fetch.web_search.workset`.split(`.`),t={orchestrator:[`memory`,`runCommand`,`switchAgent`,`newWorkspace`,`reviewPlan`,`killTerminal`,`createTask`,`terminal`,`terminalSel`,`lastCommand`,`problems`,`readFile`,`subagent`,`createFile`,`editFiles`,`rename`,`createDirectory`,`search`,`web`,`todo`,`searchSubagent`,`textSearch`,`browser`,`askQuestions`,`resolveMemoryFileUri`],researcher:[`terminal`,`problems`,`readFile`,`lastCommand`,`subagent`,`search`,`web`,`browser`],reviewer:[`terminal`,`problems`,`readFile`,`lastCommand`,`subagent`,`search`,`web`,`browser`],codeAgent:[`createTask`,`terminal`,`problems`,`readFile`,`lastCommand`,`subagent`,`createFile`,`editFiles`,`rename`,`createDirectory`,`search`,`todo`,`browser`],debugger:[`terminal`,`problems`,`readFile`,`terminalSel`,`lastCommand`,`subagent`,`createFile`,`editFiles`,`search`,`browser`],refactor:[`terminal`,`problems`,`readFile`,`lastCommand`,`subagent`,`createFile`,`editFiles`,`rename`,`createDirectory`,`search`,`browser`],explorer:[`problems`,`readFile`,`search`,`fileSearch`,`listDir`,`textSearch`,`browser`],planner:[`terminal`,`problems`,`readFile`,`reviewPlan`,`memory`,`askQuestions`,`resolveMemoryFileUri`,`lastCommand`,`subagent`,`createFile`,`editFiles`,`rename`,`createDirectory`,`search`,`web`,`todo`,`searchSubagent`,`browser`],security:[`terminal`,`problems`,`readFile`,`subagent`,`search`,`web`,`browser`],documenter:[`terminal`,`problems`,`readFile`,`lastCommand`,`subagent`,`createFile`,`editFiles`,`rename`,`createDirectory`,`search`,`web`,`browser`]};export{e as AIKIT_TOOLS,t as IDE_CAPABILITIES};
@@ -1,2 +0,0 @@
1
- import{existsSync as e,mkdirSync as t,readFileSync as n,readdirSync as r,rmSync as i,statSync as a,unlinkSync as o,writeFileSync as s}from"node:fs";import{dirname as c,resolve as l}from"node:path";import{createHash as u}from"node:crypto";const d=[`inputs`,`outputs`,`requires`,`relatedSkills`],f=[`model`],p=[`category`,`domain`,`applicability`],m=new Set([`__proto__`,`constructor`,`prototype`]);function h(e,t){return e.metadata[t]??e.fields[t]}function g(e,t){let n=h(e,t);return n?v(n):[]}function _(e){let t=Object.create(null),n=Object.create(null),r=[],i=e,a=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!a)return{fields:t,metadata:n,tools:r,body:i};let o=a[1];i=a[2];let s=!1;for(let e of o.split(/\r?\n/)){if(s){if(e.trim()===``)continue;let t=e.match(/^\s{2,}(\S+?):\s*(.*)$/);if(t){let[,e,r]=t;if(m.has(e))continue;n[e]=r;continue}s=!1}let i=e.match(/^(\S+?):\s*(.*)$/);if(!i)continue;let[,a,o]=i;if(a===`metadata`&&o.trim()===``){s=!0;continue}m.has(a)||(t[a]=o,a===`tools`&&(r=v(o)))}return{fields:t,metadata:n,tools:r,body:i}}function v(e){let t=e.trim();if(!t.startsWith(`[`)||!t.endsWith(`]`))return[];let n=t.slice(1,-1).trim();return n?n.split(`,`).map(e=>e.trim()).filter(Boolean):[]}function y(e){return`[${e.join(`, `)}]`}function b(e,t){let n=_(e),r=_(t),i={...n.fields},a={...n.metadata};for(let[e,t]of Object.entries(r.metadata))e in a||(a[e]=t);for(let e of f)r.fields[e]&&(i[e]=r.fields[e]);for(let e of p){let t=h(r,e);t&&(a[e]=t)}for(let e of[...p,...d])delete i[e];delete i.metadata;let o=n.tools,s=r.tools,c=new Set(o),l=s.filter(e=>!c.has(e)),u=[...o,...l];u.length>0&&(i.tools=y(u));for(let e of d){let t=g(n,e),i=g(r,e),o=new Set(t),s=i.filter(e=>!o.has(e)),c=[...t,...s];c.length>0?a[e]=y(c):delete a[e]}let m=[`---`],v=[`name`,`description`,`argument-hint`,`tools`,`model`],b=[`category`,`domain`,`applicability`,`inputs`,`outputs`,`requires`,`relatedSkills`],x=new Set;for(let e of v)e in i&&(m.push(`${e}: ${i[e]}`),x.add(e));for(let[e,t]of Object.entries(i))x.has(e)||m.push(`${e}: ${t}`);let S=[],C=new Set;for(let e of b){let t=a[e];t&&(S.push(` ${e}: ${t}`),C.add(e))}for(let[e,t]of Object.entries(a))!C.has(e)&&t&&S.push(` ${e}: ${t}`);return S.length>0&&(m.push(`metadata:`),m.push(...S)),m.push(`---`),`${m.join(`
2
- `)}\n${n.body}`}function x(e){return u(`sha256`).update(e).digest(`hex`).slice(0,16)}function S(t){if(!e(t))return null;try{let e=n(t,`utf-8`),r=JSON.parse(e);return!r.version||!r.files?null:r}catch{return null}}function C(e,t){s(e,`${JSON.stringify(t,null,2)}\n`,`utf-8`)}function w(e){return e.endsWith(`.agent.md`)&&!e.startsWith(`_shared/`)&&!e.startsWith(`agents/_shared/`)&&!e.startsWith(`templates/`)||e.endsWith(`SKILL.md`)&&!e.startsWith(`_shared/`)&&!e.startsWith(`templates/`)?`merge-frontmatter`:`overwrite`}function T(e,t,n){if(!e)return`new`;let r=e.files[t];return r?r.sourceHash===x(n)?`current`:`outdated`:`new`}function E(e,t,n,r){e.files[t]={sourceHash:x(n),strategy:r??w(t),updatedAt:new Date().toISOString()}}function D(e){return{version:e,generatedAt:new Date().toISOString(),files:{}}}function O(i,o,u,d=``,f=!1){if(e(i)){t(o,{recursive:!0});for(let p of r(i)){let r=l(i,p),m=l(o,p),h=d?`${d}/${p}`:p;if(a(r).isDirectory()){O(r,m,u,h,f);continue}let g=n(r,`utf-8`);if(f){t(c(m),{recursive:!0}),s(m,g,`utf-8`),E(u,h,g);continue}let _=T(u,h,g);if(_!==`current`){if(_===`new`&&!e(m)){t(c(m),{recursive:!0}),s(m,g,`utf-8`),E(u,h,g);continue}if(_===`new`&&e(m)){E(u,h,g);continue}w(h)===`merge-frontmatter`&&e(m)?s(m,b(g,n(m,`utf-8`)),`utf-8`):(t(c(m),{recursive:!0}),s(m,g,`utf-8`)),E(u,h,g)}}}}function k(t,n,i,s){let c=new Set;if(e(t)){let e=(t,n)=>{for(let i of r(t)){let r=l(t,i),o=n?`${n}/${i}`:i;a(r).isDirectory()?e(r,o):c.add(`${s}/${o}`)}};e(t,``)}let u=[];for(let t of Object.keys(i.files)){if(!t.startsWith(`${s}/`)||c.has(t))continue;let r=l(n,t.slice(s.length+1));e(r)&&(o(r),u.push(t)),delete i.files[t]}return u}function A(t,n,r,i,a=!1){let o=l(n,`scaffold`,r),s=l(t,`.github`),c=l(s,`.aikit-scaffold.json`),u=S(c)??D(i);u.version=i;for(let t of[`agents`,`prompts`]){let n=l(o,t);e(n)&&O(n,l(s,t),u,t,a)}if(a)for(let e of[`agents`,`prompts`]){let t=k(l(o,e),l(s,e),u,e);for(let e of t)console.log(` Removed orphaned scaffold file: ${e}`)}C(c,u)}function j(t,n,r,i,a=!1){let o=l(t,`.github`),s=l(o,`.aikit-scaffold.json`),c=S(s)??D(i);c.version=i;for(let t of r){let r=l(n,`scaffold`,`general`,`skills`,t);e(r)&&O(r,l(o,`skills`,t),c,`skills/${t}`,a)}C(s,c)}function M(t,n,r,i,a=!1){let o=l(t,r);if(!e(o))return;let s=l(n,r),c=l(n,`.aikit-scaffold.json`),u=S(c)??D(i);if(u.version=i,O(o,s,u,r,a),a){let e=k(o,s,u,r);for(let t of e)console.log(` Removed orphaned scaffold file: ${t}`)}C(c,u)}function N(t,i,o,s){if(e(t))for(let c of r(t)){let r=l(t,c),u=o?`${o}/${c}`:c;if(a(r).isDirectory())N(r,l(i,c),u,s);else{let t=l(i,c),a=n(r,`utf-8`);e(t)?a===n(t,`utf-8`)?s.push({status:`current`,relativePath:u,sourcePath:r}):s.push({status:`outdated`,relativePath:u,sourcePath:r,content:a}):s.push({status:`new`,relativePath:u,sourcePath:r,content:a})}}}function P(e,t,n){let r=[],i=l(t,`scaffold`,n);for(let t of[`agents`,`prompts`])N(l(i,t),l(e,`.github`,t),t,r);return r}function F(t,n,r){let i=[];for(let a of r){let r=l(n,`scaffold`,`general`,`skills`,a);e(r)&&N(r,l(t,`.github`,`skills`,a),`skills/${a}`,i)}return i}function I(t,n,r,a,o=!1){let s=l(t,`.github`),c=l(s,`.aikit-scaffold.json`),u=S(c)??D(a);u.version=a;for(let t of r){let r=l(n,`scaffold`,`flows`,t,`steps`);if(!e(r))continue;let a=l(s,`flows`,t,`skills`);e(a)&&i(a,{recursive:!0,force:!0}),O(r,l(s,`flows`,t,`steps`),u,`flows/${t}/steps`,o)}C(c,u)}function L(t,n,r){let i=[];for(let a of r){let r=l(n,`scaffold`,`flows`,a,`steps`);e(r)&&N(r,l(t,`.github`,`flows`,a,`steps`),`flows/${a}/steps`,i)}return i}function R(i,o,c,d=!1){let f=l(o,`scaffold`,`claude-code`,`commands`);if(!e(f))return;let p=l(i,`.claude`),m=l(p,`.aikit-scaffold.json`),h;h=e(m)?JSON.parse(n(m,`utf-8`)):{version:c,generatedAt:new Date().toISOString(),files:{}},h.version=c,h.generatedAt=new Date().toISOString(),t(l(p,`commands`),{recursive:!0});let g=r(f);for(let t of g){let r=l(f,t);if(!a(r).isFile())continue;let i=`commands/${t}`,o=l(p,i),c=n(r,`utf-8`),m=u(`sha256`).update(c).digest(`hex`).slice(0,16),g=h.files[i];if(g&&!d&&e(o)){let e=n(o,`utf-8`);if(u(`sha256`).update(e).digest(`hex`).slice(0,16)!==g.sourceHash)continue}s(o,c,`utf-8`),h.files[i]={sourceHash:m,strategy:`overwrite`,updatedAt:new Date().toISOString()}}if(d){let e=k(f,l(p,`commands`),h,`commands`);for(let t of e)console.log(` Removed orphaned scaffold file: ${t}`)}s(m,JSON.stringify(h,null,2),`utf-8`)}export{L as guideFlows,P as guideScaffold,F as guideSkills,R as smartCopyClaudeCommands,I as smartCopyFlows,A as smartCopyScaffold,j as smartCopySkills,M as smartCopySubdir};
@@ -1,5 +0,0 @@
1
- import{a as e,i as t,n,r,t as i}from"./constants-B8_CApx0.js";import{n as a,t as o}from"./templates-DJ7EC5vw.js";import{smartCopySubdir as s}from"./scaffold-CJwkHf-q.js";import{existsSync as c,mkdirSync as l,readFileSync as u,rmSync as d,unlinkSync as f,writeFileSync as p}from"node:fs";import{dirname as m,join as h,resolve as g}from"node:path";import{fileURLToPath as _}from"node:url";import{getGlobalDataDir as v,saveRegistry as y}from"../../core/dist/index.js";import{homedir as b}from"node:os";function x(e){let t=e;for(let e=0;e<10;e++){try{let e=h(t,`package.json`);if(c(e)&&JSON.parse(u(e,`utf8`)).name===`@vpxa/aikit`)return t}catch{}let e=m(t);if(e===t)break;t=e}return g(e,`..`,`..`,`..`)}function S(){let e=b(),t=process.platform,n=[],r=g(e,`.copilot`),i=g(r,`instructions`),a=g(e,`.claude`),o=g(e,`.cursor`),s=g(e,`.windsurf`);if(t===`win32`){let t=process.env.APPDATA??g(e,`AppData`,`Roaming`);n.push({ide:`VS Code`,configDir:g(t,`Code`,`User`),mcpConfigPath:g(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:g(t,`Code - Insiders`,`User`),mcpConfigPath:g(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:g(t,`VSCodium`,`User`),mcpConfigPath:g(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:g(t,`Cursor`,`User`),mcpConfigPath:g(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:g(t,`Cursor Nightly`,`User`),mcpConfigPath:g(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:g(t,`Windsurf`,`User`),mcpConfigPath:g(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}else if(t===`darwin`){let t=g(e,`Library`,`Application Support`);n.push({ide:`VS Code`,configDir:g(t,`Code`,`User`),mcpConfigPath:g(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:g(t,`Code - Insiders`,`User`),mcpConfigPath:g(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:g(t,`VSCodium`,`User`),mcpConfigPath:g(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:g(t,`Cursor`,`User`),mcpConfigPath:g(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:g(t,`Cursor Nightly`,`User`),mcpConfigPath:g(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:g(t,`Windsurf`,`User`),mcpConfigPath:g(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}else{let t=process.env.XDG_CONFIG_HOME??g(e,`.config`);n.push({ide:`VS Code`,configDir:g(t,`Code`,`User`),mcpConfigPath:g(t,`Code`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VS Code Insiders`,configDir:g(t,`Code - Insiders`,`User`),mcpConfigPath:g(t,`Code - Insiders`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`VSCodium`,configDir:g(t,`VSCodium`,`User`),mcpConfigPath:g(t,`VSCodium`,`User`,`mcp.json`),globalScaffoldRoot:r,instructionsRoot:i},{ide:`Cursor`,configDir:g(t,`Cursor`,`User`),mcpConfigPath:g(t,`Cursor`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Cursor Nightly`,configDir:g(t,`Cursor Nightly`,`User`),mcpConfigPath:g(t,`Cursor Nightly`,`User`,`mcp.json`),globalScaffoldRoot:o,instructionsRoot:null},{ide:`Windsurf`,configDir:g(t,`Windsurf`,`User`),mcpConfigPath:g(t,`Windsurf`,`User`,`mcp.json`),globalScaffoldRoot:s,instructionsRoot:null})}return n.push({ide:`Claude Code`,configDir:g(e,`.claude`),mcpConfigPath:g(e,`.claude`,`mcp.json`),globalScaffoldRoot:a,instructionsRoot:null}),n.push({ide:`Copilot CLI`,configDir:r,mcpConfigPath:g(r,`mcp-config.json`),globalScaffoldRoot:null,instructionsRoot:null}),n.filter(e=>c(e.configDir))}function C(e,t,r=!1){let{mcpConfigPath:i,configDir:a}=e,o={...n},s={};if(c(i)){try{let e=u(i,`utf-8`);s=JSON.parse(e)}catch{let e=`${i}.bak`;p(e,u(i,`utf-8`),`utf-8`),console.log(` Backed up invalid ${i} to ${e}`),s={}}if((s.servers??s.mcpServers??{})[t]&&!r){console.log(` ${e.ide}: ${t} already configured (use --force to update)`);return}}let d=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`,`Windsurf`]).has(e.ide)?`servers`:`mcpServers`,f=s[d]??{};e.ide===`Copilot CLI`?f[t]={...o,tools:[`*`]}:f[t]=o,s[d]=f,l(a,{recursive:!0}),p(i,`${JSON.stringify(s,null,2)}\n`,`utf-8`),console.log(` ${e.ide}: configured ${t} in ${i}`)}const w=new Set([`VS Code`,`VS Code Insiders`,`VSCodium`]);function T(t,n=!1){if(!w.has(t.ide))return;let r=g(t.configDir,`settings.json`),i={};if(c(r))try{let e=u(r,`utf-8`);i=JSON.parse(e)}catch{console.log(` ${t.ide}: skipped settings.json (invalid JSON)`);return}let a=!1;for(let[t,r]of Object.entries(e))if(typeof r==`object`&&r){let e=typeof i[t]==`object`&&i[t]!==null?i[t]:{},n={...e,...r};JSON.stringify(n)!==JSON.stringify(e)&&(i[t]=n,a=!0)}else (n||!(t in i))&&(i[t]=r,a=!0);a&&(p(r,`${JSON.stringify(i,null,2)}\n`,`utf-8`),console.log(` ${t.ide}: updated settings.json`))}function E(e,n,r,u,f=!1){let m=new Set;for(let e of n)e.globalScaffoldRoot&&m.add(e.globalScaffoldRoot);if(m.size===0){console.log(` No IDEs with global scaffold support detected.`);return}let h=g(e,`scaffold`,`general`);for(let n of m){s(h,n,`agents`,u,f),s(h,n,`prompts`,u,f);let r=0;for(let e of t)c(g(h,`skills`,e))&&(s(h,n,`skills/${e}`,u,f),r++);for(let t of i){let r=g(e,`scaffold`,`flows`,t);if(!c(g(r,`steps`)))continue;let i=g(n,`flows`,t);l(i,{recursive:!0});let a=g(i,`skills`);c(a)&&(d(a,{recursive:!0,force:!0}),console.log(` ${n}: migrated ${t} flow to steps/ layout`)),s(r,i,`steps`,u,f)}console.log(` ${n}: scaffold updated (${r} skills)`)}let _=new Set,v=a(`aikit`,r),y=o(`aikit`,r);for(let e of n){if(!e.globalScaffoldRoot)continue;let t=e.globalScaffoldRoot;if(e.ide===`Claude Code`){let e=g(t,`CLAUDE.md`);p(e,`${v}\n---\n\n${y}`,`utf-8`),_.add(e)}else if(e.ide===`VS Code`||e.ide===`VS Code Insiders`||e.ide===`VSCodium`){let n=e.instructionsRoot??t;l(n,{recursive:!0});let r=g(n,`copilot-instructions.md`);_.has(r)||(p(r,`---\napplyTo: "**"\n---\n\n${v}\n---\n\n${y}`,`utf-8`),_.add(r));let i=g(b(),`.github`),a=g(i,`copilot-instructions.md`);_.has(a)||(l(i,{recursive:!0}),p(a,`${v}\n---\n\n${y}`,`utf-8`),_.add(a)),s(h,e.configDir,`prompts`,u,f)}else if(e.ide===`Cursor`||e.ide===`Cursor Nightly`){let e=g(t,`rules`);l(e,{recursive:!0});let n=g(e,`aikit.mdc`);_.has(n)||(p(n,`${v}\n---\n\n${y}`,`utf-8`),_.add(n))}else if(e.ide===`Windsurf`){let e=g(t,`rules`);l(e,{recursive:!0});let n=g(e,`aikit.md`);_.has(n)||(p(n,`${v}\n---\n\n${y}`,`utf-8`),_.add(n))}}_.size>0&&console.log(` Instruction files: ${[..._].join(`, `)}`)}function D(e){let t=[];for(let n of e){if(!n.globalScaffoldRoot)continue;let e=n.globalScaffoldRoot;if(n.ide===`VS Code`||n.ide===`VS Code Insiders`||n.ide===`VSCodium`){let r=n.instructionsRoot??e;t.push(g(r,`kb.instructions.md`)),t.push(g(r,`aikit.instructions.md`))}else n.ide===`Cursor`||n.ide===`Cursor Nightly`?t.push(g(e,`rules`,`kb.mdc`)):n.ide===`Windsurf`&&t.push(g(e,`rules`,`kb.md`))}for(let e of t)c(e)&&(f(e),console.log(` Removed legacy file: ${e}`))}async function O(e){let t=r,n=x(m(_(import.meta.url))),i=JSON.parse(u(g(n,`package.json`),`utf-8`)).version;console.log(`Initializing @vpxa/aikit v${i}...\n`);let a=v();l(a,{recursive:!0}),console.log(` Global data store: ${a}`),y({version:1,workspaces:{}}),console.log(` Created registry.json`);let o=S();if(o.length===0)console.log(`
2
- No supported IDEs detected. You can manually add the MCP server config.`);else{console.log(`\n Detected ${o.length} IDE(s):`);for(let n of o)C(n,t,e.force),T(n,e.force)}console.log(`
3
- Installing scaffold files:`),E(n,o,t,i,e.force),D(o),console.log(`
4
- User-level AI Kit installation complete!`),console.log(`
5
- Next steps:`),console.log(` 1. Open any workspace in your IDE`),console.log(` 2. The AI Kit server will auto-start and index the workspace`),console.log(` 3. Agents, prompts, skills & instructions are available globally`),console.log(` 4. No per-workspace init needed — just open a project and start coding`)}export{O as initUser};
@@ -1,73 +0,0 @@
1
- /**
2
- * Claude Code adapter — generates Claude Code config from definitions.
3
- *
4
- * Output format:
5
- * CLAUDE.md — Main instructions (agents + protocols inline)
6
- * .claude/settings.json — Hooks config
7
- * .mcp.json — MCP server config
8
- * .claude/commands/{name}.md — Slash commands (from prompts)
9
- *
10
- * Status: STUB — not yet implemented.
11
- */
12
-
13
- // biome-ignore lint/correctness/noUnusedImports: reserved for implementation
14
- import { AGENTS } from '../definitions/agents.mjs';
15
- // biome-ignore lint/correctness/noUnusedImports: reserved for implementation
16
- import { AGENT_BODIES } from '../definitions/bodies.mjs';
17
- // biome-ignore lint/correctness/noUnusedImports: reserved for implementation
18
- import { CLAUDE_MODELS, VARIANT_GROUPS } from '../definitions/models.mjs';
19
- import { PROMPTS } from '../definitions/prompts.mjs';
20
- // biome-ignore lint/correctness/noUnusedImports: reserved for implementation
21
- import { IDE_CAPABILITIES } from '../definitions/tools.mjs';
22
-
23
- export const CLAUDE_FLOWS_SECTION = [
24
- '## Flows',
25
- '',
26
- "This project uses aikit's pluggable flow system. Check flow status with the `flow_status` MCP tool.",
27
- "If a flow is active, follow the current step's skill instructions. Advance with `flow_step({ action: 'next' })`.",
28
- 'Use `flow_list` to see available flows and `flow_start` to begin one.',
29
- ].join('\n');
30
-
31
- export const CLAUDE_ORCHESTRATOR_FLOW_ROUTING_SECTION = [
32
- '## Flows',
33
- '',
34
- "This project uses aikit's pluggable flow system. Check flow status with the `flow_status` MCP tool.",
35
- "If a flow is active, follow the current step's skill instructions. Advance with `flow_step({ action: 'next' })`.",
36
- 'Use `flow_list` to see available flows and `flow_start` to begin one.',
37
- ].join('\n');
38
-
39
- // ── Command generator ──────────────────────────────────────────────
40
- /**
41
- * Generate a Claude Code slash command (.md) from a prompt definition.
42
- * Claude Code commands are plain markdown — no YAML frontmatter needed.
43
- * Invoked as /project:aikit-{name} in Claude Code.
44
- */
45
- function generateCommand(name, def) {
46
- const lines = [];
47
- lines.push(`# aikit ${name}`);
48
- lines.push('');
49
- if (def.description) {
50
- lines.push(`> ${def.description}`);
51
- lines.push('');
52
- }
53
- lines.push(def.content.trim());
54
- lines.push('');
55
- return lines.join('\n');
56
- }
57
-
58
- export function generateClaudeCode() {
59
- const files = [];
60
-
61
- // ── Slash commands from PROMPTS definitions ──────────────────────
62
- for (const [name, def] of Object.entries(PROMPTS)) {
63
- files.push({
64
- path: `commands/aikit-${name}.md`,
65
- content: generateCommand(name, def),
66
- });
67
- }
68
-
69
- // TODO: Inline agent instructions into CLAUDE.md sections
70
- // TODO: Generate .mcp.json (server name, env vars)
71
-
72
- return files;
73
- }
@@ -1,292 +0,0 @@
1
- /**
2
- * Copilot adapter — generates GitHub Copilot agent files from definitions.
3
- *
4
- * Output format:
5
- * agents/{Name}.agent.md — YAML frontmatter + markdown body
6
- * agents/_shared/{name}.md — Shared protocol files
7
- * agents/templates/execution-state.md
8
- * agents/README.md
9
- * prompts/{name}.prompt.md — YAML frontmatter + markdown body
10
- *
11
- * Copilot-specific conventions:
12
- * - model field appends " (copilot)" suffix
13
- * - tools are listed as YAML array in frontmatter
14
- * - prompts target a specific agent via `agent:` field
15
- * - hooks are embedded in copilot-instructions.md (not separate files)
16
- * - plugins/skills are SKILL.md files in .github/skills/
17
- */
18
-
19
- import { AGENTS } from '../definitions/agents.mjs';
20
- import { AGENT_BODIES } from '../definitions/bodies.mjs';
21
- import { COPILOT_MODELS, VARIANT_GROUPS } from '../definitions/models.mjs';
22
- import { PROMPTS } from '../definitions/prompts.mjs';
23
- import { PROTOCOLS, TEMPLATES } from '../definitions/protocols.mjs';
24
- import { IDE_CAPABILITIES } from '../definitions/tools.mjs';
25
-
26
- // ─── Copilot tool mapping ─────────────────────────────────────────────────
27
-
28
- /** Map abstract IDE capability names to Copilot tool identifiers */
29
- const COPILOT_TOOL_MAP = {
30
- terminal: 'execute/runInTerminal',
31
- problems: 'read/problems',
32
- readFile: 'read/readFile',
33
- lastCommand: 'read/terminalLastCommand',
34
- subagent: 'agent/runSubagent',
35
- createFile: 'edit/createFile',
36
- editFiles: 'edit/editFiles',
37
- rename: 'edit/rename',
38
- createDirectory: 'edit/createDirectory',
39
- search: 'search/changes, search/codebase, search/usages',
40
- web: 'web/fetch, web/githubRepo',
41
- todo: 'todo',
42
- memory: 'vscode/memory',
43
- newWorkspace: 'vscode/newWorkspace',
44
- reviewPlan: 'vscode/reviewPlan',
45
- askQuestions: 'vscode/askQuestions',
46
- resolveMemoryFileUri: 'vscode/resolveMemoryFileUri',
47
- runCommand: 'vscode/runCommand',
48
- switchAgent: 'vscode/switchAgent',
49
- killTerminal: 'execute/killTerminal',
50
- createTask: 'execute/createAndRunTask',
51
- terminalSel: 'read/terminalSelection',
52
- fileSearch: 'search/fileSearch',
53
- listDir: 'search/listDirectory',
54
- textSearch: 'search/textSearch',
55
- searchSubagent: 'search/searchSubagent',
56
- browser:
57
- 'browser/openBrowserPage, browser/readPage, browser/screenshotPage, browser/navigatePage, browser/clickElement, browser/dragElement, browser/hoverElement, browser/typeInPage, browser/runPlaywrightCode, browser/handleDialog',
58
- };
59
-
60
- function buildToolsYaml(toolRole) {
61
- const capabilities = IDE_CAPABILITIES[toolRole] || [];
62
- const copilotTools = capabilities.map((cap) => COPILOT_TOOL_MAP[cap]).filter(Boolean);
63
- // Use server wildcard instead of listing all 67 tools individually.
64
- // VS Code expands `<server-name>/*` to all tools from that MCP server.
65
- return `[${[...copilotTools, 'aikit/*'].join(', ')}]`;
66
- }
67
-
68
- function copilotModel(agentName) {
69
- const models = COPILOT_MODELS[agentName];
70
- if (!models) return 'Auto (copilot)';
71
- // NOTE: Model array syntax (e.g. [model1, model2]) is experimental and
72
- // requires a VS Code experiment flag to be enabled. For now, we always
73
- // emit the primary (first) model as a plain string.
74
- if (Array.isArray(models)) {
75
- return models[0] || 'Auto (copilot)';
76
- }
77
- return models;
78
- }
79
-
80
- const FLOWS_SECTION = [
81
- '## Flows',
82
- '',
83
- "This project uses aikit's pluggable flow system. Check flow status with the `flow_status` MCP tool.",
84
- "If a flow is active, follow the current step's skill instructions. Advance with `flow_step({ action: 'next' })`.",
85
- 'Use `flow_list` to see available flows and `flow_start` to begin one.',
86
- ].join('\n');
87
-
88
- // ─── Agent file generators ────────────────────────────────────────────────
89
-
90
- function buildAgentTable() {
91
- const rows = [];
92
- for (const [name, def] of Object.entries(AGENTS)) {
93
- if (def.variants) {
94
- for (const suffix of VARIANT_GROUPS[name] || []) {
95
- const fullName = `${name}-${suffix}`;
96
- const models = COPILOT_MODELS[fullName] || COPILOT_MODELS[name];
97
- const model = Array.isArray(models) ? models[0] : models || 'Unknown';
98
- const varDef = def.variants[suffix] || {};
99
- const desc = varDef.description || def.description;
100
- rows.push(`| **${fullName}** | ${desc} | ${model} | ${def.category} |`);
101
- }
102
- } else {
103
- const models = COPILOT_MODELS[name];
104
- const model = Array.isArray(models) ? models[0] : models || 'Unknown';
105
- rows.push(`| **${name}** | ${def.description} | ${model} | ${def.category} |`);
106
- }
107
- }
108
- return `| Agent | Purpose | Model | Category |\n|-------|---------|-------|----------|\n${rows.join('\n')}`;
109
- }
110
-
111
- function generateVariantAgent(roleName, suffix, def) {
112
- const fullName = `${roleName}-${suffix}`;
113
- const varDef = def.variants[suffix] || {};
114
- const model = copilotModel(fullName);
115
- const desc = varDef.description || def.description;
116
- const identity =
117
- varDef.identity ||
118
- (suffix === VARIANT_GROUPS[roleName]?.[0]
119
- ? `, the primary ${roleName} agent.`
120
- : `, a variant of ${roleName}. Same responsibilities, different model perspective.`);
121
-
122
- const sharedContent =
123
- def.sharedBase && PROTOCOLS[def.sharedBase] ? `\n\n${PROTOCOLS[def.sharedBase]}` : '';
124
-
125
- const extra = def.extraBody ? `\n\n${def.extraBody}` : '';
126
- const variantAddendum = varDef.bodyAddendum ? `\n\n${varDef.bodyAddendum}` : '';
127
-
128
- const skillsSection = def.skills?.length
129
- ? `\n\n## Skills (load on demand)\n\n| Skill | When to load |\n|-------|--------------|\n${def.skills.map(([s, w]) => `| ${s} | ${w} |`).join('\n')}`
130
- : '';
131
-
132
- const title = def.title || roleName;
133
-
134
- return `---
135
- description: '${desc}'
136
- ${def.argumentHint ? `argument-hint: "${def.argumentHint}"\n` : ''}tools: ${buildToolsYaml(def.toolRole)}
137
- model: ${model}
138
- ---
139
-
140
- # ${fullName} - ${title}
141
-
142
- You are **${fullName}**${identity}${extra}
143
- ${sharedContent}${variantAddendum}${skillsSection}
144
-
145
- ${FLOWS_SECTION}
146
- `;
147
- }
148
-
149
- function generateSingleAgent(name, def) {
150
- const model = copilotModel(name);
151
- const body =
152
- typeof AGENT_BODIES[name] === 'function'
153
- ? AGENT_BODIES[name](buildAgentTable())
154
- : AGENT_BODIES[name] || '';
155
-
156
- const sharedContent =
157
- def.sharedBase && PROTOCOLS[def.sharedBase] ? `\n\n${PROTOCOLS[def.sharedBase]}` : '';
158
-
159
- const additionalContent = (def.sharedProtocols || [])
160
- .map((key) => (PROTOCOLS[key] ? `\n\n${PROTOCOLS[key]}` : ''))
161
- .join('');
162
-
163
- const title = def.title || name;
164
- const skillsSection = def.skills?.length
165
- ? `\n## Skills (load on demand)\n\n| Skill | When to load |\n|-------|--------------|\n${def.skills.map(([s, w]) => `| ${s} | ${w} |`).join('\n')}\n`
166
- : '';
167
-
168
- return `---
169
- description: '${def.description}'
170
- ${def.argumentHint ? `argument-hint: "${def.argumentHint}"\n` : ''}tools: ${buildToolsYaml(def.toolRole)}
171
- model: ${model}
172
- ---
173
-
174
- # ${name} - ${title}
175
-
176
- You are the **${name}**, ${def.description.toLowerCase().replace(/^./, (c) => c.toLowerCase())}
177
-
178
- ${body}${sharedContent}${additionalContent}${skillsSection}
179
-
180
- ${FLOWS_SECTION}
181
- `;
182
- }
183
-
184
- // ─── Prompt file generator ────────────────────────────────────────────────
185
-
186
- function generatePrompt(_name, def) {
187
- // NOTE: Do NOT emit a `tools:` field in prompt files.
188
- // Prompt `tools:` is an exclusive allowlist in VS Code — it replaces the
189
- // agent's tools entirely. Since prompts only list aikit/* MCP tools (which
190
- // are all deferred), the API rejects with "All tools cannot be deferred."
191
- // Omitting `tools:` lets the prompt inherit the full tool set from `agent:`.
192
- return `---
193
- description: "${def.description}"
194
- agent: "${def.agent}"
195
- ---
196
-
197
- ${def.content}
198
- `;
199
- }
200
-
201
- // ─── README generator ─────────────────────────────────────────────────────
202
-
203
- function generateReadme() {
204
- return `# Agents
205
-
206
- This directory contains AI agent definitions generated by \`@vpxa/aikit init\`.
207
-
208
- ## Agent Roster
209
-
210
- ${buildAgentTable()}
211
-
212
- ## Multi-Model Pattern
213
-
214
- Variant agents (Researcher-Alpha/Beta/Gamma/Delta, Code-Reviewer-Alpha/Beta, Architect-Reviewer-Alpha/Beta) share the same methodology via files in \`_shared/\`. They differ only in which LLM model backs them — enabling multi-model decision analysis and dual-review workflows.
215
-
216
- **Agent names are model-agnostic.** The model behind Alpha/Beta/Gamma/Delta can be changed in \`scaffold/definitions/models.mjs\` without renaming any agent files.
217
-
218
- ## Structure
219
-
220
- \`\`\`
221
- agents/
222
- {Name}.agent.md — Agent definition (YAML frontmatter + instructions)
223
- _shared/ — Shared protocols referenced by multiple agents
224
- code-agent-base.md — Base for all code-modifying agents
225
- researcher-base.md — Base for all Researcher variants
226
- code-reviewer-base.md — Base for all Code-Reviewer variants
227
- architect-reviewer-base.md — Base for all Architect-Reviewer variants
228
- decision-protocol.md — Multi-model decision protocol rules
229
- forge-protocol.md — FORGE quality gate protocol
230
- templates/
231
- execution-state.md — Orchestrator state tracking template
232
- adr-template.md — Architecture Decision Record template
233
- \`\`\`
234
-
235
- ## Regenerating
236
-
237
- To regenerate after changing models or agent definitions:
238
-
239
- \`\`\`bash
240
- cd knowledge-base
241
- node scaffold/generate.mjs
242
- \`\`\`
243
- `;
244
- }
245
-
246
- // ─── Public API ───────────────────────────────────────────────────────────
247
-
248
- /**
249
- * Generate all Copilot scaffold files.
250
- * Returns an array of { path, content } objects.
251
- * The caller (generate.mjs) is responsible for writing them to disk.
252
- */
253
- export function generateCopilot() {
254
- const files = [];
255
-
256
- // Agent files
257
- for (const [name, def] of Object.entries(AGENTS)) {
258
- if (def.variants) {
259
- for (const suffix of VARIANT_GROUPS[name] || []) {
260
- files.push({
261
- path: `agents/${name}-${suffix}.agent.md`,
262
- content: generateVariantAgent(name, suffix, def),
263
- });
264
- }
265
- } else {
266
- files.push({
267
- path: `agents/${name}.agent.md`,
268
- content: generateSingleAgent(name, def),
269
- });
270
- }
271
- }
272
-
273
- // Shared protocols
274
- for (const [name, content] of Object.entries(PROTOCOLS)) {
275
- files.push({ path: `agents/_shared/${name}.md`, content: `${content}\n` });
276
- }
277
-
278
- // Templates
279
- for (const [name, content] of Object.entries(TEMPLATES)) {
280
- files.push({ path: `agents/templates/${name}.md`, content: `${content}\n` });
281
- }
282
-
283
- // README
284
- files.push({ path: 'agents/README.md', content: generateReadme() });
285
-
286
- // Prompts
287
- for (const [name, def] of Object.entries(PROMPTS)) {
288
- files.push({ path: `prompts/aikit-${name}.prompt.md`, content: generatePrompt(name, def) });
289
- }
290
-
291
- return files;
292
- }