kirograph 1.2.2 → 1.3.0
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 +4 -3
- package/dist/bin/commands/attack-surface.js +15 -2
- package/dist/bin/commands/attack-surface.js.map +2 -2
- package/dist/bin/commands/help.js +4 -2
- package/dist/bin/commands/help.js.map +2 -2
- package/dist/bin/commands/memory.js +23 -3
- package/dist/bin/commands/memory.js.map +2 -2
- package/dist/bin/commands/security-export.js +7 -1
- package/dist/bin/commands/security-export.js.map +2 -2
- package/dist/bin/commands/wiki.js +12 -1
- package/dist/bin/commands/wiki.js.map +2 -2
- package/dist/bin/installer/common.js +25 -0
- package/dist/bin/installer/common.js.map +2 -2
- package/dist/bin/installer/config-prompt.js +25 -1
- package/dist/bin/installer/config-prompt.js.map +2 -2
- package/dist/bin/installer/index.js +23 -0
- package/dist/bin/installer/index.js.map +2 -2
- package/dist/bin/installer/steering.js +5 -1
- package/dist/bin/installer/steering.js.map +2 -2
- package/dist/bin/kirograph.js +1 -1
- package/dist/config.js +63 -2
- package/dist/config.js.map +2 -2
- package/dist/mcp/handlers/memory.js +17 -5
- package/dist/mcp/handlers/memory.js.map +2 -2
- package/dist/mcp/handlers/security.js +13 -2
- package/dist/mcp/handlers/security.js.map +2 -2
- package/dist/mcp/handlers/wiki.js +11 -1
- package/dist/mcp/handlers/wiki.js.map +2 -2
- package/dist/mcp/tools.js +4 -4
- package/dist/mcp/tools.js.map +2 -2
- package/dist/memory/index.js +40 -10
- package/dist/memory/index.js.map +2 -2
- package/dist/memory/relation-display.js +37 -0
- package/dist/memory/relation-display.js.map +7 -0
- package/dist/patterns/library/sql-injection-concat-js.yaml +3 -0
- package/dist/patterns/library/sql-injection-template-js.yaml +4 -0
- package/dist/security/attack-surface.js +20 -2
- package/dist/security/attack-surface.js.map +2 -2
- package/dist/security/data-flows.js +0 -10
- package/dist/security/data-flows.js.map +2 -2
- package/dist/wiki/index.js +15 -2
- package/dist/wiki/index.js.map +2 -2
- package/dist/wiki/lint.js +23 -11
- package/dist/wiki/lint.js.map +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,11 +41,11 @@ The result is fewer tool calls, less context used, and faster responses on compl
|
|
|
41
41
|
| 🏛️ **Architecture Analysis** | Package graph, layer detection, coupling metrics (Ca/Ce/instability) |
|
|
42
42
|
| 📸 **Snapshots & Diff** | Save graph state before refactors, diff after to verify structural changes |
|
|
43
43
|
| <h4>Security</h4> | |
|
|
44
|
-
| 🔒 **Security (KiroGraph-Sec opt-in module)** | Goes beyond "this dependency has a CVE" — uses the call graph to determine if vulnerable code is **actually reachable** from your entry points. Maps your **attack surface** (which HTTP routes reach vulnerable deps). Detects **hardcoded secrets** and shows how many entry points expose them. **SAST-lite** finds SQL injection, path traversal, and dangerous eval in your code. **AST-based SAST (opt-in via `enablePatterns`)** runs 10 bundled structural pattern rules via `@ast-grep/napi` — matches actual code structure, not just symbol names. **Supply chain health** checks OpenSSF Scorecard scores and detects dependency confusion attacks. Covers 14 ecosystems, outputs CycloneDX SBOM/VEX and CI-ready SARIF reports. |
|
|
44
|
+
| 🔒 **Security (KiroGraph-Sec opt-in module)** | Goes beyond "this dependency has a CVE" — uses the call graph to determine if vulnerable code is **actually reachable** from your entry points. Maps your **attack surface** (which HTTP routes reach vulnerable deps). Detects **hardcoded secrets** and shows how many entry points expose them. **SAST-lite** finds SQL injection, path traversal, and dangerous eval in your code. **AST-based SAST (opt-in via `enablePatterns`)** runs 10 bundled structural pattern rules via `@ast-grep/napi` — matches actual code structure, not just symbol names. **Supply chain health** checks OpenSSF Scorecard scores and detects dependency confusion attacks. **Auth detection (opt-in via `securityAuthDetectionMode: 'jev'`)** ⚠️ *experimental*: backstops the `attack-surface` heuristic — catches custom-named auth wrappers a substring match misses. Covers 14 ecosystems, outputs CycloneDX SBOM/VEX and CI-ready SARIF reports. |
|
|
45
45
|
| <h4>Knowledge & Data</h4> | |
|
|
46
|
-
| 🧠 **Persistent Memory (KiroGraph-Mem opt-in module)** | Cross-session observations — decisions, errors, patterns — auto-linked to code symbols. **Conflict detection**: typed relations between observations (`supersedes`, `conflicts_with`, `compatible`) with agent judgment workflow (`kirograph_mem_compare`, `kirograph_mem_judge`). **Stale review**: schedule observations for re-evaluation (`review_after` + `kirograph_mem_review`). **Passive capture**: extract learnings from structured text. **Prompt saving**: session context reconstruction. **Topic key**: stable semantic addressing. **Strict writes (opt-in via `memoryStrictWrites`)**: rejects an unknown `kind` or blank tags instead of silently corrupting the store. **Typed fields (opt-in via `memorySchemaValidation`)**: observations can carry structured `fields` beyond free-text `content`, validated per `kind` against a JSON Schema registered at `.kirograph/memory-schemas/<kind>.schema.json` — a kind with no schema is never validated. Inspired by [Engram](https://github.com/Gentleman-Programming/engram), [IWE](https://github.com/iwe-org/iwe)'s schema-validated agent writes, and [tmd](https://github.com/alfonsograziano/tmd)'s per-type schema registration. |
|
|
46
|
+
| 🧠 **Persistent Memory (KiroGraph-Mem opt-in module)** | Cross-session observations — decisions, errors, patterns — auto-linked to code symbols. **Conflict detection**: typed relations between observations (`supersedes`, `conflicts_with`, `compatible`) with agent judgment workflow (`kirograph_mem_compare`, `kirograph_mem_judge`). **Stale review**: schedule observations for re-evaluation (`review_after` + `kirograph_mem_review`). **Passive capture**: extract learnings from structured text. **Prompt saving**: session context reconstruction. **Topic key**: stable semantic addressing. **Strict writes (opt-in via `memoryStrictWrites`)**: rejects an unknown `kind` or blank tags instead of silently corrupting the store. **Relation classification (opt-in via `memoryRelationMode: 'jev'`)** ⚠️ *experimental*: auto-classifies and auto-judges high-confidence relations instead of requiring a full agent turn to reason out its own answer. **Typed fields (opt-in via `memorySchemaValidation`)**: observations can carry structured `fields` beyond free-text `content`, validated per `kind` against a JSON Schema registered at `.kirograph/memory-schemas/<kind>.schema.json` — a kind with no schema is never validated. Inspired by [Engram](https://github.com/Gentleman-Programming/engram), [IWE](https://github.com/iwe-org/iwe)'s schema-validated agent writes, [jev](https://docs.typesafe.ai), and [tmd](https://github.com/alfonsograziano/tmd)'s per-type schema registration. |
|
|
47
47
|
| 👁️ **Watchmen (KiroGraph-Watchmen opt-in module)** ⚠️ *experimental* | Auto-synthesizes accumulated memory observations into workspace briefs and `inclusion: manual` skill files. Fires via the `watchmenReady` signal in `kirograph_mem_store` when threshold is reached. **Local model** (default, `watchmenSynthesisMode: 'local'`): runs `gemma-4-E4B-it-ONNX` on-device via `@huggingface/transformers` — ~3–4 GB one-time download, ~3–5 GB RAM, 8–15 s on Apple Silicon M1+. No API key, no background daemon, no external calls. **Agent mode** also available for Kiro (`watchmenSynthesisMode: 'agent'`, uses active session). ⚠️ **Experimental:** output quality in local mode depends heavily on the model chosen and your hardware. Smaller models or slower machines may produce incomplete briefs and lower-quality skill files. Use `agent` mode for best results. |
|
|
48
|
-
| 📚 **Wiki (KiroGraph-Wiki opt-in module)** | Karpathy-style LLM wiki — a set of markdown pages that compound knowledge across sessions. Three ops: **ingest** (build structured prompt from source text), **apply-diff** (write LLM-generated WIKI_DIFF to SQLite + disk), **lint** (broken links, orphan pages, contradictions). **Link graph** (`kirograph wiki links <slug>`): outgoing/broken/incoming `[[slug]]` backlinks for a page. **Rename** (`kirograph wiki rename <from> <to>`): moves a page's file and rewrites every `[[slug]]` reference to it across the wiki — a CLI-first port of the navigation/refactor features [IWE](https://github.com/iwe-org/iwe) gets from a full LSP. Context enrichment: `kirograph_context` auto-includes relevant wiki pages above score threshold. Two synthesis modes: `agent` (IDE LLM) or `local` (HuggingFace, same infra as Watchmen). Conflict resolution: deterministic by source date when `wikiAutoResolveConflicts: true`. **Typed pages (opt-in via `wikiTypedPages`)**: a page may declare `_type: <type>` in a YAML frontmatter block, validated by `wiki lint` against a JSON Schema registered at `.kirograph/wiki-schemas/<type>.schema.json` — pages with no frontmatter, or a `_type` with no schema, are never validated. Inspired by [Karpathy's LLM Wiki pattern](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f), [IWE](https://github.com/iwe-org/iwe), and [tmd](https://github.com/alfonsograziano/tmd)'s per-type schema registration. |
|
|
48
|
+
| 📚 **Wiki (KiroGraph-Wiki opt-in module)** | Karpathy-style LLM wiki — a set of markdown pages that compound knowledge across sessions. Three ops: **ingest** (build structured prompt from source text), **apply-diff** (write LLM-generated WIKI_DIFF to SQLite + disk), **lint** (broken links, orphan pages, contradictions). **Link graph** (`kirograph wiki links <slug>`): outgoing/broken/incoming `[[slug]]` backlinks for a page. **Rename** (`kirograph wiki rename <from> <to>`): moves a page's file and rewrites every `[[slug]]` reference to it across the wiki — a CLI-first port of the navigation/refactor features [IWE](https://github.com/iwe-org/iwe) gets from a full LSP. **Contradiction detection (opt-in via `wikiContradictionMode: 'jev'`)** ⚠️ *experimental*: replaces the keyword heuristic with an actual judgment call on each FTS-similar page pair. Context enrichment: `kirograph_context` auto-includes relevant wiki pages above score threshold. Two synthesis modes: `agent` (IDE LLM) or `local` (HuggingFace, same infra as Watchmen). Conflict resolution: deterministic by source date when `wikiAutoResolveConflicts: true`. **Typed pages (opt-in via `wikiTypedPages`)**: a page may declare `_type: <type>` in a YAML frontmatter block, validated by `wiki lint` against a JSON Schema registered at `.kirograph/wiki-schemas/<type>.schema.json` — pages with no frontmatter, or a `_type` with no schema, are never validated. Inspired by [Karpathy's LLM Wiki pattern](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f), [IWE](https://github.com/iwe-org/iwe), [jev](https://docs.typesafe.ai), and [tmd](https://github.com/alfonsograziano/tmd)'s per-type schema registration. |
|
|
49
49
|
| 📖 **Documentation Indexing (KiroGraph-Doc opt-in module)** | Section-level retrieval from Markdown, MDX, RST, AsciiDoc, OpenAPI — 92-97% token savings |
|
|
50
50
|
| 📊 **Data Navigation (KiroGraph-Data opt-in module)** | Query CSV/JSON/Excel/Parquet/**PDF** with filters, aggregations, joins — all server-side in SQLite |
|
|
51
51
|
| <h4>Token Optimization</h4> | |
|
|
@@ -187,6 +187,7 @@ KiroGraph is inspired by [CodeGraph](https://github.com/colbymchenry/codegraph)
|
|
|
187
187
|
- [turboquant-js](https://github.com/danilodevhub/turboquant-js) by [Danilo Dev](https://github.com/danilodevhub): the TurboQuant engine — TypeScript implementation of Google's Walsh-Hadamard + Lloyd-Max quantization algorithm used for embedding compression.
|
|
188
188
|
- [turbovec](https://github.com/RyanCodrai/turbovec) by [Ryan Codrai](https://github.com/RyanCodrai): the TurboVec engine — Rust implementation of TurboQuant with SIMD acceleration, exposed to Node.js via a napi-rs native addon.
|
|
189
189
|
- [pdf-inspector](https://github.com/firecrawl/pdf-inspector) by [Firecrawl](https://github.com/firecrawl): the PDF parser used in the data module — pure Rust, no OCR, no network, prebuilt binaries for linux-x64 and macOS ARM64.
|
|
190
|
+
- [jev](https://docs.typesafe.ai) by [TypeSafe](https://typesafe.ai) ⚠️ *experimental*: the fast typed-classification model (System One) powering the opt-in `memoryRelationMode`, `wikiContradictionMode`, and `securityAuthDetectionMode: 'jev'` toggles — a calibrated Choice/Score/Noul answer in place of a full agent turn for narrow classification decisions. The only KiroGraph feature requiring a paid external API key; set it via `JEV_API_KEY` in `.kirograph/.env` (gitignored, never in `config.json`) — see [Configuration](docs/guide/configuration.md#jev). Classification quality and API stability haven't been exercised in production yet; each toggle falls back to its existing non-jev behavior when unset.
|
|
190
191
|
- [tokensave](https://tokensave.dev): gap-close roadmap inspiration — code quality tools (complexity, god class, recursion, doc coverage), git workflow context tools (diff_context, commit_context, test_map), atomic edit primitives, multi-branch indexing, per-call token metrics, and MCP protocol annotations (`readOnlyHint`, `alwaysLoad`).
|
|
191
192
|
|
|
192
193
|
### Contributors
|
|
@@ -67,8 +67,21 @@ function register(program) {
|
|
|
67
67
|
const db = cg.getDatabase();
|
|
68
68
|
db.applySecuritySchema();
|
|
69
69
|
const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require("../../security/attack-surface.js"));
|
|
70
|
-
const analyzer = new AttackSurfaceAnalyzer(db
|
|
71
|
-
|
|
70
|
+
const analyzer = new AttackSurfaceAnalyzer(db, {
|
|
71
|
+
authDetectionMode: config.securityAuthDetectionMode,
|
|
72
|
+
authConfidenceThreshold: config.securityAuthConfidenceThreshold,
|
|
73
|
+
jevApiKey: config.jevApiKey,
|
|
74
|
+
jevBaseUrl: config.jevBaseUrl,
|
|
75
|
+
jevModel: config.jevModel
|
|
76
|
+
});
|
|
77
|
+
let result;
|
|
78
|
+
try {
|
|
79
|
+
result = await analyzer.analyze();
|
|
80
|
+
} catch (err) {
|
|
81
|
+
console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);
|
|
82
|
+
cg.close();
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
72
85
|
cg.close();
|
|
73
86
|
let routes = opts.publicOnly ? result.allRoutes.filter((r) => r.exposureLevel === "public") : result.allRoutes;
|
|
74
87
|
const limited = routes.slice(0, limit);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/commands/attack-surface.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, section } from '../ui';\nimport type { AttackSurfaceEntry } from '../../security/attack-surface';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\n\nexport function register(program: Command): void {\n program\n .command('attack-surface [projectPath]')\n .description('Map HTTP routes to reachable vulnerable dependencies')\n .option('--limit <n>', 'Max routes to show (default: 20)', '20')\n .option('--public-only', 'Show only public/unauthenticated routes')\n .option('--format <fmt>', 'Output format: text, json (default: text)', 'text')\n .action(async (\n projectPath: string | undefined,\n opts: { limit: string; publicOnly?: boolean; format: string },\n ) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${yellow}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const limit = parseInt(opts.limit, 10);\n if (isNaN(limit) || limit < 1) {\n console.error(` \u2716 Invalid --limit value: ${opts.limit}. Must be a positive integer.`);\n process.exit(1);\n }\n\n const validFormats = ['text', 'json'];\n if (!validFormats.includes(opts.format)) {\n console.error(` \u2716 Invalid --format value: ${opts.format}. Use: text, json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require('../../security/attack-surface.js'));\n const analyzer = new AttackSurfaceAnalyzer(db);\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,WAAsB;AACtB,oBAA2B;AAC3B,gBAAkD;AAGlD,MAAM,MAAS;AACf,MAAM,SAAS;AAER,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,8BAA8B,EACtC,YAAY,sDAAsD,EAClE,OAAO,eAAe,oCAAoC,IAAI,EAC9D,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,kBAAkB,6CAA6C,MAAM,EAC5E,OAAO,OACN,aACA,SACG;AACH,UAAM,SAAS,KAAK,QAAQ,eAAe,QAAQ,IAAI,CAAC;AACxD,UAAM,SAAS,UAAM,0BAAW,MAAM;AAEtC,QAAI,CAAC,OAAO,gBAAgB;AAC1B,cAAQ,MAAM;AAAA,IAAO,MAAM,wCAAmC,eAAK,EAAE;AACrE,cAAQ,MAAM,KAAK,aAAG,uCAAuC,eAAK,IAAI,gBAAM,GAAG,cAAI,yBAAyB,eAAK,EAAE;AACnH,cAAQ,MAAM,KAAK,aAAG,eAAe,eAAK,IAAI,gBAAM,GAAG,cAAI,kBAAkB,eAAK;AAAA,CAAI;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,QAAQ,SAAS,KAAK,OAAO,EAAE;AACrC,QAAI,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC7B,cAAQ,MAAM,mCAA8B,KAAK,KAAK,+BAA+B;AACrF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,eAAe,CAAC,QAAQ,MAAM;AACpC,QAAI,CAAC,aAAa,SAAS,KAAK,MAAM,GAAG;AACvC,cAAQ,MAAM,oCAA+B,KAAK,MAAM,mBAAmB;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,QAAI,CAAC,UAAU,cAAc,MAAM,GAAG;AACpC,cAAQ,MAAM,yDAAoD;AAClE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,KAAK,MAAM,UAAU,KAAK,MAAM;AACtC,UAAM,KAAK,GAAG,YAAY;AAC1B,OAAG,oBAAoB;AAEvB,UAAM,EAAE,sBAAsB,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,kCAAkC,CAAC;AAChH,UAAM,WAAW,IAAI,sBAAsB,
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport * as path from 'path';\nimport { loadConfig } from '../../config';\nimport { dim, reset, violet, bold, section } from '../ui';\nimport type { AttackSurfaceEntry } from '../../security/attack-surface';\n\nconst red = '\\x1b[31m';\nconst yellow = '\\x1b[33m';\n\nexport function register(program: Command): void {\n program\n .command('attack-surface [projectPath]')\n .description('Map HTTP routes to reachable vulnerable dependencies')\n .option('--limit <n>', 'Max routes to show (default: 20)', '20')\n .option('--public-only', 'Show only public/unauthenticated routes')\n .option('--format <fmt>', 'Output format: text, json (default: text)', 'text')\n .action(async (\n projectPath: string | undefined,\n opts: { limit: string; publicOnly?: boolean; format: string },\n ) => {\n const target = path.resolve(projectPath ?? process.cwd());\n const config = await loadConfig(target);\n\n if (!config.enableSecurity) {\n console.error(`\\n ${yellow}\u26A0 Security analysis is disabled.${reset}`);\n console.error(` ${dim}Enable it in .kirograph/config.json:${reset} ${violet}${bold}\"enableSecurity\": true${reset}`);\n console.error(` ${dim}Then re-run:${reset} ${violet}${bold}kirograph index${reset}\\n`);\n process.exit(1);\n }\n\n const limit = parseInt(opts.limit, 10);\n if (isNaN(limit) || limit < 1) {\n console.error(` \u2716 Invalid --limit value: ${opts.limit}. Must be a positive integer.`);\n process.exit(1);\n }\n\n const validFormats = ['text', 'json'];\n if (!validFormats.includes(opts.format)) {\n console.error(` \u2716 Invalid --format value: ${opts.format}. Use: text, json`);\n process.exit(1);\n }\n\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n if (!KiroGraph.isInitialized(target)) {\n console.error(' \u2716 KiroGraph not initialized. Run: kirograph init');\n process.exit(1);\n }\n\n const cg = await KiroGraph.open(target);\n const db = cg.getDatabase();\n db.applySecuritySchema();\n\n const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require('../../security/attack-surface.js'));\n const analyzer = new AttackSurfaceAnalyzer(db, {\n authDetectionMode: config.securityAuthDetectionMode,\n authConfidenceThreshold: config.securityAuthConfidenceThreshold,\n jevApiKey: config.jevApiKey,\n jevBaseUrl: config.jevBaseUrl,\n jevModel: config.jevModel,\n });\n let result;\n try {\n result = await analyzer.analyze();\n } catch (err) {\n console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);\n cg.close(); process.exit(1);\n }\n\n cg.close();\n\n // Apply --public-only filter\n let routes = opts.publicOnly\n ? result.allRoutes.filter(r => r.exposureLevel === 'public')\n : result.allRoutes;\n\n // Apply limit\n const limited = routes.slice(0, limit);\n\n // \u2500\u2500 JSON output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (opts.format === 'json') {\n console.log(JSON.stringify(\n {\n totalRoutes: result.totalRoutes,\n publicRoutes: result.publicRoutes,\n authenticatedRoutes: result.authenticatedRoutes,\n routesWithVulns: result.routesWithVulns,\n criticalPaths: result.criticalPaths,\n routes: limited,\n },\n null,\n 2,\n ));\n return;\n }\n\n // \u2500\u2500 Text output \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const totalLabel = result.totalRoutes === 1 ? 'route' : 'routes';\n console.log(\n `\\n ${section('Attack Surface')} ` +\n `${dim}(${result.totalRoutes} ${totalLabel} total: ${result.publicRoutes} public, ${result.authenticatedRoutes} authenticated)${reset}\\n`,\n );\n\n if (result.criticalPaths.length === 0) {\n console.log(` ${dim}No routes reaching vulnerable dependencies found.${reset}\\n`);\n return;\n }\n\n // Critical paths section\n console.log(` ${violet}${bold}\u25CF Critical paths${reset} ${dim}(routes reaching affected vulnerabilities)${reset}\\n`);\n\n const criticalToShow = result.criticalPaths.slice(0, limit);\n\n for (const entry of criticalToShow) {\n printRouteEntry(entry);\n }\n\n // If public-only was not set, also show clean routes summary\n if (!opts.publicOnly) {\n const cleanCount = result.totalRoutes - result.routesWithVulns;\n if (cleanCount > 0) {\n console.log(` ${dim}+ ${cleanCount} clean route${cleanCount === 1 ? '' : 's'} (no reachable vulnerabilities)${reset}\\n`);\n }\n }\n });\n}\n\nfunction printRouteEntry(entry: AttackSurfaceEntry): void {\n const isPublicVuln = entry.exposureLevel === 'public' && entry.vulnerableDeps.length > 0;\n const isAuthVuln = (entry.exposureLevel === 'authenticated' || entry.exposureLevel === 'internal') && entry.vulnerableDeps.length > 0;\n\n const routeColor = isPublicVuln ? red : isAuthVuln ? yellow : dim;\n const riskLabel = entry.riskScore > 0 ? `${entry.riskScore.toFixed(1)}` : '?';\n\n // Exposure badge\n const exposureBadge = (() => {\n switch (entry.exposureLevel) {\n case 'public': return `${red}public${reset} `;\n case 'authenticated': return `${yellow}authenticated${reset}`;\n case 'internal': return `${dim}internal${reset} `;\n default: return `${dim}unknown${reset} `;\n }\n })();\n\n // Pick the top vuln by riskScore to show inline\n const topVuln = entry.vulnerableDeps.reduce<AttackSurfaceEntry['vulnerableDeps'][0] | null>(\n (best, v) => {\n if (!best) return v;\n if ((v.riskScore ?? 0) > (best.riskScore ?? 0)) return v;\n return best;\n },\n null,\n );\n\n let vulnSuffix = '';\n if (topVuln) {\n const hopWord = topVuln.hopCount === 1 ? '1 hop' : `${topVuln.hopCount} hops`;\n vulnSuffix = ` ${dim}\u2192${reset} ${violet}${topVuln.packageName}${reset} ${dim}${topVuln.cveId}${reset} ${dim}(${hopWord})${reset}`;\n if (entry.vulnerableDeps.length > 1) {\n vulnSuffix += ` ${dim}+${entry.vulnerableDeps.length - 1} more${reset}`;\n }\n }\n\n console.log(\n ` ${routeColor}[${riskLabel}]${reset} ${bold}${entry.route.padEnd(30)}${reset} ${exposureBadge}${vulnSuffix}`,\n );\n\n // Pattern matches below the route line\n for (const pm of entry.patternMatches) {\n const sevUpper = pm.severity.toUpperCase();\n const pmColor = pm.severity === 'critical' ? red : pm.severity === 'high' ? yellow : dim;\n console.log(\n ` ${pmColor}\u26A0 [${sevUpper}]${reset} ${dim}${pm.patternId}${reset} ${dim}at${reset} ${pm.symbolName}:${pm.line}`,\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -285,7 +285,7 @@ const GROUPS = [
|
|
|
285
285
|
{ name: "wiki search", args: "<query>", desc: "Full-text search over wiki pages", opts: ["--limit <n> Max results"] },
|
|
286
286
|
{ name: "wiki page", args: "<slug>", desc: "Print the full content of a wiki page" },
|
|
287
287
|
{ name: "wiki list", desc: "List all wiki pages" },
|
|
288
|
-
{ name: "wiki lint", desc:
|
|
288
|
+
{ name: "wiki lint", desc: 'Health check the wiki for broken links, orphans, contradictions. wikiContradictionMode: "jev" replaces the keyword heuristic with an actual judgment call.' },
|
|
289
289
|
{ name: "wiki links", args: "<slug>", desc: "Show outgoing, broken, and incoming [[slug]] links for a page" },
|
|
290
290
|
{ name: "wiki rename", args: "<from> <to>", desc: "Rename a page slug, moving its file and updating every [[slug]] reference to it" },
|
|
291
291
|
{ name: "wiki reindex", desc: "Rebuild SQLite index from .kirograph/wiki/*.md files" },
|
|
@@ -315,6 +315,8 @@ const GROUPS = [
|
|
|
315
315
|
{ name: "mem lint", desc: "Health check and auto-repair", opts: ["--fix Auto-fix issues"] },
|
|
316
316
|
{ name: "mem reembed", desc: "Re-embed all observations after model change" },
|
|
317
317
|
{ name: "mem conflicts list", desc: "List pending conflict relations" },
|
|
318
|
+
{ name: "mem conflicts compare", args: "<a> <b>", desc: 'Establish a relation between two observations. With memoryRelationMode: "jev", omit --relation to classify it automatically.', opts: ["--relation <type> supersedes | conflicts_with | compatible | scoped | related | not_conflict"] },
|
|
319
|
+
{ name: "mem conflicts judge", args: "<id>", desc: "Finalize a pending relation", opts: ["--relation <type>", "--confidence <n>"] },
|
|
318
320
|
{ name: "mem conflicts ignore", args: "<id>", desc: "Dismiss a pending conflict relation" },
|
|
319
321
|
{ name: "mem watchmen status", desc: "Show watchmen observation counter and last synthesis time" },
|
|
320
322
|
{ name: "mem watchmen synthesize", desc: "Run watchmen synthesis: produce brief and/or skill files" },
|
|
@@ -384,7 +386,7 @@ const GROUPS = [
|
|
|
384
386
|
{ name: "security secrets", args: "[path]", desc: "Scan for hardcoded secrets with call-graph blast radius", opts: ["--include-tests Include test files", "--severity <s> Filter level", "--format json"] },
|
|
385
387
|
{ name: "security flows", args: "[path]", desc: "SAST-lite: detect dangerous data flows (SQL injection, eval, path traversal, etc.)", opts: ["--type sql|eval|deserialize|path|all", "--format json"] },
|
|
386
388
|
{ name: "security ci-report", args: "[path]", desc: "Generate CI/CD security report (JSON, SARIF for GitHub, or text)", opts: ["--format json|sarif|text", "--fail-on affected|any|critical", "--output <file>"] },
|
|
387
|
-
{ name: "attack-surface", args: "[path]", desc:
|
|
389
|
+
{ name: "attack-surface", args: "[path]", desc: 'Map attack surface: routes \u2192 vulnerable deps with hop count and auth status. securityAuthDetectionMode: "jev" catches custom-named auth wrappers the heuristic misses.', opts: ["--limit <n>", "--public-only", "--format json"] },
|
|
388
390
|
{ name: "supply-chain", args: "[path]", desc: "Supply chain health: OpenSSF Scorecard, maintainer count, abandoned packages", opts: ["--threshold critical|high|medium", "--refresh", "--format json"] },
|
|
389
391
|
{ name: "dep-confusion", args: "[path]", desc: "Detect dependency confusion: internal packages that exist in public registries", opts: ["--format json"] },
|
|
390
392
|
{ name: "remediation", args: "[path]", desc: "Remediation SLA tracking: days open, fix available since, overdue alerts", opts: ["--overdue-only", "--format json"] },
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bin/commands/help.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from 'commander';\nimport { printBanner } from '../banner';\n\ntype CommandEntry = { name: string; args?: string; desc: string; opts?: string[] };\ntype Group = { icon: string; title: string; commands: CommandEntry[]; examples: [string, string][] };\n\nconst c = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n violet: '\\x1b[38;5;99m',\n purple: '\\x1b[38;5;135m',\n lavender: '\\x1b[38;5;141m',\n paleLavender: '\\x1b[38;5;183m',\n gray: '\\x1b[90m',\n brown: '\\x1b[38;5;130m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n underline: '\\x1b[4m',\n};\n\nconst GROUPS: Group[] = [\n {\n icon: '\uD83D\uDD27', title: 'Setup',\n commands: [\n { name: 'install', desc: 'Wire up MCP/instructions for an agent workspace', opts: ['--target <t> kiro | cursor | claude | windsurf | ...', 'Kiro install: prompts to import global hooks'] },\n { name: 'init', args: '[path]', desc: 'Initialize KiroGraph in a project', opts: ['-i, --index Index immediately after init'] },\n { name: 'uninit', args: '[path]', desc: 'Remove KiroGraph from a project', opts: ['--force Skip confirmation', '--target <t> Target to clean up (or \"all\")'] },\n { name: 'hook', desc: 'Manage global Kiro hooks in ~/.kirograph/hooks/', opts: ['save [path] Save workspace hooks to global store', 'import [path] Import global hooks into workspace', 'list List saved global hooks', '--all Save or import all without prompting (save/import)'] },\n { name: 'doctor', args: '[path]', desc: 'Health check: index, config, hooks, and permissions', opts: ['--fix Auto-repair fixable issues'] },\n ],\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering'],\n ['kirograph install --target claude', 'Wire up Claude Code MCP + project memory'],\n ['kirograph init --index', 'Init and immediately index'],\n ['kirograph hook save', 'Save workspace hooks to your global library'],\n ['kirograph hook import', 'Import global hooks into this project'],\n ['kirograph doctor --fix', 'Check and auto-repair installation issues'],\n ],\n },\n {\n icon: '\uD83D\uDCE6', title: 'Indexing',\n commands: [\n { name: 'index', args: '[path]', desc: 'Full re-index of a project', opts: ['--force Force re-index all files'] },\n { name: 'sync', args: '[path]', desc: 'Incremental sync of changed files', opts: ['--files <f> Specific files to sync'] },\n { name: 'sync-if-dirty', args: '[path]', desc: 'Sync only if a dirty marker is present', opts: ['-q, --quiet Suppress output'] },\n { name: 'mark-dirty', args: '[path]', desc: 'Write a dirty marker for deferred sync' },\n { name: 'unlock', args: '[path]', desc: 'Force-release a stale lock file' },\n ],\n examples: [\n ['kirograph sync', 'Incremental sync of changed files'],\n ['kirograph index --force', 'Force full re-index'],\n ],\n },\n {\n icon: '\uD83D\uDD0D', title: 'Search',\n commands: [\n { name: 'status', args: '[path]', desc: 'Show index statistics and health' },\n { name: 'query', args: '<search>', desc: 'Search for symbols by name', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'context', args: '<task>', desc: 'Build relevant code context for a task', opts: ['--max-nodes <n> Max symbols', '--no-code Exclude code', '--format <f> markdown | json'] },\n { name: 'files', args: '[path]', desc: 'Show project file structure', opts: ['--format <f> tree | flat | grouped | compact', '--filter <p> Directory prefix', '--pattern <g> Glob'] },\n { name: 'path', args: '<from> <to>', desc: 'Shortest dependency path between two symbols' },\n { name: 'affected', args: '[files...]', desc: 'Find test files affected by changed source files', opts: ['--stdin Read from stdin', '-d <n> Depth', '-q Quiet'] },\n { name: 'callers', args: '<symbol>', desc: 'List symbols that call a given function or method', opts: ['--limit <n> Max results'] },\n { name: 'callees', args: '<symbol>', desc: 'List symbols called by a given function or method', opts: ['--limit <n> Max results'] },\n { name: 'impact', args: '<symbol>', desc: 'Show symbols affected by changing a given symbol', opts: ['-d, --depth <n> Max traversal depth'] },\n ],\n examples: [\n ['kirograph query useState', 'Find symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get context for a task'],\n ['kirograph callers parseToken', 'Who calls parseToken?'],\n ['kirograph callees handleRequest', 'What does handleRequest call?'],\n ['kirograph impact UserService', 'What breaks if UserService changes?'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from git diff'],\n ],\n },\n {\n icon: '\uD83D\uDCCA', title: 'Insights',\n commands: [\n { name: 'hotspots', args: '[path]', desc: 'Most-connected symbols by edge degree', opts: ['--limit <n> Max results', '--format <f> table | json'] },\n { name: 'surprising', args: '[path]', desc: 'Non-obvious cross-file connections', opts: ['--limit <n> Max results'] },\n { name: 'dead-code', args: '[path]', desc: 'Unreferenced unexported symbols', opts: ['--limit <n> Max results'] },\n { name: 'circular-deps', args: '[path]', desc: 'Find circular dependency cycles', opts: ['-j, --json JSON output'] },\n { name: 'largest', args: '[path]', desc: 'Symbols ranked by lines of code', opts: ['--limit <n> Max results'] },\n { name: 'rank', args: '[path]', desc: 'Symbols ranked by fan-in or fan-out edge count', opts: ['--by <by> fan-in | fan-out'] },\n { name: 'distribution', args: '[dir]', desc: 'Symbol-kind breakdown per file or directory', opts: ['--limit <n> Max results'] },\n { name: 'god-class', args: '[path]', desc: 'Classes ranked by member count (god-class risk)', opts: ['--limit <n> Max results'] },\n { name: 'gini', args: '[path]', desc: 'Gini inequality coefficient of a metric', opts: ['--metric <m> loc | fan-in | fan-out'] },\n { name: 'snapshot', desc: 'Save/list/diff graph snapshots', opts: ['save [label]', 'list', 'diff [label] --format summary|full|json'] },\n { name: 'export', desc: 'Interactive graph dashboard', opts: ['build [path] Generate HTML', 'start [path] Generate and open'] },\n ],\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph circular-deps', 'Find all circular dependency cycles'],\n ['kirograph largest --limit 20', 'Biggest functions by LOC'],\n ['kirograph god-class', 'Find potential god classes'],\n ['kirograph snapshot save pre-refactor', 'Save before a refactor'],\n ['kirograph export start', 'Open the graph dashboard'],\n ],\n },\n {\n icon: '\uD83C\uDFDB\uFE0F', title: 'Architecture',\n commands: [\n { name: 'architecture', args: '[path]', desc: 'Package graph and layer map', opts: ['--packages Packages only', '--layers Layers only'] },\n { name: 'coupling', args: '[path]', desc: 'Coupling metrics per package', opts: ['--sort <s> instability | ca | ce | name', '--package <n> Detail view'] },\n { name: 'package', args: '<name>', desc: 'Inspect a package', opts: ['--no-files Omit file list'] },\n { name: 'type-hierarchy', args: '<symbol>', desc: 'Traverse base/derived types of a class or interface', opts: ['--direction <dir> up | down | both'] },\n { name: 'communities', args: '[path]', desc: 'Detect code communities (clusters of related symbols)' },\n { name: 'manifest', args: '[path]', desc: 'Workspace manifest: packages, versions, licenses, version drift' },\n ],\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Packages ranked by instability'],\n ['kirograph type-hierarchy UserRepository --direction up', 'What interfaces does this implement?'],\n ['kirograph communities', 'Find tightly coupled clusters'],\n ['kirograph manifest', 'Show all dependency versions and drift'],\n ],\n },\n {\n icon: '\uD83C\uDFE5', title: 'Code Health',\n commands: [\n { name: 'module-api', args: '[path]', desc: 'List all exported symbols in a file or directory', opts: ['--limit <n> Max results'] },\n { name: 'rename-preview', args: '<symbol>', desc: 'Show all reference sites for a symbol before renaming', opts: ['--limit <n> Max results'] },\n { name: 'doc-coverage', args: '[path]', desc: 'Find exported symbols missing docstrings', opts: ['--limit <n> Max results'] },\n { name: 'inheritance-depth', args: '[path]', desc: 'Find deepest inheritance chains', opts: ['--limit <n> Max results'] },\n { name: 'recursion', args: '[path]', desc: 'Find recursive and mutually-recursive functions', opts: ['--limit <n> Max results'] },\n { name: 'annotations', args: '[path]', desc: 'Decorator/attribute histogram across the codebase', opts: ['--decorator <name> Filter by name'] },\n { name: 'unused-imports', args: '[path]', desc: 'Find import nodes with zero resolved downstream edges', opts: ['--limit <n> Max results'] },\n { name: 'dependency-depth', args: '[path]', desc: 'Topological depth of each file in the import graph', opts: ['--limit <n> Max files'] },\n { name: 'session', desc: 'Save or compare session baselines for tracking changes', opts: ['start Start a session baseline', 'end Compare current state to baseline'] },\n { name: 'refactor', desc: 'Refactoring tools: rename preview and community-driven suggestions', opts: ['rename <symbol> Preview rename locations', 'suggest Get refactoring suggestions'] },\n ],\n examples: [\n ['kirograph module-api src/auth', 'List public API of the auth module'],\n ['kirograph rename-preview handleLogin', 'Find all sites before renaming'],\n ['kirograph doc-coverage', 'Find undocumented exports'],\n ['kirograph unused-imports', 'Find dead import statements'],\n ['kirograph session start && <edit> && kirograph session end', 'Diff graph before and after a change'],\n ],\n },\n {\n icon: '\uD83D\uDD2C', title: 'Analysis',\n commands: [\n { name: 'complexity', args: '[path]', desc: 'Rank functions by cyclomatic, cognitive, and maintainability score', opts: ['--limit <n> Max results'] },\n { name: 'simplify-scan', args: '[path]', desc: 'Find candidates for simplification by complexity and dead code', opts: ['--limit <n> Max results'] },\n { name: 'health', args: '[path]', desc: 'Composite codebase health score (0-10000) with grade' },\n { name: 'dsm', args: '[path]', desc: 'Design Structure Matrix \u2014 detect strongly coupled module groups', opts: ['--limit <n> Max groups'] },\n { name: 'test-risk', args: '[path]', desc: 'Rank untested code by risk score (complexity \u00D7 fan-in)', opts: ['--limit <n> Max results'] },\n { name: 'test-coverage', args: '[path]', desc: 'Show test coverage gaps from lcov/Istanbul reports', opts: ['--sort <order> asc (worst first) | desc'] },\n ],\n examples: [\n ['kirograph health', 'Get overall health score and grade'],\n ['kirograph complexity --limit 10', 'Top 10 most complex functions'],\n ['kirograph test-risk', 'Which untested code is highest risk?'],\n ['kirograph test-coverage', 'Show worst-covered files first'],\n ['kirograph dsm', 'Find tightly coupled module groups'],\n ],\n },\n {\n icon: '\uD83C\uDF3F', title: 'Git',\n commands: [\n { name: 'diff-context', args: '[path]', desc: 'Changed symbols, their callers/callees, and affected tests', opts: ['--staged Use staged changes only'] },\n { name: 'commit-context', args: '[path]', desc: 'Structured summary of staged changes for a commit message' },\n { name: 'pr-context', args: '<base> [head]', desc: 'Semantic diff between two git refs for PR descriptions', opts: ['--format <fmt> text | json'] },\n { name: 'changelog', args: '<ref1> <ref2>', desc: 'Human-readable semantic diff between two git refs' },\n { name: 'test-map', args: '[symbol]', desc: 'Map symbols to test files; show uncovered symbols', opts: ['--limit <n> Max results'] },\n ],\n examples: [\n ['kirograph diff-context --staged', 'What does my staged diff actually change?'],\n ['kirograph commit-context', 'Generate a structured commit message draft'],\n ['kirograph pr-context main', 'Semantic PR description vs main'],\n ['kirograph changelog v1.0 v1.1', 'What changed between two tags?'],\n ['kirograph test-map', 'Which symbols have no test coverage?'],\n ],\n },\n {\n icon: '\u270F\uFE0F', title: 'Edit',\n commands: [\n { name: 'str-replace', args: '<file> <old> <new>', desc: 'Replace unique string anchor in a file; fails on 0 or >1 matches' },\n { name: 'multi-replace', args: '<file> <pairs-json>', desc: 'Multiple string replacements as an all-or-nothing transaction' },\n { name: 'insert-at', args: '<file> <anchor> <content>', desc: 'Insert content before or after an anchor or line number', opts: ['--after Insert after anchor', '--line Treat anchor as line number'] },\n { name: 'ast-rewrite', args: '<file> <pattern> <rewrite>', desc: 'Structural rewrite via ast-grep (requires ast-grep on PATH)' },\n ],\n examples: [\n ['kirograph str-replace auth.ts \"return null\" \"return undefined\"', 'Safe replace a unique string'],\n ['kirograph insert-at server.ts \"app.listen\" \"app.use(logger());\" --before', 'Insert before a line'],\n ['kirograph ast-rewrite src/api.ts \"console.log($MSG)\" \"logger.debug($MSG)\"', 'Structural rewrite'],\n ],\n },\n {\n icon: '\uD83C\uDF32', title: 'Branch',\n commands: [\n { name: 'branch list', desc: 'List tracked branches with size and last-sync time' },\n { name: 'branch add', args: '[name]', desc: 'Start tracking a branch (copies current index)' },\n { name: 'branch remove', args: '<name>', desc: 'Stop tracking a branch and delete its DB' },\n { name: 'branch gc', desc: 'Remove DBs for branches that no longer exist in git' },\n { name: 'branch diff', args: '<a> <b>', desc: 'Symbol diff between two tracked branch DBs' },\n { name: 'branch search', args: '<name> <query>', desc: 'Search symbols in a branch DB without switching' },\n ],\n examples: [\n ['kirograph branch list', 'See all tracked branches'],\n ['kirograph branch add feature/auth', 'Track the auth branch'],\n ['kirograph branch diff main feature/auth', 'What symbols changed?'],\n ['kirograph branch search feature/auth \"handleLogin\"', 'Search in branch without switching'],\n ['kirograph branch gc', 'Clean up deleted branches'],\n ],\n },\n {\n icon: '\uD83D\uDCDA', title: 'Docs',\n commands: [\n { name: 'docs toc', args: '[file]', desc: 'Table of contents for a file or the whole project' },\n { name: 'docs search', args: '<query>', desc: 'Full-text search over documentation sections', opts: ['--limit <n> Max results', '--section <id> Restrict to section'] },\n { name: 'docs section', args: '<id>', desc: 'Print the full content of a section by ID' },\n { name: 'docs outline', args: '<file>', desc: 'Print heading hierarchy for a document' },\n { name: 'docs refs', args: '<id>', desc: 'Show code-to-doc and doc-to-code cross-references' },\n { name: 'docs reindex', desc: 'Force re-index all documentation files' },\n { name: 'docs lint', desc: 'Find broken refs, stale sections, FTS desync' },\n ],\n examples: [\n ['kirograph docs toc', 'Table of contents for the project'],\n ['kirograph docs search \"authentication\"', 'Find docs about auth'],\n ['kirograph docs section api.auth.login', 'Read a specific section'],\n ['kirograph docs refs api.auth.login', 'Which code references this doc section?'],\n ],\n },\n {\n icon: '\uD83D\uDDC4\uFE0F', title: 'Data',\n commands: [\n { name: 'data list', desc: 'List all indexed datasets' },\n { name: 'data describe', args: '<dataset>', desc: 'Show schema and column profiles', opts: ['--format <f> table | json'] },\n { name: 'data query', args: '<dataset>', desc: 'Query rows with filters', opts: ['--filter <f> col:op:val', '--limit <n> Max rows', '--format <f> table | json | csv'] },\n { name: 'data aggregate', args: '<dataset>', desc: 'Server-side GROUP BY aggregation', opts: ['--group-by <col>', '--metric <agg:col> sum|avg|count|min|max'] },\n { name: 'data search', args: '<dataset> <q>', desc: 'Search column names and sample values' },\n { name: 'data join', args: '<left> <right>', desc: 'SQL JOIN across two indexed datasets', opts: ['--left-col <c> Join key', '--right-col <c> Join key', '--type inner|left|right'] },\n { name: 'data correlations', args: '<dataset>', desc: 'Pairwise Pearson correlations between numeric columns' },\n { name: 'data quality', args: '<dataset>', desc: 'Data quality triage: rank columns by risk' },\n { name: 'data drift', args: '<dataset>', desc: 'Show schema drift between last two indexes' },\n { name: 'data history', args: '<dataset>', desc: 'Show history of schema changes for a dataset' },\n ],\n examples: [\n ['kirograph data list', 'List all indexed datasets'],\n ['kirograph data describe orders', 'Schema and column profiles for orders'],\n ['kirograph data query orders --filter status:eq:shipped', 'Filter rows'],\n ['kirograph data aggregate orders --group-by region --metric sum:amount', 'Aggregate by region'],\n ['kirograph data join users orders --left-col id --right-col user_id', 'Join datasets'],\n ],\n },\n {\n icon: '\uD83D\uDCD6', title: 'Wiki',\n commands: [\n { name: 'wiki init', desc: 'Initialize wiki: create SCHEMA.md and MANIFEST.md' },\n { name: 'wiki ingest', args: '[source]', desc: 'Print the ingest prompt for the LLM (reads file or stdin)' },\n { name: 'wiki search', args: '<query>', desc: 'Full-text search over wiki pages', opts: ['--limit <n> Max results'] },\n { name: 'wiki page', args: '<slug>', desc: 'Print the full content of a wiki page' },\n { name: 'wiki list', desc: 'List all wiki pages' },\n { name: 'wiki lint', desc: 'Health check the wiki for broken links, orphans, contradictions' },\n { name: 'wiki links', args: '<slug>', desc: 'Show outgoing, broken, and incoming [[slug]] links for a page' },\n { name: 'wiki rename', args: '<from> <to>', desc: 'Rename a page slug, moving its file and updating every [[slug]] reference to it' },\n { name: 'wiki reindex', desc: 'Rebuild SQLite index from .kirograph/wiki/*.md files' },\n { name: 'wiki status', desc: 'Wiki subsystem stats: page count, source count, oldest/newest page' },\n { name: 'wiki synthesize', desc: 'Run local-model wiki synthesis over the pending source queue' },\n { name: 'wiki apply-diff', args: '[diff]', desc: 'Apply a WIKI_DIFF string to the wiki' },\n ],\n examples: [\n ['kirograph wiki init', 'Initialize the wiki in this project'],\n ['kirograph wiki search \"authentication flow\"', 'Find wiki pages about auth'],\n ['kirograph wiki page arch-overview', 'Read a specific wiki page'],\n ['kirograph wiki lint', 'Check wiki health'],\n ['kirograph wiki status', 'How many pages and sources?'],\n ],\n },\n {\n icon: '\uD83E\uDDE0', title: 'Memory',\n commands: [\n { name: 'mem search', args: '<query>', desc: 'Search past observations', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'mem store', args: '<text>', desc: 'Store an observation', opts: ['--kind <k> decision | error | pattern | architecture | note'] },\n { name: 'mem capture', args: '<text>', desc: 'Passively extract multiple observations from free-form text' },\n { name: 'mem timeline', desc: 'List recent sessions and observations' },\n { name: 'mem status', desc: 'Memory health dashboard' },\n { name: 'mem prune', desc: 'Remove old observations', opts: ['--older-than <d> Duration (e.g. 90d)'] },\n { name: 'mem export', desc: 'Export observations', opts: ['--format <f> jsonl | md'] },\n { name: 'mem lint', desc: 'Health check and auto-repair', opts: ['--fix Auto-fix issues'] },\n { name: 'mem reembed', desc: 'Re-embed all observations after model change' },\n { name: 'mem conflicts list', desc: 'List pending conflict relations' },\n { name: 'mem conflicts ignore', args: '<id>', desc: 'Dismiss a pending conflict relation' },\n { name: 'mem watchmen status', desc: 'Show watchmen observation counter and last synthesis time' },\n { name: 'mem watchmen synthesize', desc: 'Run watchmen synthesis: produce brief and/or skill files' },\n { name: 'mem watchmen reset', desc: 'Reset the watchmen observation counter to zero' },\n ],\n examples: [\n ['kirograph mem search \"auth decision\"', 'Search for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph mem prune --older-than 90d', 'Remove observations older than 90 days'],\n ['kirograph mem conflicts list', 'See pending conflict relations'],\n ['kirograph mem watchmen status', 'Check watchmen counter and last synthesis'],\n ['kirograph mem watchmen synthesize', 'Trigger watchmen synthesis manually'],\n ],\n },\n {\n icon: '\uD83D\uDD12', title: 'Security',\n commands: [\n { name: 'security', args: '[path]', desc: 'Security overview: vulnerabilities, verdicts, stale-data warnings' },\n { name: 'vulns', args: '[path]', desc: 'List vulnerabilities with reachability verdicts and severity',\n opts: [\n '--severity <level> Filter by severity: critical, high, medium, low',\n '--verdict <verdict> Filter by verdict: affected, not_affected, under_investigation',\n '--refresh Trigger fresh vulnerability enrichment before listing',\n '--add <cveId> Manually register a CVE (requires --package and --version)',\n ],\n },\n { name: 'reachability', args: '<target>', desc: 'Check reachability for a CVE or dependency: verdict, call paths, impact', opts: ['--explain Plain-English reason for the verdict'] },\n { name: 'vuln suppress', args: '<cveId>', desc: 'Mark a CVE as suppressed (false positive or accepted risk)',\n opts: [\n '--reason <text> Reason for suppression',\n '--expires <date> Expiry date (e.g. 2026-12-31)',\n ],\n },\n { name: 'vuln unsuppress', args: '<cveId>', desc: 'Remove a suppression' },\n { name: 'vuln suppressions', desc: 'List all active suppressions', opts: ['--format json JSON output'] },\n { name: 'licenses', args: '[path]', desc: 'Show dependency licenses and check against policy (deny/warn lists)',\n opts: [\n '--policy Show only policy violations',\n '--deny <patterns> Override deny list (comma-separated SPDX patterns)',\n '--warn <patterns> Override warn list (comma-separated SPDX patterns)',\n '--format json JSON output',\n ],\n },\n { name: 'vex', args: '[path]', desc: 'Export a VEX document (Vulnerability Exploitability eXchange)', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'sbom', args: '[path]', desc: 'Export a Software Bill of Materials', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'staleness', args: '[path]', desc: 'Check dependency freshness \u2014 packages behind their latest version',\n opts: [\n '--threshold <n> Show only packages with staleness_score >= n (default: 0.3)',\n '--refresh Fetch latest version info from registries before listing',\n '--format <fmt> table | json',\n ],\n },\n { name: 'security export', args: '[path]', desc: 'Generate HTML security dashboard', opts: ['--output <file> Output path', '--open Open in browser'] },\n { name: 'security secrets', args: '[path]', desc: 'Scan for hardcoded secrets with call-graph blast radius', opts: ['--include-tests Include test files', '--severity <s> Filter level', '--format json'] },\n { name: 'security flows', args: '[path]', desc: 'SAST-lite: detect dangerous data flows (SQL injection, eval, path traversal, etc.)', opts: ['--type sql|eval|deserialize|path|all', '--format json'] },\n { name: 'security ci-report', args: '[path]', desc: 'Generate CI/CD security report (JSON, SARIF for GitHub, or text)', opts: ['--format json|sarif|text', '--fail-on affected|any|critical', '--output <file>'] },\n { name: 'attack-surface', args: '[path]', desc: 'Map attack surface: routes \u2192 vulnerable deps with hop count and auth status', opts: ['--limit <n>', '--public-only', '--format json'] },\n { name: 'supply-chain', args: '[path]', desc: 'Supply chain health: OpenSSF Scorecard, maintainer count, abandoned packages', opts: ['--threshold critical|high|medium', '--refresh', '--format json'] },\n { name: 'dep-confusion', args: '[path]', desc: 'Detect dependency confusion: internal packages that exist in public registries', opts: ['--format json'] },\n { name: 'remediation', args: '[path]', desc: 'Remediation SLA tracking: days open, fix available since, overdue alerts', opts: ['--overdue-only', '--format json'] },\n { name: 'pattern', args: '[pattern]', desc: 'AST structural search: live pattern search or library rule runner',\n opts: [\n '--list Show all bundled SAST rules',\n '--library <id> Run a specific library rule',\n '--lang <l> Language filter (js, ts, python, go, ...)',\n '--format json JSON output',\n ],\n },\n ],\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities with severity and verdict'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Show only vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV before listing'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph security export --open', 'Generate and open HTML security dashboard'],\n ['kirograph security secrets', 'Scan for hardcoded secrets with call-graph blast radius'],\n ['kirograph security flows', 'Detect dangerous data flows (SQL injection, eval, etc.)'],\n ['kirograph security ci-report --format sarif --output results.sarif', 'SARIF report for GitHub Security tab'],\n ['kirograph attack-surface --public-only', 'Show public routes reaching vulnerable deps'],\n ['kirograph supply-chain --threshold high', 'Show high-risk supply chain findings'],\n ['kirograph dep-confusion', 'Detect dependency confusion attack vectors'],\n ['kirograph remediation --overdue-only', 'Show CVEs past their remediation SLA'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls'],\n ['kirograph pattern --list', 'Show all bundled SAST rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run the dangerous-eval library rule'],\n ],\n },\n {\n icon: '\u2699\uFE0F', title: 'Agent',\n commands: [\n { name: 'caveman', args: '[mode]', desc: 'Communication style (off | lite | full | ultra)' },\n { name: 'compression', args: '[level]', desc: 'Shell compression level (off | normal | aggressive | ultra)' },\n { name: 'exec', args: '<cmd>', desc: 'Run command with token-optimized output', opts: ['-l <level> Compression level', '-t <sec> Timeout'] },\n { name: 'gain', desc: 'Token savings statistics', opts: ['--graph ASCII chart', '--history Recent commands', '--daily Day breakdown'] },\n { name: 'bench', desc: 'Run local token-efficiency benchmark across KiroGraph tools', opts: ['--quiet Suppress per-tool output'] },\n { name: 'monitor', desc: 'Live tail of mcp-calls.jsonl \u2014 watch MCP tool usage in real time', opts: ['--lines <n> Initial lines to show'] },\n { name: 'upgrade', desc: 'Update KiroGraph to the latest version', opts: ['--dry-run Show what would change without installing'] },\n { name: 'cost', args: '[sessionDir]', desc: 'Analyze MCP tool usage and token cost from Claude session transcripts', opts: ['--last <n> Last N sessions', '--category Group by tool category'] },\n { name: 'serve', desc: 'Start the MCP server', opts: ['--mcp Run as stdio MCP', '--path <p> Project path'] },\n ],\n examples: [\n ['kirograph caveman lite', 'Enable lite caveman mode'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ['kirograph bench', 'Run token-efficiency benchmark'],\n ['kirograph monitor', 'Watch MCP tool calls live'],\n ['kirograph cost --last 5', 'Cost breakdown for the last 5 sessions'],\n ['kirograph upgrade --dry-run', 'Preview available KiroGraph update'],\n ],\n },\n];\n\nfunction renderGroup(group: Group, highlightIdx: number, interactive = false): string[] {\n const lines: string[] = [];\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}COMMANDS${c.reset} ${c.dim}\u2191\u2193 select \u00B7 enter to copy \u00B7 q quit${c.reset}`);\n lines.push('');\n\n for (let i = 0; i < group.commands.length; i++) {\n const cmd = group.commands[i]!;\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const isHighlighted = i === highlightIdx;\n const prefix = isHighlighted ? `${c.green}${c.bold}\u276F${c.reset} ` : ' ';\n const namePart = isHighlighted\n ? `${c.bold}${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.bold + cmd.args + c.reset : ''}`\n : `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n lines.push(`${prefix}${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n // In interactive mode show only the highlighted command's opts\n if (cmd.opts && (!interactive || isHighlighted)) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n lines.push(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n\n if (!interactive && group.examples.length > 0) {\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}EXAMPLES${c.reset}`);\n lines.push('');\n for (const [ex, desc] of group.examples) {\n lines.push(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n lines.push(` ${c.dim}${desc}${c.reset}`);\n }\n }\n\n return lines;\n}\n\n\nfunction renderTabs(selectedIdx: number): string {\n return GROUPS.map((g, i) => {\n if (i === selectedIdx) {\n return `${c.bold}${c.violet}${c.underline}${g.icon} ${g.title}${c.reset}`;\n }\n return `${c.dim}${g.icon} ${g.title}${c.reset}`;\n }).join(' ');\n}\n\n/**\n * Interactive tabbed help \u2014 left/right for tabs, up/down for commands, enter to copy.\n */\nexport function printInteractiveHelp(): void {\n let selectedTab = 0;\n let selectedCmd = 0;\n\n function render() {\n // Move to top-left and clear from cursor to end of screen\n process.stdout.write('\\x1b[H\\x1b[J');\n\n const lines: string[] = [];\n lines.push('');\n lines.push(` ${renderTabs(selectedTab)}`);\n lines.push(` ${c.dim}\u2190 \u2192 tabs \u00B7 \u2191 \u2193 commands \u00B7 enter to use \u00B7 q quit${c.reset}`);\n lines.push(...renderGroup(GROUPS[selectedTab]!, selectedCmd, true));\n\n process.stdout.write(lines.join('\\n') + '\\n');\n }\n\n // Enter alternate screen + hide cursor so rendering never scrolls or flickers\n process.stdout.write('\\x1b[?1049h\\x1b[?25l');\n\n printBanner();\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset} ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}`);\n\n render();\n\n // Enter raw mode for interactive navigation\n const stdin = process.stdin;\n if (!stdin.isTTY) {\n // Non-interactive: leave alternate screen and print all groups normally\n process.stdout.write('\\x1b[?25h\\x1b[?1049l');\n for (let i = 1; i < GROUPS.length; i++) {\n const lines = renderGroup(GROUPS[i]!, -1);\n for (const line of lines) console.log(line);\n }\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function cleanup() {\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdin.pause();\n // Leave alternate screen and restore cursor\n process.stdout.write('\\x1b[?25h\\x1b[?1049l');\n }\n\n function onData(key: string) {\n // Arrow keys and other escape sequences start with \\x1b[\n if (key.startsWith('\\x1b[')) {\n if (key === '\\x1b[C') { // right arrow \u2014 next tab\n selectedTab = (selectedTab + 1) % GROUPS.length;\n selectedCmd = 0;\n render();\n } else if (key === '\\x1b[D') { // left arrow \u2014 prev tab\n selectedTab = (selectedTab - 1 + GROUPS.length) % GROUPS.length;\n selectedCmd = 0;\n render();\n } else if (key === '\\x1b[B') { // down arrow \u2014 next command\n const maxCmd = GROUPS[selectedTab]!.commands.length - 1;\n selectedCmd = Math.min(selectedCmd + 1, maxCmd);\n render();\n } else if (key === '\\x1b[A') { // up arrow \u2014 prev command\n selectedCmd = Math.max(selectedCmd - 1, 0);\n render();\n }\n // Ignore other escape sequences\n return;\n }\n\n if (key === '\\r' || key === '\\n') { // enter \u2014 copy command to terminal\n cleanup();\n const cmd = GROUPS[selectedTab]!.commands[selectedCmd]!;\n const fullCmd = `kirograph ${cmd.name}${cmd.args ? ' ' + cmd.args : ''}`;\n console.log(`\\n ${c.green}${c.bold}$${c.reset} ${fullCmd}\\n`);\n process.exit(0);\n } else if (key === 'q' || key === '\\x03') { // q, ctrl+c\n cleanup();\n console.log();\n process.exit(0);\n }\n }\n\n stdin.on('data', onData);\n}\n\n/**\n * Non-interactive full help (for piping, --help flag).\n */\nexport function printColoredHelp(): void {\n\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset}`);\n console.log(` ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}\\n`);\n\n for (const group of GROUPS) {\n console.log(`${c.bold}${c.paleLavender}${group.icon} ${group.title.toUpperCase()}${c.reset}\\n`);\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n for (const cmd of group.commands) {\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const namePart = `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n console.log(` ${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n if (cmd.opts) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n console.log(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n console.log();\n }\n\n console.log(`${c.bold}${c.paleLavender}GLOBAL FLAGS${c.reset}\\n`);\n console.log(` ${c.purple}-h, --help${c.reset} ${c.gray}Show this help${c.reset}`);\n console.log(` ${c.purple}-V, --version${c.reset} ${c.gray}Show version number${c.reset}\\n`);\n\n\n console.log(`${c.bold}${c.paleLavender}EXAMPLES${c.reset}\\n`);\n\n const exampleGroups: Array<{ title: string; examples: [string, string][] }> = [\n {\n title: '\uD83D\uDD27 Setup & indexing',\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering for the current workspace'],\n ['kirograph install --target claude', 'Wire up Claude Code MCP + project memory'],\n ['kirograph install --target codex', 'Install Codex project instructions and print MCP config'],\n ['kirograph init --index', 'Init and immediately index the project'],\n ['kirograph hook save', 'Save workspace hooks to ~/.kirograph/hooks/'],\n ['kirograph hook import', 'Import global hooks into .kiro/hooks/'],\n ['kirograph sync', 'Incremental sync of changed files'],\n ],\n },\n {\n title: '\uD83D\uDD0D Search & exploration',\n examples: [\n ['kirograph query useState', 'Find all symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get relevant code context for a task'],\n ['kirograph files --format grouped', 'Show files grouped by directory'],\n ['kirograph path LoginController DatabasePool', 'Find how two symbols are connected'],\n ['kirograph affected src/auth.ts', 'Find tests affected by a change'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from a git diff'],\n ['kirograph export start', 'Open the interactive graph dashboard in the browser'],\n ['kirograph export build -o /tmp/graph', 'Export the dashboard to a custom directory'],\n ],\n },\n {\n title: '\uD83D\uDCCA Graph insights',\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph surprising', 'Find unexpected cross-module connections'],\n ['kirograph dead-code', 'Find unreferenced unexported symbols'],\n ['kirograph snapshot save pre-refactor', 'Save a named snapshot before a refactor'],\n ['kirograph snapshot diff pre-refactor', 'Diff current graph vs the named snapshot'],\n ],\n },\n {\n title: '\uD83C\uDFDB\uFE0F Architecture',\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Show packages ranked by instability'],\n ['kirograph package src/auth', 'Inspect the auth package'],\n ],\n },\n {\n title: '\uD83D\uDD12 Security',\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV then list'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln suppress CVE-2024-1234 --expires 2026-12-31', 'Suppress with expiry date'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls (requires enablePatterns: true)'],\n ['kirograph pattern --list', 'Show all bundled SAST pattern rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run a specific library rule'],\n ],\n },\n {\n title: '\u2699\uFE0F Agent',\n examples: [\n ['kirograph caveman full', 'Enable full caveman mode for the agent'],\n ['kirograph caveman off', 'Disable caveman mode'],\n ['kirograph compression aggressive', 'Set compression to aggressive level'],\n ['kirograph compression off', 'Disable compression hook (tool still available)'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph exec --level ultra npm test', 'Run tests with ultra compression'],\n ['kirograph exec --raw cargo build', 'Show raw vs compressed comparison'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ['kirograph mem search \"auth decision\"', 'Search memory for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph data list', 'List all indexed datasets'],\n ['kirograph data describe tests-fixtures-users', 'Show schema and column profiles'],\n ['kirograph data query orders --filter status:eq:shipped --limit 10', 'Query rows with filters'],\n ['kirograph data aggregate orders --group-by region --metric sum:amount', 'Server-side aggregation'],\n ['kirograph serve --mcp', 'Start the MCP server'],\n ],\n },\n ];\n\n for (const eg of exampleGroups) {\n console.log(` ${c.dim}${eg.title}${c.reset}`);\n for (const [ex, desc] of eg.examples) {\n console.log(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n console.log(` ${c.dim}${desc}${c.reset}`);\n }\n console.log();\n }\n}\n\nexport function register(program: Command): void {\n program.configureHelp({ formatHelp: () => '' });\n program.addHelpText('afterAll', '');\n // Disable Commander's built-in --help to prevent process.exit\n program.helpOption(false);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Command } from 'commander';\nimport { printBanner } from '../banner';\n\ntype CommandEntry = { name: string; args?: string; desc: string; opts?: string[] };\ntype Group = { icon: string; title: string; commands: CommandEntry[]; examples: [string, string][] };\n\nconst c = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n violet: '\\x1b[38;5;99m',\n purple: '\\x1b[38;5;135m',\n lavender: '\\x1b[38;5;141m',\n paleLavender: '\\x1b[38;5;183m',\n gray: '\\x1b[90m',\n brown: '\\x1b[38;5;130m',\n green: '\\x1b[32m',\n cyan: '\\x1b[36m',\n underline: '\\x1b[4m',\n};\n\nconst GROUPS: Group[] = [\n {\n icon: '\uD83D\uDD27', title: 'Setup',\n commands: [\n { name: 'install', desc: 'Wire up MCP/instructions for an agent workspace', opts: ['--target <t> kiro | cursor | claude | windsurf | ...', 'Kiro install: prompts to import global hooks'] },\n { name: 'init', args: '[path]', desc: 'Initialize KiroGraph in a project', opts: ['-i, --index Index immediately after init'] },\n { name: 'uninit', args: '[path]', desc: 'Remove KiroGraph from a project', opts: ['--force Skip confirmation', '--target <t> Target to clean up (or \"all\")'] },\n { name: 'hook', desc: 'Manage global Kiro hooks in ~/.kirograph/hooks/', opts: ['save [path] Save workspace hooks to global store', 'import [path] Import global hooks into workspace', 'list List saved global hooks', '--all Save or import all without prompting (save/import)'] },\n { name: 'doctor', args: '[path]', desc: 'Health check: index, config, hooks, and permissions', opts: ['--fix Auto-repair fixable issues'] },\n ],\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering'],\n ['kirograph install --target claude', 'Wire up Claude Code MCP + project memory'],\n ['kirograph init --index', 'Init and immediately index'],\n ['kirograph hook save', 'Save workspace hooks to your global library'],\n ['kirograph hook import', 'Import global hooks into this project'],\n ['kirograph doctor --fix', 'Check and auto-repair installation issues'],\n ],\n },\n {\n icon: '\uD83D\uDCE6', title: 'Indexing',\n commands: [\n { name: 'index', args: '[path]', desc: 'Full re-index of a project', opts: ['--force Force re-index all files'] },\n { name: 'sync', args: '[path]', desc: 'Incremental sync of changed files', opts: ['--files <f> Specific files to sync'] },\n { name: 'sync-if-dirty', args: '[path]', desc: 'Sync only if a dirty marker is present', opts: ['-q, --quiet Suppress output'] },\n { name: 'mark-dirty', args: '[path]', desc: 'Write a dirty marker for deferred sync' },\n { name: 'unlock', args: '[path]', desc: 'Force-release a stale lock file' },\n ],\n examples: [\n ['kirograph sync', 'Incremental sync of changed files'],\n ['kirograph index --force', 'Force full re-index'],\n ],\n },\n {\n icon: '\uD83D\uDD0D', title: 'Search',\n commands: [\n { name: 'status', args: '[path]', desc: 'Show index statistics and health' },\n { name: 'query', args: '<search>', desc: 'Search for symbols by name', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'context', args: '<task>', desc: 'Build relevant code context for a task', opts: ['--max-nodes <n> Max symbols', '--no-code Exclude code', '--format <f> markdown | json'] },\n { name: 'files', args: '[path]', desc: 'Show project file structure', opts: ['--format <f> tree | flat | grouped | compact', '--filter <p> Directory prefix', '--pattern <g> Glob'] },\n { name: 'path', args: '<from> <to>', desc: 'Shortest dependency path between two symbols' },\n { name: 'affected', args: '[files...]', desc: 'Find test files affected by changed source files', opts: ['--stdin Read from stdin', '-d <n> Depth', '-q Quiet'] },\n { name: 'callers', args: '<symbol>', desc: 'List symbols that call a given function or method', opts: ['--limit <n> Max results'] },\n { name: 'callees', args: '<symbol>', desc: 'List symbols called by a given function or method', opts: ['--limit <n> Max results'] },\n { name: 'impact', args: '<symbol>', desc: 'Show symbols affected by changing a given symbol', opts: ['-d, --depth <n> Max traversal depth'] },\n ],\n examples: [\n ['kirograph query useState', 'Find symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get context for a task'],\n ['kirograph callers parseToken', 'Who calls parseToken?'],\n ['kirograph callees handleRequest', 'What does handleRequest call?'],\n ['kirograph impact UserService', 'What breaks if UserService changes?'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from git diff'],\n ],\n },\n {\n icon: '\uD83D\uDCCA', title: 'Insights',\n commands: [\n { name: 'hotspots', args: '[path]', desc: 'Most-connected symbols by edge degree', opts: ['--limit <n> Max results', '--format <f> table | json'] },\n { name: 'surprising', args: '[path]', desc: 'Non-obvious cross-file connections', opts: ['--limit <n> Max results'] },\n { name: 'dead-code', args: '[path]', desc: 'Unreferenced unexported symbols', opts: ['--limit <n> Max results'] },\n { name: 'circular-deps', args: '[path]', desc: 'Find circular dependency cycles', opts: ['-j, --json JSON output'] },\n { name: 'largest', args: '[path]', desc: 'Symbols ranked by lines of code', opts: ['--limit <n> Max results'] },\n { name: 'rank', args: '[path]', desc: 'Symbols ranked by fan-in or fan-out edge count', opts: ['--by <by> fan-in | fan-out'] },\n { name: 'distribution', args: '[dir]', desc: 'Symbol-kind breakdown per file or directory', opts: ['--limit <n> Max results'] },\n { name: 'god-class', args: '[path]', desc: 'Classes ranked by member count (god-class risk)', opts: ['--limit <n> Max results'] },\n { name: 'gini', args: '[path]', desc: 'Gini inequality coefficient of a metric', opts: ['--metric <m> loc | fan-in | fan-out'] },\n { name: 'snapshot', desc: 'Save/list/diff graph snapshots', opts: ['save [label]', 'list', 'diff [label] --format summary|full|json'] },\n { name: 'export', desc: 'Interactive graph dashboard', opts: ['build [path] Generate HTML', 'start [path] Generate and open'] },\n ],\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph circular-deps', 'Find all circular dependency cycles'],\n ['kirograph largest --limit 20', 'Biggest functions by LOC'],\n ['kirograph god-class', 'Find potential god classes'],\n ['kirograph snapshot save pre-refactor', 'Save before a refactor'],\n ['kirograph export start', 'Open the graph dashboard'],\n ],\n },\n {\n icon: '\uD83C\uDFDB\uFE0F', title: 'Architecture',\n commands: [\n { name: 'architecture', args: '[path]', desc: 'Package graph and layer map', opts: ['--packages Packages only', '--layers Layers only'] },\n { name: 'coupling', args: '[path]', desc: 'Coupling metrics per package', opts: ['--sort <s> instability | ca | ce | name', '--package <n> Detail view'] },\n { name: 'package', args: '<name>', desc: 'Inspect a package', opts: ['--no-files Omit file list'] },\n { name: 'type-hierarchy', args: '<symbol>', desc: 'Traverse base/derived types of a class or interface', opts: ['--direction <dir> up | down | both'] },\n { name: 'communities', args: '[path]', desc: 'Detect code communities (clusters of related symbols)' },\n { name: 'manifest', args: '[path]', desc: 'Workspace manifest: packages, versions, licenses, version drift' },\n ],\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Packages ranked by instability'],\n ['kirograph type-hierarchy UserRepository --direction up', 'What interfaces does this implement?'],\n ['kirograph communities', 'Find tightly coupled clusters'],\n ['kirograph manifest', 'Show all dependency versions and drift'],\n ],\n },\n {\n icon: '\uD83C\uDFE5', title: 'Code Health',\n commands: [\n { name: 'module-api', args: '[path]', desc: 'List all exported symbols in a file or directory', opts: ['--limit <n> Max results'] },\n { name: 'rename-preview', args: '<symbol>', desc: 'Show all reference sites for a symbol before renaming', opts: ['--limit <n> Max results'] },\n { name: 'doc-coverage', args: '[path]', desc: 'Find exported symbols missing docstrings', opts: ['--limit <n> Max results'] },\n { name: 'inheritance-depth', args: '[path]', desc: 'Find deepest inheritance chains', opts: ['--limit <n> Max results'] },\n { name: 'recursion', args: '[path]', desc: 'Find recursive and mutually-recursive functions', opts: ['--limit <n> Max results'] },\n { name: 'annotations', args: '[path]', desc: 'Decorator/attribute histogram across the codebase', opts: ['--decorator <name> Filter by name'] },\n { name: 'unused-imports', args: '[path]', desc: 'Find import nodes with zero resolved downstream edges', opts: ['--limit <n> Max results'] },\n { name: 'dependency-depth', args: '[path]', desc: 'Topological depth of each file in the import graph', opts: ['--limit <n> Max files'] },\n { name: 'session', desc: 'Save or compare session baselines for tracking changes', opts: ['start Start a session baseline', 'end Compare current state to baseline'] },\n { name: 'refactor', desc: 'Refactoring tools: rename preview and community-driven suggestions', opts: ['rename <symbol> Preview rename locations', 'suggest Get refactoring suggestions'] },\n ],\n examples: [\n ['kirograph module-api src/auth', 'List public API of the auth module'],\n ['kirograph rename-preview handleLogin', 'Find all sites before renaming'],\n ['kirograph doc-coverage', 'Find undocumented exports'],\n ['kirograph unused-imports', 'Find dead import statements'],\n ['kirograph session start && <edit> && kirograph session end', 'Diff graph before and after a change'],\n ],\n },\n {\n icon: '\uD83D\uDD2C', title: 'Analysis',\n commands: [\n { name: 'complexity', args: '[path]', desc: 'Rank functions by cyclomatic, cognitive, and maintainability score', opts: ['--limit <n> Max results'] },\n { name: 'simplify-scan', args: '[path]', desc: 'Find candidates for simplification by complexity and dead code', opts: ['--limit <n> Max results'] },\n { name: 'health', args: '[path]', desc: 'Composite codebase health score (0-10000) with grade' },\n { name: 'dsm', args: '[path]', desc: 'Design Structure Matrix \u2014 detect strongly coupled module groups', opts: ['--limit <n> Max groups'] },\n { name: 'test-risk', args: '[path]', desc: 'Rank untested code by risk score (complexity \u00D7 fan-in)', opts: ['--limit <n> Max results'] },\n { name: 'test-coverage', args: '[path]', desc: 'Show test coverage gaps from lcov/Istanbul reports', opts: ['--sort <order> asc (worst first) | desc'] },\n ],\n examples: [\n ['kirograph health', 'Get overall health score and grade'],\n ['kirograph complexity --limit 10', 'Top 10 most complex functions'],\n ['kirograph test-risk', 'Which untested code is highest risk?'],\n ['kirograph test-coverage', 'Show worst-covered files first'],\n ['kirograph dsm', 'Find tightly coupled module groups'],\n ],\n },\n {\n icon: '\uD83C\uDF3F', title: 'Git',\n commands: [\n { name: 'diff-context', args: '[path]', desc: 'Changed symbols, their callers/callees, and affected tests', opts: ['--staged Use staged changes only'] },\n { name: 'commit-context', args: '[path]', desc: 'Structured summary of staged changes for a commit message' },\n { name: 'pr-context', args: '<base> [head]', desc: 'Semantic diff between two git refs for PR descriptions', opts: ['--format <fmt> text | json'] },\n { name: 'changelog', args: '<ref1> <ref2>', desc: 'Human-readable semantic diff between two git refs' },\n { name: 'test-map', args: '[symbol]', desc: 'Map symbols to test files; show uncovered symbols', opts: ['--limit <n> Max results'] },\n ],\n examples: [\n ['kirograph diff-context --staged', 'What does my staged diff actually change?'],\n ['kirograph commit-context', 'Generate a structured commit message draft'],\n ['kirograph pr-context main', 'Semantic PR description vs main'],\n ['kirograph changelog v1.0 v1.1', 'What changed between two tags?'],\n ['kirograph test-map', 'Which symbols have no test coverage?'],\n ],\n },\n {\n icon: '\u270F\uFE0F', title: 'Edit',\n commands: [\n { name: 'str-replace', args: '<file> <old> <new>', desc: 'Replace unique string anchor in a file; fails on 0 or >1 matches' },\n { name: 'multi-replace', args: '<file> <pairs-json>', desc: 'Multiple string replacements as an all-or-nothing transaction' },\n { name: 'insert-at', args: '<file> <anchor> <content>', desc: 'Insert content before or after an anchor or line number', opts: ['--after Insert after anchor', '--line Treat anchor as line number'] },\n { name: 'ast-rewrite', args: '<file> <pattern> <rewrite>', desc: 'Structural rewrite via ast-grep (requires ast-grep on PATH)' },\n ],\n examples: [\n ['kirograph str-replace auth.ts \"return null\" \"return undefined\"', 'Safe replace a unique string'],\n ['kirograph insert-at server.ts \"app.listen\" \"app.use(logger());\" --before', 'Insert before a line'],\n ['kirograph ast-rewrite src/api.ts \"console.log($MSG)\" \"logger.debug($MSG)\"', 'Structural rewrite'],\n ],\n },\n {\n icon: '\uD83C\uDF32', title: 'Branch',\n commands: [\n { name: 'branch list', desc: 'List tracked branches with size and last-sync time' },\n { name: 'branch add', args: '[name]', desc: 'Start tracking a branch (copies current index)' },\n { name: 'branch remove', args: '<name>', desc: 'Stop tracking a branch and delete its DB' },\n { name: 'branch gc', desc: 'Remove DBs for branches that no longer exist in git' },\n { name: 'branch diff', args: '<a> <b>', desc: 'Symbol diff between two tracked branch DBs' },\n { name: 'branch search', args: '<name> <query>', desc: 'Search symbols in a branch DB without switching' },\n ],\n examples: [\n ['kirograph branch list', 'See all tracked branches'],\n ['kirograph branch add feature/auth', 'Track the auth branch'],\n ['kirograph branch diff main feature/auth', 'What symbols changed?'],\n ['kirograph branch search feature/auth \"handleLogin\"', 'Search in branch without switching'],\n ['kirograph branch gc', 'Clean up deleted branches'],\n ],\n },\n {\n icon: '\uD83D\uDCDA', title: 'Docs',\n commands: [\n { name: 'docs toc', args: '[file]', desc: 'Table of contents for a file or the whole project' },\n { name: 'docs search', args: '<query>', desc: 'Full-text search over documentation sections', opts: ['--limit <n> Max results', '--section <id> Restrict to section'] },\n { name: 'docs section', args: '<id>', desc: 'Print the full content of a section by ID' },\n { name: 'docs outline', args: '<file>', desc: 'Print heading hierarchy for a document' },\n { name: 'docs refs', args: '<id>', desc: 'Show code-to-doc and doc-to-code cross-references' },\n { name: 'docs reindex', desc: 'Force re-index all documentation files' },\n { name: 'docs lint', desc: 'Find broken refs, stale sections, FTS desync' },\n ],\n examples: [\n ['kirograph docs toc', 'Table of contents for the project'],\n ['kirograph docs search \"authentication\"', 'Find docs about auth'],\n ['kirograph docs section api.auth.login', 'Read a specific section'],\n ['kirograph docs refs api.auth.login', 'Which code references this doc section?'],\n ],\n },\n {\n icon: '\uD83D\uDDC4\uFE0F', title: 'Data',\n commands: [\n { name: 'data list', desc: 'List all indexed datasets' },\n { name: 'data describe', args: '<dataset>', desc: 'Show schema and column profiles', opts: ['--format <f> table | json'] },\n { name: 'data query', args: '<dataset>', desc: 'Query rows with filters', opts: ['--filter <f> col:op:val', '--limit <n> Max rows', '--format <f> table | json | csv'] },\n { name: 'data aggregate', args: '<dataset>', desc: 'Server-side GROUP BY aggregation', opts: ['--group-by <col>', '--metric <agg:col> sum|avg|count|min|max'] },\n { name: 'data search', args: '<dataset> <q>', desc: 'Search column names and sample values' },\n { name: 'data join', args: '<left> <right>', desc: 'SQL JOIN across two indexed datasets', opts: ['--left-col <c> Join key', '--right-col <c> Join key', '--type inner|left|right'] },\n { name: 'data correlations', args: '<dataset>', desc: 'Pairwise Pearson correlations between numeric columns' },\n { name: 'data quality', args: '<dataset>', desc: 'Data quality triage: rank columns by risk' },\n { name: 'data drift', args: '<dataset>', desc: 'Show schema drift between last two indexes' },\n { name: 'data history', args: '<dataset>', desc: 'Show history of schema changes for a dataset' },\n ],\n examples: [\n ['kirograph data list', 'List all indexed datasets'],\n ['kirograph data describe orders', 'Schema and column profiles for orders'],\n ['kirograph data query orders --filter status:eq:shipped', 'Filter rows'],\n ['kirograph data aggregate orders --group-by region --metric sum:amount', 'Aggregate by region'],\n ['kirograph data join users orders --left-col id --right-col user_id', 'Join datasets'],\n ],\n },\n {\n icon: '\uD83D\uDCD6', title: 'Wiki',\n commands: [\n { name: 'wiki init', desc: 'Initialize wiki: create SCHEMA.md and MANIFEST.md' },\n { name: 'wiki ingest', args: '[source]', desc: 'Print the ingest prompt for the LLM (reads file or stdin)' },\n { name: 'wiki search', args: '<query>', desc: 'Full-text search over wiki pages', opts: ['--limit <n> Max results'] },\n { name: 'wiki page', args: '<slug>', desc: 'Print the full content of a wiki page' },\n { name: 'wiki list', desc: 'List all wiki pages' },\n { name: 'wiki lint', desc: 'Health check the wiki for broken links, orphans, contradictions. wikiContradictionMode: \"jev\" replaces the keyword heuristic with an actual judgment call.' },\n { name: 'wiki links', args: '<slug>', desc: 'Show outgoing, broken, and incoming [[slug]] links for a page' },\n { name: 'wiki rename', args: '<from> <to>', desc: 'Rename a page slug, moving its file and updating every [[slug]] reference to it' },\n { name: 'wiki reindex', desc: 'Rebuild SQLite index from .kirograph/wiki/*.md files' },\n { name: 'wiki status', desc: 'Wiki subsystem stats: page count, source count, oldest/newest page' },\n { name: 'wiki synthesize', desc: 'Run local-model wiki synthesis over the pending source queue' },\n { name: 'wiki apply-diff', args: '[diff]', desc: 'Apply a WIKI_DIFF string to the wiki' },\n ],\n examples: [\n ['kirograph wiki init', 'Initialize the wiki in this project'],\n ['kirograph wiki search \"authentication flow\"', 'Find wiki pages about auth'],\n ['kirograph wiki page arch-overview', 'Read a specific wiki page'],\n ['kirograph wiki lint', 'Check wiki health'],\n ['kirograph wiki status', 'How many pages and sources?'],\n ],\n },\n {\n icon: '\uD83E\uDDE0', title: 'Memory',\n commands: [\n { name: 'mem search', args: '<query>', desc: 'Search past observations', opts: ['--kind <k> Filter by kind', '--limit <n> Max results'] },\n { name: 'mem store', args: '<text>', desc: 'Store an observation', opts: ['--kind <k> decision | error | pattern | architecture | note'] },\n { name: 'mem capture', args: '<text>', desc: 'Passively extract multiple observations from free-form text' },\n { name: 'mem timeline', desc: 'List recent sessions and observations' },\n { name: 'mem status', desc: 'Memory health dashboard' },\n { name: 'mem prune', desc: 'Remove old observations', opts: ['--older-than <d> Duration (e.g. 90d)'] },\n { name: 'mem export', desc: 'Export observations', opts: ['--format <f> jsonl | md'] },\n { name: 'mem lint', desc: 'Health check and auto-repair', opts: ['--fix Auto-fix issues'] },\n { name: 'mem reembed', desc: 'Re-embed all observations after model change' },\n { name: 'mem conflicts list', desc: 'List pending conflict relations' },\n { name: 'mem conflicts compare', args: '<a> <b>', desc: 'Establish a relation between two observations. With memoryRelationMode: \"jev\", omit --relation to classify it automatically.', opts: ['--relation <type> supersedes | conflicts_with | compatible | scoped | related | not_conflict'] },\n { name: 'mem conflicts judge', args: '<id>', desc: 'Finalize a pending relation', opts: ['--relation <type>', '--confidence <n>'] },\n { name: 'mem conflicts ignore', args: '<id>', desc: 'Dismiss a pending conflict relation' },\n { name: 'mem watchmen status', desc: 'Show watchmen observation counter and last synthesis time' },\n { name: 'mem watchmen synthesize', desc: 'Run watchmen synthesis: produce brief and/or skill files' },\n { name: 'mem watchmen reset', desc: 'Reset the watchmen observation counter to zero' },\n ],\n examples: [\n ['kirograph mem search \"auth decision\"', 'Search for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph mem prune --older-than 90d', 'Remove observations older than 90 days'],\n ['kirograph mem conflicts list', 'See pending conflict relations'],\n ['kirograph mem watchmen status', 'Check watchmen counter and last synthesis'],\n ['kirograph mem watchmen synthesize', 'Trigger watchmen synthesis manually'],\n ],\n },\n {\n icon: '\uD83D\uDD12', title: 'Security',\n commands: [\n { name: 'security', args: '[path]', desc: 'Security overview: vulnerabilities, verdicts, stale-data warnings' },\n { name: 'vulns', args: '[path]', desc: 'List vulnerabilities with reachability verdicts and severity',\n opts: [\n '--severity <level> Filter by severity: critical, high, medium, low',\n '--verdict <verdict> Filter by verdict: affected, not_affected, under_investigation',\n '--refresh Trigger fresh vulnerability enrichment before listing',\n '--add <cveId> Manually register a CVE (requires --package and --version)',\n ],\n },\n { name: 'reachability', args: '<target>', desc: 'Check reachability for a CVE or dependency: verdict, call paths, impact', opts: ['--explain Plain-English reason for the verdict'] },\n { name: 'vuln suppress', args: '<cveId>', desc: 'Mark a CVE as suppressed (false positive or accepted risk)',\n opts: [\n '--reason <text> Reason for suppression',\n '--expires <date> Expiry date (e.g. 2026-12-31)',\n ],\n },\n { name: 'vuln unsuppress', args: '<cveId>', desc: 'Remove a suppression' },\n { name: 'vuln suppressions', desc: 'List all active suppressions', opts: ['--format json JSON output'] },\n { name: 'licenses', args: '[path]', desc: 'Show dependency licenses and check against policy (deny/warn lists)',\n opts: [\n '--policy Show only policy violations',\n '--deny <patterns> Override deny list (comma-separated SPDX patterns)',\n '--warn <patterns> Override warn list (comma-separated SPDX patterns)',\n '--format json JSON output',\n ],\n },\n { name: 'vex', args: '[path]', desc: 'Export a VEX document (Vulnerability Exploitability eXchange)', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'sbom', args: '[path]', desc: 'Export a Software Bill of Materials', opts: ['--output <file> Write to file instead of stdout'] },\n { name: 'staleness', args: '[path]', desc: 'Check dependency freshness \u2014 packages behind their latest version',\n opts: [\n '--threshold <n> Show only packages with staleness_score >= n (default: 0.3)',\n '--refresh Fetch latest version info from registries before listing',\n '--format <fmt> table | json',\n ],\n },\n { name: 'security export', args: '[path]', desc: 'Generate HTML security dashboard', opts: ['--output <file> Output path', '--open Open in browser'] },\n { name: 'security secrets', args: '[path]', desc: 'Scan for hardcoded secrets with call-graph blast radius', opts: ['--include-tests Include test files', '--severity <s> Filter level', '--format json'] },\n { name: 'security flows', args: '[path]', desc: 'SAST-lite: detect dangerous data flows (SQL injection, eval, path traversal, etc.)', opts: ['--type sql|eval|deserialize|path|all', '--format json'] },\n { name: 'security ci-report', args: '[path]', desc: 'Generate CI/CD security report (JSON, SARIF for GitHub, or text)', opts: ['--format json|sarif|text', '--fail-on affected|any|critical', '--output <file>'] },\n { name: 'attack-surface', args: '[path]', desc: 'Map attack surface: routes \u2192 vulnerable deps with hop count and auth status. securityAuthDetectionMode: \"jev\" catches custom-named auth wrappers the heuristic misses.', opts: ['--limit <n>', '--public-only', '--format json'] },\n { name: 'supply-chain', args: '[path]', desc: 'Supply chain health: OpenSSF Scorecard, maintainer count, abandoned packages', opts: ['--threshold critical|high|medium', '--refresh', '--format json'] },\n { name: 'dep-confusion', args: '[path]', desc: 'Detect dependency confusion: internal packages that exist in public registries', opts: ['--format json'] },\n { name: 'remediation', args: '[path]', desc: 'Remediation SLA tracking: days open, fix available since, overdue alerts', opts: ['--overdue-only', '--format json'] },\n { name: 'pattern', args: '[pattern]', desc: 'AST structural search: live pattern search or library rule runner',\n opts: [\n '--list Show all bundled SAST rules',\n '--library <id> Run a specific library rule',\n '--lang <l> Language filter (js, ts, python, go, ...)',\n '--format json JSON output',\n ],\n },\n ],\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities with severity and verdict'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Show only vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV before listing'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph security export --open', 'Generate and open HTML security dashboard'],\n ['kirograph security secrets', 'Scan for hardcoded secrets with call-graph blast radius'],\n ['kirograph security flows', 'Detect dangerous data flows (SQL injection, eval, etc.)'],\n ['kirograph security ci-report --format sarif --output results.sarif', 'SARIF report for GitHub Security tab'],\n ['kirograph attack-surface --public-only', 'Show public routes reaching vulnerable deps'],\n ['kirograph supply-chain --threshold high', 'Show high-risk supply chain findings'],\n ['kirograph dep-confusion', 'Detect dependency confusion attack vectors'],\n ['kirograph remediation --overdue-only', 'Show CVEs past their remediation SLA'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls'],\n ['kirograph pattern --list', 'Show all bundled SAST rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run the dangerous-eval library rule'],\n ],\n },\n {\n icon: '\u2699\uFE0F', title: 'Agent',\n commands: [\n { name: 'caveman', args: '[mode]', desc: 'Communication style (off | lite | full | ultra)' },\n { name: 'compression', args: '[level]', desc: 'Shell compression level (off | normal | aggressive | ultra)' },\n { name: 'exec', args: '<cmd>', desc: 'Run command with token-optimized output', opts: ['-l <level> Compression level', '-t <sec> Timeout'] },\n { name: 'gain', desc: 'Token savings statistics', opts: ['--graph ASCII chart', '--history Recent commands', '--daily Day breakdown'] },\n { name: 'bench', desc: 'Run local token-efficiency benchmark across KiroGraph tools', opts: ['--quiet Suppress per-tool output'] },\n { name: 'monitor', desc: 'Live tail of mcp-calls.jsonl \u2014 watch MCP tool usage in real time', opts: ['--lines <n> Initial lines to show'] },\n { name: 'upgrade', desc: 'Update KiroGraph to the latest version', opts: ['--dry-run Show what would change without installing'] },\n { name: 'cost', args: '[sessionDir]', desc: 'Analyze MCP tool usage and token cost from Claude session transcripts', opts: ['--last <n> Last N sessions', '--category Group by tool category'] },\n { name: 'serve', desc: 'Start the MCP server', opts: ['--mcp Run as stdio MCP', '--path <p> Project path'] },\n ],\n examples: [\n ['kirograph caveman lite', 'Enable lite caveman mode'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ['kirograph bench', 'Run token-efficiency benchmark'],\n ['kirograph monitor', 'Watch MCP tool calls live'],\n ['kirograph cost --last 5', 'Cost breakdown for the last 5 sessions'],\n ['kirograph upgrade --dry-run', 'Preview available KiroGraph update'],\n ],\n },\n];\n\nfunction renderGroup(group: Group, highlightIdx: number, interactive = false): string[] {\n const lines: string[] = [];\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}COMMANDS${c.reset} ${c.dim}\u2191\u2193 select \u00B7 enter to copy \u00B7 q quit${c.reset}`);\n lines.push('');\n\n for (let i = 0; i < group.commands.length; i++) {\n const cmd = group.commands[i]!;\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const isHighlighted = i === highlightIdx;\n const prefix = isHighlighted ? `${c.green}${c.bold}\u276F${c.reset} ` : ' ';\n const namePart = isHighlighted\n ? `${c.bold}${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.bold + cmd.args + c.reset : ''}`\n : `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n lines.push(`${prefix}${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n // In interactive mode show only the highlighted command's opts\n if (cmd.opts && (!interactive || isHighlighted)) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n lines.push(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n\n if (!interactive && group.examples.length > 0) {\n lines.push('');\n lines.push(` ${c.bold}${c.paleLavender}EXAMPLES${c.reset}`);\n lines.push('');\n for (const [ex, desc] of group.examples) {\n lines.push(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n lines.push(` ${c.dim}${desc}${c.reset}`);\n }\n }\n\n return lines;\n}\n\n\nfunction renderTabs(selectedIdx: number): string {\n return GROUPS.map((g, i) => {\n if (i === selectedIdx) {\n return `${c.bold}${c.violet}${c.underline}${g.icon} ${g.title}${c.reset}`;\n }\n return `${c.dim}${g.icon} ${g.title}${c.reset}`;\n }).join(' ');\n}\n\n/**\n * Interactive tabbed help \u2014 left/right for tabs, up/down for commands, enter to copy.\n */\nexport function printInteractiveHelp(): void {\n let selectedTab = 0;\n let selectedCmd = 0;\n\n function render() {\n // Move to top-left and clear from cursor to end of screen\n process.stdout.write('\\x1b[H\\x1b[J');\n\n const lines: string[] = [];\n lines.push('');\n lines.push(` ${renderTabs(selectedTab)}`);\n lines.push(` ${c.dim}\u2190 \u2192 tabs \u00B7 \u2191 \u2193 commands \u00B7 enter to use \u00B7 q quit${c.reset}`);\n lines.push(...renderGroup(GROUPS[selectedTab]!, selectedCmd, true));\n\n process.stdout.write(lines.join('\\n') + '\\n');\n }\n\n // Enter alternate screen + hide cursor so rendering never scrolls or flickers\n process.stdout.write('\\x1b[?1049h\\x1b[?25l');\n\n printBanner();\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset} ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}`);\n\n render();\n\n // Enter raw mode for interactive navigation\n const stdin = process.stdin;\n if (!stdin.isTTY) {\n // Non-interactive: leave alternate screen and print all groups normally\n process.stdout.write('\\x1b[?25h\\x1b[?1049l');\n for (let i = 1; i < GROUPS.length; i++) {\n const lines = renderGroup(GROUPS[i]!, -1);\n for (const line of lines) console.log(line);\n }\n return;\n }\n\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n function cleanup() {\n stdin.removeListener('data', onData);\n stdin.setRawMode(false);\n stdin.pause();\n // Leave alternate screen and restore cursor\n process.stdout.write('\\x1b[?25h\\x1b[?1049l');\n }\n\n function onData(key: string) {\n // Arrow keys and other escape sequences start with \\x1b[\n if (key.startsWith('\\x1b[')) {\n if (key === '\\x1b[C') { // right arrow \u2014 next tab\n selectedTab = (selectedTab + 1) % GROUPS.length;\n selectedCmd = 0;\n render();\n } else if (key === '\\x1b[D') { // left arrow \u2014 prev tab\n selectedTab = (selectedTab - 1 + GROUPS.length) % GROUPS.length;\n selectedCmd = 0;\n render();\n } else if (key === '\\x1b[B') { // down arrow \u2014 next command\n const maxCmd = GROUPS[selectedTab]!.commands.length - 1;\n selectedCmd = Math.min(selectedCmd + 1, maxCmd);\n render();\n } else if (key === '\\x1b[A') { // up arrow \u2014 prev command\n selectedCmd = Math.max(selectedCmd - 1, 0);\n render();\n }\n // Ignore other escape sequences\n return;\n }\n\n if (key === '\\r' || key === '\\n') { // enter \u2014 copy command to terminal\n cleanup();\n const cmd = GROUPS[selectedTab]!.commands[selectedCmd]!;\n const fullCmd = `kirograph ${cmd.name}${cmd.args ? ' ' + cmd.args : ''}`;\n console.log(`\\n ${c.green}${c.bold}$${c.reset} ${fullCmd}\\n`);\n process.exit(0);\n } else if (key === 'q' || key === '\\x03') { // q, ctrl+c\n cleanup();\n console.log();\n process.exit(0);\n }\n }\n\n stdin.on('data', onData);\n}\n\n/**\n * Non-interactive full help (for piping, --help flag).\n */\nexport function printColoredHelp(): void {\n\n console.log(`\\n${c.bold}${c.paleLavender}USAGE${c.reset}`);\n console.log(` ${c.lavender}kirograph${c.reset} ${c.gray}<command>${c.reset} ${c.dim}[options]${c.reset}\\n`);\n\n for (const group of GROUPS) {\n console.log(`${c.bold}${c.paleLavender}${group.icon} ${group.title.toUpperCase()}${c.reset}\\n`);\n const nameWidth = Math.max(...group.commands.map(cmd => (cmd.name + (cmd.args ? ' ' + cmd.args : '')).length)) + 2;\n for (const cmd of group.commands) {\n const signature = cmd.name + (cmd.args ? ' ' + cmd.args : '');\n const namePart = `${c.lavender}${cmd.name}${c.reset}${cmd.args ? ' ' + c.dim + cmd.args + c.reset : ''}`;\n const pad = ' '.repeat(Math.max(0, nameWidth - signature.length));\n console.log(` ${namePart}${pad}${c.gray}${cmd.desc}${c.reset}`);\n if (cmd.opts) {\n for (const opt of cmd.opts) {\n const [flag, ...rest] = opt.split(/ +/);\n console.log(` ${c.purple}${flag}${c.reset}${rest.length ? ' ' + c.dim + rest.join(' ') + c.reset : ''}`);\n }\n }\n }\n console.log();\n }\n\n console.log(`${c.bold}${c.paleLavender}GLOBAL FLAGS${c.reset}\\n`);\n console.log(` ${c.purple}-h, --help${c.reset} ${c.gray}Show this help${c.reset}`);\n console.log(` ${c.purple}-V, --version${c.reset} ${c.gray}Show version number${c.reset}\\n`);\n\n\n console.log(`${c.bold}${c.paleLavender}EXAMPLES${c.reset}\\n`);\n\n const exampleGroups: Array<{ title: string; examples: [string, string][] }> = [\n {\n title: '\uD83D\uDD27 Setup & indexing',\n examples: [\n ['kirograph install', 'Wire up Kiro MCP + hooks + steering for the current workspace'],\n ['kirograph install --target claude', 'Wire up Claude Code MCP + project memory'],\n ['kirograph install --target codex', 'Install Codex project instructions and print MCP config'],\n ['kirograph init --index', 'Init and immediately index the project'],\n ['kirograph hook save', 'Save workspace hooks to ~/.kirograph/hooks/'],\n ['kirograph hook import', 'Import global hooks into .kiro/hooks/'],\n ['kirograph sync', 'Incremental sync of changed files'],\n ],\n },\n {\n title: '\uD83D\uDD0D Search & exploration',\n examples: [\n ['kirograph query useState', 'Find all symbols named useState'],\n ['kirograph context \"add dark mode\"', 'Get relevant code context for a task'],\n ['kirograph files --format grouped', 'Show files grouped by directory'],\n ['kirograph path LoginController DatabasePool', 'Find how two symbols are connected'],\n ['kirograph affected src/auth.ts', 'Find tests affected by a change'],\n ['git diff --name-only | kirograph affected --stdin', 'Affected tests from a git diff'],\n ['kirograph export start', 'Open the interactive graph dashboard in the browser'],\n ['kirograph export build -o /tmp/graph', 'Export the dashboard to a custom directory'],\n ],\n },\n {\n title: '\uD83D\uDCCA Graph insights',\n examples: [\n ['kirograph hotspots --limit 10', 'Top 10 most-connected symbols'],\n ['kirograph surprising', 'Find unexpected cross-module connections'],\n ['kirograph dead-code', 'Find unreferenced unexported symbols'],\n ['kirograph snapshot save pre-refactor', 'Save a named snapshot before a refactor'],\n ['kirograph snapshot diff pre-refactor', 'Diff current graph vs the named snapshot'],\n ],\n },\n {\n title: '\uD83C\uDFDB\uFE0F Architecture',\n examples: [\n ['kirograph architecture --packages', 'List all detected packages'],\n ['kirograph coupling --sort instability', 'Show packages ranked by instability'],\n ['kirograph package src/auth', 'Inspect the auth package'],\n ],\n },\n {\n title: '\uD83D\uDD12 Security',\n examples: [\n ['kirograph security', 'Overview: dep count, vuln count, verdict breakdown'],\n ['kirograph security --refresh-staleness', 'Overview including stale dependency count'],\n ['kirograph vulns', 'List all vulnerabilities'],\n ['kirograph vulns --stale', 'Show staleness score alongside each CVE'],\n ['kirograph vulns --verdict under_investigation', 'Vulnerabilities still being investigated'],\n ['kirograph vulns --severity critical --verdict affected', 'Critical confirmed vulnerabilities'],\n ['kirograph vulns --refresh', 'Re-query OSV then list'],\n ['kirograph staleness', 'Show packages with staleness_score >= 0.3'],\n ['kirograph staleness --refresh --threshold 0.5', 'Fetch latest versions and show very stale packages'],\n ['kirograph reachability CVE-2023-12345', 'Check reachability for a specific CVE'],\n ['kirograph reachability lodash', 'Check reachability for a dependency by package name'],\n ['kirograph licenses', 'Show all dependency licenses'],\n ['kirograph licenses --policy', 'Show only license policy violations'],\n ['kirograph licenses --deny \"GPL-*,AGPL-*\"', 'Block all GPL/AGPL licenses'],\n ['kirograph vex --output vex.json', 'Export CycloneDX VEX document'],\n ['kirograph sbom --output sbom.json', 'Export SPDX SBOM'],\n ['kirograph vuln suppress CVE-2024-1234 --reason \"not in code path\"', 'Suppress a false positive CVE'],\n ['kirograph vuln suppress CVE-2024-1234 --expires 2026-12-31', 'Suppress with expiry date'],\n ['kirograph vuln unsuppress CVE-2024-1234', 'Remove a suppression'],\n ['kirograph vuln suppressions', 'List all active suppressions'],\n ['kirograph pattern \"eval($X)\"', 'Find all eval() calls (requires enablePatterns: true)'],\n ['kirograph pattern --list', 'Show all bundled SAST pattern rules'],\n ['kirograph pattern --library dangerous-eval-js', 'Run a specific library rule'],\n ],\n },\n {\n title: '\u2699\uFE0F Agent',\n examples: [\n ['kirograph caveman full', 'Enable full caveman mode for the agent'],\n ['kirograph caveman off', 'Disable caveman mode'],\n ['kirograph compression aggressive', 'Set compression to aggressive level'],\n ['kirograph compression off', 'Disable compression hook (tool still available)'],\n ['kirograph exec git status', 'Run git status with compression'],\n ['kirograph exec --level ultra npm test', 'Run tests with ultra compression'],\n ['kirograph exec --raw cargo build', 'Show raw vs compressed comparison'],\n ['kirograph gain --graph', 'Show token savings graph'],\n ['kirograph mem search \"auth decision\"', 'Search memory for past decisions'],\n ['kirograph mem store \"use idempotency keys\" --kind decision', 'Store a decision'],\n ['kirograph data list', 'List all indexed datasets'],\n ['kirograph data describe tests-fixtures-users', 'Show schema and column profiles'],\n ['kirograph data query orders --filter status:eq:shipped --limit 10', 'Query rows with filters'],\n ['kirograph data aggregate orders --group-by region --metric sum:amount', 'Server-side aggregation'],\n ['kirograph serve --mcp', 'Start the MCP server'],\n ],\n },\n ];\n\n for (const eg of exampleGroups) {\n console.log(` ${c.dim}${eg.title}${c.reset}`);\n for (const [ex, desc] of eg.examples) {\n console.log(` ${c.violet}$${c.reset} ${c.lavender}${ex}${c.reset}`);\n console.log(` ${c.dim}${desc}${c.reset}`);\n }\n console.log();\n }\n}\n\nexport function register(program: Command): void {\n program.configureHelp({ formatHelp: () => '' });\n program.addHelpText('afterAll', '');\n // Disable Commander's built-in --help to prevent process.exit\n program.helpOption(false);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -32,6 +32,7 @@ __export(memory_exports, {
|
|
|
32
32
|
});
|
|
33
33
|
module.exports = __toCommonJS(memory_exports);
|
|
34
34
|
var import_ui = require("../ui");
|
|
35
|
+
var import_relation_display = require("../../memory/relation-display");
|
|
35
36
|
function register(program) {
|
|
36
37
|
const mem = program.command("mem").description("Persistent cross-session memory (requires enableMemory: true)");
|
|
37
38
|
mem.command("search <query>").description("Search memory observations (hybrid FTS + vector)").option("--kind <kind>", "Filter by kind: decision, error, pattern, architecture, summary, note").option("--limit <n>", "Max results", "10").option("--session <id>", "Filter to specific session").option("--format <fmt>", "Output format: text, json", "text").action(async (query, opts) => {
|
|
@@ -82,8 +83,8 @@ function register(program) {
|
|
|
82
83
|
console.log(` ${import_ui.violet}[${r.observation.kind}]${import_ui.reset} ${r.observation.content}`);
|
|
83
84
|
if (r.relations && r.relations.length > 0) {
|
|
84
85
|
const annotations = r.relations.filter((rel) => rel.judgmentStatus !== "ignored").map((rel) => {
|
|
85
|
-
const icon
|
|
86
|
-
return `${icon} ${
|
|
86
|
+
const { icon, label } = (0, import_relation_display.describeMemRelation)(rel, r.observation.id);
|
|
87
|
+
return `${icon} ${label}`;
|
|
87
88
|
}).join(" ");
|
|
88
89
|
if (annotations) console.log(` ${import_ui.dim}${annotations}${import_ui.reset}`);
|
|
89
90
|
}
|
|
@@ -698,7 +699,7 @@ function register(program) {
|
|
|
698
699
|
}
|
|
699
700
|
cg.close();
|
|
700
701
|
});
|
|
701
|
-
conflicts.command("compare <observationA> <observationB>").description(
|
|
702
|
+
conflicts.command("compare <observationA> <observationB>").description('Establish a typed relation between two observations (IDs or topic_keys). With memoryRelationMode: "jev", omit --relation to classify it automatically.').option("--relation <type>", "Relation: supersedes, conflicts_with, compatible, scoped, related, not_conflict").option("--confidence <n>", "Confidence 0.0\u20131.0", "1.0").option("--reason <text>", "Explanation").option("--evidence <text>", "Supporting evidence").action(async (observationA, observationB, opts) => {
|
|
702
703
|
const { MemoryManager } = await Promise.resolve().then(() => require("../../memory/index.js"));
|
|
703
704
|
const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
|
|
704
705
|
const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
|
|
@@ -717,6 +718,25 @@ function register(program) {
|
|
|
717
718
|
db.applyMemorySchema();
|
|
718
719
|
const mem2 = new MemoryManager(config, db.getRawDb());
|
|
719
720
|
mem2.initialize();
|
|
721
|
+
if (!opts.relation) {
|
|
722
|
+
if (config.memoryRelationMode !== "jev") {
|
|
723
|
+
console.error(' \u2716 --relation is required (set memoryRelationMode: "jev" in config to classify it automatically instead).');
|
|
724
|
+
cg.close();
|
|
725
|
+
process.exit(1);
|
|
726
|
+
}
|
|
727
|
+
try {
|
|
728
|
+
const result = await mem2.autoCompareObservations(observationA, observationB);
|
|
729
|
+
const status = result.autoJudged ? `${import_ui.dim}auto-judged${import_ui.reset}` : `${import_ui.dim}pending review${import_ui.reset}`;
|
|
730
|
+
console.log(` \u2713 Relation ${import_ui.dim}${result.relationId}${import_ui.reset} classified by jev: ${import_ui.violet}${result.relation}${import_ui.reset} (confidence: ${result.confidence.toFixed(2)}, ${status})`);
|
|
731
|
+
if (!result.autoJudged) console.log(` ${import_ui.dim}Use \`kirograph mem conflicts judge ${result.relationId} --relation <type> --confidence <n>\` to finalize.${import_ui.reset}`);
|
|
732
|
+
} catch (err) {
|
|
733
|
+
console.error(` \u2716 ${err instanceof Error ? err.message : String(err)}`);
|
|
734
|
+
cg.close();
|
|
735
|
+
process.exit(1);
|
|
736
|
+
}
|
|
737
|
+
cg.close();
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
720
740
|
const id = mem2.compareObservations({
|
|
721
741
|
observationA,
|
|
722
742
|
observationB,
|