@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.
- package/package.json +9 -1
- package/packages/cli/dist/index.js +2 -2
- package/packages/cli/dist/{init-D_OGLUN1.js → init-CuRXmyD9.js} +4 -4
- package/packages/cli/dist/scaffold-WMQ2uQ48.js +2 -0
- package/packages/cli/dist/{templates-DJ7EC5vw.js → templates-ArdAVWoY.js} +13 -3
- package/packages/cli/dist/user-vbJwa7x2.js +5 -0
- package/packages/dashboard/dist/assets/index-C6D-PCp0.js.map +1 -1
- package/packages/flows/dist/index.d.ts +29 -0
- package/packages/flows/dist/index.js +1 -1
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/{server-B9Mx1aK-.js → server-CVhVH5cT.js} +127 -127
- package/packages/tools/dist/index.d.ts +19 -1
- package/packages/tools/dist/index.js +39 -39
- package/scaffold/dist/adapters/claude-code.mjs +4 -0
- package/scaffold/dist/adapters/copilot.mjs +75 -0
- package/scaffold/dist/adapters/flows.mjs +1 -0
- package/scaffold/dist/adapters/skills.mjs +1 -0
- package/scaffold/dist/compiled/flows-data.mjs +1429 -0
- package/scaffold/dist/compiled/skills-data.mjs +9951 -0
- package/scaffold/dist/definitions/agents.mjs +9 -0
- package/scaffold/{definitions → dist/definitions}/bodies.mjs +6 -229
- package/scaffold/dist/definitions/exclusions.mjs +1 -0
- package/scaffold/dist/definitions/hooks.mjs +1 -0
- package/scaffold/dist/definitions/models.mjs +1 -0
- package/scaffold/dist/definitions/plugins.mjs +1 -0
- package/scaffold/{definitions → dist/definitions}/prompts.mjs +9 -149
- package/scaffold/{definitions → dist/definitions}/protocols.mjs +9 -37
- package/scaffold/dist/definitions/tools.mjs +1 -0
- package/packages/cli/dist/scaffold-CJwkHf-q.js +0 -2
- package/packages/cli/dist/user-BEmVW8Tp.js +0 -5
- package/scaffold/adapters/claude-code.mjs +0 -73
- package/scaffold/adapters/copilot.mjs +0 -292
- package/scaffold/definitions/agents.mjs +0 -266
- package/scaffold/definitions/hooks.mjs +0 -43
- package/scaffold/definitions/models.mjs +0 -84
- package/scaffold/definitions/plugins.mjs +0 -147
- package/scaffold/definitions/tools.mjs +0 -250
- package/scaffold/flows/_epilogue/steps/docs-sync/README.md +0 -120
- package/scaffold/flows/aikit-advanced/README.md +0 -70
- package/scaffold/flows/aikit-advanced/flow.json +0 -69
- package/scaffold/flows/aikit-advanced/steps/design/README.md +0 -178
- package/scaffold/flows/aikit-advanced/steps/execute/README.md +0 -145
- package/scaffold/flows/aikit-advanced/steps/plan/README.md +0 -122
- package/scaffold/flows/aikit-advanced/steps/spec/README.md +0 -121
- package/scaffold/flows/aikit-advanced/steps/task/README.md +0 -119
- package/scaffold/flows/aikit-advanced/steps/verify/README.md +0 -145
- package/scaffold/flows/aikit-basic/README.md +0 -51
- package/scaffold/flows/aikit-basic/flow.json +0 -45
- package/scaffold/flows/aikit-basic/steps/assess/README.md +0 -109
- package/scaffold/flows/aikit-basic/steps/design/README.md +0 -116
- package/scaffold/flows/aikit-basic/steps/implement/README.md +0 -131
- package/scaffold/flows/aikit-basic/steps/verify/README.md +0 -123
- package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +0 -132
- package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +0 -132
- package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +0 -112
- package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +0 -112
- package/scaffold/general/agents/Debugger.agent.md +0 -412
- package/scaffold/general/agents/Documenter.agent.md +0 -468
- package/scaffold/general/agents/Explorer.agent.md +0 -76
- package/scaffold/general/agents/Frontend.agent.md +0 -440
- package/scaffold/general/agents/Implementer.agent.md +0 -425
- package/scaffold/general/agents/Orchestrator.agent.md +0 -452
- package/scaffold/general/agents/Planner.agent.md +0 -481
- package/scaffold/general/agents/README.md +0 -57
- package/scaffold/general/agents/Refactor.agent.md +0 -435
- package/scaffold/general/agents/Researcher-Alpha.agent.md +0 -151
- package/scaffold/general/agents/Researcher-Beta.agent.md +0 -152
- package/scaffold/general/agents/Researcher-Delta.agent.md +0 -153
- package/scaffold/general/agents/Researcher-Gamma.agent.md +0 -152
- package/scaffold/general/agents/Security.agent.md +0 -433
- package/scaffold/general/agents/_shared/architect-reviewer-base.md +0 -104
- package/scaffold/general/agents/_shared/code-agent-base.md +0 -366
- package/scaffold/general/agents/_shared/code-reviewer-base.md +0 -87
- package/scaffold/general/agents/_shared/decision-protocol.md +0 -27
- package/scaffold/general/agents/_shared/forge-protocol.md +0 -90
- package/scaffold/general/agents/_shared/researcher-base.md +0 -114
- package/scaffold/general/agents/templates/adr-template.md +0 -28
- package/scaffold/general/agents/templates/execution-state.md +0 -26
- package/scaffold/general/prompts/aikit-ask.prompt.md +0 -13
- package/scaffold/general/prompts/aikit-debug.prompt.md +0 -15
- package/scaffold/general/prompts/aikit-design.prompt.md +0 -15
- package/scaffold/general/prompts/aikit-flow-add.prompt.md +0 -84
- package/scaffold/general/prompts/aikit-flow-create.prompt.md +0 -80
- package/scaffold/general/prompts/aikit-flow-manage.prompt.md +0 -24
- package/scaffold/general/prompts/aikit-implement.prompt.md +0 -17
- package/scaffold/general/prompts/aikit-plan.prompt.md +0 -15
- package/scaffold/general/prompts/aikit-review.prompt.md +0 -24
- package/scaffold/general/skills/adr-skill/SKILL.md +0 -335
- package/scaffold/general/skills/adr-skill/assets/templates/adr-madr.md +0 -89
- package/scaffold/general/skills/adr-skill/assets/templates/adr-readme.md +0 -20
- package/scaffold/general/skills/adr-skill/assets/templates/adr-simple.md +0 -46
- package/scaffold/general/skills/adr-skill/references/adr-conventions.md +0 -95
- package/scaffold/general/skills/adr-skill/references/examples.md +0 -193
- package/scaffold/general/skills/adr-skill/references/review-checklist.md +0 -77
- package/scaffold/general/skills/adr-skill/references/template-variants.md +0 -52
- package/scaffold/general/skills/adr-skill/scripts/bootstrap_adr.js +0 -259
- package/scaffold/general/skills/adr-skill/scripts/new_adr.js +0 -391
- package/scaffold/general/skills/adr-skill/scripts/set_adr_status.js +0 -169
- package/scaffold/general/skills/aikit/SKILL.md +0 -754
- package/scaffold/general/skills/brainstorming/SKILL.md +0 -265
- package/scaffold/general/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
- package/scaffold/general/skills/c4-architecture/SKILL.md +0 -389
- package/scaffold/general/skills/c4-architecture/references/advanced-patterns.md +0 -552
- package/scaffold/general/skills/c4-architecture/references/c4-syntax.md +0 -510
- package/scaffold/general/skills/c4-architecture/references/common-mistakes.md +0 -437
- package/scaffold/general/skills/c4-architecture/references/html-design-system.md +0 -337
- package/scaffold/general/skills/c4-architecture/references/html-template.html +0 -627
- package/scaffold/general/skills/docs/SKILL.md +0 -553
- package/scaffold/general/skills/docs/references/diataxis-anti-patterns.md +0 -147
- package/scaffold/general/skills/docs/references/diataxis-compass.md +0 -123
- package/scaffold/general/skills/docs/references/diataxis-quadrants.md +0 -192
- package/scaffold/general/skills/docs/references/diataxis-quality.md +0 -76
- package/scaffold/general/skills/docs/references/diataxis-templates.md +0 -120
- package/scaffold/general/skills/docs/references/flow-artifacts-guide.md +0 -70
- package/scaffold/general/skills/docs/references/project-knowledge-gotchas.md +0 -32
- package/scaffold/general/skills/docs/references/project-knowledge-templates.md +0 -281
- package/scaffold/general/skills/docs/references/project-knowledge-workflow.md +0 -80
- package/scaffold/general/skills/frontend-design/SKILL.md +0 -237
- package/scaffold/general/skills/lesson-learned/SKILL.md +0 -113
- package/scaffold/general/skills/lesson-learned/references/anti-patterns.md +0 -55
- package/scaffold/general/skills/lesson-learned/references/se-principles.md +0 -109
- package/scaffold/general/skills/multi-agents-development/SKILL.md +0 -448
- package/scaffold/general/skills/multi-agents-development/architecture-review-prompt.md +0 -81
- package/scaffold/general/skills/multi-agents-development/code-quality-review-prompt.md +0 -91
- package/scaffold/general/skills/multi-agents-development/implementer-prompt.md +0 -93
- package/scaffold/general/skills/multi-agents-development/parallel-dispatch-example.md +0 -167
- package/scaffold/general/skills/multi-agents-development/spec-review-prompt.md +0 -81
- package/scaffold/general/skills/present/SKILL.md +0 -616
- package/scaffold/general/skills/react/SKILL.md +0 -309
- package/scaffold/general/skills/repo-access/SKILL.md +0 -178
- package/scaffold/general/skills/repo-access/references/error-patterns.md +0 -116
- package/scaffold/general/skills/repo-access/references/platform-matrix.md +0 -142
- package/scaffold/general/skills/requirements-clarity/SKILL.md +0 -333
- package/scaffold/general/skills/session-handoff/SKILL.md +0 -199
- package/scaffold/general/skills/session-handoff/references/handoff-template.md +0 -139
- package/scaffold/general/skills/session-handoff/references/resume-checklist.md +0 -80
- package/scaffold/general/skills/session-handoff/scripts/check_staleness.js +0 -269
- package/scaffold/general/skills/session-handoff/scripts/create_handoff.js +0 -299
- package/scaffold/general/skills/session-handoff/scripts/list_handoffs.js +0 -113
- package/scaffold/general/skills/session-handoff/scripts/validate_handoff.js +0 -241
- package/scaffold/general/skills/typescript/SKILL.md +0 -405
- 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
|
-
}
|