kirograph 0.13.0 → 0.14.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.
Files changed (84) hide show
  1. package/README.md +332 -93
  2. package/dist/bin/commands/caveman.js +19 -2
  3. package/dist/bin/commands/caveman.js.map +2 -2
  4. package/dist/bin/commands/compression.js +109 -0
  5. package/dist/bin/commands/compression.js.map +7 -0
  6. package/dist/bin/commands/context.js +31 -24
  7. package/dist/bin/commands/context.js.map +2 -2
  8. package/dist/bin/commands/exec.js +107 -0
  9. package/dist/bin/commands/exec.js.map +7 -0
  10. package/dist/bin/commands/gain.js +119 -0
  11. package/dist/bin/commands/gain.js.map +7 -0
  12. package/dist/bin/commands/help.js +16 -5
  13. package/dist/bin/commands/help.js.map +2 -2
  14. package/dist/bin/commands/install.js +8 -2
  15. package/dist/bin/commands/install.js.map +2 -2
  16. package/dist/bin/commands/query.js +5 -1
  17. package/dist/bin/commands/query.js.map +2 -2
  18. package/dist/bin/commands/serve.js +2 -2
  19. package/dist/bin/commands/serve.js.map +2 -2
  20. package/dist/bin/commands/uninit.js +65 -41
  21. package/dist/bin/commands/uninit.js.map +2 -2
  22. package/dist/bin/commands/utils.js +16 -0
  23. package/dist/bin/commands/utils.js.map +2 -2
  24. package/dist/bin/installer/cli-agent.js +5 -25
  25. package/dist/bin/installer/cli-agent.js.map +2 -2
  26. package/dist/bin/installer/common.js +154 -0
  27. package/dist/bin/installer/common.js.map +7 -0
  28. package/dist/bin/installer/config-prompt.js +9 -2
  29. package/dist/bin/installer/config-prompt.js.map +2 -2
  30. package/dist/bin/installer/hooks.js +19 -1
  31. package/dist/bin/installer/hooks.js.map +2 -2
  32. package/dist/bin/installer/index.js +104 -86
  33. package/dist/bin/installer/index.js.map +2 -2
  34. package/dist/bin/installer/instructions.js +60 -0
  35. package/dist/bin/installer/instructions.js.map +7 -0
  36. package/dist/bin/installer/mcp.js +6 -36
  37. package/dist/bin/installer/mcp.js.map +2 -2
  38. package/dist/bin/installer/steering.js +116 -40
  39. package/dist/bin/installer/steering.js.map +2 -2
  40. package/dist/bin/installer/targets/claude.js +79 -0
  41. package/dist/bin/installer/targets/claude.js.map +7 -0
  42. package/dist/bin/installer/targets/codex.js +77 -0
  43. package/dist/bin/installer/targets/codex.js.map +7 -0
  44. package/dist/bin/installer/targets/index.js +57 -0
  45. package/dist/bin/installer/targets/index.js.map +7 -0
  46. package/dist/bin/installer/targets/kiro.js +63 -0
  47. package/dist/bin/installer/targets/kiro.js.map +7 -0
  48. package/dist/bin/kirograph.js +7 -1
  49. package/dist/bin/kirograph.js.map +3 -3
  50. package/dist/compression/filters/aws.js +418 -0
  51. package/dist/compression/filters/aws.js.map +7 -0
  52. package/dist/compression/filters/docker.js +153 -0
  53. package/dist/compression/filters/docker.js.map +7 -0
  54. package/dist/compression/filters/files.js +150 -0
  55. package/dist/compression/filters/files.js.map +7 -0
  56. package/dist/compression/filters/generic.js +86 -0
  57. package/dist/compression/filters/generic.js.map +7 -0
  58. package/dist/compression/filters/git.js +272 -0
  59. package/dist/compression/filters/git.js.map +7 -0
  60. package/dist/compression/filters/github.js +137 -0
  61. package/dist/compression/filters/github.js.map +7 -0
  62. package/dist/compression/filters/lint.js +280 -0
  63. package/dist/compression/filters/lint.js.map +7 -0
  64. package/dist/compression/filters/misc.js +212 -0
  65. package/dist/compression/filters/misc.js.map +7 -0
  66. package/dist/compression/filters/package.js +151 -0
  67. package/dist/compression/filters/package.js.map +7 -0
  68. package/dist/compression/filters/test.js +266 -0
  69. package/dist/compression/filters/test.js.map +7 -0
  70. package/dist/compression/index.js +144 -0
  71. package/dist/compression/index.js.map +7 -0
  72. package/dist/compression/naive-cost.js +94 -0
  73. package/dist/compression/naive-cost.js.map +7 -0
  74. package/dist/compression/tracker.js +228 -0
  75. package/dist/compression/tracker.js.map +7 -0
  76. package/dist/compression/types.js +17 -0
  77. package/dist/compression/types.js.map +7 -0
  78. package/dist/config.js +18 -1
  79. package/dist/config.js.map +2 -2
  80. package/dist/mcp/tool-names.js +50 -0
  81. package/dist/mcp/tool-names.js.map +7 -0
  82. package/dist/mcp/tools.js +173 -4
  83. package/dist/mcp/tools.js.map +3 -3
  84. package/package.json +2 -2
@@ -37,6 +37,8 @@ var import_config = require("../../config");
37
37
  var import_caveman = require("../installer/caveman");
38
38
  var import_steering = require("../installer/steering");
39
39
  var import_cli_agent = require("../installer/cli-agent");
40
+ var import_common = require("../installer/common");
41
+ var import_instructions = require("../installer/instructions");
40
42
  var import_ui = require("../ui");
41
43
  const JOKES = [
42
44
  "Ugh. Words hard. Code easy.",
@@ -99,15 +101,30 @@ function register(program) {
99
101
  const kiroDir = path.join(cwd, ".kiro");
100
102
  const steeringPath = path.join(kiroDir, "steering", "kirograph.md");
101
103
  if (fs.existsSync(steeringPath)) {
102
- (0, import_steering.writeSteering)(kiroDir, normalized);
104
+ const config = await (0, import_config.loadConfig)(cwd);
105
+ (0, import_steering.writeSteering)(kiroDir, {
106
+ cavemanMode: normalized,
107
+ enableCompression: config.shellCompressionLevel !== "off",
108
+ shellCompressionLevel: config.shellCompressionLevel
109
+ });
103
110
  }
104
111
  const agentPath = path.join(kiroDir, "agents", "kirograph.json");
105
112
  if (fs.existsSync(agentPath)) {
106
113
  (0, import_cli_agent.writeCliAgent)(kiroDir);
107
114
  }
115
+ for (const file of ["claude.md", "codex.md"]) {
116
+ const instructionsPath = path.join(cwd, ".kirograph", file);
117
+ if (fs.existsSync(instructionsPath)) {
118
+ fs.writeFileSync(instructionsPath, (0, import_instructions.buildAgentInstructions)(normalized));
119
+ }
120
+ }
121
+ const agentsPath = path.join(cwd, "AGENTS.md");
122
+ if (fs.existsSync(agentsPath) && fs.readFileSync(agentsPath, "utf8").includes("<!-- kirograph:codex:start -->")) {
123
+ (0, import_common.upsertGeneratedBlock)(agentsPath, "codex", "## KiroGraph", (0, import_instructions.buildAgentInstructions)(normalized));
124
+ }
108
125
  console.log();
109
126
  if (normalized === "off") {
110
- console.log(` ${import_ui.green}\u2713${import_ui.reset} Caveman mode ${import_ui.violet}${import_ui.bold}off${import_ui.reset}${import_ui.dim} \u2014 agent will respond normally from next session.${import_ui.reset}`);
127
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Caveman mode ${import_ui.violet}${import_ui.bold}off${import_ui.reset}${import_ui.dim} . Agent will respond normally from next session.${import_ui.reset}`);
111
128
  console.log(joke());
112
129
  } else {
113
130
  console.log(` ${import_ui.green}\u2713${import_ui.reset} Caveman mode set to ${import_ui.violet}${import_ui.bold}${normalized}${import_ui.reset}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/commands/caveman.ts"],
4
- "sourcesContent": ["/**\n * kg caveman [off|lite|full|ultra] \u2014 set caveman mode for this project\n * kg caveman \u2014 show current mode\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { Command } from 'commander';\nimport { loadConfig, updateConfig } from '../../config';\nimport { CAVEMAN_RULES, CavemanMode } from '../installer/caveman';\nimport { writeSteering } from '../installer/steering';\nimport { writeCliAgent } from '../installer/cli-agent';\nimport { bold, dim, green, reset, violet } from '../ui';\n\nconst JOKES = [\n 'Ugh. Words hard. Code easy.',\n 'Caveman not need article. Caveman have rock.',\n 'Why say lot word when few word do trick?',\n 'Token saved = mammoth fed.',\n 'Caveman compress speech. Caveman also compress mammoth.',\n 'Me not lazy. Me efficient.',\n 'Short answer good answer. Long answer... ugh.',\n 'Caveman invent fire. Caveman invent brief response.',\n 'No filler word. Only meat.',\n 'Grunt once. Mean much.',\n];\n\nfunction joke(): string {\n const line = JOKES[Math.floor(Math.random() * JOKES.length)];\n return `\\n ${violet}\uD83E\uDEA8 ${line}${reset}`;\n}\n\nconst MODES: Array<{ name: string; desc: string }> = [\n { name: 'off', desc: 'normal responses' },\n { name: 'lite', desc: 'compact, no filler, full sentences' },\n { name: 'full', desc: 'fragments, no articles, short synonyms' },\n { name: 'ultra', desc: 'maximum compression, abbreviations, \u2192 for causality' },\n];\n\nexport function register(program: Command): void {\n program\n .command('caveman [mode]')\n .description('Set caveman communication style for the Kiro agent (off | lite | full | ultra)')\n .action(async (mode: string | undefined) => {\n const cwd = process.cwd();\n\n // No mode argument: show current status\n if (!mode) {\n let current = 'off';\n try {\n const config = await loadConfig(cwd);\n current = config.cavemanMode ?? 'off';\n } catch { /* no .kirograph/ */ }\n\n console.log();\n console.log(` ${dim}Caveman mode${reset} ${violet}${bold}${current}${reset}`);\n console.log();\n console.log(` ${dim}Available modes:${reset}`);\n for (const m of MODES) {\n const active = m.name === current;\n const marker = active ? `${green}\u25CF${reset}` : `${dim}\u25CB${reset}`;\n const nameStr = active ? `${violet}${bold}${m.name}${reset}` : `${dim}${m.name}${reset}`;\n const nameW = m.name.length;\n const pad = ' '.repeat(6 - nameW);\n console.log(` ${marker} ${nameStr}${pad}${dim}${m.desc}${reset}`);\n }\n console.log();\n console.log(` ${dim}Change:${reset} kg caveman ${dim}<mode>${reset}`);\n console.log(joke());\n console.log();\n return;\n }\n\n const normalized = mode.toLowerCase();\n const valid = MODES.map(m => m.name);\n if (!valid.includes(normalized)) {\n console.error(` ${dim}Unknown mode:${reset} ${normalized}${dim}. Choose from: off, lite, full, ultra${reset}`);\n process.exit(1);\n }\n\n await updateConfig(cwd, { cavemanMode: normalized as CavemanMode | 'off' });\n\n const kiroDir = path.join(cwd, '.kiro');\n\n // Regenerate steering file if .kiro/steering/kirograph.md exists\n const steeringPath = path.join(kiroDir, 'steering', 'kirograph.md');\n if (fs.existsSync(steeringPath)) {\n writeSteering(kiroDir, normalized as CavemanMode | 'off');\n }\n\n // Regenerate CLI agent config if .kiro/agents/kirograph.json exists\n const agentPath = path.join(kiroDir, 'agents', 'kirograph.json');\n if (fs.existsSync(agentPath)) {\n writeCliAgent(kiroDir);\n }\n\n console.log();\n if (normalized === 'off') {\n console.log(` ${green}\u2713${reset} Caveman mode ${violet}${bold}off${reset}${dim} \u2014 agent will respond normally from next session.${reset}`);\n console.log(joke());\n } else {\n console.log(` ${green}\u2713${reset} Caveman mode set to ${violet}${bold}${normalized}${reset}`);\n console.log(` ${dim}Takes effect on next agent session.${reset}`);\n console.log();\n console.log(` ${dim}Rules preview:${reset}`);\n console.log();\n for (const line of CAVEMAN_RULES[normalized].split('\\n')) {\n if (line.startsWith('## ')) {\n console.log(` ${violet}${bold}${line.slice(3)}${reset}`);\n } else if (line === '') {\n console.log();\n } else {\n console.log(` ${dim}${line}${reset}`);\n }\n }\n console.log(joke());\n }\n console.log();\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * kg caveman [off|lite|full|ultra] \u2014 set caveman mode for this project\n * kg caveman \u2014 show current mode\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { Command } from 'commander';\nimport { loadConfig, updateConfig } from '../../config';\nimport { CAVEMAN_RULES, CavemanMode } from '../installer/caveman';\nimport { writeSteering } from '../installer/steering';\nimport { writeCliAgent } from '../installer/cli-agent';\nimport { upsertGeneratedBlock } from '../installer/common';\nimport { buildAgentInstructions } from '../installer/instructions';\nimport { bold, dim, green, reset, violet } from '../ui';\n\nconst JOKES = [\n 'Ugh. Words hard. Code easy.',\n 'Caveman not need article. Caveman have rock.',\n 'Why say lot word when few word do trick?',\n 'Token saved = mammoth fed.',\n 'Caveman compress speech. Caveman also compress mammoth.',\n 'Me not lazy. Me efficient.',\n 'Short answer good answer. Long answer... ugh.',\n 'Caveman invent fire. Caveman invent brief response.',\n 'No filler word. Only meat.',\n 'Grunt once. Mean much.',\n];\n\nfunction joke(): string {\n const line = JOKES[Math.floor(Math.random() * JOKES.length)];\n return `\\n ${violet}\uD83E\uDEA8 ${line}${reset}`;\n}\n\nconst MODES: Array<{ name: string; desc: string }> = [\n { name: 'off', desc: 'normal responses' },\n { name: 'lite', desc: 'compact, no filler, full sentences' },\n { name: 'full', desc: 'fragments, no articles, short synonyms' },\n { name: 'ultra', desc: 'maximum compression, abbreviations, \u2192 for causality' },\n];\n\nexport function register(program: Command): void {\n program\n .command('caveman [mode]')\n .description('Set caveman communication style for the Kiro agent (off | lite | full | ultra)')\n .action(async (mode: string | undefined) => {\n const cwd = process.cwd();\n\n // No mode argument: show current status\n if (!mode) {\n let current = 'off';\n try {\n const config = await loadConfig(cwd);\n current = config.cavemanMode ?? 'off';\n } catch { /* no .kirograph/ */ }\n\n console.log();\n console.log(` ${dim}Caveman mode${reset} ${violet}${bold}${current}${reset}`);\n console.log();\n console.log(` ${dim}Available modes:${reset}`);\n for (const m of MODES) {\n const active = m.name === current;\n const marker = active ? `${green}\u25CF${reset}` : `${dim}\u25CB${reset}`;\n const nameStr = active ? `${violet}${bold}${m.name}${reset}` : `${dim}${m.name}${reset}`;\n const nameW = m.name.length;\n const pad = ' '.repeat(6 - nameW);\n console.log(` ${marker} ${nameStr}${pad}${dim}${m.desc}${reset}`);\n }\n console.log();\n console.log(` ${dim}Change:${reset} kg caveman ${dim}<mode>${reset}`);\n console.log(joke());\n console.log();\n return;\n }\n\n const normalized = mode.toLowerCase();\n const valid = MODES.map(m => m.name);\n if (!valid.includes(normalized)) {\n console.error(` ${dim}Unknown mode:${reset} ${normalized}${dim}. Choose from: off, lite, full, ultra${reset}`);\n process.exit(1);\n }\n\n await updateConfig(cwd, { cavemanMode: normalized as CavemanMode | 'off' });\n\n const kiroDir = path.join(cwd, '.kiro');\n\n // Regenerate steering file if .kiro/steering/kirograph.md exists\n const steeringPath = path.join(kiroDir, 'steering', 'kirograph.md');\n if (fs.existsSync(steeringPath)) {\n const config = await loadConfig(cwd);\n writeSteering(kiroDir, {\n cavemanMode: normalized as CavemanMode | 'off',\n enableCompression: config.shellCompressionLevel !== 'off',\n shellCompressionLevel: config.shellCompressionLevel,\n });\n }\n\n // Regenerate CLI agent config if .kiro/agents/kirograph.json exists\n const agentPath = path.join(kiroDir, 'agents', 'kirograph.json');\n if (fs.existsSync(agentPath)) {\n writeCliAgent(kiroDir);\n }\n\n for (const file of ['claude.md', 'codex.md']) {\n const instructionsPath = path.join(cwd, '.kirograph', file);\n if (fs.existsSync(instructionsPath)) {\n fs.writeFileSync(instructionsPath, buildAgentInstructions(normalized as CavemanMode | 'off'));\n }\n }\n const agentsPath = path.join(cwd, 'AGENTS.md');\n if (fs.existsSync(agentsPath) && fs.readFileSync(agentsPath, 'utf8').includes('<!-- kirograph:codex:start -->')) {\n upsertGeneratedBlock(agentsPath, 'codex', '## KiroGraph', buildAgentInstructions(normalized as CavemanMode | 'off'));\n }\n\n console.log();\n if (normalized === 'off') {\n console.log(` ${green}\u2713${reset} Caveman mode ${violet}${bold}off${reset}${dim} . Agent will respond normally from next session.${reset}`);\n console.log(joke());\n } else {\n console.log(` ${green}\u2713${reset} Caveman mode set to ${violet}${bold}${normalized}${reset}`);\n console.log(` ${dim}Takes effect on next agent session.${reset}`);\n console.log();\n console.log(` ${dim}Rules preview:${reset}`);\n console.log();\n for (const line of CAVEMAN_RULES[normalized].split('\\n')) {\n if (line.startsWith('## ')) {\n console.log(` ${violet}${bold}${line.slice(3)}${reset}`);\n } else if (line === '') {\n console.log();\n } else {\n console.log(` ${dim}${line}${reset}`);\n }\n }\n console.log(joke());\n }\n console.log();\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var compression_exports = {};
30
+ __export(compression_exports, {
31
+ register: () => register
32
+ });
33
+ module.exports = __toCommonJS(compression_exports);
34
+ var path = __toESM(require("path"));
35
+ var fs = __toESM(require("fs"));
36
+ var import_config = require("../../config");
37
+ var import_steering = require("../installer/steering");
38
+ var import_hooks = require("../installer/hooks");
39
+ var import_ui = require("../ui");
40
+ const LEVELS = [
41
+ { name: "off", desc: "no compression hook or steering (tool still available)" },
42
+ { name: "normal", desc: "balanced: removes noise, keeps structure" },
43
+ { name: "aggressive", desc: "more compact: groups by category, limits output" },
44
+ { name: "ultra", desc: "maximum compression: counts and summaries only" }
45
+ ];
46
+ function register(program) {
47
+ program.command("compression [level]").description("Set shell compression level for kirograph_exec (off | normal | aggressive | ultra)").action(async (level) => {
48
+ const cwd = process.cwd();
49
+ if (!level) {
50
+ let current = "normal";
51
+ try {
52
+ const config2 = await (0, import_config.loadConfig)(cwd);
53
+ current = config2.shellCompressionLevel ?? "normal";
54
+ } catch {
55
+ }
56
+ console.log();
57
+ console.log(` ${import_ui.dim}Shell compression${import_ui.reset} ${import_ui.violet}${import_ui.bold}${current}${import_ui.reset}`);
58
+ console.log();
59
+ console.log(` ${import_ui.dim}Available levels:${import_ui.reset}`);
60
+ for (const l of LEVELS) {
61
+ const active = l.name === current;
62
+ const marker = active ? `${import_ui.green}\u25CF${import_ui.reset}` : `${import_ui.dim}\u25CB${import_ui.reset}`;
63
+ const nameStr = active ? `${import_ui.violet}${import_ui.bold}${l.name}${import_ui.reset}` : `${import_ui.dim}${l.name}${import_ui.reset}`;
64
+ const nameW = l.name.length;
65
+ const pad = " ".repeat(12 - nameW);
66
+ console.log(` ${marker} ${nameStr}${pad}${import_ui.dim}${l.desc}${import_ui.reset}`);
67
+ }
68
+ console.log();
69
+ console.log(` ${import_ui.dim}Change:${import_ui.reset} kg compression ${import_ui.dim}<level>${import_ui.reset}`);
70
+ console.log();
71
+ return;
72
+ }
73
+ const normalized = level.toLowerCase() === "on" ? "normal" : level.toLowerCase();
74
+ const valid = LEVELS.map((l) => l.name);
75
+ if (!valid.includes(normalized)) {
76
+ console.error(` ${import_ui.dim}Unknown level:${import_ui.reset} ${normalized}${import_ui.dim}. Choose from: off, normal, aggressive, ultra${import_ui.reset}`);
77
+ process.exit(1);
78
+ }
79
+ const shellCompressionLevel = normalized;
80
+ const config = await (0, import_config.updateConfig)(cwd, { shellCompressionLevel });
81
+ const enableCompression = shellCompressionLevel !== "off";
82
+ const kiroDir = path.join(cwd, ".kiro");
83
+ const steeringPath = path.join(kiroDir, "steering", "kirograph.md");
84
+ if (fs.existsSync(steeringPath)) {
85
+ (0, import_steering.writeSteering)(kiroDir, { cavemanMode: config.cavemanMode, enableCompression, shellCompressionLevel });
86
+ }
87
+ const hooksDir = path.join(kiroDir, "hooks");
88
+ if (fs.existsSync(hooksDir)) {
89
+ (0, import_hooks.writeHooks)(kiroDir, { enableCompression });
90
+ }
91
+ console.log();
92
+ if (shellCompressionLevel === "off") {
93
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Shell compression ${import_ui.violet}${import_ui.bold}off${import_ui.reset}`);
94
+ console.log(` ${import_ui.dim}kirograph_exec is still available but the agent won't be prompted to use it.${import_ui.reset}`);
95
+ console.log(` ${import_ui.dim}The compression hook and steering section have been removed.${import_ui.reset}`);
96
+ } else {
97
+ console.log(` ${import_ui.green}\u2713${import_ui.reset} Shell compression set to ${import_ui.violet}${import_ui.bold}${shellCompressionLevel}${import_ui.reset}`);
98
+ console.log(` ${import_ui.dim}kirograph_exec will use "${shellCompressionLevel}" as the default level.${import_ui.reset}`);
99
+ console.log(` ${import_ui.dim}The agent will be guided to use it for git, test, lint, build, and docker commands.${import_ui.reset}`);
100
+ }
101
+ console.log(` ${import_ui.dim}Takes effect on next agent session.${import_ui.reset}`);
102
+ console.log();
103
+ });
104
+ }
105
+ // Annotate the CommonJS export names for ESM import in node:
106
+ 0 && (module.exports = {
107
+ register
108
+ });
109
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/compression.ts"],
4
+ "sourcesContent": ["/**\n * kg compression [off|normal|aggressive|ultra] \u2014 set compression level for this project\n * kg compression \u2014 show current level\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { Command } from 'commander';\nimport { loadConfig, updateConfig, KiroGraphConfig } from '../../config';\nimport { writeSteering } from '../installer/steering';\nimport { writeHooks } from '../installer/hooks';\nimport { bold, dim, green, reset, violet } from '../ui';\n\ntype CompressionLevel = KiroGraphConfig['shellCompressionLevel'];\n\nconst LEVELS: Array<{ name: string; desc: string }> = [\n { name: 'off', desc: 'no compression hook or steering (tool still available)' },\n { name: 'normal', desc: 'balanced: removes noise, keeps structure' },\n { name: 'aggressive', desc: 'more compact: groups by category, limits output' },\n { name: 'ultra', desc: 'maximum compression: counts and summaries only' },\n];\n\nexport function register(program: Command): void {\n program\n .command('compression [level]')\n .description('Set shell compression level for kirograph_exec (off | normal | aggressive | ultra)')\n .action(async (level: string | undefined) => {\n const cwd = process.cwd();\n\n // No argument: show current status\n if (!level) {\n let current: CompressionLevel = 'normal';\n try {\n const config = await loadConfig(cwd);\n current = config.shellCompressionLevel ?? 'normal';\n } catch { /* no .kirograph/ */ }\n\n console.log();\n console.log(` ${dim}Shell compression${reset} ${violet}${bold}${current}${reset}`);\n console.log();\n console.log(` ${dim}Available levels:${reset}`);\n for (const l of LEVELS) {\n const active = l.name === current;\n const marker = active ? `${green}\u25CF${reset}` : `${dim}\u25CB${reset}`;\n const nameStr = active ? `${violet}${bold}${l.name}${reset}` : `${dim}${l.name}${reset}`;\n const nameW = l.name.length;\n const pad = ' '.repeat(12 - nameW);\n console.log(` ${marker} ${nameStr}${pad}${dim}${l.desc}${reset}`);\n }\n console.log();\n console.log(` ${dim}Change:${reset} kg compression ${dim}<level>${reset}`);\n console.log();\n return;\n }\n\n // Support legacy \"on\" \u2192 \"normal\"\n const normalized = level.toLowerCase() === 'on' ? 'normal' : level.toLowerCase();\n const valid = LEVELS.map(l => l.name);\n if (!valid.includes(normalized)) {\n console.error(` ${dim}Unknown level:${reset} ${normalized}${dim}. Choose from: off, normal, aggressive, ultra${reset}`);\n process.exit(1);\n }\n\n const shellCompressionLevel = normalized as CompressionLevel;\n const config = await updateConfig(cwd, { shellCompressionLevel });\n const enableCompression = shellCompressionLevel !== 'off';\n\n const kiroDir = path.join(cwd, '.kiro');\n\n // Regenerate steering file if it exists\n const steeringPath = path.join(kiroDir, 'steering', 'kirograph.md');\n if (fs.existsSync(steeringPath)) {\n writeSteering(kiroDir, { cavemanMode: config.cavemanMode, enableCompression, shellCompressionLevel });\n }\n\n // Regenerate hooks if hooks dir exists\n const hooksDir = path.join(kiroDir, 'hooks');\n if (fs.existsSync(hooksDir)) {\n writeHooks(kiroDir, { enableCompression });\n }\n\n console.log();\n if (shellCompressionLevel === 'off') {\n console.log(` ${green}\u2713${reset} Shell compression ${violet}${bold}off${reset}`);\n console.log(` ${dim}kirograph_exec is still available but the agent won't be prompted to use it.${reset}`);\n console.log(` ${dim}The compression hook and steering section have been removed.${reset}`);\n } else {\n console.log(` ${green}\u2713${reset} Shell compression set to ${violet}${bold}${shellCompressionLevel}${reset}`);\n console.log(` ${dim}kirograph_exec will use \"${shellCompressionLevel}\" as the default level.${reset}`);\n console.log(` ${dim}The agent will be guided to use it for git, test, lint, build, and docker commands.${reset}`);\n }\n console.log(` ${dim}Takes effect on next agent session.${reset}`);\n console.log();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["config"]
7
+ }
@@ -25,52 +25,59 @@ var import_ui = require("../ui");
25
25
  function register(program) {
26
26
  program.command("context <task>").description("Build relevant code context for a task").option("--max-nodes <n>", "Max symbols to include", "20").option("--no-code", "Exclude code snippets").option("--format <fmt>", "Output format: markdown, json", "markdown").action(async (task, opts) => {
27
27
  const KiroGraph = (await Promise.resolve().then(() => require("../../index.js"))).default;
28
- const cg = await KiroGraph.open(process.cwd());
28
+ const { trackCliToolSaving } = await Promise.resolve().then(() => require("./utils.js"));
29
+ const cwd = process.cwd();
30
+ const cg = await KiroGraph.open(cwd);
29
31
  const ctx = await cg.buildContext(task, {
30
32
  maxNodes: parseInt(opts.maxNodes),
31
33
  includeCode: opts.code
32
34
  });
35
+ let output;
33
36
  if (opts.format === "json") {
34
- console.log(JSON.stringify({
37
+ output = JSON.stringify({
35
38
  task: ctx.task,
36
39
  summary: ctx.summary,
37
40
  entryPoints: ctx.entryPoints.map((n) => ({ kind: n.kind, name: n.name, file: n.filePath, line: n.startLine })),
38
41
  relatedNodes: ctx.relatedNodes.map((n) => ({ kind: n.kind, name: n.name, file: n.filePath, line: n.startLine })),
39
42
  codeSnippets: Object.fromEntries(ctx.codeSnippets)
40
- }, null, 2));
41
- cg.close();
42
- return;
43
- }
44
- console.log(`
43
+ }, null, 2);
44
+ console.log(output);
45
+ } else {
46
+ const lines = [];
47
+ lines.push(`
45
48
  ${(0, import_ui.section)("Context:")} ${import_ui.violet}${import_ui.bold}${ctx.task}${import_ui.reset}
46
49
  `);
47
- console.log(` ${import_ui.dim}${ctx.summary}${import_ui.reset}`);
48
- if (ctx.entryPoints.length > 0) {
49
- console.log(`
50
+ lines.push(` ${import_ui.dim}${ctx.summary}${import_ui.reset}`);
51
+ if (ctx.entryPoints.length > 0) {
52
+ lines.push(`
50
53
  ${(0, import_ui.section)("Entry Points")}
51
54
  `);
52
- for (const n of ctx.entryPoints) {
53
- console.log(` ${import_ui.violet}${import_ui.bold}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
54
- if (ctx.codeSnippets.has(n.id)) {
55
- console.log(`
55
+ for (const n of ctx.entryPoints) {
56
+ lines.push(` ${import_ui.violet}${import_ui.bold}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
57
+ if (ctx.codeSnippets.has(n.id)) {
58
+ lines.push(`
56
59
  ${import_ui.dim}\`\`\`${import_ui.reset}`);
57
- for (const line of (ctx.codeSnippets.get(n.id) ?? "").split("\n")) {
58
- console.log(` ${line}`);
59
- }
60
- console.log(` ${import_ui.dim}\`\`\`${import_ui.reset}
60
+ for (const line of (ctx.codeSnippets.get(n.id) ?? "").split("\n")) {
61
+ lines.push(` ${line}`);
62
+ }
63
+ lines.push(` ${import_ui.dim}\`\`\`${import_ui.reset}
61
64
  `);
65
+ }
62
66
  }
63
67
  }
64
- }
65
- if (ctx.relatedNodes.length > 0) {
66
- console.log(`
68
+ if (ctx.relatedNodes.length > 0) {
69
+ lines.push(`
67
70
  ${(0, import_ui.section)("Related Symbols")}
68
71
  `);
69
- for (const n of ctx.relatedNodes) {
70
- console.log(` ${import_ui.dim}\xB7${import_ui.reset} ${import_ui.violet}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
72
+ for (const n of ctx.relatedNodes) {
73
+ lines.push(` ${import_ui.dim}\xB7${import_ui.reset} ${import_ui.violet}${n.name}${import_ui.reset} ${import_ui.dim}${n.kind} ${n.filePath}:${n.startLine}${import_ui.reset}`);
74
+ }
75
+ lines.push("");
71
76
  }
72
- console.log();
77
+ output = lines.join("\n");
78
+ console.log(output);
73
79
  }
80
+ trackCliToolSaving(cwd, "kirograph_context", output, { maxNodes: parseInt(opts.maxNodes) });
74
81
  cg.close();
75
82
  });
76
83
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/bin/commands/context.ts"],
4
- "sourcesContent": ["import { Command } from 'commander';\nimport { dim, reset, violet, bold, section } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('context <task>')\n .description('Build relevant code context for a task')\n .option('--max-nodes <n>', 'Max symbols to include', '20')\n .option('--no-code', 'Exclude code snippets')\n .option('--format <fmt>', 'Output format: markdown, json', 'markdown')\n .action(async (task: string, opts: { maxNodes: string; code: boolean; format: string }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const cg = await KiroGraph.open(process.cwd());\n const ctx = await cg.buildContext(task, {\n maxNodes: parseInt(opts.maxNodes),\n includeCode: opts.code,\n });\n\n if (opts.format === 'json') {\n console.log(JSON.stringify({\n task: ctx.task,\n summary: ctx.summary,\n entryPoints: ctx.entryPoints.map((n: any) => ({ kind: n.kind, name: n.name, file: n.filePath, line: n.startLine })),\n relatedNodes: ctx.relatedNodes.map((n: any) => ({ kind: n.kind, name: n.name, file: n.filePath, line: n.startLine })),\n codeSnippets: Object.fromEntries(ctx.codeSnippets),\n }, null, 2));\n cg.close(); return;\n }\n\n // Markdown output\n console.log(`\\n ${section('Context:')} ${violet}${bold}${ctx.task}${reset}\\n`);\n console.log(` ${dim}${ctx.summary}${reset}`);\n if (ctx.entryPoints.length > 0) {\n console.log(`\\n ${section('Entry Points')}\\n`);\n for (const n of ctx.entryPoints) {\n console.log(` ${violet}${bold}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n if (ctx.codeSnippets.has(n.id)) {\n console.log(`\\n ${dim}\\`\\`\\`${reset}`);\n for (const line of (ctx.codeSnippets.get(n.id) ?? '').split('\\n')) {\n console.log(` ${line}`);\n }\n console.log(` ${dim}\\`\\`\\`${reset}\\n`);\n }\n }\n }\n if (ctx.relatedNodes.length > 0) {\n console.log(`\\n ${section('Related Symbols')}\\n`);\n for (const n of ctx.relatedNodes) {\n console.log(` ${dim}\u00B7${reset} ${violet}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n }\n console.log();\n }\n cg.close();\n });\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAkD;AAE3C,SAAS,SAAS,SAAwB;AAC/C,UACG,QAAQ,gBAAgB,EACxB,YAAY,wCAAwC,EACpD,OAAO,mBAAmB,0BAA0B,IAAI,EACxD,OAAO,aAAa,uBAAuB,EAC3C,OAAO,kBAAkB,iCAAiC,UAAU,EACpE,OAAO,OAAO,MAAc,SAA8D;AACzF,UAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG;AAClF,UAAM,KAAK,MAAM,UAAU,KAAK,QAAQ,IAAI,CAAC;AAC7C,UAAM,MAAM,MAAM,GAAG,aAAa,MAAM;AAAA,MACtC,UAAU,SAAS,KAAK,QAAQ;AAAA,MAChC,aAAa,KAAK;AAAA,IACpB,CAAC;AAED,QAAI,KAAK,WAAW,QAAQ;AAC1B,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,aAAa,IAAI,YAAY,IAAI,CAAC,OAAY,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,UAAU,EAAE;AAAA,QAClH,cAAc,IAAI,aAAa,IAAI,CAAC,OAAY,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,UAAU,EAAE;AAAA,QACpH,cAAc,OAAO,YAAY,IAAI,YAAY;AAAA,MACnD,GAAG,MAAM,CAAC,CAAC;AACX,SAAG,MAAM;AAAG;AAAA,IACd;AAGA,YAAQ,IAAI;AAAA,QAAO,mBAAQ,UAAU,CAAC,IAAI,gBAAM,GAAG,cAAI,GAAG,IAAI,IAAI,GAAG,eAAK;AAAA,CAAI;AAC9E,YAAQ,IAAI,KAAK,aAAG,GAAG,IAAI,OAAO,GAAG,eAAK,EAAE;AAC5C,QAAI,IAAI,YAAY,SAAS,GAAG;AAC9B,cAAQ,IAAI;AAAA,QAAO,mBAAQ,cAAc,CAAC;AAAA,CAAI;AAC9C,iBAAW,KAAK,IAAI,aAAa;AAC/B,gBAAQ,IAAI,KAAK,gBAAM,GAAG,cAAI,GAAG,EAAE,IAAI,GAAG,eAAK,KAAK,aAAG,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS,GAAG,eAAK,EAAE;AACxG,YAAI,IAAI,aAAa,IAAI,EAAE,EAAE,GAAG;AAC9B,kBAAQ,IAAI;AAAA,IAAO,aAAG,SAAS,eAAK,EAAE;AACtC,qBAAW,SAAS,IAAI,aAAa,IAAI,EAAE,EAAE,KAAK,IAAI,MAAM,IAAI,GAAG;AACjE,oBAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,UACzB;AACA,kBAAQ,IAAI,KAAK,aAAG,SAAS,eAAK;AAAA,CAAI;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,aAAa,SAAS,GAAG;AAC/B,cAAQ,IAAI;AAAA,QAAO,mBAAQ,iBAAiB,CAAC;AAAA,CAAI;AACjD,iBAAW,KAAK,IAAI,cAAc;AAChC,gBAAQ,IAAI,KAAK,aAAG,OAAI,eAAK,IAAI,gBAAM,GAAG,EAAE,IAAI,GAAG,eAAK,KAAK,aAAG,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,SAAS,GAAG,eAAK,EAAE;AAAA,MACnH;AACA,cAAQ,IAAI;AAAA,IACd;AACA,OAAG,MAAM;AAAA,EACX,CAAC;AACL;",
4
+ "sourcesContent": ["import { Command } from 'commander';\nimport { dim, reset, violet, bold, section } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('context <task>')\n .description('Build relevant code context for a task')\n .option('--max-nodes <n>', 'Max symbols to include', '20')\n .option('--no-code', 'Exclude code snippets')\n .option('--format <fmt>', 'Output format: markdown, json', 'markdown')\n .action(async (task: string, opts: { maxNodes: string; code: boolean; format: string }) => {\n const KiroGraph = (await Promise.resolve().then(() => require('../../index.js'))).default;\n const { trackCliToolSaving } = await Promise.resolve().then(() => require('./utils.js'));\n\n const cwd = process.cwd();\n const cg = await KiroGraph.open(cwd);\n const ctx = await cg.buildContext(task, {\n maxNodes: parseInt(opts.maxNodes),\n includeCode: opts.code,\n });\n\n let output: string;\n\n if (opts.format === 'json') {\n output = JSON.stringify({\n task: ctx.task,\n summary: ctx.summary,\n entryPoints: ctx.entryPoints.map((n: any) => ({ kind: n.kind, name: n.name, file: n.filePath, line: n.startLine })),\n relatedNodes: ctx.relatedNodes.map((n: any) => ({ kind: n.kind, name: n.name, file: n.filePath, line: n.startLine })),\n codeSnippets: Object.fromEntries(ctx.codeSnippets),\n }, null, 2);\n console.log(output);\n } else {\n // Markdown output\n const lines: string[] = [];\n lines.push(`\\n ${section('Context:')} ${violet}${bold}${ctx.task}${reset}\\n`);\n lines.push(` ${dim}${ctx.summary}${reset}`);\n if (ctx.entryPoints.length > 0) {\n lines.push(`\\n ${section('Entry Points')}\\n`);\n for (const n of ctx.entryPoints) {\n lines.push(` ${violet}${bold}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n if (ctx.codeSnippets.has(n.id)) {\n lines.push(`\\n ${dim}\\`\\`\\`${reset}`);\n for (const line of (ctx.codeSnippets.get(n.id) ?? '').split('\\n')) {\n lines.push(` ${line}`);\n }\n lines.push(` ${dim}\\`\\`\\`${reset}\\n`);\n }\n }\n }\n if (ctx.relatedNodes.length > 0) {\n lines.push(`\\n ${section('Related Symbols')}\\n`);\n for (const n of ctx.relatedNodes) {\n lines.push(` ${dim}\u00B7${reset} ${violet}${n.name}${reset} ${dim}${n.kind} ${n.filePath}:${n.startLine}${reset}`);\n }\n lines.push('');\n }\n output = lines.join('\\n');\n console.log(output);\n }\n\n // Track graph tool savings\n trackCliToolSaving(cwd, 'kirograph_context', output, { maxNodes: parseInt(opts.maxNodes) });\n\n cg.close();\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var exec_exports = {};
20
+ __export(exec_exports, {
21
+ register: () => register
22
+ });
23
+ module.exports = __toCommonJS(exec_exports);
24
+ var import_child_process = require("child_process");
25
+ var import_compression = require("../../compression/index");
26
+ var import_tracker = require("../../compression/tracker");
27
+ var import_config = require("../../config");
28
+ var import_ui = require("../ui");
29
+ function register(program) {
30
+ program.command("exec").description("Run a shell command and return token-optimized output").option("-l, --level <level>", "Compression level: normal, aggressive, ultra").option("-t, --timeout <seconds>", "Timeout in seconds", "60").option("--raw", "Also print the raw output for comparison").option("--json", "Output result as JSON").allowUnknownOption(true).allowExcessArguments(true).action(async (opts, cmd) => {
31
+ const args = cmd.args;
32
+ if (args.length === 0) {
33
+ console.error(" Usage: kirograph exec <command...>");
34
+ console.error(" Example: kirograph exec git status");
35
+ process.exit(1);
36
+ }
37
+ const shellCommand = args.join(" ");
38
+ const cwd = process.cwd();
39
+ const timeout = (parseInt(opts.timeout || "60", 10) || 60) * 1e3;
40
+ let defaultLevel = "normal";
41
+ try {
42
+ const config = await (0, import_config.loadConfig)(cwd);
43
+ if (config.shellCompressionLevel && config.shellCompressionLevel !== "off") {
44
+ defaultLevel = config.shellCompressionLevel;
45
+ }
46
+ } catch {
47
+ }
48
+ const level = opts.level || defaultLevel;
49
+ const validLevels = ["normal", "aggressive", "ultra"];
50
+ if (!validLevels.includes(level)) {
51
+ console.error(` Unknown level: ${level}. Choose from: normal, aggressive, ultra`);
52
+ process.exit(1);
53
+ }
54
+ let rawOutput;
55
+ let exitCode = 0;
56
+ try {
57
+ rawOutput = (0, import_child_process.execSync)(shellCommand, {
58
+ cwd,
59
+ timeout,
60
+ encoding: "utf8",
61
+ stdio: ["pipe", "pipe", "pipe"],
62
+ maxBuffer: 10 * 1024 * 1024
63
+ });
64
+ } catch (err) {
65
+ rawOutput = (err.stdout || "") + (err.stderr || "");
66
+ exitCode = err.status ?? 1;
67
+ }
68
+ const result = (0, import_compression.compress)(shellCommand, rawOutput, { level, preserveErrors: exitCode !== 0 });
69
+ const tracker = new import_tracker.TokenTracker(cwd);
70
+ tracker.record(shellCommand, result.originalTokens, result.compressedTokens, result.strategy);
71
+ if (opts.json) {
72
+ console.log(JSON.stringify({
73
+ command: shellCommand,
74
+ exitCode,
75
+ level,
76
+ strategy: result.strategy,
77
+ commandFamily: result.commandFamily,
78
+ originalTokens: result.originalTokens,
79
+ compressedTokens: result.compressedTokens,
80
+ savings: result.savings,
81
+ output: result.output
82
+ }, null, 2));
83
+ process.exit(exitCode);
84
+ return;
85
+ }
86
+ if (opts.raw) {
87
+ console.log(`${import_ui.dim}\u2500\u2500 raw (${result.originalTokens} tokens) \u2500\u2500${import_ui.reset}`);
88
+ console.log(rawOutput);
89
+ console.log(`${import_ui.dim}\u2500\u2500 compressed (${result.compressedTokens} tokens) \u2500\u2500${import_ui.reset}`);
90
+ }
91
+ if (exitCode !== 0) {
92
+ process.stderr.write(result.output + "\n");
93
+ } else {
94
+ console.log(result.output);
95
+ }
96
+ if (result.savings > 5) {
97
+ console.log(`
98
+ ${import_ui.dim}[${import_ui.green}${result.savings}% saved${import_ui.reset}${import_ui.dim} | ${result.originalTokens}\u2192${result.compressedTokens} tokens | ${import_ui.violet}${result.strategy}${import_ui.reset}${import_ui.dim}]${import_ui.reset}`);
99
+ }
100
+ process.exit(exitCode);
101
+ });
102
+ }
103
+ // Annotate the CommonJS export names for ESM import in node:
104
+ 0 && (module.exports = {
105
+ register
106
+ });
107
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/exec.ts"],
4
+ "sourcesContent": ["/**\n * kirograph exec <command...> \u2014 Run a shell command with token-optimized output\n *\n * Examples:\n * kirograph exec git status\n * kirograph exec --level aggressive npm test\n * kirograph exec -l ultra ls -la src/\n */\n\nimport { Command } from 'commander';\nimport { execSync } from 'child_process';\nimport { compress } from '../../compression/index';\nimport { TokenTracker } from '../../compression/tracker';\nimport { loadConfig } from '../../config';\nimport { dim, green, reset, violet } from '../ui';\n\nexport function register(program: Command): void {\n program\n .command('exec')\n .description('Run a shell command and return token-optimized output')\n .option('-l, --level <level>', 'Compression level: normal, aggressive, ultra')\n .option('-t, --timeout <seconds>', 'Timeout in seconds', '60')\n .option('--raw', 'Also print the raw output for comparison')\n .option('--json', 'Output result as JSON')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(async (opts: { level?: string; timeout?: string; raw?: boolean; json?: boolean }, cmd: Command) => {\n // Everything after \"exec\" and known options is the command to run\n const args = cmd.args;\n if (args.length === 0) {\n console.error(' Usage: kirograph exec <command...>');\n console.error(' Example: kirograph exec git status');\n process.exit(1);\n }\n\n const shellCommand = args.join(' ');\n const cwd = process.cwd();\n const timeout = (parseInt(opts.timeout || '60', 10) || 60) * 1000;\n\n // Read default level from config\n let defaultLevel: 'normal' | 'aggressive' | 'ultra' = 'normal';\n try {\n const config = await loadConfig(cwd);\n if (config.shellCompressionLevel && config.shellCompressionLevel !== 'off') {\n defaultLevel = config.shellCompressionLevel as 'normal' | 'aggressive' | 'ultra';\n }\n } catch { /* no config */ }\n\n const level = (opts.level as 'normal' | 'aggressive' | 'ultra') || defaultLevel;\n const validLevels = ['normal', 'aggressive', 'ultra'];\n if (!validLevels.includes(level)) {\n console.error(` Unknown level: ${level}. Choose from: normal, aggressive, ultra`);\n process.exit(1);\n }\n\n // Execute the command\n let rawOutput: string;\n let exitCode = 0;\n try {\n rawOutput = execSync(shellCommand, {\n cwd,\n timeout,\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024,\n });\n } catch (err: any) {\n rawOutput = (err.stdout || '') + (err.stderr || '');\n exitCode = err.status ?? 1;\n }\n\n // Compress\n const result = compress(shellCommand, rawOutput, { level, preserveErrors: exitCode !== 0 });\n\n // Track savings\n const tracker = new TokenTracker(cwd);\n tracker.record(shellCommand, result.originalTokens, result.compressedTokens, result.strategy);\n\n // Output\n if (opts.json) {\n console.log(JSON.stringify({\n command: shellCommand,\n exitCode,\n level,\n strategy: result.strategy,\n commandFamily: result.commandFamily,\n originalTokens: result.originalTokens,\n compressedTokens: result.compressedTokens,\n savings: result.savings,\n output: result.output,\n }, null, 2));\n process.exit(exitCode);\n return;\n }\n\n if (opts.raw) {\n console.log(`${dim}\u2500\u2500 raw (${result.originalTokens} tokens) \u2500\u2500${reset}`);\n console.log(rawOutput);\n console.log(`${dim}\u2500\u2500 compressed (${result.compressedTokens} tokens) \u2500\u2500${reset}`);\n }\n\n // Print compressed output\n if (exitCode !== 0) {\n process.stderr.write(result.output + '\\n');\n } else {\n console.log(result.output);\n }\n\n // Print savings footer\n if (result.savings > 5) {\n console.log(`\\n${dim}[${green}${result.savings}% saved${reset}${dim} | ${result.originalTokens}\u2192${result.compressedTokens} tokens | ${violet}${result.strategy}${reset}${dim}]${reset}`);\n }\n\n process.exit(exitCode);\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var gain_exports = {};
20
+ __export(gain_exports, {
21
+ register: () => register
22
+ });
23
+ module.exports = __toCommonJS(gain_exports);
24
+ function register(program) {
25
+ program.command("gain").description("Show token savings from kirograph_exec compression").option("--graph", "Show ASCII graph of daily savings").option("--history", "Show recent command history").option("--daily", "Show day-by-day breakdown").option("--period <period>", "Time period: session, today, week, all", "all").option("--json", "Output as JSON").action(async (opts) => {
26
+ const { TokenTracker } = await Promise.resolve().then(() => require("../../compression/tracker.js"));
27
+ const tracker = new TokenTracker(process.cwd());
28
+ if (opts.history) {
29
+ const history = tracker.getHistory(20);
30
+ if (history.length === 0) {
31
+ console.log(" No commands recorded yet. Use kirograph_exec to run commands with compression.");
32
+ return;
33
+ }
34
+ if (opts.json) {
35
+ console.log(JSON.stringify(history, null, 2));
36
+ return;
37
+ }
38
+ console.log(" Recent compressed commands:\n");
39
+ for (const r of history) {
40
+ const date = new Date(r.timestamp).toLocaleString();
41
+ const savings = r.originalTokens > 0 ? Math.round((r.originalTokens - r.compressedTokens) / r.originalTokens * 100) : 0;
42
+ const cmd = r.command.length > 50 ? r.command.slice(0, 47) + "..." : r.command;
43
+ console.log(` ${date} ${cmd.padEnd(50)} ${savings}% saved (${r.strategy})`);
44
+ }
45
+ return;
46
+ }
47
+ if (opts.daily || opts.graph) {
48
+ const daily = tracker.getDailyBreakdown(30);
49
+ if (daily.length === 0) {
50
+ console.log(" No data yet.");
51
+ return;
52
+ }
53
+ if (opts.json) {
54
+ console.log(JSON.stringify(daily, null, 2));
55
+ return;
56
+ }
57
+ if (opts.graph) {
58
+ console.log(" Token savings (last 30 days):\n");
59
+ const maxSaved = Math.max(...daily.map((d) => d.saved), 1);
60
+ const barWidth = 40;
61
+ for (const day of daily) {
62
+ const bar = "\u2588".repeat(Math.round(day.saved / maxSaved * barWidth));
63
+ const label = day.date.slice(5);
64
+ console.log(` ${label} ${bar} ${day.saved.toLocaleString()} tokens (${day.commands} cmds)`);
65
+ }
66
+ return;
67
+ }
68
+ console.log(" Daily breakdown:\n");
69
+ console.log(" Date Commands Tokens Saved");
70
+ console.log(" " + "\u2500".repeat(40));
71
+ for (const day of daily) {
72
+ console.log(` ${day.date} ${String(day.commands).padStart(8)} ${day.saved.toLocaleString().padStart(12)}`);
73
+ }
74
+ return;
75
+ }
76
+ const period = opts.period;
77
+ const stats = tracker.getStats(period);
78
+ if (stats.totalCommands === 0) {
79
+ console.log(" No savings recorded yet.");
80
+ console.log(" Use kirograph tools and kirograph exec . Savings are tracked automatically.");
81
+ return;
82
+ }
83
+ if (opts.json) {
84
+ console.log(JSON.stringify(stats, null, 2));
85
+ return;
86
+ }
87
+ console.log(`
88
+ Token Savings (${period}):`);
89
+ console.log(` ${"\u2500".repeat(50)}`);
90
+ console.log(` Total calls: ${stats.totalCommands}`);
91
+ console.log(` Tokens without KiroGraph: ~${stats.totalOriginal.toLocaleString()}`);
92
+ console.log(` Tokens with KiroGraph: ~${stats.totalCompressed.toLocaleString()}`);
93
+ console.log(` Saved: ~${stats.totalSaved.toLocaleString()} (${stats.savingsPercent}%)`);
94
+ if (stats.bySource.exec.count > 0 || stats.bySource.graph.count > 0) {
95
+ console.log(`
96
+ By source:`);
97
+ if (stats.bySource.graph.count > 0) {
98
+ console.log(` \u{1F4CA} Graph tools: ${String(stats.bySource.graph.count).padStart(4)} calls ~${stats.bySource.graph.saved.toLocaleString()} tokens saved (vs file reads/grep)`);
99
+ }
100
+ if (stats.bySource.exec.count > 0) {
101
+ console.log(` \u26A1 Compression: ${String(stats.bySource.exec.count).padStart(4)} calls ~${stats.bySource.exec.saved.toLocaleString()} tokens saved (vs raw output)`);
102
+ }
103
+ }
104
+ if (Object.keys(stats.byFamily).length > 0) {
105
+ console.log(`
106
+ By family:`);
107
+ for (const [family, data] of Object.entries(stats.byFamily)) {
108
+ const icon = family.startsWith("graph") ? "\u{1F4CA}" : "\u26A1";
109
+ console.log(` ${icon} ${family.padEnd(20)} ${String(data.count).padStart(4)} calls ${data.savings}% avg savings`);
110
+ }
111
+ }
112
+ console.log();
113
+ });
114
+ }
115
+ // Annotate the CommonJS export names for ESM import in node:
116
+ 0 && (module.exports = {
117
+ register
118
+ });
119
+ //# sourceMappingURL=gain.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/commands/gain.ts"],
4
+ "sourcesContent": ["/**\n * kirograph gain \u2014 Token savings analytics CLI command\n */\n\nimport { Command } from 'commander';\n\nexport function register(program: Command): void {\n program\n .command('gain')\n .description('Show token savings from kirograph_exec compression')\n .option('--graph', 'Show ASCII graph of daily savings')\n .option('--history', 'Show recent command history')\n .option('--daily', 'Show day-by-day breakdown')\n .option('--period <period>', 'Time period: session, today, week, all', 'all')\n .option('--json', 'Output as JSON')\n .action(async (opts: { graph?: boolean; history?: boolean; daily?: boolean; period: string; json?: boolean }) => {\n const { TokenTracker } = await Promise.resolve().then(() => require('../../compression/tracker.js'));\n const tracker = new TokenTracker(process.cwd());\n\n if (opts.history) {\n const history = tracker.getHistory(20);\n if (history.length === 0) {\n console.log(' No commands recorded yet. Use kirograph_exec to run commands with compression.');\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(history, null, 2));\n return;\n }\n\n console.log(' Recent compressed commands:\\n');\n for (const r of history) {\n const date = new Date(r.timestamp).toLocaleString();\n const savings = r.originalTokens > 0\n ? Math.round(((r.originalTokens - r.compressedTokens) / r.originalTokens) * 100)\n : 0;\n const cmd = r.command.length > 50 ? r.command.slice(0, 47) + '...' : r.command;\n console.log(` ${date} ${cmd.padEnd(50)} ${savings}% saved (${r.strategy})`);\n }\n return;\n }\n\n if (opts.daily || opts.graph) {\n const daily = tracker.getDailyBreakdown(30);\n if (daily.length === 0) {\n console.log(' No data yet.');\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(daily, null, 2));\n return;\n }\n\n if (opts.graph) {\n console.log(' Token savings (last 30 days):\\n');\n const maxSaved = Math.max(...daily.map(d => d.saved), 1);\n const barWidth = 40;\n\n for (const day of daily) {\n const bar = '\u2588'.repeat(Math.round((day.saved / maxSaved) * barWidth));\n const label = day.date.slice(5); // MM-DD\n console.log(` ${label} ${bar} ${day.saved.toLocaleString()} tokens (${day.commands} cmds)`);\n }\n return;\n }\n\n console.log(' Daily breakdown:\\n');\n console.log(' Date Commands Tokens Saved');\n console.log(' ' + '\u2500'.repeat(40));\n for (const day of daily) {\n console.log(` ${day.date} ${String(day.commands).padStart(8)} ${day.saved.toLocaleString().padStart(12)}`);\n }\n return;\n }\n\n // Default: summary stats\n const period = opts.period as 'session' | 'today' | 'week' | 'all';\n const stats = tracker.getStats(period);\n\n if (stats.totalCommands === 0) {\n console.log(' No savings recorded yet.');\n console.log(' Use kirograph tools and kirograph exec . Savings are tracked automatically.');\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n console.log(`\\n Token Savings (${period}):`);\n console.log(` ${'\u2500'.repeat(50)}`);\n console.log(` Total calls: ${stats.totalCommands}`);\n console.log(` Tokens without KiroGraph: ~${stats.totalOriginal.toLocaleString()}`);\n console.log(` Tokens with KiroGraph: ~${stats.totalCompressed.toLocaleString()}`);\n console.log(` Saved: ~${stats.totalSaved.toLocaleString()} (${stats.savingsPercent}%)`);\n\n // Source breakdown\n if (stats.bySource.exec.count > 0 || stats.bySource.graph.count > 0) {\n console.log(`\\n By source:`);\n if (stats.bySource.graph.count > 0) {\n console.log(` \uD83D\uDCCA Graph tools: ${String(stats.bySource.graph.count).padStart(4)} calls ~${stats.bySource.graph.saved.toLocaleString()} tokens saved (vs file reads/grep)`);\n }\n if (stats.bySource.exec.count > 0) {\n console.log(` \u26A1 Compression: ${String(stats.bySource.exec.count).padStart(4)} calls ~${stats.bySource.exec.saved.toLocaleString()} tokens saved (vs raw output)`);\n }\n }\n\n if (Object.keys(stats.byFamily).length > 0) {\n console.log(`\\n By family:`);\n for (const [family, data] of Object.entries(stats.byFamily)) {\n const icon = family.startsWith('graph') ? '\uD83D\uDCCA' : '\u26A1';\n console.log(` ${icon} ${family.padEnd(20)} ${String(data.count).padStart(4)} calls ${data.savings}% avg savings`);\n }\n }\n\n console.log();\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }