@vpxa/aikit 0.1.9 → 0.1.11

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 (93) hide show
  1. package/package.json +1 -1
  2. package/packages/indexer/dist/smart-index-scheduler.js +1 -1
  3. package/packages/server/dist/compression-interceptor.d.ts +12 -0
  4. package/packages/server/dist/compression-interceptor.js +1 -0
  5. package/packages/server/dist/server.js +2 -2
  6. package/packages/server/dist/tools/analyze.tools.js +3 -3
  7. package/packages/server/dist/tools/flow.tools.js +1 -1
  8. package/packages/server/dist/tools/onboard.tool.js +1 -1
  9. package/packages/server/dist/tools/present/templates.js +6 -6
  10. package/packages/server/dist/tools/present/tool.js +1 -1
  11. package/packages/server/dist/tools/search.tool.js +2 -2
  12. package/packages/store/dist/lance-store.js +1 -1
  13. package/packages/tools/dist/compact.d.ts +6 -0
  14. package/packages/tools/dist/compact.js +2 -2
  15. package/packages/tools/dist/compress-output.d.ts +38 -0
  16. package/packages/tools/dist/compress-output.js +1 -0
  17. package/packages/tools/dist/compression/delta-cache.d.ts +29 -0
  18. package/packages/tools/dist/compression/delta-cache.js +1 -0
  19. package/packages/tools/dist/compression/engine.d.ts +34 -0
  20. package/packages/tools/dist/compression/engine.js +4 -0
  21. package/packages/tools/dist/compression/litm.d.ts +20 -0
  22. package/packages/tools/dist/compression/litm.js +1 -0
  23. package/packages/tools/dist/compression/mmr.d.ts +24 -0
  24. package/packages/tools/dist/compression/mmr.js +1 -0
  25. package/packages/tools/dist/compression/rules/docker.d.ts +11 -0
  26. package/packages/tools/dist/compression/rules/docker.js +3 -0
  27. package/packages/tools/dist/compression/rules/generic.d.ts +11 -0
  28. package/packages/tools/dist/compression/rules/generic.js +3 -0
  29. package/packages/tools/dist/compression/rules/git.d.ts +11 -0
  30. package/packages/tools/dist/compression/rules/git.js +3 -0
  31. package/packages/tools/dist/compression/rules/index.d.ts +14 -0
  32. package/packages/tools/dist/compression/rules/index.js +1 -0
  33. package/packages/tools/dist/compression/rules/kubectl.d.ts +11 -0
  34. package/packages/tools/dist/compression/rules/kubectl.js +3 -0
  35. package/packages/tools/dist/compression/rules/lint.d.ts +11 -0
  36. package/packages/tools/dist/compression/rules/lint.js +3 -0
  37. package/packages/tools/dist/compression/rules/npm.d.ts +11 -0
  38. package/packages/tools/dist/compression/rules/npm.js +3 -0
  39. package/packages/tools/dist/compression/rules/test-runner.d.ts +11 -0
  40. package/packages/tools/dist/compression/rules/test-runner.js +3 -0
  41. package/packages/tools/dist/compression/scoring.d.ts +26 -0
  42. package/packages/tools/dist/compression/scoring.js +1 -0
  43. package/packages/tools/dist/compression/types.d.ts +61 -0
  44. package/packages/tools/dist/compression/types.js +1 -0
  45. package/packages/tools/dist/digest.d.ts +5 -0
  46. package/packages/tools/dist/digest.js +4 -4
  47. package/packages/tools/dist/index.d.ts +5 -1
  48. package/packages/tools/dist/index.js +1 -1
  49. package/packages/tools/dist/parse-output.d.ts +3 -1
  50. package/packages/tools/dist/parse-output.js +1 -1
  51. package/packages/tools/dist/truncation.d.ts +34 -1
  52. package/packages/tools/dist/truncation.js +10 -6
  53. package/packages/tui/dist/{App-DpjN3iS-.js → App-D8fednPY.js} +1 -1
  54. package/packages/tui/dist/App.js +1 -1
  55. package/packages/tui/dist/{CuratedPanel-BIamXLNy.js → CuratedPanel-BwkPKdX4.js} +1 -1
  56. package/packages/tui/dist/LogPanel-C6KagE0H.js +3320 -0
  57. package/packages/tui/dist/{SearchPanel-CpJGczAc.js → SearchPanel-BbvCaco0.js} +1 -1
  58. package/packages/tui/dist/{StatusPanel-BAbUxyqQ.js → StatusPanel-BFshFJU9.js} +1 -1
  59. package/packages/tui/dist/chunk-BSngPjfM.js +2 -0
  60. package/packages/tui/dist/{devtools-DMOZMn70.js → devtools-owCrRz12.js} +2 -2
  61. package/packages/tui/dist/hooks/useKBClient.js +1 -1
  62. package/packages/tui/dist/hooks/usePolling.js +1 -1
  63. package/packages/tui/dist/index.js +1 -1
  64. package/packages/tui/dist/{jsx-runtime-y6Gdq5PZ.js → jsx-runtime-B_2ewjsM.js} +7 -7
  65. package/packages/tui/dist/panels/CuratedPanel.js +1 -1
  66. package/packages/tui/dist/panels/LogPanel.js +1 -1
  67. package/packages/tui/dist/panels/SearchPanel.js +1 -1
  68. package/packages/tui/dist/panels/StatusPanel.js +1 -1
  69. package/packages/tui/dist/{react-D__J1GQe.js → react-sYq8CyFO.js} +1 -1
  70. package/packages/tui/dist/{useKBClient-C35iA4uG.js → useKBClient-BkBffCdd.js} +1 -1
  71. package/packages/tui/dist/{usePolling-BbjnRWgx.js → usePolling-D3y7u5cZ.js} +1 -1
  72. package/scaffold/adapters/copilot.mjs +4 -1
  73. package/scaffold/definitions/agents.mjs +32 -8
  74. package/scaffold/definitions/bodies.mjs +6 -2
  75. package/scaffold/definitions/protocols.mjs +12 -0
  76. package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +7 -0
  77. package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +7 -0
  78. package/scaffold/general/agents/Debugger.agent.md +7 -0
  79. package/scaffold/general/agents/Documenter.agent.md +1 -0
  80. package/scaffold/general/agents/Explorer.agent.md +6 -0
  81. package/scaffold/general/agents/Frontend.agent.md +9 -0
  82. package/scaffold/general/agents/Implementer.agent.md +7 -0
  83. package/scaffold/general/agents/Orchestrator.agent.md +35 -51
  84. package/scaffold/general/agents/README.md +3 -3
  85. package/scaffold/general/agents/Refactor.agent.md +1 -0
  86. package/scaffold/general/agents/Researcher-Beta.agent.md +2 -2
  87. package/scaffold/general/agents/Researcher-Delta.agent.md +2 -2
  88. package/scaffold/general/agents/Researcher-Gamma.agent.md +2 -2
  89. package/scaffold/general/agents/Security.agent.md +7 -0
  90. package/scaffold/general/agents/_shared/code-agent-base.md +38 -18
  91. package/scaffold/general/skills/aikit/SKILL.md +73 -1
  92. package/packages/tui/dist/LogPanel-Db-SeZhR.js +0 -3
  93. package/packages/tui/dist/chunk-D6axbAb-.js +0 -2
@@ -202,7 +202,79 @@ Lane actions: `create` (copy files to lane), `list`, `status` (modified/added/de
202
202
  |------|-----|---------|
203
203
  | `brainstorm` | — | Interactive brainstorming and ideation sessions with structured output |
204
204
 
205
- ## Search Strategy
205
+ ## Flow System
206
+
207
+ Flows are multi-step guided workflows that structure complex tasks. Each step has a skill file with detailed instructions, required artifacts, and agent assignments.
208
+
209
+ ### Built-in Flows
210
+
211
+ | Flow | Steps | Use When |
212
+ |------|-------|----------|
213
+ | `aikit:basic` | assess → implement → verify | Bug fixes, config changes, small features |
214
+ | `aikit:advanced` | spec → plan → task → execute → verify | New modules, cross-service changes, architectural work |
215
+
216
+ ### Flow Lifecycle
217
+
218
+ ```text
219
+ flow_list() # See available flows
220
+ flow_info({ flow: "aikit:basic" }) # View steps, skills, agents
221
+ flow_start({ flow: "aikit:basic" }) # Start — sets current step to first
222
+ flow_read_skill({ step: "assess" }) # Read current step's skill instructions
223
+ # ... do the work described in the skill ...
224
+ flow_step({ action: "next" }) # Advance to next step
225
+ flow_step({ action: "skip" }) # Skip current step
226
+ flow_step({ action: "redo" }) # Redo current step
227
+ flow_status() # Check progress
228
+ flow_reset() # Clear state, start over
229
+ ```
230
+
231
+ ### Creating Custom Flows
232
+
233
+ 1. Create a directory under `.github/flows/<flow-name>/`
234
+ 2. Add `manifest.yaml`:
235
+
236
+ ```yaml
237
+ name: my-flow
238
+ version: "1.0.0"
239
+ description: "My custom flow"
240
+ artifacts_dir: .spec
241
+ steps:
242
+ - id: design
243
+ name: Design
244
+ skill: skills/design/SKILL.md
245
+ description: "Create the design document"
246
+ produces: [design.md]
247
+ requires: []
248
+ agents: [Planner]
249
+ - id: implement
250
+ name: Implement
251
+ skill: skills/implement/SKILL.md
252
+ description: "Implement the design"
253
+ produces: [code]
254
+ requires: [design]
255
+ agents: [Implementer]
256
+ agents:
257
+ - agents/planner.agent.md
258
+ install: []
259
+ ```
260
+
261
+ 3. Add skill files under `.github/flows/<flow-name>/skills/<step-id>/SKILL.md`
262
+ 4. The flow appears in `flow_list()` automatically
263
+
264
+ ### How Flows Are Delivered
265
+
266
+ - **Built-in flows** ship with the AI Kit MCP server in `scaffold/flows/`
267
+ - `aikit init` copies them to `.github/flows/` in your workspace
268
+ - At runtime, flow tools resolve paths to `.github/flows/` (workspace-local copies)
269
+ - Custom flows placed in `.github/flows/` are discovered alongside built-in ones
270
+
271
+ ### Agent-Flow Integration
272
+
273
+ - All code agents have a "Flows" section instructing them to check `flow_status()` first
274
+ - If a flow is active, the agent follows the current step's skill via `flow_read_skill()`
275
+ - After completing a step's work, advance with `flow_step({ action: "next" })`
276
+ - The **Orchestrator** selects and starts flows; other agents follow them
277
+ - The **Orchestrator** specifies `aikit` skill loading — all agents should load `aikit` skill to access flow tools
206
278
 
207
279
  ## CRITICAL: Use AI Kit Tools Instead of Native IDE Tools
208
280
 
@@ -1,3 +0,0 @@
1
- import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
- import{r as e}from"./chunk-D6axbAb-.js";import{t}from"./react-D__J1GQe.js";import{a as n,i as r,t as i}from"./jsx-runtime-y6Gdq5PZ.js";import{homedir as a}from"node:os";import{exec as o,execFile as s}from"node:child_process";import{appendFileSync as c,closeSync as l,constants as u,existsSync as d,mkdirSync as f,openSync as p,readFileSync as m,readdirSync as h,renameSync as g,statSync as _,unlinkSync as v,writeFileSync as y}from"node:fs";import{basename as ee,dirname as b,join as x,resolve as S}from"node:path";import{promisify as C}from"node:util";import{fileURLToPath as w}from"node:url";import{createHash as T}from"node:crypto";import"turndown";C(o),x(b(w(import.meta.url)),`..`,`..`,`wasm`),new Set(Object.keys({".ts":`tree-sitter-typescript.wasm`,".tsx":`tree-sitter-typescript.wasm`,".mts":`tree-sitter-typescript.wasm`,".cts":`tree-sitter-typescript.wasm`,".js":`tree-sitter-javascript.wasm`,".jsx":`tree-sitter-javascript.wasm`,".mjs":`tree-sitter-javascript.wasm`,".cjs":`tree-sitter-javascript.wasm`,".py":`tree-sitter-python.wasm`,".go":`tree-sitter-go.wasm`,".rs":`tree-sitter-rust.wasm`,".java":`tree-sitter-java.wasm`,".kt":`tree-sitter-kotlin.wasm`,".kts":`tree-sitter-kotlin.wasm`,".scala":`tree-sitter-scala.wasm`,".sc":`tree-sitter-scala.wasm`,".c":`tree-sitter-c.wasm`,".h":`tree-sitter-c.wasm`,".cpp":`tree-sitter-cpp.wasm`,".cc":`tree-sitter-cpp.wasm`,".cxx":`tree-sitter-cpp.wasm`,".hpp":`tree-sitter-cpp.wasm`,".hxx":`tree-sitter-cpp.wasm`,".cs":`tree-sitter-c_sharp.wasm`,".swift":`tree-sitter-swift.wasm`,".rb":`tree-sitter-ruby.wasm`,".php":`tree-sitter-php.wasm`}));const E={ai:`.ai`,aiKb:`.ai/kb`,aiCurated:`.ai/curated`,restorePoints:`.ai/restore-points`,data:`.aikit-data`,state:`.aikit-state`,logs:`.aikit-state/logs`,brainstorm:`.brainstorm`,handoffs:`.handoffs`},D={root:`.aikit-data`,registry:`registry.json`};E.data;function O(){return process.env.AIKIT_GLOBAL_DATA_DIR??S(a(),D.root)}function k(e){let t=S(e);return`${ee(t).toLowerCase().replace(/[^a-z0-9-]/g,`-`)||`workspace`}-${T(`sha256`).update(t).digest(`hex`).slice(0,8)}`}function te(){let e=S(O(),D.registry);if(!d(e))return{version:1,workspaces:{}};let t=m(e,`utf-8`);try{return JSON.parse(t)}catch{return{version:1,workspaces:{}}}}function ne(e,t=5e3){let n=`${e}.lock`,r=Date.now()+t,i=10;for(;Date.now()<r;)try{let e=p(n,u.O_CREAT|u.O_EXCL|u.O_WRONLY);return y(e,`${process.pid}\n`),l(e),n}catch(e){if(e.code!==`EEXIST`)throw e;try{let{mtimeMs:e}=_(n);if(Date.now()-e>3e4){v(n);continue}}catch{}let t=new SharedArrayBuffer(4);Atomics.wait(new Int32Array(t),0,0,i),i=Math.min(i*2,200)}throw Error(`Failed to acquire registry lock after ${t}ms`)}function re(e){try{v(e)}catch{}}function ie(e){let t=O();f(t,{recursive:!0});let n=S(t,D.registry),r=ne(n);try{let t=`${n}.tmp`;y(t,JSON.stringify(e,null,2),`utf-8`),g(t,n)}finally{re(r)}}function ae(e){let t=te(),n=k(e),r=new Date().toISOString();return t.workspaces[n]?t.workspaces[n].lastAccessedAt=r:t.workspaces[n]={partition:n,workspacePath:S(e),registeredAt:r,lastAccessedAt:r},f(A(n),{recursive:!0}),ie(t),t.workspaces[n]}function A(e){return S(O(),e)}function j(){return d(S(O(),D.registry))}function M(e){return j()?S(A(ae(e).partition),`state`):S(e,E.state)}const N={debug:0,info:1,warn:2,error:3},P=[];let F=process.env.AIKIT_LOG_LEVEL??`info`,I=process.env.AIKIT_LOG_FILE_SINK===`true`||process.env.AIKIT_LOG_FILE_SINK!==`false`&&!process.env.VITEST&&process.env.NODE_ENV!==`test`;function L(){return I?process.env.VITEST||process.env.NODE_ENV===`test`?process.env.AIKIT_LOG_FILE_SINK===`true`:!0:!1}let R;function z(){return R||=S(process.cwd(),E.logs),R}function B(e){let t=e.toISOString().slice(0,10);return x(z(),`${t}.jsonl`)}let V=0;function H(){let e=Date.now();if(!(e-V<36e5)){V=e;try{let t=z(),n=new Date(e-30*864e5).toISOString().slice(0,10);for(let e of h(t))if(e.endsWith(`.jsonl`)&&e.slice(0,10)<n)try{v(x(t,e))}catch{}}catch{}}}function U(e,t){try{f(z(),{recursive:!0}),c(B(t),`${e}\n`),H()}catch{}}function W(e){function t(t,n,r){if(N[t]<N[F])return;let i=new Date,a={ts:i.toISOString(),level:t,component:e,msg:n,...r},o=JSON.stringify(a);console.error(o);for(let i of P)try{i({level:t,component:e,message:n,data:r})}catch{}L()&&(t===`warn`||t===`error`)&&U(o,i)}return{debug:(e,n)=>t(`debug`,e,n),info:(e,n)=>t(`info`,e,n),warn:(e,n)=>t(`warn`,e,n),error:(e,n)=>t(`error`,e,n)}}const G=W(`query-executor`),K=b(w(import.meta.url));function q(){let e=x(K,`..`,`queries`);if(d(e))return e;let t=x(K,`..`,`..`,`src`,`queries`);return d(t)?t:e}const J=q(),oe={".ts":`typescript`,".tsx":`typescript`,".mts":`typescript`,".cts":`typescript`,".js":`javascript`,".jsx":`javascript`,".mjs":`javascript`,".cjs":`javascript`,".py":`python`,".go":`go`,".rs":`rust`,".java":`java`};var Y=class{queryCache=new Map;scmCache=new Map;execute(e,t,n,r){let i=this.getOrCompile(t,n,r);return i?i.matches(e).map(e=>X(e)):[]}executeCaptures(e,t,n,r){let i=this.getOrCompile(t,n,r);return i?i.captures(e).map(e=>Z(e)):[]}executeRaw(e,t,n){return t.query(n).matches(e).map(e=>X(e))}getOrCompile(e,t,n){let r=oe[t];if(!r)return null;let i=`${r}:${n}`,a=this.queryCache.get(i);if(a)return a;let o=this.loadScm(r,n);if(!o)return null;try{let t=e.query(o);return this.queryCache.set(i,t),t}catch(e){throw G.warn(`Failed to compile query`,{langDir:r,queryType:n,error:String(e)}),Error(`Failed to compile ${r}/${n}.scm: ${String(e)}`)}}loadScm(e,t){let n=`${e}:${t}`,r=this.scmCache.get(n);if(r!==void 0)return r;let i=x(J,e,`${t}.scm`);try{let e=m(i,`utf-8`);return this.scmCache.set(n,e),e}catch{return G.info(`Query file not found (graceful skip)`,{langDir:e,queryType:t}),null}}dispose(){this.queryCache.clear(),this.scmCache.clear()}static resolveQueryDir(e){return x(J,e)}};function X(e){let t=new Map;for(let n of e.captures)t.set(n.name,Z(n));return{pattern:e.pattern,captures:t}}function Z(e){let{node:t}=e;return{name:e.name,text:t.text,nodeType:t.type,startLine:t.startPosition.row,endLine:t.endPosition.row,startColumn:t.startPosition.column,endColumn:t.endPosition.column,node:t}}new Y,new Y,new Y,new Y,new Y,new Set(`.ts,.tsx,.js,.jsx,.mjs,.cjs,.java,.kt,.kts,.scala,.py,.go,.rs,.rb,.php,.swift,.cs,.c,.cpp,.h,.hpp,.sh,.bash,.ps1,.sql,.graphql,.gql,.proto,.json,.yaml,.yml,.toml,.env,.ini,.cfg,.xml,.pom,.gradle,.tf,.hcl,.lock,.mjs`.split(`,`)),E.restorePoints,new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,E.state]),new Set([`.git`,E.data,E.state,`.turbo`,`.yarn`,`build`,`coverage`,`dist`,`node_modules`]),C(s),new Set(`if_statement.for_statement.for_in_statement.while_statement.do_statement.switch_case.catch_clause.ternary_expression.if_statement.for_statement.while_statement.except_clause.list_comprehension.if_statement.for_statement.enhanced_for_statement.while_statement.catch_clause.ternary_expression.if_statement.for_statement.select_statement.if_expression.for_expression.while_expression.match_arm`.split(`.`));function se(){return S(M(process.cwd()),`replay.jsonl`)}function ce(e={}){let t=se(),n;try{n=m(t,`utf-8`)}catch{return[]}let r=n.trim().split(`
3
- `).filter(Boolean),i=[];for(let e of r)try{i.push(JSON.parse(e))}catch{}if(e.tool&&(i=i.filter(t=>t.tool===e.tool)),e.source&&(i=i.filter(t=>t.source===e.source)),e.since){let t=e.since;i=i.filter(e=>e.ts>=t)}let a=e.last??20;return i.slice(-a)}C(o),E.data,`script,style,noscript,iframe,svg,nav,footer,header,aside,form,button,input,select,textarea,[role="navigation"],[role="banner"],[role="contentinfo"],[aria-hidden="true"],.sidebar,.nav,.menu,.footer,.header,.ad,.advertisement,.cookie-banner,.popup,.modal`.split(`,`);var Q=e(t()),$=i();function le(){let[e,t]=(0,Q.useState)([]);return(0,Q.useEffect)(()=>{let e=()=>{t(ce({last:30}))};e();let n=setInterval(e,2e3);return()=>clearInterval(n)},[]),(0,$.jsxs)(n,{flexDirection:`column`,borderStyle:`round`,paddingX:1,children:[(0,$.jsx)(r,{bold:!0,color:`cyan`,children:`Activity Log`}),(0,$.jsx)(r,{children:` `}),e.length===0&&(0,$.jsx)(r,{color:`gray`,children:`No activity recorded yet`}),e.slice().reverse().map((e,t)=>{let n=e.ts.split(`T`)[1]?.split(`.`)[0]??e.ts,i=e.status===`ok`?`green`:`red`;return(0,$.jsxs)(r,{children:[(0,$.jsx)(r,{color:`gray`,children:n}),` `,(0,$.jsx)(r,{color:i,children:e.status===`ok`?`✓`:`✗`}),` `,(0,$.jsx)(r,{bold:!0,children:e.tool}),` `,(0,$.jsxs)(r,{color:`gray`,children:[`(`,e.durationMs,`ms)`]})]},`${e.ts}-${t}`)}),(0,$.jsx)(r,{children:` `}),(0,$.jsx)(r,{color:`gray`,children:`Refreshes every 2s │ Showing last 30`})]})}export{le as t};
@@ -1,2 +0,0 @@
1
- import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
- import{createRequire as e}from"node:module";var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),c=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},l=(e,r,i)=>(i=e==null?{}:t(a(e)),c(r||!e||!e.__esModule?n(i,`default`,{value:e,enumerable:!0}):i,e)),u=e(import.meta.url);export{u as n,l as r,s as t};