@vpxa/kb 0.1.23 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/package.json +9 -2
- package/packages/analyzers/dist/symbol-analyzer.js +5 -5
- package/packages/cli/dist/commands/init/adapters.js +1 -1
- package/packages/cli/dist/commands/init/constants.d.ts +4 -1
- package/packages/cli/dist/commands/init/constants.js +1 -1
- package/packages/cli/dist/commands/init/frontmatter.d.ts +54 -0
- package/packages/cli/dist/commands/init/frontmatter.js +2 -0
- package/packages/cli/dist/commands/init/index.js +4 -4
- package/packages/cli/dist/commands/init/manifest.d.ts +71 -0
- package/packages/cli/dist/commands/init/manifest.js +1 -0
- package/packages/cli/dist/commands/init/scaffold.d.ts +28 -5
- package/packages/cli/dist/commands/init/scaffold.js +1 -1
- package/packages/cli/dist/commands/init/templates.js +38 -9
- package/packages/cli/dist/commands/init/user.d.ts +1 -1
- package/packages/cli/dist/commands/init/user.js +4 -4
- package/packages/cli/dist/commands/system.js +2 -2
- package/packages/cli/dist/kb-init.js +1 -1
- package/packages/core/dist/errors.d.ts +2 -2
- package/packages/core/dist/errors.js +1 -1
- package/packages/core/dist/logger.d.ts +2 -1
- package/packages/core/dist/logger.js +1 -1
- package/packages/core/dist/types.d.ts +6 -0
- package/packages/dashboard/dist/assets/index-9ysCkze9.js +21 -0
- package/packages/dashboard/dist/assets/index-9ysCkze9.js.map +1 -0
- package/packages/dashboard/dist/assets/index-CHpVij2M.css +1 -0
- package/packages/dashboard/dist/index.html +18 -0
- package/packages/elicitation/dist/__tests__/build.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/build.test.js +35 -0
- package/packages/elicitation/dist/__tests__/fields.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/fields.test.js +81 -0
- package/packages/elicitation/dist/__tests__/normalize.test.d.ts +1 -0
- package/packages/elicitation/dist/__tests__/normalize.test.js +60 -0
- package/packages/elicitation/dist/build.d.ts +13 -0
- package/packages/elicitation/dist/build.js +23 -0
- package/packages/elicitation/dist/fields.d.ts +41 -0
- package/packages/elicitation/dist/fields.js +62 -0
- package/packages/elicitation/dist/index.d.ts +10 -0
- package/packages/elicitation/dist/index.js +12 -0
- package/packages/elicitation/dist/normalize.d.ts +15 -0
- package/packages/elicitation/dist/normalize.js +31 -0
- package/packages/elicitation/dist/types.d.ts +85 -0
- package/packages/elicitation/dist/types.js +8 -0
- package/packages/kb-client/dist/direct-client.d.ts +37 -0
- package/packages/kb-client/dist/direct-client.js +1 -0
- package/packages/kb-client/dist/index.d.ts +5 -0
- package/packages/kb-client/dist/index.js +1 -0
- package/packages/kb-client/dist/mcp-client.d.ts +19 -0
- package/packages/kb-client/dist/mcp-client.js +4 -0
- package/packages/kb-client/dist/parsers.d.ts +35 -0
- package/packages/kb-client/dist/parsers.js +2 -0
- package/packages/kb-client/dist/types.d.ts +62 -0
- package/packages/kb-client/dist/types.js +1 -0
- package/packages/present/dist/index.html +384 -0
- package/packages/server/dist/completions.d.ts +14 -0
- package/packages/server/dist/completions.js +1 -0
- package/packages/server/dist/config.js +1 -1
- package/packages/server/dist/dashboard-static.d.ts +27 -0
- package/packages/server/dist/dashboard-static.js +1 -0
- package/packages/server/dist/elicitor.d.ts +18 -0
- package/packages/server/dist/elicitor.js +1 -0
- package/packages/server/dist/index.js +1 -1
- package/packages/server/dist/mcp-logging.js +1 -1
- package/packages/server/dist/output-schemas.d.ts +118 -1
- package/packages/server/dist/output-schemas.js +1 -1
- package/packages/server/dist/prompts.d.ts +9 -2
- package/packages/server/dist/prompts.js +13 -6
- package/packages/server/dist/resources/curated-resources.js +1 -1
- package/packages/server/dist/resources/resource-notifier.d.ts +45 -0
- package/packages/server/dist/resources/resource-notifier.js +1 -0
- package/packages/server/dist/sampling.d.ts +41 -0
- package/packages/server/dist/sampling.js +2 -0
- package/packages/server/dist/server.d.ts +5 -2
- package/packages/server/dist/server.js +3 -1
- package/packages/server/dist/task-manager.d.ts +40 -0
- package/packages/server/dist/task-manager.js +1 -0
- package/packages/server/dist/tool-metadata.js +1 -1
- package/packages/server/dist/tool-prefix.d.ts +12 -0
- package/packages/server/dist/tool-prefix.js +1 -0
- package/packages/server/dist/tools/analyze.tools.js +4 -4
- package/packages/server/dist/tools/audit.tool.js +1 -1
- package/packages/server/dist/tools/brainstorm.tool.d.ts +7 -0
- package/packages/server/dist/tools/brainstorm.tool.js +9 -0
- package/packages/server/dist/tools/bridge.tools.js +1 -1
- package/packages/server/dist/tools/context.tools.js +9 -9
- package/packages/server/dist/tools/execution.tools.d.ts +2 -1
- package/packages/server/dist/tools/execution.tools.js +4 -3
- package/packages/server/dist/tools/forge.tools.js +10 -10
- package/packages/server/dist/tools/forget.tool.d.ts +2 -1
- package/packages/server/dist/tools/forget.tool.js +1 -1
- package/packages/server/dist/tools/graph.tool.js +2 -2
- package/packages/server/dist/tools/infra.tools.js +2 -2
- package/packages/server/dist/tools/list.tool.js +2 -2
- package/packages/server/dist/tools/lookup.tool.js +1 -1
- package/packages/server/dist/tools/manipulation.tools.js +4 -4
- package/packages/server/dist/tools/onboard.tool.js +2 -2
- package/packages/server/dist/tools/persistence.tools.js +4 -4
- package/packages/server/dist/tools/policy.tools.js +3 -2
- package/packages/server/dist/tools/present-blocks.d.ts +46 -0
- package/packages/server/dist/tools/present-blocks.js +27 -0
- package/packages/server/dist/tools/present-charts.d.ts +31 -0
- package/packages/server/dist/tools/present-charts.js +34 -0
- package/packages/server/dist/tools/present-theme.d.ts +14 -0
- package/packages/server/dist/tools/present-theme.js +395 -0
- package/packages/server/dist/tools/present-utils.d.ts +11 -0
- package/packages/server/dist/tools/present-utils.js +1 -0
- package/packages/server/dist/tools/present.tool.d.ts +7 -0
- package/packages/server/dist/tools/present.tool.js +113 -0
- package/packages/server/dist/tools/produce.tool.js +2 -2
- package/packages/server/dist/tools/read.tool.js +1 -1
- package/packages/server/dist/tools/reindex.tool.d.ts +2 -1
- package/packages/server/dist/tools/reindex.tool.js +2 -2
- package/packages/server/dist/tools/remember.tool.d.ts +2 -1
- package/packages/server/dist/tools/remember.tool.js +2 -2
- package/packages/server/dist/tools/replay.tool.js +2 -2
- package/packages/server/dist/tools/search.tool.d.ts +2 -1
- package/packages/server/dist/tools/search.tool.js +5 -4
- package/packages/server/dist/tools/status.tool.js +2 -2
- package/packages/server/dist/tools/update.tool.d.ts +2 -1
- package/packages/server/dist/tools/update.tool.js +1 -1
- package/packages/server/dist/tools/utility.tools.js +8 -8
- package/packages/store/dist/lance-store.d.ts +1 -0
- package/packages/store/dist/lance-store.js +1 -1
- package/packages/tools/dist/audit.js +1 -1
- package/packages/tools/dist/batch.js +1 -1
- package/packages/tools/dist/check.js +1 -1
- package/packages/tools/dist/checkpoint.js +1 -1
- package/packages/tools/dist/compact.js +2 -2
- package/packages/tools/dist/config-extractor.d.ts +9 -0
- package/packages/tools/dist/config-extractor.js +7 -0
- package/packages/tools/dist/dead-symbols.js +2 -2
- package/packages/tools/dist/diagram-builder.d.ts +9 -0
- package/packages/tools/dist/diagram-builder.js +9 -0
- package/packages/tools/dist/eval.js +2 -2
- package/packages/tools/dist/evidence-map.d.ts +12 -1
- package/packages/tools/dist/evidence-map.js +2 -2
- package/packages/tools/dist/file-summary.js +2 -2
- package/packages/tools/dist/find-examples.js +2 -2
- package/packages/tools/dist/forge-classify.d.ts +4 -0
- package/packages/tools/dist/forge-classify.js +1 -1
- package/packages/tools/dist/git-context.d.ts +1 -0
- package/packages/tools/dist/git-context.js +3 -3
- package/packages/tools/dist/index.d.ts +3 -2
- package/packages/tools/dist/index.js +1 -1
- package/packages/tools/dist/onboard-utils.d.ts +12 -0
- package/packages/tools/dist/onboard-utils.js +1 -0
- package/packages/tools/dist/onboard.js +2 -21
- package/packages/tools/dist/queue.js +1 -1
- package/packages/tools/dist/regex-utils.d.ts +8 -0
- package/packages/tools/dist/regex-utils.js +1 -0
- package/packages/tools/dist/rename.js +2 -2
- package/packages/tools/dist/replay.d.ts +2 -1
- package/packages/tools/dist/replay.js +4 -4
- package/packages/tools/dist/symbol.js +3 -3
- package/packages/tools/dist/synthesis-engine.d.ts +13 -0
- package/packages/tools/dist/synthesis-engine.js +6 -0
- package/packages/tools/dist/test-run.d.ts +3 -1
- package/packages/tools/dist/test-run.js +1 -1
- package/packages/tools/dist/trace.js +2 -2
- package/packages/tui/dist/App-DXY0-tlW.js +2 -0
- package/packages/tui/dist/App.d.ts +3 -3
- package/packages/tui/dist/App.js +1 -1
- package/packages/tui/dist/CuratedPanel-BIamXLNy.js +2 -0
- package/packages/tui/dist/LogPanel-D6u6o84n.js +3 -0
- package/packages/tui/dist/SearchPanel-CpJGczAc.js +2 -0
- package/packages/tui/dist/StatusPanel-BAbUxyqQ.js +2 -0
- package/packages/tui/dist/hooks/useKBClient.d.ts +9 -0
- package/packages/tui/dist/hooks/useKBClient.js +2 -0
- package/packages/tui/dist/hooks/usePolling.d.ts +8 -0
- package/packages/tui/dist/hooks/usePolling.js +2 -0
- package/packages/tui/dist/index.d.ts +6 -2
- package/packages/tui/dist/index.js +1 -1
- package/packages/tui/dist/jsx-runtime-y6Gdq5PZ.js +294 -0
- package/packages/tui/dist/panels/CuratedPanel.d.ts +1 -7
- package/packages/tui/dist/panels/CuratedPanel.js +1 -1
- package/packages/tui/dist/panels/LogPanel.js +1 -1
- package/packages/tui/dist/panels/SearchPanel.d.ts +1 -10
- package/packages/tui/dist/panels/SearchPanel.js +1 -1
- package/packages/tui/dist/panels/StatusPanel.d.ts +1 -7
- package/packages/tui/dist/panels/StatusPanel.js +1 -1
- package/packages/tui/dist/react-D__J1GQe.js +24 -0
- package/packages/tui/dist/types-VcTHNV6s.d.ts +64 -0
- package/packages/tui/dist/useKBClient-C35iA4uG.js +2 -0
- package/packages/tui/dist/usePolling-BbjnRWgx.js +2 -0
- package/scaffold/adapters/copilot.mjs +9 -81
- package/scaffold/definitions/agents.mjs +12 -0
- package/scaffold/definitions/bodies.mjs +39 -14
- package/scaffold/definitions/protocols.mjs +149 -0
- package/scaffold/definitions/tools.mjs +40 -5
- package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +1 -1
- package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +1 -1
- package/scaffold/general/agents/Debugger.agent.md +2 -2
- package/scaffold/general/agents/Documenter.agent.md +2 -2
- package/scaffold/general/agents/Explorer.agent.md +4 -3
- package/scaffold/general/agents/Frontend.agent.md +1 -1
- package/scaffold/general/agents/Implementer.agent.md +1 -1
- package/scaffold/general/agents/Orchestrator.agent.md +16 -1
- package/scaffold/general/agents/Planner.agent.md +11 -4
- package/scaffold/general/agents/Refactor.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Alpha.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Beta.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Delta.agent.md +1 -1
- package/scaffold/general/agents/Researcher-Gamma.agent.md +1 -1
- package/scaffold/general/agents/Security.agent.md +10 -8
- package/scaffold/general/agents/_shared/architect-reviewer-base.md +1 -0
- package/scaffold/general/agents/_shared/code-agent-base.md +28 -0
- package/scaffold/general/agents/_shared/code-reviewer-base.md +1 -0
- package/scaffold/general/agents/_shared/forge-protocol.md +44 -0
- package/scaffold/general/agents/_shared/researcher-base.md +14 -0
- package/scaffold/general/agents/templates/adr-template.md +1 -0
- package/scaffold/general/agents/templates/execution-state.md +1 -0
- package/skills/knowledge-base/SKILL.md +19 -6
- package/skills/present/SKILL.md +153 -0
- package/packages/server/dist/tools/toolkit.tools.d.ts +0 -36
- package/packages/server/dist/tools/toolkit.tools.js +0 -20
- package/packages/tui/dist/App-DE_tdOhs.js +0 -2
- package/packages/tui/dist/CuratedPanel-sYdZAICX.js +0 -2
- package/packages/tui/dist/LogPanel-Ce3jMQbH.js +0 -3
- package/packages/tui/dist/SearchPanel-DREo6zgt.js +0 -2
- package/packages/tui/dist/StatusPanel-2ex8fLOO.js +0 -2
- package/packages/tui/dist/embedder.interface-IFCBpOlX.d.ts +0 -28
- package/packages/tui/dist/index-C8NmOF18.d.ts +0 -13
- package/packages/tui/dist/jsx-runtime-Cof-kwFn.js +0 -316
- package/packages/tui/dist/store.interface-CnY6SPOH.d.ts +0 -150
- /package/packages/tui/dist/{devtools-DUyj952l.js → devtools-DMOZMn70.js} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{fileSummary as e}from"./file-summary.js";import{dirname as t,extname as n,relative as r,resolve as i}from"node:path";import{existsSync as a,readFileSync as o,readdirSync as s,statSync as c}from"node:fs";import{KB_PATHS as l}from"../../core/dist/index.js";const u=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.mts`,`.cts`,`.mjs`,`.cjs`]),d=new Set([`.git`,l.data,l.state,`.turbo`,`.yarn`,`build`,`coverage`,`dist`,`node_modules`]),f=/auth|token|permission|acl|encrypt|secret|credential|jwt|oauth|password/i,p=/\b(hash|sign|verify|bcrypt|jwt|decrypt|secret|password)\b/i,m=/auth|security|permission|encrypt|secret|credential/i,h=/types\.ts$|schema\.ts$|contract\.ts$|\.proto$|openapi|swagger|\.graphql$/i,g=/(?:^|\/)(events|contracts|shared)(?:\/|$)/i,_=/export\s+interface\b|export\s+type\b|export\s+const\s+\w*Schema\w*\s*=\s*z\./i,v=/schema|contract|migration|breaking.change|api.change/i,y=/migration|data.?model|multi.?service|breaking|backward.?compat/i,b={floor:{ground:`Parasitic — read target file only`,build:`Implement directly`,break:`Skip`,evidenceMap:`Not required`,gate:`Self-certify`},standard:{ground:`Scope map + blast radius + constraint seed`,build:`TDD — test first, then implement`,break:`Error paths + edge cases`,evidenceMap:`3-8 critical-path entries`,gate:`YIELD/HOLD evaluation`},critical:{ground:`Full scope map + blast radius + trace + patterns + constraint pack`,build:`TDD + contract verification + cross-service validation`,break:`Error paths + edge cases + security dimensions + data-flow verification`,evidenceMap:`Comprehensive — all critical-path claims with receipts`,gate:`Strict YIELD/HOLD/HARD_BLOCK evaluation`}};async function x(e){let t=i(e.rootPath),n=e.task.trim(),r=e.files.map(e=>i(t,e)),a=[],o=!1,s=!1;for(let e of r){let r=C(e,t),i=T(e);(f.test(r)||p.test(i)||m.test(n))&&(o=!0),(h.test(r)||g.test(r)||v.test(n)||_.test(i)||await E(e))&&(s=!0)}o&&S(a,{rule:`security-path`,detail:`Security/auth path, task, or content matched security heuristics`,source:`security_auth`}),s&&S(a,{rule:`schema-contract`,detail:`Schema or contract path, task, or export shape matched contract heuristics`,source:`schema_contract`});let c=D(r,t);c.affectedFiles>5&&S(a,{rule:`blast-radius-importers`,detail:`${c.affectedFiles} affected files via direct import scanning`,source:`blast_radius`});let l=[...new Set(r.map(e=>M(e,t)).filter(e=>!!e))].sort();l.length>=2&&S(a,{rule:`cross-package-boundary`,detail:`Files span ${l.length} packages: ${l.join(`, `)}`,source:`cross_package`}),y.test(n)&&S(a,{rule:`task-hint-critical`,detail:`Task description matched migration or compatibility criticality hints`,source:`task_hint`});let u=a.length>0?`critical`:r.length===1?`floor`:`standard`;return{tier:u,triggers:a,packagesCrossed:l,hasSchemaChange:s,hasSecurityPath:o,typedUnknownSeeds:
|
|
1
|
+
import{fileSummary as e}from"./file-summary.js";import{dirname as t,extname as n,relative as r,resolve as i}from"node:path";import{existsSync as a,readFileSync as o,readdirSync as s,statSync as c}from"node:fs";import{KB_PATHS as l}from"../../core/dist/index.js";const u=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.mts`,`.cts`,`.mjs`,`.cjs`]),d=new Set([`.git`,l.data,l.state,`.turbo`,`.yarn`,`build`,`coverage`,`dist`,`node_modules`]),f=/auth|token|permission|acl|encrypt|secret|credential|jwt|oauth|password/i,p=/\b(hash|sign|verify|bcrypt|jwt|decrypt|secret|password)\b/i,m=/auth|security|permission|encrypt|secret|credential/i,h=/types\.ts$|schema\.ts$|contract\.ts$|\.proto$|openapi|swagger|\.graphql$/i,g=/(?:^|\/)(events|contracts|shared)(?:\/|$)/i,_=/export\s+interface\b|export\s+type\b|export\s+const\s+\w*Schema\w*\s*=\s*z\./i,v=/schema|contract|migration|breaking.change|api.change/i,y=/migration|data.?model|multi.?service|breaking|backward.?compat/i,b={floor:{ground:`Parasitic — read target file only`,build:`Implement directly`,break:`Skip`,evidenceMap:`Not required`,gate:`Self-certify`},standard:{ground:`Scope map + blast radius + constraint seed`,build:`TDD — test first, then implement`,break:`Error paths + edge cases`,evidenceMap:`3-8 critical-path entries`,gate:`YIELD/HOLD evaluation`},critical:{ground:`Full scope map + blast radius + trace + patterns + constraint pack`,build:`TDD + contract verification + cross-service validation`,break:`Error paths + edge cases + security dimensions + data-flow verification`,evidenceMap:`Comprehensive — all critical-path claims with receipts`,gate:`Strict YIELD/HOLD/HARD_BLOCK evaluation`}};async function x(e){let t=i(e.rootPath),n=e.task.trim(),r=e.files.map(e=>i(t,e)),a=[],o=!1,s=!1;for(let e of r){let r=C(e,t),i=T(e);(f.test(r)||p.test(i)||m.test(n))&&(o=!0),(h.test(r)||g.test(r)||v.test(n)||_.test(i)||await E(e))&&(s=!0)}o&&S(a,{rule:`security-path`,detail:`Security/auth path, task, or content matched security heuristics`,source:`security_auth`}),s&&S(a,{rule:`schema-contract`,detail:`Schema or contract path, task, or export shape matched contract heuristics`,source:`schema_contract`});let c=D(r,t);c.affectedFiles>5&&S(a,{rule:`blast-radius-importers`,detail:`${c.affectedFiles} affected files via direct import scanning`,source:`blast_radius`});let l=[...new Set(r.map(e=>M(e,t)).filter(e=>!!e))].sort();l.length>=2&&S(a,{rule:`cross-package-boundary`,detail:`Files span ${l.length} packages: ${l.join(`, `)}`,source:`cross_package`}),y.test(n)&&S(a,{rule:`task-hint-critical`,detail:`Task description matched migration or compatibility criticality hints`,source:`task_hint`});let u=a.length>0?`critical`:r.length===1?`floor`:`standard`;u===`floor`&&(o||s)&&(u=`standard`);let d=j(a),x=u===`floor`&&d.some(e=>e.type===`contract`)?{suggestedTier:`standard`,reason:`Contract-type unknowns detected — Floor may be insufficient`}:void 0;return{tier:u,triggers:a,packagesCrossed:l,hasSchemaChange:s,hasSecurityPath:o,typedUnknownSeeds:d,ceremony:b[u],reclassifyHint:x}}function S(e,t){e.some(e=>e.rule===t.rule&&e.source===t.source)||e.push(t)}function C(e,t){let n=i(t,e),a=r(t,n);return(a&&!a.startsWith(`..`)?a:n).replace(/\\/g,`/`)}function w(e){if(!a(e))return!1;try{return c(e).size<=1e5}catch{return!1}}function T(e){if(!w(e))return``;try{return o(e,`utf-8`).split(/\r?\n/).slice(0,200).join(`
|
|
2
2
|
`)}catch{return``}}async function E(t){if(!w(t))return!1;try{let n=await e({path:t}),r=new Set(n.exports);return n.interfaces.some(e=>r.has(e.name))||n.types.some(e=>r.has(e.name))}catch{return!1}}function D(e,t){let n=new Set(e.filter(e=>a(e)));if(n.size===0)return{affectedFiles:e.length,importers:[]};let i=new Set;for(let e of O(t)){if(n.has(e)||!w(e))continue;let t=T(e);t&&k(t).some(t=>A(t,e,n))&&i.add(e)}return{affectedFiles:e.length+i.size,importers:[...i].map(e=>r(t,e).replace(/\\/g,`/`))}}function O(e){let t=[];function r(e){let a=[];try{a=s(e)}catch{return}for(let o of a){if(d.has(o))continue;let a=i(e,o),s;try{s=c(a)}catch{continue}if(s.isDirectory()){r(a);continue}u.has(n(o).toLowerCase())&&t.push(a)}}return r(e),t}function k(e){let t=new Set;for(let n of e.matchAll(/(?:from\s+['"]([^'"]+)['"]|import\s+['"]([^'"]+)['"]|require\(\s*['"]([^'"]+)['"]\s*\))/g)){let e=n[1]??n[2]??n[3];e&&t.add(e)}return[...t]}function A(e,n,r){if(!e.startsWith(`.`))return!1;let a=i(t(n),e);return[a,`${a}.ts`,`${a}.tsx`,`${a}.js`,`${a}.jsx`,`${a}.mts`,`${a}.cts`,`${a}.mjs`,`${a}.cjs`,i(a,`index.ts`),i(a,`index.tsx`),i(a,`index.js`),i(a,`index.jsx`)].some(e=>r.has(e))}function j(e){return e.map(e=>{switch(e.source){case`security_auth`:return{description:`Verify auth and security assumptions before yielding`,type:`contract`,suggestedTool:`kb_search`};case`schema_contract`:return{description:`Confirm schema and contract compatibility`,type:`contract`,suggestedTool:`kb_schema_validate`};case`blast_radius`:return{description:`Inspect affected importers before delivery`,type:`impact`,suggestedTool:`kb_blast_radius`};case`cross_package`:return{description:`Assess downstream package impact across boundaries`,type:`impact`,suggestedTool:`kb_blast_radius`};case`task_hint`:return{description:`Check established conventions for migrations or compatibility work`,type:`convention`,suggestedTool:`kb_find`};default:return{description:`No explicit unknown routing required`,type:`freshness`,suggestedTool:`kb_lookup`}}})}function M(e,n){let s=t(i(n,e)),c=i(n);for(;s.length>=c.length;){let e=i(s,`package.json`);if(a(e))try{return JSON.parse(o(e,`utf-8`)).name??r(c,s).replace(/\\/g,`/`)}catch{return r(c,s).replace(/\\/g,`/`)}let n=t(s);if(n===s)break;s=n}}export{x as forgeClassify};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{execFile as e}from"node:child_process";import{promisify as t}from"node:util";const n=t(e);async function r(e,t){try{let{stdout:r}=await n(`git`,e,{cwd:t,timeout:15e3});return r.toString().trim()}catch{return``}}async function i(e={}){let t=e.cwd??process.cwd(),n=e.commitCount??5,[i,a,o,s]=await Promise.all([r([`rev-parse`,`--abbrev-ref`,`HEAD`],
|
|
2
|
-
`).filter(Boolean)){let t=e[0],n=e[1],r=e.slice(3).trim();t!==` `&&t!==`?`&&
|
|
3
|
-
`).filter(Boolean).map(e=>{let[t,n,r,i]=e.split(`|`);return{hash:t,message:n,author:r,date:i}});return{branch:
|
|
1
|
+
import{execFile as e}from"node:child_process";import{promisify as t}from"node:util";const n=t(e);async function r(e,t){try{let{stdout:r}=await n(`git`,e,{cwd:t,timeout:15e3});return r.toString().trim()}catch{return``}}async function i(e={}){let t=e.cwd??process.cwd(),n=e.commitCount??5,i=await r([`rev-parse`,`--show-toplevel`],t);if(!i)return{gitRoot:t,branch:`unknown`,status:{staged:[],modified:[],untracked:[]},recentCommits:[]};let a=i,[o,s,c,l]=await Promise.all([r([`rev-parse`,`--abbrev-ref`,`HEAD`],a),r([`status`,`--porcelain`],a),r([`log`,`--max-count=${n}`,`--format=%h|%s|%an|%ai`],a),e.includeDiff?r([`diff`,`--stat`,`--no-color`],a):Promise.resolve(``)]),u=[],d=[],f=[];for(let e of s.split(`
|
|
2
|
+
`).filter(Boolean)){let t=e[0],n=e[1],r=e.slice(3).trim();t!==` `&&t!==`?`&&u.push(r),(n===`M`||n===`D`)&&d.push(r),t===`?`&&f.push(r)}let p=c.split(`
|
|
3
|
+
`).filter(Boolean).map(e=>{let[t,n,r,i]=e.split(`|`);return{hash:t,message:n,author:r,date:i}});return{gitRoot:i,branch:o||`unknown`,status:{staged:u,modified:d,untracked:f},recentCommits:p,diff:l||void 0}}export{i as gitContext};
|
|
@@ -17,7 +17,7 @@ import { DogfoodLogEntry, DogfoodLogGroupedEntry, DogfoodLogOptions, DogfoodLogR
|
|
|
17
17
|
import { EncodeOperation, EncodeOptions, EncodeResult, encode } from "./encode.js";
|
|
18
18
|
import { EnvInfoOptions, EnvInfoResult, envInfo } from "./env-info.js";
|
|
19
19
|
import { EvalOptions, EvalResult, evaluate } from "./eval.js";
|
|
20
|
-
import { EvidenceEntry, EvidenceMapAction, EvidenceMapResult, EvidenceMapState, EvidenceStatus, ForgeTier, GateDecision, GateResult, UnknownType, evidenceMap } from "./evidence-map.js";
|
|
20
|
+
import { EvidenceEntry, EvidenceMapAction, EvidenceMapResult, EvidenceMapState, EvidenceStatus, ForgeTier, GateDecision, GateResult, SafetyGate, SafetyGateResult, UnknownType, autoClaimTestFailures, evidenceMap } from "./evidence-map.js";
|
|
21
21
|
import { FileSummaryOptions, FileSummaryResult, fileSummary } from "./file-summary.js";
|
|
22
22
|
import { Example, FindExamplesOptions, FindExamplesResult, findExamples } from "./find-examples.js";
|
|
23
23
|
import { FindOptions, FindResult, FindResults, find } from "./find.js";
|
|
@@ -36,6 +36,7 @@ import { resolvePath } from "./path-resolver.js";
|
|
|
36
36
|
import { ManagedProcess, processList, processLogs, processStart, processStatus, processStop } from "./process-manager.js";
|
|
37
37
|
import { QueueItem, QueueState, queueClear, queueCreate, queueDelete, queueDone, queueFail, queueGet, queueList, queueNext, queuePush } from "./queue.js";
|
|
38
38
|
import { RegexTestOptions, RegexTestResult, regexTest } from "./regex-test.js";
|
|
39
|
+
import { escapeRegExp } from "./regex-utils.js";
|
|
39
40
|
import { RenameChange, RenameOptions, RenameResult, rename } from "./rename.js";
|
|
40
41
|
import { ReplayEntry, ReplayOptions, replayAppend, replayCapture, replayClear, replayList, replayTrim } from "./replay.js";
|
|
41
42
|
import { RestorePoint, createRestorePoint, listRestorePoints, restoreFromPoint } from "./restore-points.js";
|
|
@@ -53,4 +54,4 @@ import { WatchEvent, WatchHandle, WatchOptions, watchList, watchStart, watchStop
|
|
|
53
54
|
import { WebFetchMode, WebFetchOptions, WebFetchResult, webFetch } from "./web-fetch.js";
|
|
54
55
|
import { WebSearchOptions, WebSearchResult, WebSearchResultItem, parseSearchResults, webSearch } from "./web-search.js";
|
|
55
56
|
import { Workset, addToWorkset, deleteWorkset, getWorkset, listWorksets, removeFromWorkset, saveWorkset } from "./workset.js";
|
|
56
|
-
export { type AuditCheck, type AuditData, type AuditOptions, type AuditRecommendation, type BatchOperation, type BatchOptions, type BatchResult, type ChangelogEntry, type ChangelogFormat, type ChangelogOptions, type ChangelogResult, type CheckOptions, type CheckResult, type CheckSummaryResult, type Checkpoint, type ClassifyTrigger, type CodemodChange, type CodemodOptions, type CodemodResult, type CodemodRule, type CompactOptions, type CompactResult, type ConstraintRef, type DeadSymbol, type DeadSymbolOptions, type DeadSymbolResult, type DelegateOptions, type DelegateResult, type DiffChange, type DiffFile, type DiffHunk, type DiffParseOptions, type DigestFieldEntry, type DigestOptions, type DigestResult, type DigestSource, type DogfoodLogEntry, type DogfoodLogGroupedEntry, type DogfoodLogOptions, type DogfoodLogResult, type EncodeOperation, type EncodeOptions, type EncodeResult, type EnvInfoOptions, type EnvInfoResult, type EvalOptions, type EvalResult, type EvidenceEntry, type EvidenceMapAction, type EvidenceMapResult, type EvidenceMapState, type EvidenceStatus, type Example, FileCache, type FileCacheEntry, type FileCacheStats, type FileMetrics, type FileSummaryOptions, type FileSummaryResult, type FindExamplesOptions, type FindExamplesResult, type FindOptions, type FindResult, type FindResults, type ForgeClassifyCeremony, type ForgeClassifyOptions, type ForgeClassifyResult, type ForgeGroundOptions, type ForgeGroundResult, type ForgeTier, type GateDecision, type GateResult, type GitContextOptions, type GitContextResult, type GraphAugmentOptions, type GraphAugmentedResult, type GraphQueryOptions, type GraphQueryResult, type GuideRecommendation, type GuideResult, type HealthCheck, type HealthResult, type HttpMethod, type HttpRequestOptions, type HttpRequestResult, type KBError, type KBErrorCode, type KBNextHint, type KBResponse, type KBResponseMeta, type LaneDiffEntry, type LaneDiffResult, type LaneMergeResult, type LaneMeta, type ManagedProcess, type MeasureOptions, type MeasureResult, type OnboardMode, type OnboardOptions, type OnboardResult, type OnboardStepResult, type ParsedError, type ParsedGitStatus, type ParsedOutput, type ParsedTestResult, type ParsedTestSummary, type QueueItem, type QueueState, type RegexTestOptions, type RegexTestResult, type RenameChange, type RenameOptions, type RenameResult, type ReplayEntry, type ReplayOptions, type RestorePoint, type SchemaValidateOptions, type SchemaValidateResult, type ScopeMapEntry, type ScopeMapOptions, type ScopeMapResult, type Snippet, type SnippetAction, type SnippetOptions, type SnippetResult, type StashEntry, type StratumCard, type StratumCardOptions, type StratumCardResult, type SymbolGraphContext, type SymbolInfo, type SymbolOptions, type TestRunOptions, type TestRunResult, type TimeOptions, type TimeResult, type TraceNode, type TraceOptions, type TraceResult, type TransformOptions, type TransformResult, type TypedUnknownSeed, type UnknownType, type ValidationError, type WatchEvent, type WatchHandle, type WatchOptions, type WebFetchMode, type WebFetchOptions, type WebFetchResult, type WebSearchOptions, type WebSearchResult, type WebSearchResultItem, type Workset, addToWorkset, analyzeFile, audit, batch, changelog, check, checkpointLatest, checkpointList, checkpointLoad, checkpointSave, classifyExitCode, codemod, compact, cosineSimilarity, createRestorePoint, dataTransform, delegate, delegateListModels, deleteWorkset, diffParse, digest, dogfoodLog, encode, envInfo, errorResponse, estimateTokens, evaluate, evidenceMap, fileSummary, find, findDeadSymbols, findExamples, forgeClassify, forgeGround, formatChangelog, getWorkset, gitContext, graphAugmentSearch, graphQuery, guide, headTailTruncate, health, httpRequest, laneCreate, laneDiff, laneDiscard, laneList, laneMerge, laneStatus, listRestorePoints, listWorksets, measure, okResponse, onboard, paragraphTruncate, parseBiome, parseGitStatus, parseOutput, parseSearchResults, parseTsc, parseVitest, processList, processLogs, processStart, processStatus, processStop, queueClear, queueCreate, queueDelete, queueDone, queueFail, queueGet, queueList, queueNext, queuePush, regexTest, removeFromWorkset, rename, replayAppend, replayCapture, replayClear, replayList, replayTrim, resolvePath, restoreFromPoint, saveWorkset, schemaValidate, scopeMap, segment, snippet, stashClear, stashDelete, stashGet, stashList, stashSet, stratumCard, summarizeCheckResult, symbol, testRun, timeUtils, trace, truncateToTokenBudget, watchList, watchStart, watchStop, webFetch, webSearch };
|
|
57
|
+
export { type AuditCheck, type AuditData, type AuditOptions, type AuditRecommendation, type BatchOperation, type BatchOptions, type BatchResult, type ChangelogEntry, type ChangelogFormat, type ChangelogOptions, type ChangelogResult, type CheckOptions, type CheckResult, type CheckSummaryResult, type Checkpoint, type ClassifyTrigger, type CodemodChange, type CodemodOptions, type CodemodResult, type CodemodRule, type CompactOptions, type CompactResult, type ConstraintRef, type DeadSymbol, type DeadSymbolOptions, type DeadSymbolResult, type DelegateOptions, type DelegateResult, type DiffChange, type DiffFile, type DiffHunk, type DiffParseOptions, type DigestFieldEntry, type DigestOptions, type DigestResult, type DigestSource, type DogfoodLogEntry, type DogfoodLogGroupedEntry, type DogfoodLogOptions, type DogfoodLogResult, type EncodeOperation, type EncodeOptions, type EncodeResult, type EnvInfoOptions, type EnvInfoResult, type EvalOptions, type EvalResult, type EvidenceEntry, type EvidenceMapAction, type EvidenceMapResult, type EvidenceMapState, type EvidenceStatus, type Example, FileCache, type FileCacheEntry, type FileCacheStats, type FileMetrics, type FileSummaryOptions, type FileSummaryResult, type FindExamplesOptions, type FindExamplesResult, type FindOptions, type FindResult, type FindResults, type ForgeClassifyCeremony, type ForgeClassifyOptions, type ForgeClassifyResult, type ForgeGroundOptions, type ForgeGroundResult, type ForgeTier, type GateDecision, type GateResult, type GitContextOptions, type GitContextResult, type GraphAugmentOptions, type GraphAugmentedResult, type GraphQueryOptions, type GraphQueryResult, type GuideRecommendation, type GuideResult, type HealthCheck, type HealthResult, type HttpMethod, type HttpRequestOptions, type HttpRequestResult, type KBError, type KBErrorCode, type KBNextHint, type KBResponse, type KBResponseMeta, type LaneDiffEntry, type LaneDiffResult, type LaneMergeResult, type LaneMeta, type ManagedProcess, type MeasureOptions, type MeasureResult, type OnboardMode, type OnboardOptions, type OnboardResult, type OnboardStepResult, type ParsedError, type ParsedGitStatus, type ParsedOutput, type ParsedTestResult, type ParsedTestSummary, type QueueItem, type QueueState, type RegexTestOptions, type RegexTestResult, type RenameChange, type RenameOptions, type RenameResult, type ReplayEntry, type ReplayOptions, type RestorePoint, type SafetyGate, type SafetyGateResult, type SchemaValidateOptions, type SchemaValidateResult, type ScopeMapEntry, type ScopeMapOptions, type ScopeMapResult, type Snippet, type SnippetAction, type SnippetOptions, type SnippetResult, type StashEntry, type StratumCard, type StratumCardOptions, type StratumCardResult, type SymbolGraphContext, type SymbolInfo, type SymbolOptions, type TestRunOptions, type TestRunResult, type TimeOptions, type TimeResult, type TraceNode, type TraceOptions, type TraceResult, type TransformOptions, type TransformResult, type TypedUnknownSeed, type UnknownType, type ValidationError, type WatchEvent, type WatchHandle, type WatchOptions, type WebFetchMode, type WebFetchOptions, type WebFetchResult, type WebSearchOptions, type WebSearchResult, type WebSearchResultItem, type Workset, addToWorkset, analyzeFile, audit, autoClaimTestFailures, batch, changelog, check, checkpointLatest, checkpointList, checkpointLoad, checkpointSave, classifyExitCode, codemod, compact, cosineSimilarity, createRestorePoint, dataTransform, delegate, delegateListModels, deleteWorkset, diffParse, digest, dogfoodLog, encode, envInfo, errorResponse, escapeRegExp, estimateTokens, evaluate, evidenceMap, fileSummary, find, findDeadSymbols, findExamples, forgeClassify, forgeGround, formatChangelog, getWorkset, gitContext, graphAugmentSearch, graphQuery, guide, headTailTruncate, health, httpRequest, laneCreate, laneDiff, laneDiscard, laneList, laneMerge, laneStatus, listRestorePoints, listWorksets, measure, okResponse, onboard, paragraphTruncate, parseBiome, parseGitStatus, parseOutput, parseSearchResults, parseTsc, parseVitest, processList, processLogs, processStart, processStatus, processStop, queueClear, queueCreate, queueDelete, queueDone, queueFail, queueGet, queueList, queueNext, queuePush, regexTest, removeFromWorkset, rename, replayAppend, replayCapture, replayClear, replayList, replayTrim, resolvePath, restoreFromPoint, saveWorkset, schemaValidate, scopeMap, segment, snippet, stashClear, stashDelete, stashGet, stashList, stashSet, stratumCard, summarizeCheckResult, symbol, testRun, timeUtils, trace, truncateToTokenBudget, watchList, watchStart, watchStop, webFetch, webSearch };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{parseBiome as e,parseGitStatus as t,parseOutput as n,parseTsc as r,parseVitest as i}from"./parse-output.js";import{check as a,summarizeCheckResult as o}from"./check.js";import{
|
|
1
|
+
import{parseBiome as e,parseGitStatus as t,parseOutput as n,parseTsc as r,parseVitest as i}from"./parse-output.js";import{check as a,summarizeCheckResult as o}from"./check.js";import{escapeRegExp as s}from"./regex-utils.js";import{findDeadSymbols as c}from"./dead-symbols.js";import{health as l}from"./health.js";import{resolvePath as u}from"./path-resolver.js";import{cosineSimilarity as d,estimateTokens as f,segment as p}from"./text-utils.js";import{errorResponse as m,okResponse as h}from"./response-envelope.js";import{audit as g}from"./audit.js";import{batch as _}from"./batch.js";import{changelog as v,formatChangelog as y}from"./changelog.js";import{checkpointLatest as b,checkpointList as x,checkpointLoad as S,checkpointSave as C}from"./checkpoint.js";import{createRestorePoint as w,listRestorePoints as T,restoreFromPoint as E}from"./restore-points.js";import{codemod as D}from"./codemod.js";import{compact as O}from"./compact.js";import{dataTransform as k}from"./data-transform.js";import{delegate as A,delegateListModels as j}from"./delegate.js";import{diffParse as M}from"./diff-parse.js";import{digest as N}from"./digest.js";import{dogfoodLog as P}from"./dogfood-log.js";import{encode as F}from"./encode.js";import{envInfo as I}from"./env-info.js";import{evaluate as L}from"./eval.js";import{autoClaimTestFailures as R,evidenceMap as z}from"./evidence-map.js";import{FileCache as B}from"./file-cache.js";import{fileSummary as V}from"./file-summary.js";import{findExamples as H}from"./find-examples.js";import{find as U}from"./find.js";import{forgeClassify as W}from"./forge-classify.js";import{scopeMap as G}from"./scope-map.js";import{forgeGround as K}from"./forge-ground.js";import{gitContext as q}from"./git-context.js";import{graphAugmentSearch as J,graphQuery as Y}from"./graph-query.js";import{guide as X}from"./guide.js";import{headTailTruncate as Z,paragraphTruncate as Q,truncateToTokenBudget as $}from"./truncation.js";import{httpRequest as ee}from"./http-request.js";import{laneCreate as te,laneDiff as ne,laneDiscard as re,laneList as ie,laneMerge as ae,laneStatus as oe}from"./lane.js";import{analyzeFile as se,measure as ce}from"./measure.js";import{onboard as le}from"./onboard.js";import{processList as ue,processLogs as de,processStart as fe,processStatus as pe,processStop as me}from"./process-manager.js";import{queueClear as he,queueCreate as ge,queueDelete as _e,queueDone as ve,queueFail as ye,queueGet as be,queueList as xe,queueNext as Se,queuePush as Ce}from"./queue.js";import{regexTest as we}from"./regex-test.js";import{rename as Te}from"./rename.js";import{replayAppend as Ee,replayCapture as De,replayClear as Oe,replayList as ke,replayTrim as Ae}from"./replay.js";import{schemaValidate as je}from"./schema-validate.js";import{snippet as Me}from"./snippet.js";import{stashClear as Ne,stashDelete as Pe,stashGet as Fe,stashList as Ie,stashSet as Le}from"./stash.js";import{stratumCard as Re}from"./stratum-card.js";import{symbol as ze}from"./symbol.js";import{classifyExitCode as Be,testRun as Ve}from"./test-run.js";import{timeUtils as He}from"./time-utils.js";import{trace as Ue}from"./trace.js";import{watchList as We,watchStart as Ge,watchStop as Ke}from"./watch.js";import{webFetch as qe}from"./web-fetch.js";import{parseSearchResults as Je,webSearch as Ye}from"./web-search.js";import{addToWorkset as Xe,deleteWorkset as Ze,getWorkset as Qe,listWorksets as $e,removeFromWorkset as et,saveWorkset as tt}from"./workset.js";export{B as FileCache,Xe as addToWorkset,se as analyzeFile,g as audit,R as autoClaimTestFailures,_ as batch,v as changelog,a as check,b as checkpointLatest,x as checkpointList,S as checkpointLoad,C as checkpointSave,Be as classifyExitCode,D as codemod,O as compact,d as cosineSimilarity,w as createRestorePoint,k as dataTransform,A as delegate,j as delegateListModels,Ze as deleteWorkset,M as diffParse,N as digest,P as dogfoodLog,F as encode,I as envInfo,m as errorResponse,s as escapeRegExp,f as estimateTokens,L as evaluate,z as evidenceMap,V as fileSummary,U as find,c as findDeadSymbols,H as findExamples,W as forgeClassify,K as forgeGround,y as formatChangelog,Qe as getWorkset,q as gitContext,J as graphAugmentSearch,Y as graphQuery,X as guide,Z as headTailTruncate,l as health,ee as httpRequest,te as laneCreate,ne as laneDiff,re as laneDiscard,ie as laneList,ae as laneMerge,oe as laneStatus,T as listRestorePoints,$e as listWorksets,ce as measure,h as okResponse,le as onboard,Q as paragraphTruncate,e as parseBiome,t as parseGitStatus,n as parseOutput,Je as parseSearchResults,r as parseTsc,i as parseVitest,ue as processList,de as processLogs,fe as processStart,pe as processStatus,me as processStop,he as queueClear,ge as queueCreate,_e as queueDelete,ve as queueDone,ye as queueFail,be as queueGet,xe as queueList,Se as queueNext,Ce as queuePush,we as regexTest,et as removeFromWorkset,Te as rename,Ee as replayAppend,De as replayCapture,Oe as replayClear,ke as replayList,Ae as replayTrim,u as resolvePath,E as restoreFromPoint,tt as saveWorkset,je as schemaValidate,G as scopeMap,p as segment,Me as snippet,Ne as stashClear,Pe as stashDelete,Fe as stashGet,Ie as stashList,Le as stashSet,Re as stratumCard,o as summarizeCheckResult,ze as symbol,Ve as testRun,He as timeUtils,Ue as trace,$ as truncateToTokenBudget,We as watchList,Ge as watchStart,Ke as watchStop,qe as webFetch,Ye as webSearch};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region packages/tools/src/onboard-utils.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Shared utilities for onboard sub-modules.
|
|
4
|
+
*/
|
|
5
|
+
declare const TEST_SEGMENTS: Set<string>;
|
|
6
|
+
declare function isTestPath(filePath: string): boolean;
|
|
7
|
+
/** Get the package key for grouping: detects monorepo, Java, and flat structures */
|
|
8
|
+
declare function getPackageKey(fp: string): string;
|
|
9
|
+
/** Try to match extensionless import path to actual source file */
|
|
10
|
+
declare function resolveExtensionlessPath(nf: string, exportsByFile: Map<string, unknown>): string;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { TEST_SEGMENTS, getPackageKey, isTestPath, resolveExtensionlessPath };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=new Set([`test`,`tests`,`__tests__`,`spec`,`specs`,`__mocks__`,`__fixtures__`,`fixtures`,`test-utils`]);function t(t){return t.replace(/\\/g,`/`).split(`/`).some(t=>e.has(t))||/\.(test|spec)\.[jt]sx?$/.test(t)||/Test\.java$/.test(t)}function n(e){let t=e.split(`/`);if(t.length>=2&&[`packages`,`services`,`providers`,`apps`,`libs`].includes(t[0]))return`${t[0]}/${t[1]}`;let n=t.indexOf(`java`),r=t.indexOf(`kotlin`),i=n>=0?n:r;if(i>=0&&i+2<t.length){let e=t.slice(i+1);return[`com`,`org`,`net`,`io`,`dev`].includes(e[0])&&e.length>=3?e.slice(0,3).join(`/`):e.slice(0,2).join(`/`)}return t[0]===`src`&&t.length>=3?`${t[0]}/${t[1]}`:t[0]}function r(e,t){if(t.has(e))return e;for(let n of[`.ts`,`.tsx`,`.js`,`.jsx`])if(t.has(`${e}${n}`))return`${e}${n}`;return t.has(`${e}/index.ts`)?`${e}/index.ts`:e}export{e as TEST_SEGMENTS,n as getPackageKey,t as isTestPath,r as resolveExtensionlessPath};
|
|
@@ -1,21 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)
|
|
3
|
-
`)}const S=new Set([`test`,`tests`,`__tests__`,`spec`,`specs`,`__mocks__`,`__fixtures__`,`fixtures`,`test-utils`]);function C(e){return e.replace(/\\/g,`/`).split(`/`).some(e=>S.has(e))||/\.(test|spec)\.[jt]sx?$/.test(e)||/Test\.java$/.test(e)}function w(e,t,n){let r=e.get(`dependencies`),i=e.get(`symbols`),a=e.get(`entry-points`),o=[`## Code Map: ${t}\n`];if(!r&&!i)return o.push(`No dependency or symbol data available.`),o.join(`
|
|
4
|
-
`);let s=r?.reverseGraph??{},c=i?.symbols??[],l=a?.entryPoints??[],u=new Map;for(let e of c){if(!e.exported)continue;let t=e.filePath.replace(/\\/g,`/`);if(C(t))continue;let n=u.get(t);n?n.push({name:e.name,kind:e.kind}):u.set(t,[{name:e.name,kind:e.kind}])}let d=new Map;for(let[e,t]of Object.entries(s)){let n=D(e.replace(/\\/g,`/`),u),r=t.map(e=>e.replace(/\\/g,`/`)).filter(e=>!C(e));if(r.length===0)continue;let i=d.get(n);if(i)for(let e of r)i.add(e);else d.set(n,new Set(r))}let f=new Map;for(let e of l)f.set(e.filePath.replace(/\\/g,`/`),{name:e.name,trigger:e.trigger});let p=new Map,m=new Map;if(n)for(let[e,t]of n){if(C(e))continue;let n=T(e);for(let[r,i]of t){if(C(r)||n===T(r))continue;let t=p.get(e);t||(t=new Map,p.set(e,t)),t.set(r,i);let a=m.get(r),o={file:e,symbols:i};a?a.push(o):m.set(r,[o])}}let h=new Set;for(let e of f.keys())h.add(e);for(let e of p.keys())h.add(e);for(let e of m.keys())h.add(e);if(!n)for(let e of u.keys()){let t=d.get(e);t&&t.size>=3&&h.add(e)}let g=new Map;for(let e of h){let t=T(e),n=g.get(t);n?n.push(e):g.set(t,[e])}let _=[...g.entries()].sort((e,t)=>e[0].localeCompare(t[0])),v=n?`AST call graph`:`import analysis`,y=n?`, ${p.size} cross-package callers`:``;o.push(`**${h.size} key modules** (${v}${y})\n`),o.push(`**Legend:** ⚡ Entry point | 📤 Exports | → Calls (outgoing) | ← Called by (incoming) | ➡ Used by (import)
|
|
5
|
-
`);for(let[e,t]of _){t.sort(),o.push(`### ${e}/\n`);for(let r of t){let t=u.get(r),i=f.get(r),a=p.get(r),s=m.get(r),c=d.get(r),l=r.startsWith(`${e}/`)?r.slice(e.length+1):r;if(o.push(`**${l}**`),i&&o.push(` ⚡ Entry: \`${i.name}\`${i.trigger?` (${i.trigger})`:``}`),t&&t.length>0){let e=t.slice(0,8).map(e=>`${e.name}`).join(`, `),n=t.length>8?` (+${t.length-8})`:``;o.push(` 📤 ${e}${n}`)}if(a&&a.size>0){let t=[...a.entries()].sort((e,t)=>t[1].length-e[1].length);for(let[n,r]of t.slice(0,4)){let t=n.startsWith(`${e}/`)?n.slice(e.length+1):n;o.push(` → ${t}: ${r.slice(0,5).join(`, `)}${r.length>5?`…`:``}`)}t.length>4&&o.push(` → +${t.length-4} more targets`)}if(s&&s.length>0){for(let t of s.slice(0,4)){let n=t.file.startsWith(`${e}/`)?t.file.slice(e.length+1):t.file;o.push(` ← ${n}: ${t.symbols.slice(0,4).join(`, `)}${t.symbols.length>4?`…`:``}`)}s.length>4&&o.push(` ← +${s.length-4} more callers`)}else if(!n&&c&&c.size>0){let e=[...c].filter(e=>!C(e));e.length<=3?o.push(` ➡ Used by: ${e.join(`, `)}`):o.push(` ➡ Used by: ${e.slice(0,3).join(`, `)} (+${e.length-3} more)`)}o.push(``)}}return o.join(`
|
|
6
|
-
`)}function T(e){let t=e.split(`/`);if(t.length>=2&&[`packages`,`services`,`providers`,`apps`,`libs`].includes(t[0]))return`${t[0]}/${t[1]}`;let n=t.indexOf(`java`),r=t.indexOf(`kotlin`),i=n>=0?n:r;if(i>=0&&i+2<t.length){let e=t.slice(i+1);return[`com`,`org`,`net`,`io`,`dev`].includes(e[0])&&e.length>=3?e.slice(0,3).join(`/`):e.slice(0,2).join(`/`)}return t[0]===`src`&&t.length>=3?`${t[0]}/${t[1]}`:t[0]}function E(e,t,n){let r=t.get(`symbols`),i=t.get(`entry-points`),a=t.get(`dependencies`),o=new Map;for(let[t,n]of e)if(!C(t))for(let[e,r]of n){if(C(e))continue;let n=T(t),i=T(e);if(n===i)continue;let a=`${n}|${i}`;o.set(a,(o.get(a)??0)+r.length)}if(o.size===0)return`## Architecture Diagram
|
|
7
|
-
|
|
8
|
-
No cross-package dependencies detected.`;let s=new Set;for(let e of o.keys()){let[t,n]=e.split(`|`);s.add(t),s.add(n)}let c=new Map;if(r?.symbols)for(let e of r.symbols){if(!e.exported)continue;let t=e.filePath.replace(/\\/g,`/`);if(C(t))continue;let n=T(t);c.set(n,(c.get(n)??0)+1)}let l=new Map;if(i?.entryPoints)for(let e of i.entryPoints){let t=T(e.filePath.replace(/\\/g,`/`)),n=l.get(t);n?(n.count++,e.trigger&&n.triggers.add(e.trigger)):l.set(t,{count:1,triggers:new Set(e.trigger?[e.trigger]:[])})}let u=[];if(a?.external){let e=a.external,t={"client-dynamodb":{id:`dynamodb`,name:`DynamoDB`},"lib-dynamodb":{id:`dynamodb`,name:`DynamoDB`},"client-sqs":{id:`sqs`,name:`SQS`},"client-ses":{id:`ses`,name:`SES`},"client-sesv2":{id:`ses`,name:`SES`},"client-s3":{id:`s3`,name:`S3`},"client-eventbridge":{id:`eventbridge`,name:`EventBridge`},"client-sns":{id:`sns`,name:`SNS`},"client-secrets-manager":{id:`secrets`,name:`Secrets Manager`},"client-scheduler":{id:`scheduler`,name:`EventBridge Scheduler`},"client-apigatewaymanagementapi":{id:`apigw`,name:`API Gateway`},"client-cloudwatch":{id:`cloudwatch`,name:`CloudWatch`}},n=new Set;for(let r of Object.keys(e))for(let[e,i]of Object.entries(t))r.includes(e)&&!n.has(i.id)&&(n.add(i.id),u.push(i));u.sort((e,t)=>e.name.localeCompare(t.name))}let d=new Map;for(let e of[...s].sort()){let t=e.split(`/`)[0],n=d.get(t);n?n.push(e):d.set(t,[e])}let f=new Map;if(r?.symbols){let e=new Map;for(let t of r.symbols){let n=t.filePath.replace(/\\/g,`/`),r=T(n),i=n.match(/\.[^./]+$/)?.[0]||``;e.has(r)||e.set(r,new Map);let a=e.get(r);a.set(i,(a.get(i)??0)+1)}let t={".ts":`TypeScript`,".tsx":`TypeScript`,".js":`JavaScript`,".jsx":`JavaScript`,".java":`Java`,".kt":`Kotlin`,".scala":`Scala`,".py":`Python`,".go":`Go`,".rs":`Rust`,".cs":`C#`,".rb":`Ruby`,".php":`PHP`,".swift":`Swift`};for(let[n,r]of e){let e=``,i=0;for(let[t,n]of r)n>i&&(i=n,e=t);f.set(n,t[e]||`TypeScript`)}}let p=e=>e.replace(/[^a-zA-Z0-9]/g,`_`),m=[];m.push("```mermaid"),m.push(`C4Container`),m.push(` title C4 Container: ${n}`),m.push(``);let h=e=>{let t=[],n=l.get(e);n&&(t.push(`${n.count} handlers`),n.triggers.size>0&&t.push([...n.triggers].join(`, `)));let r=c.get(e);return r&&t.push(`${r} exports`),t.join(` · `)||``},g=e=>{let t=f.get(e)||`TypeScript`;if(e.startsWith(`infra`))return`CDK/${t}`;if(l.has(e)){let n=l.get(e);if(n?.triggers.has(`SQS`)||n?.triggers.has(`SNS`)||n?.triggers.has(`API Gateway`))return`Lambda/${t}`;if(n?.triggers.has(`HTTP Server`)||n?.triggers.has(`HTTP Endpoint`))return`Spring Boot/${t}`}return t};for(let[e,t]of[...d.entries()].sort()){let r=new Set([`com`,`org`,`net`,`io`,`dev`,`src`]).has(e)?n.charAt(0).toUpperCase()+n.slice(1):e.charAt(0).toUpperCase()+e.slice(1);if(t.length===1&&t[0]===e){let e=t[0];m.push(` Container(${p(e)}, "${e}", "${g(e)}", "${h(e)}")`)}else{m.push(` System_Boundary(${p(e)}_boundary, "${r}") {`);for(let e of t){let t=e.split(`/`).slice(1).join(`/`)||e;m.push(` Container(${p(e)}, "${t}", "${g(e)}", "${h(e)}")`)}m.push(` }`)}m.push(``)}if(u.length>0){for(let e of u)m.push(` System_Ext(ext_${e.id}, "${e.name}", "AWS")`);m.push(``)}let _=[...o.entries()].sort((e,t)=>t[1]-e[1]);for(let[e,t]of _.slice(0,30)){let[n,r]=e.split(`|`);m.push(` Rel(${p(n)}, ${p(r)}, "Uses", "${t} calls")`)}m.push("```");let v=`## C4 Container Diagram\n\n${m.join(`
|
|
9
|
-
`)}`,y=[];y.push("```mermaid"),y.push(`graph TB`);let b=new Set;for(let[,e]of l)for(let t of e.triggers)b.add(t);if(b.size>0){y.push(` subgraph Triggers["External Triggers"]`);for(let e of[...b].sort()){let t=`trigger_${e.replace(/[^a-zA-Z0-9]/g,`_`)}`;y.push(` ${t}(("${e}"))`)}y.push(` end`),y.push(``)}let x=[...s].filter(e=>l.has(e)).sort(),S=[...s].filter(e=>!l.has(e)).sort();if(x.length>0){y.push(` subgraph Services["Service Layer"]`);for(let e of x){let t=`flow_${p(e)}`,n=e.includes(`/`)?e.split(`/`).pop()??e:e,r=l.get(e);y.push(` ${t}["${n} (${r?.count??0} handlers)"]`)}y.push(` end`),y.push(``)}if(S.length>0){y.push(` subgraph Libraries["Shared Libraries"]`);for(let e of S){let t=`flow_${p(e)}`,n=e.includes(`/`)?e.split(`/`).pop()??e:e;y.push(` ${t}["${n}"]`)}y.push(` end`),y.push(``)}if(u.length>0){y.push(` subgraph External["AWS Services"]`);for(let e of u)y.push(` flow_ext_${e.id}[("${e.name}")]`);y.push(` end`),y.push(``)}for(let e of x){let t=l.get(e);if(!t)continue;let n=`flow_${p(e)}`;for(let e of t.triggers){let t=`trigger_${e.replace(/[^a-zA-Z0-9]/g,`_`)}`;y.push(` ${t} --> ${n}`)}}let w=_.filter(([e])=>{let[t,n]=e.split(`|`);return l.has(t)&&!l.has(n)});for(let[e,t]of w.slice(0,15)){let[n,r]=e.split(`|`);y.push(` flow_${p(n)} -->|${t}| flow_${p(r)}`)}let E=_.filter(([e])=>{let[t,n]=e.split(`|`);return!l.has(t)&&!l.has(n)});for(let[e,t]of E.slice(0,10)){let[n,r]=e.split(`|`);y.push(` flow_${p(n)} -->|${t}| flow_${p(r)}`)}y.push("```");let D=`## Architectural Flow\n\n${y.join(`
|
|
10
|
-
`)}`,O=[`# Architecture Diagrams: ${n}\n`];return O.push(v),O.push(D),O.join(`
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
`)}function D(e,t){if(t.has(e))return e;for(let n of[`.ts`,`.tsx`,`.js`,`.jsx`])if(t.has(`${e}${n}`))return`${e}${n}`;return t.has(`${e}/index.ts`)?`${e}/index.ts`:e}const O=new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,`__pycache__`,`.venv`,`target`,`obj`,`.gradle`]),k=[{glob:/\.env(?:\.\w+)?$/,type:`env`},{glob:/\.env\.example$/,type:`env`},{glob:/package\.json$/,type:`package-json`},{glob:/^(?:app|config|settings|default)\.(?:json|ya?ml|toml)$/i,type:`config`},{glob:/docker-compose\.ya?ml$/,type:`docker`},{glob:/cdk\.json$/,type:`cdk`},{glob:/turbo\.json$/,type:`tooling`},{glob:/application\.(?:properties|ya?ml)$/i,type:`spring`},{glob:/settings\.py$/,type:`django`},{glob:/\.flaskenv$/,type:`env`},{glob:/appsettings\.(?:\w+\.)?json$/i,type:`dotnet`}];async function A(e,t){let n=[],r=await j(e),i=/kb\.config\.json$/;for(let t of r)try{let r=f(e,t).replace(/\\/g,`/`);if(i.test(r))continue;let a=await c(t,`utf-8`),o=M(t);if(r.split(`/`).length-1>1&&o===`tooling`)continue;let s=P(a,o);s.length>0&&n.push({file:r,type:o,values:s})}catch{}return I(n,t)}async function j(e){let t=[],n=async(e,r)=>{if(!(r>3))try{let i=await l(e,{withFileTypes:!0});for(let a of i){if(O.has(a.name))continue;let i=d(e,a.name);a.isDirectory()&&!a.name.startsWith(`.`)?await n(i,r+1):a.isFile()&&k.some(e=>e.glob.test(a.name))&&t.push(i)}}catch{}};return await n(e,0),t}function M(e){let t=u(e);for(let e of k)if(e.glob.test(t))return e.type;return`unknown`}const N=/(?:secret|password|token|key|api.?key|auth|credential|private)/i;function P(e,t){let n=[];if(t===`env`)for(let t of e.split(`
|
|
15
|
-
`)){let e=t.trim();if(!e||e.startsWith(`#`))continue;let r=e.indexOf(`=`);if(r===-1)continue;let i=e.slice(0,r).trim(),a=e.slice(r+1).trim(),o=N.test(i);n.push({key:i,value:o?`***`:a,sensitive:o})}else if(t===`package-json`)try{let t=JSON.parse(e);if(t.scripts)for(let[e,r]of Object.entries(t.scripts))n.push({key:`scripts.${e}`,value:String(r),sensitive:!1});if(t.engines)for(let[e,r]of Object.entries(t.engines))n.push({key:`engines.${e}`,value:String(r),sensitive:!1})}catch{}else if(t===`spring`)for(let t of e.split(`
|
|
16
|
-
`)){let e=t.trim();if(!e||e.startsWith(`#`)||e.startsWith(`---`))continue;let r=e.match(/^([\w.[\]-]+)\s*[=:]\s*(.*)$/);if(r){let e=r[1],t=r[2].trim(),i=N.test(e);n.push({key:e,value:i?`***`:t,sensitive:i})}}else if(t===`json`||t===`config`||t===`cdk`||t===`tooling`||t===`dotnet`)try{F(JSON.parse(e),``,n,0)}catch{}else if(t===`django`)for(let t of e.split(`
|
|
17
|
-
`)){let e=t.match(/^([A-Z_][A-Z0-9_]*)\s*=\s*(.+)$/);if(e){let t=e[1],r=e[2].trim(),i=N.test(t);n.push({key:t,value:i?`***`:r.slice(0,100),sensitive:i})}}return n}function F(e,t,n,r){if(!(r>3)&&typeof e==`object`&&e&&!Array.isArray(e))for(let[i,a]of Object.entries(e)){let e=t?`${t}.${i}`:i;if(typeof a==`object`&&a&&!Array.isArray(a))F(a,e,n,r+1);else{let t=N.test(i),r=Array.isArray(a)?`[${a.length} items]`:String(a);n.push({key:e,value:t?`***`:r.slice(0,120),sensitive:t})}}}function I(e,t){let n=[];if(n.push(`## Configuration Values: ${t}\n`),e.length===0)return n.push(`No configuration files detected.`),n.join(`
|
|
18
|
-
`);n.push(`**${e.length} config files** found\n`);let r=new Map;for(let t of e)r.has(t.type)||r.set(t.type,[]),r.get(t.type)?.push(t);for(let[e,t]of r){if(e===`package-json`&&t.length>2){n.push(`### ${e}\n`);let r=t.find(e=>e.file===`package.json`);if(r){n.push(`#### ${r.file}\n`),n.push(`| Key | Value | Sensitive |`),n.push(`|-----|-------|-----------|`);for(let e of r.values.slice(0,50)){let t=e.value.replace(/\|/g,`\\|`);n.push(`| ${e.key} | ${t} | ${e.sensitive?`⚠️ yes`:`no`} |`)}n.push(``)}let i=t.filter(e=>e.file!==`package.json`);if(i.length>0){let e=new Map;for(let t of i)for(let n of t.values){let t=`${n.key}=${n.value}`;e.set(t,(e.get(t)??0)+1)}let t=Math.max(2,Math.floor(i.length*.5));n.push(`#### Sub-packages (${i.length} packages)\n`);let r=[...e.entries()].filter(([,e])=>e>=t).map(([e])=>{let[t,...n]=e.split(`=`);return{key:t,value:n.join(`=`)}});if(r.length>0){n.push(`**Common scripts** (shared by most sub-packages):
|
|
19
|
-
`),n.push(`| Key | Value |`),n.push(`|-----|-------|`);for(let e of r)n.push(`| ${e.key} | ${e.value.replace(/\|/g,`\\|`)} |`);n.push(``)}let a=new Map;for(let n of i){let r=n.values.filter(n=>{let r=`${n.key}=${n.value}`;return(e.get(r)??0)<t});if(r.length===0)continue;let i=r.map(e=>`${e.key}=${e.value}`).sort().join(`||`),o=a.get(i);o?o.files.push(n.file):a.set(i,{files:[n.file],entries:r.map(e=>({key:e.key,value:e.value}))})}for(let[,e]of a){e.files.length>1?n.push(`**${e.files.length} packages** (${e.files.map(e=>e.split(`/`).slice(-2,-1)[0]||e).join(`, `)}):`):n.push(`**${e.files[0]}**:`),n.push(`| Key | Value |`),n.push(`|-----|-------|`);for(let t of e.entries)n.push(`| ${t.key} | ${t.value.replace(/\|/g,`\\|`)} |`);n.push(``)}}continue}if(t.length>3){let r=t.map(e=>e.values.map(e=>`${e.key}=${e.value}`).sort().join(`||`)),i=r.sort((e,t)=>r.filter(e=>e===t).length-r.filter(t=>t===e).length)[0];if(r.filter(e=>e===i).length>2){n.push(`### ${e}\n`);let a=t[r.indexOf(i)],o=t.filter((e,t)=>r[t]===i).map(e=>e.file),s=t.filter((e,t)=>r[t]!==i);n.push(`**${o.length} identical files**: ${o.join(`, `)}\n`),n.push(`| Key | Value | Sensitive |`),n.push(`|-----|-------|-----------|`);for(let e of a.values.slice(0,30)){let t=e.value.replace(/\|/g,`\\|`);n.push(`| ${e.key} | ${t} | ${e.sensitive?`⚠️ yes`:`no`} |`)}n.push(``);for(let e of s){n.push(`#### ${e.file}\n`),n.push(`| Key | Value | Sensitive |`),n.push(`|-----|-------|-----------|`);for(let t of e.values.slice(0,30)){let e=t.value.replace(/\|/g,`\\|`);n.push(`| ${t.key} | ${e} | ${t.sensitive?`⚠️ yes`:`no`} |`)}n.push(``)}continue}}n.push(`### ${e}\n`);for(let e of t){n.push(`#### ${e.file}\n`),n.push(`| Key | Value | Sensitive |`),n.push(`|-----|-------|-----------|`);for(let t of e.values.slice(0,50)){let e=t.value.replace(/\|/g,`\\|`);n.push(`| ${t.key} | ${e} | ${t.sensitive?`⚠️ yes`:`no`} |`)}e.values.length>50&&n.push(`\n_...and ${e.values.length-50} more values._`),n.push(``)}}let i=e.reduce((e,t)=>e+t.values.filter(e=>e.sensitive).length,0);return i>0&&n.push(`\n**⚠️ ${i} sensitive values detected** (values masked).`),n.join(`
|
|
20
|
-
`)}async function L(c){let l=Date.now(),f=p(c.path),S=u(f),C=c.mode??`memory`,T=c.outDir??d(f,y.aiKb),D=new i,O=new e,k=new a,j=new r,M=new n,N=new t,P=[{name:`structure`,fn:()=>D.analyze(f,{format:`markdown`,maxDepth:3,sourceOnly:!0})},{name:`dependencies`,fn:()=>O.analyze(f,{format:`markdown`})},{name:`entry-points`,fn:()=>M.analyze(f)},{name:`symbols`,fn:()=>k.analyze(f,{format:`markdown`})},{name:`patterns`,fn:()=>j.analyze(f)},{name:`diagram`,fn:()=>N.analyze(f,{diagramType:`architecture`})}],F=await Promise.allSettled(P.map(async e=>{let t=Date.now(),n=await e.fn();return{name:e.name,result:n,durationMs:Date.now()-t}})),I=[],L=new Map,R=new Map;for(let e of F)if(e.status===`fulfilled`){let{name:t,result:n,durationMs:r}=e.value,i=n;I.push({name:t,status:`success`,output:i.output,durationMs:r}),L.set(t,i.output),R.set(t,i.data)}else{let t=e.reason,n=P[F.indexOf(e)].name;I.push({name:n,status:`failed`,output:``,durationMs:0,error:t.message})}let z=Date.now(),B=null;try{let e=await s(f);if((!e||e.edges.length===0)&&(e=await o(f)),e&&e.edges.length>0){B=new Map;for(let t of e.edges){let e=B.get(t.from);e||(e=new Map,B.set(t.from,e));let n=e.get(t.to);if(n)for(let e of t.symbols)n.includes(e)||n.push(e);else e.set(t.to,[...t.symbols])}}}catch{}let V=Date.now()-z,H=Date.now(),U=w(R,S,B),W=Date.now()-H+V;if(I.push({name:`code-map`,status:`success`,output:U,durationMs:W}),L.set(`code-map`,U),B&&B.size>0){let e=E(B,R,S),t=I.find(e=>e.name===`diagram`);t&&(t.output=e,L.set(`diagram`,e))}let G=Date.now(),K=await A(f,S),q=Date.now()-G;I.push({name:`config-values`,status:`success`,output:K,durationMs:q}),L.set(`config-values`,K);let J=x(I,C,S,R);if(I.push({name:`synthesis-guide`,status:`success`,output:J,durationMs:0}),L.set(`synthesis-guide`,J),C===`generate`){if(m(T))for(let e of g(T))(e.endsWith(`.md`)||e.endsWith(`.json`))&&_(d(T,e),{force:!0});h(T,{recursive:!0});let e=new Date().toISOString();for(let[t,n]of L){let r=d(T,`${t}.md`),i=n.replaceAll(f,S);v(r,`<!-- Generated: ${e} -->\n<!-- Project: ${S} -->\n<!-- Source: ${f} -->\n\n`+i,`utf-8`)}let t=[`<!-- Generated: ${e} -->`,`<!-- Project: ${S} -->`,`<!-- Source: ${f} -->`,``,`# ${S} — Codebase Knowledge`,``,`## Contents`,``];for(let e of I){let n=`${e.name}.md`,r=b[e.name]??e.name,i=e.status===`success`?`✓`:`✗`,a=e.durationMs>0?` (${e.durationMs}ms)`:``;t.push(`- ${i} [${r}](./${n})${a}`)}t.push(``),v(d(T,`README.md`),t.join(`
|
|
21
|
-
`),`utf-8`)}return{path:f,mode:C,steps:I,outDir:C===`generate`?T:void 0,totalDurationMs:Date.now()-l}}export{L as onboard};
|
|
1
|
+
import{extractConfigValues as e}from"./config-extractor.js";import{buildDiagrams as t}from"./diagram-builder.js";import{buildCodeMap as n,buildSynthesisGuide as r}from"./synthesis-engine.js";import{DependencyAnalyzer as i,DiagramGenerator as a,EntryPointAnalyzer as o,PatternAnalyzer as s,StructureAnalyzer as c,SymbolAnalyzer as l,extractRegexCallGraph as u,extractTsCallGraph as d}from"../../analyzers/dist/index.js";import{basename as f,join as p,resolve as m}from"node:path";import{existsSync as h,mkdirSync as g,readdirSync as _,rmSync as v,writeFileSync as y}from"node:fs";import{KB_PATHS as b}from"../../core/dist/index.js";const x={structure:`Project Structure`,dependencies:`Dependencies`,"entry-points":`Entry Points`,symbols:`Symbols`,patterns:`Patterns`,diagram:`C4 Container Diagram`,"code-map":`Code Map (Module Graph)`,"config-values":`Configuration Values`,"synthesis-guide":`Synthesis Guide`};async function S(S){let C=Date.now(),w=m(S.path),T=f(w),E=S.mode??`memory`,D=S.outDir??p(w,b.aiKb),O=new c,k=new i,A=new l,j=new s,M=new o,N=new a,P=[{name:`structure`,fn:()=>O.analyze(w,{format:`markdown`,maxDepth:3,sourceOnly:!0})},{name:`dependencies`,fn:()=>k.analyze(w,{format:`markdown`})},{name:`entry-points`,fn:()=>M.analyze(w)},{name:`symbols`,fn:()=>A.analyze(w,{format:`markdown`})},{name:`patterns`,fn:()=>j.analyze(w)},{name:`diagram`,fn:()=>N.analyze(w,{diagramType:`architecture`})}],F=await Promise.allSettled(P.map(async e=>{let t=Date.now(),n=await e.fn();return{name:e.name,result:n,durationMs:Date.now()-t}})),I=[],L=new Map,R=new Map;for(let e of F)if(e.status===`fulfilled`){let{name:t,result:n,durationMs:r}=e.value,i=n;I.push({name:t,status:`success`,output:i.output,durationMs:r}),L.set(t,i.output),R.set(t,i.data)}else{let t=e.reason,n=P[F.indexOf(e)].name;I.push({name:n,status:`failed`,output:``,durationMs:0,error:t.message})}let z=Date.now(),B=null;try{let e=await d(w);if((!e||e.edges.length===0)&&(e=await u(w)),e&&e.edges.length>0){B=new Map;for(let t of e.edges){let e=B.get(t.from);e||(e=new Map,B.set(t.from,e));let n=e.get(t.to);if(n)for(let e of t.symbols)n.includes(e)||n.push(e);else e.set(t.to,[...t.symbols])}}}catch{}let V=Date.now()-z,H=Date.now(),U=n(R,T,B),W=Date.now()-H+V;if(I.push({name:`code-map`,status:`success`,output:U,durationMs:W}),L.set(`code-map`,U),B&&B.size>0){let e=t(B,R,T),n=I.find(e=>e.name===`diagram`);n&&(n.output=e,L.set(`diagram`,e))}let G=Date.now(),K=await e(w,T),q=Date.now()-G;I.push({name:`config-values`,status:`success`,output:K,durationMs:q}),L.set(`config-values`,K);let J=r(I,E,T,R);if(I.push({name:`synthesis-guide`,status:`success`,output:J,durationMs:0}),L.set(`synthesis-guide`,J),E===`generate`){if(h(D))for(let e of _(D))(e.endsWith(`.md`)||e.endsWith(`.json`))&&v(p(D,e),{force:!0});g(D,{recursive:!0});let e=new Date().toISOString();for(let[t,n]of L){let r=p(D,`${t}.md`),i=n.replaceAll(w,T);y(r,`<!-- Generated: ${e} -->\n<!-- Project: ${T} -->\n<!-- Source: ${w} -->\n\n`+i,`utf-8`)}let t=[`<!-- Generated: ${e} -->`,`<!-- Project: ${T} -->`,`<!-- Source: ${w} -->`,``,`# ${T} — Codebase Knowledge`,``,`## Contents`,``];for(let e of I){let n=`${e.name}.md`,r=x[e.name]??e.name,i=e.status===`success`?`✓`:`✗`,a=e.durationMs>0?` (${e.durationMs}ms)`:``;t.push(`- ${i} [${r}](./${n})${a}`)}t.push(``),y(p(D,`README.md`),t.join(`
|
|
2
|
+
`),`utf-8`)}return{path:w,mode:E,steps:I,outDir:E===`generate`?D:void 0,totalDurationMs:Date.now()-C}}export{S as onboard};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{dirname as e,resolve as t}from"node:path";import{existsSync as n,mkdirSync as r,readFileSync as i,writeFileSync as a}from"node:fs";import{KB_PATHS as o}from"../../core/dist/index.js";const s=o.state;function c(e){return t(e??process.cwd(),s,`queue.json`)}function l(e){let t=c(e);if(!n(t))return{};try{return JSON.parse(i(t,`utf-8`))}catch{return{}}}function u(t,i){let o=c(i),s=e(o);n(s)||r(s,{recursive:!0}),a(o,`${JSON.stringify(t,null,2)}\n`,`utf-8`)}function d(){return`q_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`}function f(e,t){let n=l(t);if(n[e])throw Error(`Queue "${e}" already exists`);let r={name:e,items:[]};return n[e]=r,u(n,t),r}function p(e,t,n,r){let i=l(r);i[e]||(i[e]={name:e,items:[]});let a=new Date().toISOString(),o={id:d(),title:t,status:`pending`,data:n,createdAt:a,updatedAt:a};return i[e].items.push(o),u(i,r),o}function m(e,t){let n=l(t),r=n[e];if(!r)throw Error(`Queue "${e}" does not exist`);let i=r.items.find(e=>e.status===`pending`);return i?(i.status=`in-progress`,i.updatedAt=new Date().toISOString(),u(n,t),i):null}function h(e,t,n){let r=l(n),i=r[e];if(!i)throw Error(`Queue "${e}" does not exist`);let a=i.items.find(e=>e.id===t);if(!a)throw Error(`Item "${t}" not found in queue "${e}"`);return a.status=`done`,a.updatedAt=new Date().toISOString(),u(r,n),a}function g(e,t,n,r){let i=l(r),a=i[e];if(!a)throw Error(`Queue "${e}" does not exist`);let o=a.items.find(e=>e.id===t);if(!o)throw Error(`Item "${t}" not found in queue "${e}"`);return o.status=`failed`,o.error=n,o.updatedAt=new Date().toISOString(),u(i,r),o}function _(e,t){return l(t)[e]??null}function v(e){let t=l(e);return Object.values(t).map(e=>({name:e.name,pending:e.items.filter(e=>e.status===`pending`).length,done:e.items.filter(e=>e.status===`done`).length,failed:e.items.filter(e=>e.status===`failed`).length,total:e.items.length}))}function y(e,t){let n=l(t),r=n[e];if(!r)throw Error(`Queue "${e}" does not exist`);let i=r.items.length;r.items=r.items.filter(e=>e.status===`pending`||e.status===`in-progress`);let a=i-r.items.length;return u(n,t),a}function b(e,t){let n=l(t);return n[e]?(delete n[e],u(n,t),!0):!1}export{y as queueClear,f as queueCreate,b as queueDelete,h as queueDone,g as queueFail,_ as queueGet,v as queueList,m as queueNext,p as queuePush};
|
|
1
|
+
import{dirname as e,resolve as t}from"node:path";import{existsSync as n,mkdirSync as r,readFileSync as i,writeFileSync as a}from"node:fs";import{KB_PATHS as o}from"../../core/dist/index.js";const s=o.state;function c(e){return t(e??process.cwd(),s,`queue.json`)}function l(e){let t=c(e);if(!n(t))return{};try{return JSON.parse(i(t,`utf-8`))}catch{return{}}}function u(t,i){let o=c(i),s=e(o);n(s)||r(s,{recursive:!0}),a(o,`${JSON.stringify(t,null,2)}\n`,`utf-8`)}function d(){return`q_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`}function f(e,t){let n=l(t);if(n[e])throw Error(`Queue "${e}" already exists`);let r={name:e,items:[]};return n[e]=r,u(n,t),r}function p(e,t,n,r){let i=l(r);i[e]||(i[e]={name:e,items:[]});let a=new Date().toISOString(),o={id:d(),title:t,status:`pending`,data:n,createdAt:a,updatedAt:a};if(i[e].items.length>=500)throw Error(`Queue "${e}" has reached the maximum of 500 items. Clear completed items with queue({ action: "clear" }) before adding more.`);return i[e].items.push(o),u(i,r),o}function m(e,t){let n=l(t),r=n[e];if(!r)throw Error(`Queue "${e}" does not exist`);let i=r.items.find(e=>e.status===`pending`);return i?(i.status=`in-progress`,i.updatedAt=new Date().toISOString(),u(n,t),i):null}function h(e,t,n){let r=l(n),i=r[e];if(!i)throw Error(`Queue "${e}" does not exist`);let a=i.items.find(e=>e.id===t);if(!a)throw Error(`Item "${t}" not found in queue "${e}"`);return a.status=`done`,a.updatedAt=new Date().toISOString(),u(r,n),a}function g(e,t,n,r){let i=l(r),a=i[e];if(!a)throw Error(`Queue "${e}" does not exist`);let o=a.items.find(e=>e.id===t);if(!o)throw Error(`Item "${t}" not found in queue "${e}"`);return o.status=`failed`,o.error=n,o.updatedAt=new Date().toISOString(),u(i,r),o}function _(e,t){return l(t)[e]??null}function v(e){let t=l(e);return Object.values(t).map(e=>({name:e.name,pending:e.items.filter(e=>e.status===`pending`).length,done:e.items.filter(e=>e.status===`done`).length,failed:e.items.filter(e=>e.status===`failed`).length,total:e.items.length}))}function y(e,t){let n=l(t),r=n[e];if(!r)throw Error(`Queue "${e}" does not exist`);let i=r.items.length;r.items=r.items.filter(e=>e.status===`pending`||e.status===`in-progress`);let a=i-r.items.length;return u(n,t),a}function b(e,t){let n=l(t);return n[e]?(delete n[e],u(n,t),!0):!1}export{y as queueClear,f as queueCreate,b as queueDelete,h as queueDone,g as queueFail,_ as queueGet,v as queueList,m as queueNext,p as queuePush};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region packages/tools/src/regex-utils.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Escape special regular-expression characters in a string so it can be
|
|
4
|
+
* embedded safely inside a `new RegExp(...)` expression.
|
|
5
|
+
*/
|
|
6
|
+
declare function escapeRegExp(value: string): string;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { escapeRegExp };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}export{e as escapeRegExp};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DEFAULT_TOOL_EXTENSIONS as
|
|
2
|
-
`),`utf-8`)))}return!m&&y.length>0&&
|
|
1
|
+
import{escapeRegExp as e}from"./regex-utils.js";import{DEFAULT_TOOL_EXTENSIONS as t,walkFiles as n}from"./file-walk.js";import{createRestorePoint as r}from"./restore-points.js";import{readFile as i,writeFile as a}from"node:fs/promises";import{relative as o}from"node:path";function s(e){return e.replace(/\\/g,`/`)}function c(t){return RegExp(`(^|[^A-Za-z0-9_$])(${e(t)})(?=[^A-Za-z0-9_$]|$)`,`g`)}async function l(e){let{oldName:l,newName:u,rootPath:d,extensions:f=t,exclude:p=[],dryRun:m=!1}=e;if(!l.trim())throw Error(`oldName must not be empty`);let h=c(l),g=await n(d,f,p),_=[],v=0,y=[];for(let e of g){let t=await i(e,`utf-8`),n=t.split(/\r?\n/),r=!1;for(let t=0;t<n.length;t++){let i=n[t];h.lastIndex=0;let a=i.replace(h,(e,t)=>(r=!0,`${t}${u}`));i!==a&&(n[t]=a,_.push({path:s(o(d,e)),line:t+1,before:i,after:a}))}r&&(v+=1,m||(y.push({path:e,content:t}),await a(e,n.join(`
|
|
2
|
+
`),`utf-8`)))}return!m&&y.length>0&&r(`rename`,y,`rename: ${l} → ${u}, ${v} files`),{oldName:l,newName:u,changes:_,filesModified:v,dryRun:m}}export{l as rename};
|
|
@@ -43,8 +43,9 @@ declare function replayAppend(entry: ReplayEntry): void;
|
|
|
43
43
|
declare function replayList(opts?: ReplayOptions): ReplayEntry[];
|
|
44
44
|
/**
|
|
45
45
|
* Trim the replay log to MAX_ENTRIES, keeping the most recent.
|
|
46
|
+
* Async to avoid blocking the event loop on large logs.
|
|
46
47
|
*/
|
|
47
|
-
declare function replayTrim(): number
|
|
48
|
+
declare function replayTrim(): Promise<number>;
|
|
48
49
|
/**
|
|
49
50
|
* Clear the entire replay log.
|
|
50
51
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`).filter(Boolean),
|
|
3
|
-
`).filter(Boolean);if(
|
|
4
|
-
`)}\n`,`utf-8`),
|
|
1
|
+
import{readFile as e,writeFile as t}from"node:fs/promises";import{dirname as n,resolve as r}from"node:path";import{appendFileSync as i,mkdirSync as a,readFileSync as o,writeFileSync as s}from"node:fs";import{KB_PATHS as c}from"../../core/dist/index.js";const l=5e3;let u=0;function d(){return r(process.cwd(),c.state,`replay.jsonl`)}function f(e,t){return e.length<=t?e:`${e.slice(0,t-1)}…`}function p(e){let t=d();a(n(t),{recursive:!0});let r={...e,input:f(e.input,200),output:f(e.output,200)};i(t,`${JSON.stringify(r)}\n`,`utf-8`),u++,u>=100&&(u=0,h().catch(()=>{}))}function m(e={}){let t=d(),n;try{n=o(t,`utf-8`)}catch{return[]}let r=n.trim().split(`
|
|
2
|
+
`).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)}async function h(){let n=d(),r;try{r=await e(n,`utf-8`)}catch{return 0}let i=r.trim().split(`
|
|
3
|
+
`).filter(Boolean);if(i.length<=l)return 0;let a=i.length-l;return await t(n,`${i.slice(-l).join(`
|
|
4
|
+
`)}\n`,`utf-8`),a}function g(){let e=d();try{s(e,``,`utf-8`)}catch{}}function _(e,t,n,r){let i=Date.now();return r().then(r=>(p({ts:new Date().toISOString(),source:e,tool:t,input:typeof n==`string`?n:JSON.stringify(n),durationMs:Date.now()-i,status:`ok`,output:typeof r==`string`?r:JSON.stringify(r??``)}),r)).catch(r=>{throw p({ts:new Date().toISOString(),source:e,tool:t,input:typeof n==`string`?n:JSON.stringify(n),durationMs:Date.now()-i,status:`error`,output:r instanceof Error?r.message:String(r)}),r})}export{p as replayAppend,_ as replayCapture,g as replayClear,m as replayList,h as replayTrim};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`);for(let n=0;n<t.length;n++){let r=t[n];if(!_.test(r))continue;let i=`${e.record.sourcePath}:${r.trim()}`;b.has(i)||(b.add(i),y.push({path:e.record.sourcePath,line:e.record.startLine+n,importStatement:r.trim()}))}}let x=RegExp(`\\b${
|
|
3
|
-
`);for(let o=0;o<
|
|
1
|
+
import{escapeRegExp as e}from"./regex-utils.js";import{extname as t}from"node:path";import{SUPPORTED_EXTENSIONS as n,WasmRuntime as r,extractSymbols as i,resolveScopes as a}from"../../chunker/dist/index.js";async function o(o,s,c){let{name:l,limit:u=20,graphStore:d}=c,f=o.embedQuery?.bind(o)??o.embed.bind(o),p=[`export function ${l}`,`export class ${l}`,`export const ${l}`,`export interface ${l}`,`export type ${l}`,`export enum ${l}`].join(` | `),m=await s.search(await f(p),{limit:u*2}),h=RegExp(`^export\\s+(?:default\\s+)?(?:async\\s+)?(?:function|class|const|let|interface|type|enum)\\s+${e(l)}\\b`,`m`),g;for(let e of m){if(!h.test(e.record.content))continue;let a=e.record.content.match(/export\s+(?:default\s+)?(?:async\s+)?(\w+)/)?.[1]??`unknown`;g={path:e.record.sourcePath,line:e.record.startLine,kind:a};let o=t(e.record.sourcePath);if(r.get()&&n.has(o))try{let t=(await i(e.record.content,o,e.record.sourcePath)).find(e=>e.name===l&&e.exported);t&&(g.kind=t.kind,t.signature&&(g.signature=t.signature))}catch{}break}let _=RegExp(`import\\s+.*\\b${e(l)}\\b.*from\\s+`,`m`),v=await s.search(await f(`import ${l} from`),{limit:u*3}),y=[],b=new Set;for(let e of v){let t=e.record.content.split(`
|
|
2
|
+
`);for(let n=0;n<t.length;n++){let r=t[n];if(!_.test(r))continue;let i=`${e.record.sourcePath}:${r.trim()}`;b.has(i)||(b.add(i),y.push({path:e.record.sourcePath,line:e.record.startLine+n,importStatement:r.trim()}))}}let x=RegExp(`\\b${e(l)}\\b`),S=await s.search(await f(l),{limit:u*3}),C=[],w=new Set;for(let e of S){if(C.length>=u)break;if(g&&e.record.sourcePath===g.path)continue;let i=e.record.content.split(`
|
|
3
|
+
`);for(let o=0;o<i.length;o++){let s=i[o];if(!x.test(s)||_.test(s))continue;let c=`${e.record.sourcePath}:${e.record.startLine+o}`;if(w.has(c))continue;w.add(c);let l,u=t(e.record.sourcePath);if(r.get()&&n.has(u))try{let t=await a(e.record.content,u,o+1);t.length>0&&(l=t[0].name)}catch{}C.push({path:e.record.sourcePath,line:e.record.startLine+o,context:s.trim().slice(0,120),scope:l});break}}let T;if(d)try{let e={importedByModules:[],siblingSymbols:[]},t=await d.findNodes({namePattern:l});if(t.length>0){let n=t[0];n.sourcePath?e.definingModule=n.sourcePath:g&&(e.definingModule=g.path);let r=await d.getNeighbors(n.id,{direction:`incoming`,edgeType:`imports`});for(let t of r.nodes)e.importedByModules.push(t.sourcePath??t.name);if(e.definingModule){let t=await d.findNodes({sourcePath:e.definingModule});for(let n of t)n.name!==l&&n.type!==`module`&&e.siblingSymbols.push(`${n.type}:${n.name}`);e.siblingSymbols=e.siblingSymbols.slice(0,15)}}(e.definingModule||e.importedByModules.length>0||e.siblingSymbols.length>0)&&(T=e)}catch{}return{name:l,definedIn:g,importedBy:y.slice(0,u),referencedIn:C.slice(0,u),graphContext:T}}export{o as symbol};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OnboardMode, OnboardStepResult } from "./onboard.js";
|
|
2
|
+
|
|
3
|
+
//#region packages/tools/src/synthesis-engine.d.ts
|
|
4
|
+
declare function buildSynthesisGuide(steps: OnboardStepResult[], mode: OnboardMode, projectName: string, dataMap: Map<string, Record<string, unknown>>): string;
|
|
5
|
+
/**
|
|
6
|
+
* Build a compact code-map.md showing module relationships with call edges.
|
|
7
|
+
* Uses TypeScript compiler API call graph when available, falls back to
|
|
8
|
+
* import-based dependency graph for non-TS projects.
|
|
9
|
+
* Designed to be LLM-consumable (~10-50KB).
|
|
10
|
+
*/
|
|
11
|
+
declare function buildCodeMap(dataMap: Map<string, Record<string, unknown>>, projectName: string, callGraph: Map<string, Map<string, string[]>> | null): string;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { buildCodeMap, buildSynthesisGuide };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{getPackageKey as e,isTestPath as t,resolveExtensionlessPath as n}from"./onboard-utils.js";const r={structure:`Project Structure`,dependencies:`Dependencies`,"entry-points":`Entry Points`,symbols:`Symbols`,patterns:`Patterns`,diagram:`C4 Container Diagram`,"code-map":`Code Map (Module Graph)`,"config-values":`Configuration Values`,"synthesis-guide":`Synthesis Guide`};function i(e,t,n,i){let a=[`Analysis baselines for **${n}** have been generated.`];t===`generate`?a.push("Individual results are in the sibling `.md` and `.json` files in this directory.",``):a.push(`Results are stored in the KB vector store.`,``);let o=i.get(`symbols`),s=i.get(`dependencies`),c=i.get(`patterns`),l=i.get(`entry-points`),u=o?.totalCount??0,d=o?.exportedCount??0,f=s?.totalImports??0,p=l?.total??0,m=(c?.patterns??[]).map(e=>e.pattern),h=m.some(e=>e.startsWith(`Spring`)),g=m.includes(`AWS CDK`)||m.includes(`CDK IaC`),_=m.includes(`Maven`),v=m.includes(`Serverless`)||p>3,y=s?.external?Object.keys(s.external):[],b=y.some(e=>[`express`,`fastify`,`next`,`react`,`vitest`,`jest`].includes(e))||f>0,x=y.some(e=>[`turbo`,`lerna`,`nx`].includes(e))||m.includes(`Monorepo`);if(a.push(`### Project Profile`,``),a.push(`- **${u} symbols** (${d} exported), **${f} imports**, **${p} entry ${p===1?`point`:`points`}**`),m.length>0&&a.push(`- **Detected**: ${m.slice(0,8).join(`, `)}`),a.push(``),u===0&&f===0&&p===0)return a.push(`> **Note:** This project appears to be empty or contains no analyzable source code.`,`> Run onboard again after adding source files.`),a.join(`
|
|
2
|
+
`);let S=e.filter(e=>e.status===`success`),C=e.filter(e=>e.status===`failed`);a.push(`### Completed Analyses`,``);for(let e of S){let n=r[e.name]??e.name,i=e.output.length>1e3?`${Math.round(e.output.length/1024)}KB`:`${e.output.length}B`;t===`generate`?a.push(`- ✓ [${n}](./${e.name}.md) (${i})`):a.push(`- ✓ ${n} (${i})`)}if(C.length>0){a.push(``,`### Failed Analyses`,``);for(let e of C)a.push(`- ✗ ${e.name}: ${e.error}`)}a.push(``,`### Recommended Reading Order`,``,"1. **Start with** `synthesis-guide.md` (this file) → `entry-points.md` → `patterns.md`","2. **Module graph** via `code-map.md` — cross-package call edges with function names","3. **Architecture** via `diagram.md` (C4 Container) → `dependencies.md`","4. **Browse structure** via `structure.md` for file layout","5. **API surface** via `symbols.md` — file paths + exported symbols (capped at 80KB)","6. **Reference**: `config-values.md` (config reference)",``,`> **Size guidance:** Total output is ~`);let w=S.reduce((e,t)=>e+t.output.length,0)/1024;return a[a.length-1]+=`${Math.round(w)}KB. Focus on code-map.md + entry-points.md + diagram.md (~${Math.round((S.find(e=>e.name===`code-map`)?.output.length??0)/1024+(S.find(e=>e.name===`entry-points`)?.output.length??0)/1024+(S.find(e=>e.name===`diagram`)?.output.length??0)/1024)}KB) for maximum signal-to-token ratio.`,a.push(``,`### Synthesize Knowledge`,``,"Produce the following `kb_remember` entries:",``),a.push("1. **Architecture Summary** (category: `architecture`)"),x?(a.push(` - Package boundaries, dependency graph between packages`),a.push(` - Shared vs service-specific code`)):v?(a.push(` - Lambda functions, triggers, event flow`),a.push(` - Infrastructure patterns (queues, tables, APIs)`)):h?(a.push(` - Controller → Service → Repository layers`),a.push(` - Spring configuration and profiles`)):(a.push(` - Layer structure, dependency flow`),a.push(` - Key design decisions`)),a.push(``),a.push("2. **Domain Model** (category: `architecture`)"),a.push(` - Key entities/types and their relationships`),a.push(` - Data flow from entry points through processing`),a.push(``),a.push("3. **Conventions** (category: `conventions`)"),a.push(` - Naming patterns, file organization, testing approach`),g&&a.push(` - CDK construct patterns and stack organization`),b&&a.push(` - Build tooling, package manager, module system`),_&&a.push(` - Maven module structure, dependency management`),a.push(``,`### Using KB Tools`,``,`This project has a KB MCP server with tools for search, analysis, memory, and more.`,"`kb init` has already created `.github/copilot-instructions.md` and `AGENTS.md` with the complete tool reference.","If not, run `npx @vpxa/kb init` to generate them.",``,`**Workflow pattern — use on every task:**`,``,"```",`kb_search({ query: "your task keywords" }) # Recall prior decisions`,`kb_scope_map({ task: "what you are doing" }) # Get a reading plan`,`# ... do the work ...`,`kb_check({}) # Typecheck + lint`,`kb_test_run({}) # Run tests`,`kb_remember({ title: "What I learned", category: "decisions" }) # Persist`,"```"),a.join(`
|
|
3
|
+
`)}function a(r,i,a){let o=r.get(`dependencies`),s=r.get(`symbols`),c=r.get(`entry-points`),l=[`## Code Map: ${i}\n`];if(!o&&!s)return l.push(`No dependency or symbol data available.`),l.join(`
|
|
4
|
+
`);let u=o?.reverseGraph??{},d=s?.symbols??[],f=c?.entryPoints??[],p=new Map;for(let e of d){if(!e.exported)continue;let n=e.filePath.replace(/\\/g,`/`);if(t(n))continue;let r=p.get(n);r?r.push({name:e.name,kind:e.kind}):p.set(n,[{name:e.name,kind:e.kind}])}let m=new Map;for(let[e,r]of Object.entries(u)){let i=n(e.replace(/\\/g,`/`),p),a=r.map(e=>e.replace(/\\/g,`/`)).filter(e=>!t(e));if(a.length===0)continue;let o=m.get(i);if(o)for(let e of a)o.add(e);else m.set(i,new Set(a))}let h=new Map;for(let e of f)h.set(e.filePath.replace(/\\/g,`/`),{name:e.name,trigger:e.trigger});let g=new Map,_=new Map;if(a)for(let[n,r]of a){if(t(n))continue;let i=e(n);for(let[a,o]of r){if(t(a)||i===e(a))continue;let r=g.get(n);r||(r=new Map,g.set(n,r)),r.set(a,o);let s=_.get(a),c={file:n,symbols:o};s?s.push(c):_.set(a,[c])}}let v=new Set;for(let e of h.keys())v.add(e);for(let e of g.keys())v.add(e);for(let e of _.keys())v.add(e);if(!a)for(let e of p.keys()){let t=m.get(e);t&&t.size>=3&&v.add(e)}let y=new Map;for(let t of v){let n=e(t),r=y.get(n);r?r.push(t):y.set(n,[t])}let b=[...y.entries()].sort((e,t)=>e[0].localeCompare(t[0])),x=a?`AST call graph`:`import analysis`,S=a?`, ${g.size} cross-package callers`:``;l.push(`**${v.size} key modules** (${x}${S})\n`),l.push(`**Legend:** ⚡ Entry point | 📤 Exports | → Calls (outgoing) | ← Called by (incoming) | ➡ Used by (import)
|
|
5
|
+
`);for(let[e,n]of b){n.sort(),l.push(`### ${e}/\n`);for(let r of n){let n=p.get(r),i=h.get(r),o=g.get(r),s=_.get(r),c=m.get(r),u=r.startsWith(`${e}/`)?r.slice(e.length+1):r;if(l.push(`**${u}**`),i&&l.push(` ⚡ Entry: \`${i.name}\`${i.trigger?` (${i.trigger})`:``}`),n&&n.length>0){let e=n.slice(0,8).map(e=>`${e.name}`).join(`, `),t=n.length>8?` (+${n.length-8})`:``;l.push(` 📤 ${e}${t}`)}if(o&&o.size>0){let t=[...o.entries()].sort((e,t)=>t[1].length-e[1].length);for(let[n,r]of t.slice(0,4)){let t=n.startsWith(`${e}/`)?n.slice(e.length+1):n;l.push(` → ${t}: ${r.slice(0,5).join(`, `)}${r.length>5?`…`:``}`)}t.length>4&&l.push(` → +${t.length-4} more targets`)}if(s&&s.length>0){for(let t of s.slice(0,4)){let n=t.file.startsWith(`${e}/`)?t.file.slice(e.length+1):t.file;l.push(` ← ${n}: ${t.symbols.slice(0,4).join(`, `)}${t.symbols.length>4?`…`:``}`)}s.length>4&&l.push(` ← +${s.length-4} more callers`)}else if(!a&&c&&c.size>0){let e=[...c].filter(e=>!t(e));e.length<=3?l.push(` ➡ Used by: ${e.join(`, `)}`):l.push(` ➡ Used by: ${e.slice(0,3).join(`, `)} (+${e.length-3} more)`)}l.push(``)}}return l.join(`
|
|
6
|
+
`)}export{a as buildCodeMap,i as buildSynthesisGuide};
|
|
@@ -6,11 +6,13 @@ interface TestRunOptions {
|
|
|
6
6
|
cwd?: string;
|
|
7
7
|
timeout?: number;
|
|
8
8
|
grep?: string;
|
|
9
|
+
/** Include full raw output in result (default: false to save tokens) */
|
|
10
|
+
includeRaw?: boolean;
|
|
9
11
|
}
|
|
10
12
|
interface TestRunResult {
|
|
11
13
|
summary: ParsedTestSummary;
|
|
12
14
|
passed: boolean;
|
|
13
|
-
raw
|
|
15
|
+
raw?: string;
|
|
14
16
|
durationMs: number;
|
|
15
17
|
}
|
|
16
18
|
declare function testRun(options?: TestRunOptions): Promise<TestRunResult>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{parseVitest as e}from"./parse-output.js";import{exec as t}from"node:child_process";import{promisify as n}from"node:util";const r=n(t);let i=0;async function a(e={}){if(i>=2)throw Error(`Too many concurrent test runs (max 2). Try again later.`);i++;try{return await o(e)}finally{i--}}async function o(t){let n=t.cwd??process.cwd(),i=t.timeout??6e4,a=Date.now(),o=[`vitest`,`run`,`--reporter=verbose`,`--no-color`];t.files?.length&&o.push(...t.files),t.grep&&o.push(`--testNamePattern`,t.grep);try{let{stdout:
|
|
1
|
+
import{parseVitest as e}from"./parse-output.js";import{exec as t}from"node:child_process";import{promisify as n}from"node:util";const r=n(t);let i=0;async function a(e={}){if(i>=2)throw Error(`Too many concurrent test runs (max 2). Try again later.`);i++;try{return await o(e)}finally{i--}}async function o(t){let n=t.cwd??process.cwd(),i=t.timeout??6e4,a=Date.now(),o=[`vitest`,`run`,`--reporter=verbose`,`--no-color`];t.files?.length&&o.push(...t.files),t.grep&&o.push(`--testNamePattern`,t.grep);try{let{stdout:s}=await r(`npx ${o.join(` `)}`,{cwd:n,timeout:i}),c=s.toString(),l=e(c);return{summary:l,passed:l.failed===0,...t.includeRaw&&{raw:c},durationMs:Date.now()-a}}catch(n){let r=s(n);return{summary:e(r),passed:!1,...t.includeRaw&&{raw:r},durationMs:Date.now()-a}}}function s(e){let t=e;return[t.stdout?.toString()??``,t.stderr?.toString()??``].filter(Boolean).join(`
|
|
2
2
|
`).trim()||t.message||`Test run failed`}function c(e,t,n){if(e===0)return{isError:!1};if(e===1&&n){if(/\b(grep|rg|ripgrep|ag|ack|findstr)\b/i.test(n))return{isError:!1,reason:`grep: no matches (exit 1 is normal)`};if(/\bdiff\b/i.test(n))return{isError:!1,reason:`diff: files differ (exit 1 is normal)`}}return{isError:!0}}export{c as classifyExitCode,a as testRun};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`);if(h&&!_){let e=await
|
|
1
|
+
import{escapeRegExp as e}from"./regex-utils.js";import{readFile as t}from"node:fs/promises";import{extname as n}from"node:path";import{SUPPORTED_EXTENSIONS as r,WasmRuntime as i,extractCalls as a}from"../../chunker/dist/index.js";async function o(t,n,r){let{start:a,direction:o,maxDepth:d=3}=r,f=[],p=new Set,m=new Set,h=!!i.get(),g=new Map,_=await t.embed(a);if((await n.search(_,{limit:10})).length===0)return{start:a,direction:o,nodes:f,depth:0};let v=[{target:a,depth:0}],y=0;for(;v.length>0;){let r=v.shift();if(!r)break;if(r.depth>=d||p.has(r.target))continue;p.add(r.target);let i=await t.embed(r.target),a=await n.search(i,{limit:20}),u=e(r.target),_=l(r.target);for(let e of a){let t=e.record.sourcePath,n=e.record.content.split(`
|
|
2
|
+
`);if(h&&!_){let e=await s(g,t);for(let n of e)o!==`backward`&&n.callerName===r.target&&(c(m,f,{path:t,symbol:n.calleeName,line:n.line,relationship:`calls`,scope:n.callerName}),y=Math.max(y,r.depth+1),v.push({target:n.calleeName,depth:r.depth+1})),o!==`forward`&&n.calleeName===r.target&&(c(m,f,{path:t,symbol:n.callerName,line:n.line,relationship:`called-by`,scope:n.callerName}),y=Math.max(y,r.depth+1),v.push({target:n.callerName,depth:r.depth+1}))}for(let i=0;i<n.length;i+=1){let a=n[i],s=e.record.startLine+i;if(o!==`forward`&&RegExp(_?`from\\s+['"]${u}['"]`:`import\\s+.*\\b${u}\\b.*from\\s+`).test(a)){c(m,f,{path:t,symbol:r.target,line:s,relationship:`imported-by`}),y=Math.max(y,r.depth+1);let e=a.match(/from\s+['"]([^'"]+)['"]/);!_&&e&&v.push({target:e[1],depth:r.depth+1})}o!==`backward`&&(_?RegExp(`from\\s+['"]${u}['"]`).test(a)&&(c(m,f,{path:t,symbol:r.target,line:s,relationship:`imports`}),y=Math.max(y,r.depth+1)):h||RegExp(`\\b${u}\\s*\\(`).test(a)&&!/^\s*(?:export\s+)?(?:async\s+)?function\s/.test(a)&&(c(m,f,{path:t,symbol:r.target,line:s,relationship:`calls`}),y=Math.max(y,r.depth+1))),RegExp(_?`['"]${u}['"]`:`\\b${u}\\b`).test(a)&&!/^\s*import\s/.test(a)&&!/^\s*(?:export\s+)?(?:async\s+)?function\s/.test(a)&&(c(m,f,{path:t,symbol:r.target,line:s,relationship:`references`}),y=Math.max(y,r.depth+1))}}}return{start:a,direction:o,nodes:u(f),depth:y}}async function s(e,i){let o=e.get(i);if(o)return o;let s=n(i);if(!r.has(s))return e.set(i,[]),[];try{let n=await a(await t(i,`utf-8`),s,i);return e.set(i,n),n}catch{return e.set(i,[]),[]}}function c(e,t,n){let r=`${n.path}:${n.line}:${n.relationship}`;e.has(r)||(e.add(r),t.push(n))}function l(e){return/[./\\]/.test(e)}function u(e){let t=new Set;return e.filter(e=>{let n=`${e.path}:${e.line}:${e.relationship}`;return t.has(n)?!1:(t.add(n),!0)})}export{o as trace};
|
|
@@ -0,0 +1,2 @@
|
|
|
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,n as i,t as a}from"./jsx-runtime-y6Gdq5PZ.js";import{t as o}from"./useKBClient-C35iA4uG.js";import{t as s}from"./StatusPanel-BAbUxyqQ.js";import{t as c}from"./SearchPanel-CpJGczAc.js";import{t as l}from"./CuratedPanel-BIamXLNy.js";import{t as u}from"./LogPanel-D6u6o84n.js";var d=e(t()),f=a();const p=[`status`,`search`,`curated`,`log`];function m({client:e}){let[t,a]=(0,d.useState)(`status`);return i((e,n)=>{n.tab&&a(p[(p.indexOf(t)+1)%p.length]),e===`1`&&a(`status`),e===`2`&&a(`search`),e===`3`&&a(`curated`),e===`4`&&a(`log`)}),(0,f.jsx)(o,{value:e,children:(0,f.jsxs)(n,{flexDirection:`column`,width:`100%`,children:[(0,f.jsxs)(n,{borderStyle:`single`,paddingX:1,children:[(0,f.jsx)(r,{bold:!0,color:`cyan`,children:`KB Dashboard`}),(0,f.jsx)(r,{children:` │ `}),p.map(e=>(0,f.jsxs)(d.Fragment,{children:[(0,f.jsxs)(r,{color:e===t?`green`:`gray`,bold:e===t,children:[`[`,p.indexOf(e)+1,`] `,e]}),(0,f.jsx)(r,{children:` `})]},e)),(0,f.jsx)(r,{color:`gray`,children:` │ Tab: switch │ Ctrl+C: quit`})]}),(0,f.jsxs)(n,{flexGrow:1,minHeight:10,children:[t===`status`&&(0,f.jsx)(s,{}),t===`search`&&(0,f.jsx)(c,{}),t===`curated`&&(0,f.jsx)(l,{}),t===`log`&&(0,f.jsx)(u,{})]})]})})}export{m as t};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
-
import { t as
|
|
2
|
+
import { t as IKBClient } from "./types-VcTHNV6s.js";
|
|
3
3
|
import React from "react";
|
|
4
4
|
|
|
5
5
|
//#region packages/tui/src/App.d.ts
|
|
6
6
|
interface AppProps {
|
|
7
|
-
|
|
7
|
+
client: IKBClient;
|
|
8
8
|
}
|
|
9
9
|
declare function App({
|
|
10
|
-
|
|
10
|
+
client
|
|
11
11
|
}: AppProps): React.ReactElement;
|
|
12
12
|
//#endregion
|
|
13
13
|
export { App };
|
package/packages/tui/dist/App.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
-
import{t as e}from"./App-
|
|
2
|
+
import{t as e}from"./App-DXY0-tlW.js";export{e as App};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
import"./chunk-D6axbAb-.js";import{t as e}from"./react-D__J1GQe.js";import{a as t,i as n,t as r}from"./jsx-runtime-y6Gdq5PZ.js";import{n as i}from"./useKBClient-C35iA4uG.js";import{t as a}from"./usePolling-BbjnRWgx.js";e();var o=r();function s(){let e=i(),{data:r,error:s}=a(()=>e.listKnowledge(),1e4);return(0,o.jsxs)(t,{flexDirection:`column`,borderStyle:`round`,paddingX:1,children:[(0,o.jsx)(n,{bold:!0,color:`cyan`,children:`Curated Knowledge`}),(0,o.jsx)(n,{children:` `}),s&&(0,o.jsxs)(n,{color:`red`,children:[`Error: `,s.message]}),r&&r.length===0&&!s&&(0,o.jsx)(n,{color:`gray`,children:`No curated entries found`}),r?.map(e=>(0,o.jsxs)(n,{children:[(0,o.jsx)(n,{color:`magenta`,children:`•`}),` `,e.title,` `,(0,o.jsxs)(n,{color:`gray`,children:[`(`,e.category,`)`]})]},e.path)),!r&&!s&&(0,o.jsx)(n,{color:`yellow`,children:`Loading…`}),(0,o.jsx)(n,{children:` `}),(0,o.jsx)(n,{color:`gray`,children:`Refreshes every 10s`})]})}export{s as t};
|
|
@@ -0,0 +1,3 @@
|
|
|
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{exec as a,execFile as o}from"node:child_process";import{appendFileSync as s,existsSync as c,mkdirSync as l,readFileSync as u,readdirSync as d,unlinkSync as f}from"node:fs";import{dirname as p,join as m,resolve as h}from"node:path";import{promisify as g}from"node:util";import{fileURLToPath as _}from"node:url";import"turndown";g(a),m(p(_(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`}));const v={ai:`.ai`,aiKb:`.ai/kb`,aiCurated:`.ai/curated`,restorePoints:`.ai/restore-points`,data:`.kb-data`,state:`.kb-state`,logs:`.kb-state/logs`,brainstorm:`.brainstorm`,handoffs:`.handoffs`};v.data;const y={debug:0,info:1,warn:2,error:3},b=[];let x=process.env.KB_LOG_LEVEL??`info`,S=process.env.KB_LOG_FILE_SINK===`true`||process.env.KB_LOG_FILE_SINK!==`false`&&!process.env.VITEST&&process.env.NODE_ENV!==`test`;function C(){return S?process.env.VITEST||process.env.NODE_ENV===`test`?process.env.KB_LOG_FILE_SINK===`true`:!0:!1}let w;function T(){return w||=h(process.cwd(),v.logs),w}function E(e){let t=e.toISOString().slice(0,10);return m(T(),`${t}.jsonl`)}let D=0;function O(){let e=Date.now();if(!(e-D<36e5)){D=e;try{let t=T(),n=new Date(e-30*864e5).toISOString().slice(0,10);for(let e of d(t))if(e.endsWith(`.jsonl`)&&e.slice(0,10)<n)try{f(m(t,e))}catch{}}catch{}}}function k(e,t){try{l(T(),{recursive:!0}),s(E(t),`${e}\n`),O()}catch{}}function A(e){function t(t,n,r){if(y[t]<y[x])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 b)try{i({level:t,component:e,message:n,data:r})}catch{}C()&&(t===`warn`||t===`error`)&&k(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 j=A(`query-executor`),M=p(_(import.meta.url));function N(){let e=m(M,`..`,`queries`);if(c(e))return e;let t=m(M,`..`,`..`,`src`,`queries`);return c(t)?t:e}const P=N(),F={".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 I=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=>L(e)):[]}executeCaptures(e,t,n,r){let i=this.getOrCompile(t,n,r);return i?i.captures(e).map(e=>R(e)):[]}executeRaw(e,t,n){return t.query(n).matches(e).map(e=>L(e))}getOrCompile(e,t,n){let r=F[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 j.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=m(P,e,`${t}.scm`);try{let e=u(i,`utf-8`);return this.scmCache.set(n,e),e}catch{return j.info(`Query file not found (graceful skip)`,{langDir:e,queryType:t}),null}}dispose(){this.queryCache.clear(),this.scmCache.clear()}static resolveQueryDir(e){return m(P,e)}};function L(e){let t=new Map;for(let n of e.captures)t.set(n.name,R(n));return{pattern:e.pattern,captures:t}}function R(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 I,new I,new I,new I,new I,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(`,`)),`${v.state}`,v.restorePoints,new Set([`node_modules`,`.git`,`dist`,`build`,`coverage`,`.turbo`,`.cache`,`cdk.out`,v.state]),v.state,new Set([`.git`,v.data,v.state,`.turbo`,`.yarn`,`build`,`coverage`,`dist`,`node_modules`]),g(o),`${v.state}`,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(`.`)),v.state;function z(){return h(process.cwd(),v.state,`replay.jsonl`)}function B(e={}){let t=z(),n;try{n=u(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)}v.state,g(a),v.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(`,`),v.state;var V=e(t()),H=i();function U(){let[e,t]=(0,V.useState)([]);return(0,V.useEffect)(()=>{let e=()=>{t(B({last:30}))};e();let n=setInterval(e,2e3);return()=>clearInterval(n)},[]),(0,H.jsxs)(n,{flexDirection:`column`,borderStyle:`round`,paddingX:1,children:[(0,H.jsx)(r,{bold:!0,color:`cyan`,children:`Activity Log`}),(0,H.jsx)(r,{children:` `}),e.length===0&&(0,H.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,H.jsxs)(r,{children:[(0,H.jsx)(r,{color:`gray`,children:n}),` `,(0,H.jsx)(r,{color:i,children:e.status===`ok`?`✓`:`✗`}),` `,(0,H.jsx)(r,{bold:!0,children:e.tool}),` `,(0,H.jsxs)(r,{color:`gray`,children:[`(`,e.durationMs,`ms)`]})]},`${e.ts}-${t}`)}),(0,H.jsx)(r,{children:` `}),(0,H.jsx)(r,{color:`gray`,children:`Refreshes every 2s │ Showing last 30`})]})}export{U as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
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,n as i,o as a,t as o}from"./jsx-runtime-y6Gdq5PZ.js";import{n as s}from"./useKBClient-C35iA4uG.js";var c=e(t(),1);function l({value:e,placeholder:t=``,focus:n=!0,mask:o,highlightPastedText:s=!1,showCursor:l=!0,onChange:u,onSubmit:d}){let[f,p]=(0,c.useState)({cursorOffset:(e||``).length,cursorWidth:0}),{cursorOffset:m,cursorWidth:h}=f;(0,c.useEffect)(()=>{p(t=>{if(!n||!l)return t;let r=e||``;return t.cursorOffset>r.length-1?{cursorOffset:r.length,cursorWidth:0}:t})},[e,n,l]);let g=s?h:0,_=o?o.repeat(e.length):e,v=_,y=t?a.grey(t):void 0;if(l&&n){y=t.length>0?a.inverse(t[0])+a.grey(t.slice(1)):a.inverse(` `),v=_.length>0?``:a.inverse(` `);let e=0;for(let t of _)v+=e>=m-g&&e<=m?a.inverse(t):t,e++;_.length>0&&m===_.length&&(v+=a.inverse(` `))}return i((t,n)=>{if(n.upArrow||n.downArrow||n.ctrl&&t===`c`||n.tab||n.shift&&n.tab)return;if(n.return){d&&d(e);return}let r=m,i=e,a=0;n.leftArrow?l&&r--:n.rightArrow?l&&r++:n.backspace||n.delete?m>0&&(i=e.slice(0,m-1)+e.slice(m,e.length),r--):(i=e.slice(0,m)+t+e.slice(m,e.length),r+=t.length,t.length>1&&(a=t.length)),m<0&&(r=0),m>e.length&&(r=e.length),p({cursorOffset:r,cursorWidth:a}),i!==e&&u(i)},{isActive:n}),c.createElement(r,null,t?_.length>0?v:y:v)}var u=o();function d(){let e=s(),[t,i]=(0,c.useState)(``),[a,o]=(0,c.useState)([]),[d,f]=(0,c.useState)(!1);return(0,u.jsxs)(n,{flexDirection:`column`,borderStyle:`round`,paddingX:1,children:[(0,u.jsx)(r,{bold:!0,color:`cyan`,children:`Search`}),(0,u.jsxs)(n,{children:[(0,u.jsx)(r,{color:`green`,children:`> `}),(0,u.jsx)(l,{value:t,onChange:i,onSubmit:async t=>{if(t.trim()){f(!0);try{o(await e.search(t,{limit:10}))}catch{o([])}finally{f(!1)}}}})]}),(0,u.jsx)(r,{children:` `}),d&&(0,u.jsx)(r,{color:`yellow`,children:`Searching…`}),!d&&a.length===0&&t&&(0,u.jsx)(r,{color:`gray`,children:`No results. Press Enter to search.`}),a.map((e,t)=>(0,u.jsxs)(n,{flexDirection:`column`,children:[(0,u.jsxs)(r,{children:[(0,u.jsxs)(r,{color:`green`,children:[(t+1).toString(),`.`]}),` `,(0,u.jsx)(r,{bold:!0,children:e.sourcePath}),(0,u.jsxs)(r,{color:`gray`,children:[` (score: `,e.score.toFixed(3),`)`]})]}),(0,u.jsxs)(r,{color:`gray`,children:[` `,e.content.slice(0,80)]})]},`${e.sourcePath}-${t}`))]})}export{d as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
import"./chunk-D6axbAb-.js";import{t as e}from"./react-D__J1GQe.js";import{a as t,i as n,t as r}from"./jsx-runtime-y6Gdq5PZ.js";import{n as i}from"./useKBClient-C35iA4uG.js";import{t as a}from"./usePolling-BbjnRWgx.js";e();var o=r();function s(){let e=i(),{data:r,error:s}=a(()=>e.getStatus(),5e3);return(0,o.jsxs)(t,{flexDirection:`column`,borderStyle:`round`,paddingX:1,children:[(0,o.jsx)(n,{bold:!0,color:`cyan`,children:`Index Status`}),(0,o.jsx)(n,{children:` `}),s&&(0,o.jsxs)(n,{color:`red`,children:[`Error: `,s.message]}),r&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n,{children:[`Records: `,(0,o.jsx)(n,{bold:!0,children:r.totalRecords.toLocaleString()})]}),(0,o.jsxs)(n,{children:[`Files: `,(0,o.jsx)(n,{bold:!0,children:r.totalFiles.toLocaleString()})]}),(0,o.jsxs)(n,{children:[`Onboarded: `,(0,o.jsx)(n,{bold:!0,children:r.onboarded?`Yes`:`No`})]}),r.lastIndexedAt&&(0,o.jsxs)(n,{children:[`Last indexed: `,(0,o.jsx)(n,{bold:!0,children:r.lastIndexedAt})]})]}),!r&&!s&&(0,o.jsx)(n,{color:`yellow`,children:`Loading…`}),(0,o.jsx)(n,{children:` `}),(0,o.jsx)(n,{color:`gray`,children:`Refreshes every 5s`})]})}export{s as t};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
import { t as IKBClient } from "../types-VcTHNV6s.js";
|
|
3
|
+
import * as react from "react";
|
|
4
|
+
|
|
5
|
+
//#region packages/tui/src/hooks/useKBClient.d.ts
|
|
6
|
+
declare const KBClientProvider: react.Provider<IKBClient | null>;
|
|
7
|
+
declare function useKBClient(): IKBClient;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { KBClientProvider, useKBClient };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
+
//#region packages/tui/src/hooks/usePolling.d.ts
|
|
3
|
+
declare function usePolling<T>(fn: () => Promise<T>, intervalMs: number): {
|
|
4
|
+
data: T | null;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { usePolling };
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { t as IKBClient } from "./types-VcTHNV6s.js";
|
|
3
|
+
|
|
4
|
+
//#region packages/tui/src/index.d.ts
|
|
5
|
+
declare function launch(client: IKBClient): void;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { launch };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
|
|
2
|
-
import{r as e}from"./chunk-D6axbAb-.js";import{r as
|
|
2
|
+
import{r as e}from"./chunk-D6axbAb-.js";import{t}from"./react-D__J1GQe.js";import{r as n}from"./jsx-runtime-y6Gdq5PZ.js";import{t as r}from"./App-DXY0-tlW.js";var i=e(t());function a(e){n(i.createElement(r,{client:e}))}export{a as launch};
|