@tienne/gestalt 0.9.0 → 0.9.2

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 (136) hide show
  1. package/CLAUDE.md +78 -1
  2. package/dist/package.json +3 -1
  3. package/dist/schemas/gestalt.schema.json +5 -0
  4. package/dist/skills/blast-radius/SKILL.md +134 -0
  5. package/dist/skills/build-graph/SKILL.md +100 -0
  6. package/dist/skills/diff-radius/SKILL.md +125 -0
  7. package/dist/skills/execute/SKILL.md +90 -8
  8. package/dist/skills/interview/SKILL.md +5 -4
  9. package/dist/skills/spec/SKILL.md +7 -1
  10. package/dist/src/cli/commands/init.d.ts +5 -0
  11. package/dist/src/cli/commands/init.d.ts.map +1 -0
  12. package/dist/src/cli/commands/init.js +79 -0
  13. package/dist/src/cli/commands/init.js.map +1 -0
  14. package/dist/src/cli/commands/setup.d.ts.map +1 -1
  15. package/dist/src/cli/commands/setup.js +1 -0
  16. package/dist/src/cli/commands/setup.js.map +1 -1
  17. package/dist/src/cli/index.d.ts.map +1 -1
  18. package/dist/src/cli/index.js +9 -0
  19. package/dist/src/cli/index.js.map +1 -1
  20. package/dist/src/code-graph/blast-radius.d.ts +9 -0
  21. package/dist/src/code-graph/blast-radius.d.ts.map +1 -0
  22. package/dist/src/code-graph/blast-radius.js +139 -0
  23. package/dist/src/code-graph/blast-radius.js.map +1 -0
  24. package/dist/src/code-graph/engine.d.ts +46 -0
  25. package/dist/src/code-graph/engine.d.ts.map +1 -0
  26. package/dist/src/code-graph/engine.js +301 -0
  27. package/dist/src/code-graph/engine.js.map +1 -0
  28. package/dist/src/code-graph/git-hook.d.ts +22 -0
  29. package/dist/src/code-graph/git-hook.d.ts.map +1 -0
  30. package/dist/src/code-graph/git-hook.js +100 -0
  31. package/dist/src/code-graph/git-hook.js.map +1 -0
  32. package/dist/src/code-graph/index.d.ts +7 -0
  33. package/dist/src/code-graph/index.d.ts.map +1 -0
  34. package/dist/src/code-graph/index.js +6 -0
  35. package/dist/src/code-graph/index.js.map +1 -0
  36. package/dist/src/code-graph/plugins/go.d.ts +3 -0
  37. package/dist/src/code-graph/plugins/go.d.ts.map +1 -0
  38. package/dist/src/code-graph/plugins/go.js +126 -0
  39. package/dist/src/code-graph/plugins/go.js.map +1 -0
  40. package/dist/src/code-graph/plugins/index.d.ts +16 -0
  41. package/dist/src/code-graph/plugins/index.d.ts.map +1 -0
  42. package/dist/src/code-graph/plugins/index.js +36 -0
  43. package/dist/src/code-graph/plugins/index.js.map +1 -0
  44. package/dist/src/code-graph/plugins/java.d.ts +3 -0
  45. package/dist/src/code-graph/plugins/java.d.ts.map +1 -0
  46. package/dist/src/code-graph/plugins/java.js +108 -0
  47. package/dist/src/code-graph/plugins/java.js.map +1 -0
  48. package/dist/src/code-graph/plugins/kotlin.d.ts +3 -0
  49. package/dist/src/code-graph/plugins/kotlin.d.ts.map +1 -0
  50. package/dist/src/code-graph/plugins/kotlin.js +94 -0
  51. package/dist/src/code-graph/plugins/kotlin.js.map +1 -0
  52. package/dist/src/code-graph/plugins/objc.d.ts +3 -0
  53. package/dist/src/code-graph/plugins/objc.d.ts.map +1 -0
  54. package/dist/src/code-graph/plugins/objc.js +129 -0
  55. package/dist/src/code-graph/plugins/objc.js.map +1 -0
  56. package/dist/src/code-graph/plugins/python.d.ts +3 -0
  57. package/dist/src/code-graph/plugins/python.d.ts.map +1 -0
  58. package/dist/src/code-graph/plugins/python.js +116 -0
  59. package/dist/src/code-graph/plugins/python.js.map +1 -0
  60. package/dist/src/code-graph/plugins/rust.d.ts +3 -0
  61. package/dist/src/code-graph/plugins/rust.d.ts.map +1 -0
  62. package/dist/src/code-graph/plugins/rust.js +108 -0
  63. package/dist/src/code-graph/plugins/rust.js.map +1 -0
  64. package/dist/src/code-graph/plugins/swift.d.ts +3 -0
  65. package/dist/src/code-graph/plugins/swift.d.ts.map +1 -0
  66. package/dist/src/code-graph/plugins/swift.js +106 -0
  67. package/dist/src/code-graph/plugins/swift.js.map +1 -0
  68. package/dist/src/code-graph/plugins/typescript.d.ts +3 -0
  69. package/dist/src/code-graph/plugins/typescript.d.ts.map +1 -0
  70. package/dist/src/code-graph/plugins/typescript.js +209 -0
  71. package/dist/src/code-graph/plugins/typescript.js.map +1 -0
  72. package/dist/src/code-graph/storage.d.ts +18 -0
  73. package/dist/src/code-graph/storage.d.ts.map +1 -0
  74. package/dist/src/code-graph/storage.js +175 -0
  75. package/dist/src/code-graph/storage.js.map +1 -0
  76. package/dist/src/code-graph/types.d.ts +93 -0
  77. package/dist/src/code-graph/types.d.ts.map +1 -0
  78. package/dist/src/code-graph/types.js +17 -0
  79. package/dist/src/code-graph/types.js.map +1 -0
  80. package/dist/src/core/config.d.ts +4 -0
  81. package/dist/src/core/config.d.ts.map +1 -1
  82. package/dist/src/core/config.js +6 -1
  83. package/dist/src/core/config.js.map +1 -1
  84. package/dist/src/core/types.d.ts +1 -0
  85. package/dist/src/core/types.d.ts.map +1 -1
  86. package/dist/src/execute/passthrough-engine.d.ts +4 -1
  87. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  88. package/dist/src/execute/passthrough-engine.js +54 -4
  89. package/dist/src/execute/passthrough-engine.js.map +1 -1
  90. package/dist/src/execute/prompts.d.ts +2 -2
  91. package/dist/src/execute/prompts.d.ts.map +1 -1
  92. package/dist/src/execute/prompts.js +7 -3
  93. package/dist/src/execute/prompts.js.map +1 -1
  94. package/dist/src/execute/repository.d.ts.map +1 -1
  95. package/dist/src/execute/repository.js +1 -0
  96. package/dist/src/execute/repository.js.map +1 -1
  97. package/dist/src/execute/session.d.ts +3 -1
  98. package/dist/src/execute/session.d.ts.map +1 -1
  99. package/dist/src/execute/session.js +3 -1
  100. package/dist/src/execute/session.js.map +1 -1
  101. package/dist/src/mcp/schemas.d.ts +46 -0
  102. package/dist/src/mcp/schemas.d.ts.map +1 -1
  103. package/dist/src/mcp/schemas.js +23 -0
  104. package/dist/src/mcp/schemas.js.map +1 -1
  105. package/dist/src/mcp/server.d.ts.map +1 -1
  106. package/dist/src/mcp/server.js +21 -1
  107. package/dist/src/mcp/server.js.map +1 -1
  108. package/dist/src/mcp/tools/code-graph-passthrough.d.ts +16 -0
  109. package/dist/src/mcp/tools/code-graph-passthrough.d.ts.map +1 -0
  110. package/dist/src/mcp/tools/code-graph-passthrough.js +65 -0
  111. package/dist/src/mcp/tools/code-graph-passthrough.js.map +1 -0
  112. package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
  113. package/dist/src/mcp/tools/execute-passthrough.js +28 -2
  114. package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
  115. package/dist/src/mcp/tools/index.d.ts +1 -0
  116. package/dist/src/mcp/tools/index.d.ts.map +1 -1
  117. package/dist/src/mcp/tools/index.js +1 -0
  118. package/dist/src/mcp/tools/index.js.map +1 -1
  119. package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
  120. package/dist/src/mcp/tools/interview-passthrough.js +5 -0
  121. package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
  122. package/dist/src/mcp/tools/spec-passthrough.d.ts.map +1 -1
  123. package/dist/src/mcp/tools/spec-passthrough.js +9 -0
  124. package/dist/src/mcp/tools/spec-passthrough.js.map +1 -1
  125. package/dist/src/utils/notifier.d.ts +10 -0
  126. package/dist/src/utils/notifier.d.ts.map +1 -0
  127. package/dist/src/utils/notifier.js +21 -0
  128. package/dist/src/utils/notifier.js.map +1 -0
  129. package/package.json +3 -1
  130. package/schemas/gestalt.schema.json +5 -0
  131. package/skills/blast-radius/SKILL.md +134 -0
  132. package/skills/build-graph/SKILL.md +100 -0
  133. package/skills/diff-radius/SKILL.md +125 -0
  134. package/skills/execute/SKILL.md +90 -8
  135. package/skills/interview/SKILL.md +5 -4
  136. package/skills/spec/SKILL.md +7 -1
@@ -104,7 +104,13 @@ Spec 생성 중 Claude Code Task 패널에 상태를 표시한다. best-effort
104
104
  ```
105
105
  subject: "Spec 생성 중"
106
106
  description: "인터뷰 세션 {sessionId} 기반 Spec 구성 중..."
107
- activeForm: "Spec 생성 중"
107
+ activeForm: "1/2 컨텍스트 요청 중"
108
+ ```
109
+
110
+ 1단계 응답(`status: "prompt"`) 수신 후 `TaskUpdate`로 갱신한다.
111
+
112
+ ```
113
+ activeForm: "2/2 — Spec 검증 중"
108
114
  ```
109
115
 
110
116
  ### 완료 시 (2단계 `ges_generate_spec` 응답 수신 후)
@@ -0,0 +1,5 @@
1
+ export declare function initCommand(options: {
2
+ skipGraph?: boolean;
3
+ skipHook?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"AA2BA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDrG"}
@@ -0,0 +1,79 @@
1
+ import { existsSync, writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { createInterface } from 'node:readline';
4
+ import { codeGraphEngine } from '../../code-graph/index.js';
5
+ import { gitHookManager } from '../../code-graph/git-hook.js';
6
+ const CONFIG_FILENAME = 'gestalt.json';
7
+ const DEFAULT_CONFIG = {
8
+ $schema: './node_modules/@tienne/gestalt/schemas/gestalt.schema.json',
9
+ notifications: false,
10
+ interview: {
11
+ ambiguityThreshold: 0.2,
12
+ maxRounds: 10,
13
+ },
14
+ };
15
+ async function confirm(question) {
16
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
17
+ return new Promise((res) => {
18
+ rl.question(question, (answer) => {
19
+ rl.close();
20
+ res(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
21
+ });
22
+ });
23
+ }
24
+ export async function initCommand(options) {
25
+ const repoRoot = process.cwd();
26
+ const filePath = resolve(repoRoot, CONFIG_FILENAME);
27
+ // Step 1: gestalt.json 생성/덮어쓰기
28
+ if (existsSync(filePath)) {
29
+ const overwrite = await confirm('gestalt.json이 이미 존재합니다. 덮어쓰시겠습니까? (y/N): ');
30
+ if (!overwrite) {
31
+ console.log('gestalt.json 생성을 건너뜁니다.');
32
+ }
33
+ else {
34
+ writeFileSync(filePath, JSON.stringify(DEFAULT_CONFIG, null, 2) + '\n', 'utf-8');
35
+ console.log('✓ gestalt.json 덮어쓰기 완료: ' + filePath);
36
+ }
37
+ }
38
+ else {
39
+ writeFileSync(filePath, JSON.stringify(DEFAULT_CONFIG, null, 2) + '\n', 'utf-8');
40
+ console.log('✓ gestalt.json 생성 완료: ' + filePath);
41
+ }
42
+ // Step 2: 코드 그래프 빌드
43
+ if (!options.skipGraph) {
44
+ console.log('\n코드 그래프를 빌드하는 중...');
45
+ try {
46
+ const result = codeGraphEngine.build(repoRoot, { mode: 'full' });
47
+ console.log(`✓ 코드 그래프 빌드 완료: 노드 ${result.nodesBuilt}개, 엣지 ${result.edgesBuilt}개 (${result.timeTakenMs}ms)`);
48
+ }
49
+ catch (e) {
50
+ const msg = e instanceof Error ? e.message : String(e);
51
+ console.warn(`⚠ 코드 그래프 빌드 실패: ${msg}`);
52
+ }
53
+ }
54
+ else {
55
+ console.log('코드 그래프 빌드를 건너뜁니다. (--skip-graph)');
56
+ }
57
+ // Step 3: post-commit 훅 설치
58
+ if (!options.skipHook) {
59
+ try {
60
+ const alreadyInstalled = gitHookManager.isInstalled(repoRoot);
61
+ gitHookManager.installHook(repoRoot);
62
+ if (alreadyInstalled) {
63
+ console.log('✓ post-commit 훅이 이미 설치되어 있습니다.');
64
+ }
65
+ else {
66
+ console.log('✓ post-commit 훅 설치 완료.');
67
+ }
68
+ }
69
+ catch (e) {
70
+ const msg = e instanceof Error ? e.message : String(e);
71
+ console.warn(`⚠ post-commit 훅 설치 실패: ${msg}`);
72
+ }
73
+ }
74
+ else {
75
+ console.log('post-commit 훅 설치를 건너뜁니다. (--skip-hook)');
76
+ }
77
+ console.log('\nGestalt 초기화 완료! 이제 /build-graph, /blast-radius 스킬을 바로 사용할 수 있습니다.');
78
+ }
79
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,IAAI,IAAI,CAkBnC"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,IAAI,IAAI,CAmBnC"}
@@ -9,6 +9,7 @@ export function setupCommand() {
9
9
  }
10
10
  const config = {
11
11
  $schema: './node_modules/@tienne/gestalt/schemas/gestalt.schema.json',
12
+ notifications: false,
12
13
  interview: {
13
14
  ambiguityThreshold: 0.2,
14
15
  maxRounds: 10,
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,4DAA4D;QACrE,SAAS,EAAE;YACT,kBAAkB,EAAE,GAAG;YACvB,SAAS,EAAE,EAAE;SACd;KACF,CAAC;IAEF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,QAAQ,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE1C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,4DAA4D;QACrE,aAAa,EAAE,KAAK;QACpB,SAAS,EAAE;YACT,kBAAkB,EAAE,GAAG;YACvB,SAAS,EAAE,EAAE;SACd;KACF,CAAC;IAEF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,QAAQ,CAAC,CAAC;AACjD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,SAAS,IAAI,OAAO,CAsDnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,SAAS,IAAI,OAAO,CA+DnC"}
@@ -4,6 +4,7 @@ import { specCommand } from './commands/spec.js';
4
4
  import { serveCommand } from './commands/serve.js';
5
5
  import { statusCommand } from './commands/status.js';
6
6
  import { setupCommand } from './commands/setup.js';
7
+ import { initCommand } from './commands/init.js';
7
8
  import { monitorCommand } from './commands/monitor.js';
8
9
  import { getVersion } from '../core/version.js';
9
10
  export function createCli() {
@@ -39,6 +40,14 @@ export function createCli() {
39
40
  .action((sessionId) => {
40
41
  statusCommand(sessionId);
41
42
  });
43
+ program
44
+ .command('init')
45
+ .description('Initialize Gestalt: create gestalt.json, build code graph, and install post-commit hook')
46
+ .option('--skip-graph', 'Skip code graph build')
47
+ .option('--skip-hook', 'Skip post-commit hook installation')
48
+ .action(async (options) => {
49
+ await initCommand(options);
50
+ });
42
51
  program
43
52
  .command('setup')
44
53
  .description('Generate a gestalt.json configuration file')
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2FAA2F,CAAC;SACxG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACrC,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,aAAa,EAAE,8CAA8C,CAAC;SACrE,MAAM,CAAC,OAAO,EAAE,wCAAwC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,OAA4C,EAAE,EAAE;QACxF,MAAM,gBAAgB,CAAC,KAAK,IAAI,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,aAAa,EAAE,yDAAyD,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA4B,EAAE,EAAE;QAChE,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,CAAC,SAAkB,EAAE,EAAE;QAC7B,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,SAAkB,EAAE,EAAE;QACnC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2FAA2F,CAAC;SACxG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACrC,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,aAAa,EAAE,8CAA8C,CAAC;SACrE,MAAM,CAAC,OAAO,EAAE,wCAAwC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,OAA4C,EAAE,EAAE;QACxF,MAAM,gBAAgB,CAAC,KAAK,IAAI,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,aAAa,EAAE,yDAAyD,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA4B,EAAE,EAAE;QAChE,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,CAAC,SAAkB,EAAE,EAAE;QAC7B,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yFAAyF,CAAC;SACtG,MAAM,CAAC,cAAc,EAAE,uBAAuB,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAoD,EAAE,EAAE;QACrE,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,SAAkB,EAAE,EAAE;QACnC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CodeGraphStore } from './storage.js';
2
+ import type { BlastRadiusResult } from './types.js';
3
+ /**
4
+ * Computes blast-radius for a set of changed files using reverse BFS.
5
+ * Reverse BFS: finds all nodes that depend on (import/call) the changed files.
6
+ * Test files are prioritized in the result.
7
+ */
8
+ export declare function computeBlastRadius(store: CodeGraphStore, changedFiles: string[], maxDepth?: number): BlastRadiusResult;
9
+ //# sourceMappingURL=blast-radius.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast-radius.d.ts","sourceRoot":"","sources":["../../../src/code-graph/blast-radius.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAGrE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,GAAE,MAAU,GACnB,iBAAiB,CAoGnB"}
@@ -0,0 +1,139 @@
1
+ import { NodeKind } from './types.js';
2
+ /**
3
+ * Computes blast-radius for a set of changed files using reverse BFS.
4
+ * Reverse BFS: finds all nodes that depend on (import/call) the changed files.
5
+ * Test files are prioritized in the result.
6
+ */
7
+ export function computeBlastRadius(store, changedFiles, maxDepth = 2) {
8
+ if (changedFiles.length === 0) {
9
+ return {
10
+ changedFiles: [],
11
+ impactedFiles: [],
12
+ impactedNodes: [],
13
+ riskScore: 0,
14
+ maxDepthUsed: maxDepth,
15
+ summary: 'No changed files provided.',
16
+ };
17
+ }
18
+ // 1. Collect seed nodes from changed files
19
+ const seedNodeIds = new Set();
20
+ for (const filePath of changedFiles) {
21
+ const nodes = store.getNodesByFile(filePath);
22
+ for (const node of nodes) {
23
+ seedNodeIds.add(node.id);
24
+ }
25
+ // Always include the file node itself
26
+ seedNodeIds.add(`file:${filePath}`);
27
+ }
28
+ // 2. BFS: find all nodes that depend on seeds (reverse direction)
29
+ // An edge (source → target) means source depends on target.
30
+ // So we look for edges where target is in our current frontier.
31
+ const visited = new Set(seedNodeIds);
32
+ const impactedNodeIds = new Set();
33
+ let frontier = Array.from(seedNodeIds);
34
+ for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {
35
+ const nextFrontier = [];
36
+ for (const targetId of frontier) {
37
+ // Find all edges where this node is the target (i.e., who imports/calls this)
38
+ const incomingEdges = store.getEdgesByTarget(targetId);
39
+ for (const edge of incomingEdges) {
40
+ if (!visited.has(edge.sourceId)) {
41
+ visited.add(edge.sourceId);
42
+ impactedNodeIds.add(edge.sourceId);
43
+ nextFrontier.push(edge.sourceId);
44
+ }
45
+ }
46
+ }
47
+ frontier = nextFrontier;
48
+ }
49
+ // 3. Resolve impacted node details and extract file paths
50
+ const impactedFileSet = new Set(changedFiles);
51
+ const impactedNodes = [];
52
+ for (const nodeId of impactedNodeIds) {
53
+ const node = store.getNodeById(nodeId);
54
+ if (!node)
55
+ continue;
56
+ impactedFileSet.add(node.filePath);
57
+ // Compute hop distance (approximate: BFS level)
58
+ const hopDistance = computeHopDistance(nodeId, seedNodeIds, store, maxDepth);
59
+ impactedNodes.push({
60
+ nodeId: node.id,
61
+ filePath: node.filePath,
62
+ kind: node.kind,
63
+ name: node.name,
64
+ hopDistance,
65
+ isTest: node.isTest,
66
+ });
67
+ }
68
+ // 4. Sort: test files first, then by hop distance
69
+ impactedNodes.sort((a, b) => {
70
+ if (a.isTest && !b.isTest)
71
+ return -1;
72
+ if (!a.isTest && b.isTest)
73
+ return 1;
74
+ return a.hopDistance - b.hopDistance;
75
+ });
76
+ // 5. Build impactedFiles list: test files first
77
+ const allFiles = Array.from(impactedFileSet);
78
+ const testFiles = allFiles.filter((f) => isTestFile(f));
79
+ const nonTestFiles = allFiles.filter((f) => !isTestFile(f));
80
+ const impactedFiles = [...testFiles, ...nonTestFiles];
81
+ // 6. Calculate risk score
82
+ const stats = store.getStats('');
83
+ const totalNodes = stats.totalNodes;
84
+ const riskScore = totalNodes > 0 ? Math.min(1, impactedNodeIds.size / totalNodes) : 0;
85
+ // 7. Build summary
86
+ const summary = buildSummary(changedFiles, impactedFiles, impactedNodes, riskScore);
87
+ return {
88
+ changedFiles,
89
+ impactedFiles,
90
+ impactedNodes,
91
+ riskScore,
92
+ maxDepthUsed: maxDepth,
93
+ summary,
94
+ };
95
+ }
96
+ /**
97
+ * Approximates the minimum hop distance from a node to the seed set.
98
+ * Uses a simple BFS from the node backward toward the seeds.
99
+ */
100
+ function computeHopDistance(nodeId, seedNodeIds, store, maxDepth) {
101
+ if (seedNodeIds.has(nodeId))
102
+ return 0;
103
+ const visited = new Set([nodeId]);
104
+ let frontier = [nodeId];
105
+ for (let depth = 1; depth <= maxDepth; depth++) {
106
+ const nextFrontier = [];
107
+ for (const id of frontier) {
108
+ // Check outgoing edges (what this node depends on)
109
+ const outgoingEdges = store.getEdgesBySource(id);
110
+ for (const edge of outgoingEdges) {
111
+ if (seedNodeIds.has(edge.targetId))
112
+ return depth;
113
+ if (!visited.has(edge.targetId)) {
114
+ visited.add(edge.targetId);
115
+ nextFrontier.push(edge.targetId);
116
+ }
117
+ }
118
+ }
119
+ frontier = nextFrontier;
120
+ }
121
+ return maxDepth; // fallback
122
+ }
123
+ function isTestFile(filePath) {
124
+ return (filePath.includes('.test.') ||
125
+ filePath.includes('.spec.') ||
126
+ filePath.includes('__tests__') ||
127
+ filePath.includes('/tests/') ||
128
+ filePath.includes('_test.') ||
129
+ filePath.includes('test_'));
130
+ }
131
+ function buildSummary(changedFiles, impactedFiles, impactedNodes, riskScore) {
132
+ const testFileCount = impactedFiles.filter(isTestFile).length;
133
+ const riskLabel = riskScore > 0.6 ? 'HIGH' : riskScore > 0.3 ? 'MEDIUM' : 'LOW';
134
+ const testNodes = impactedNodes.filter((n) => n.kind === NodeKind.Function && n.isTest).length;
135
+ return (`Changed ${changedFiles.length} file(s) impact ${impactedFiles.length} file(s) ` +
136
+ `(${testFileCount} test files, ${testNodes} test functions). ` +
137
+ `Risk: ${riskLabel} (${(riskScore * 100).toFixed(1)}%).`);
138
+ }
139
+ //# sourceMappingURL=blast-radius.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast-radius.js","sourceRoot":"","sources":["../../../src/code-graph/blast-radius.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { BuildOptions, BuildResult, BlastRadiusOptions, BlastRadiusResult, DiffRadiusOptions, QueryPattern, QueryResult, CodeGraphStats } from './types.js';
2
+ export declare class CodeGraphEngine {
3
+ private storeCache;
4
+ private getDbPath;
5
+ private getStore;
6
+ /**
7
+ * Build or incrementally update the code graph for a repository.
8
+ */
9
+ build(repoRoot: string, opts?: BuildOptions): BuildResult;
10
+ /**
11
+ * Compute blast-radius for changed files.
12
+ * Auto-detects changed files from git diff if not provided.
13
+ */
14
+ blastRadius(repoRoot: string, opts?: BlastRadiusOptions): BlastRadiusResult;
15
+ /**
16
+ * Compute blast-radius for uncommitted changes (staged / unstaged / all).
17
+ * - staged: git diff --cached --name-only
18
+ * - unstaged: git diff --name-only
19
+ * - all (default): git diff HEAD --name-only
20
+ */
21
+ diffRadius(repoRoot: string, opts?: DiffRadiusOptions): BlastRadiusResult;
22
+ /**
23
+ * Query the graph with a specific pattern.
24
+ */
25
+ query(repoRoot: string, pattern: QueryPattern, target: string): QueryResult;
26
+ /**
27
+ * Returns statistics about the code graph.
28
+ */
29
+ stats(repoRoot: string): CodeGraphStats;
30
+ /**
31
+ * Checks if a code-graph.db exists for the given repo root.
32
+ */
33
+ dbExists(repoRoot: string): boolean;
34
+ /**
35
+ * Search for files whose paths or node names contain any of the given keywords.
36
+ * Returns unique file paths sorted by match count descending.
37
+ */
38
+ searchByKeywords(repoRoot: string, keywords: string[]): string[];
39
+ /**
40
+ * Close all open database connections.
41
+ */
42
+ close(): void;
43
+ private getGitChangedFiles;
44
+ }
45
+ export declare const codeGraphEngine: CodeGraphEngine;
46
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/code-graph/engine.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AAwCpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAqC;IAEvD,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW;IA8D7D;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,iBAAiB;IAiB/E;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,iBAAiB;IA8B7E;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW;IA6D3E;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAMvC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInC;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IA2BhE;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,kBAAkB;CAiB3B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}