@su-record/vibe 3.2.18 → 3.2.20

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 (80) hide show
  1. package/CLAUDE.md +1 -0
  2. package/dist/cli/commands/remove.d.ts.map +1 -1
  3. package/dist/cli/commands/remove.js +15 -6
  4. package/dist/cli/commands/remove.js.map +1 -1
  5. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
  6. package/dist/cli/setup/ProjectSetup.js +13 -1
  7. package/dist/cli/setup/ProjectSetup.js.map +1 -1
  8. package/dist/tools/dispatch/costGate.d.ts +59 -0
  9. package/dist/tools/dispatch/costGate.d.ts.map +1 -0
  10. package/dist/tools/dispatch/costGate.js +85 -0
  11. package/dist/tools/dispatch/costGate.js.map +1 -0
  12. package/dist/tools/dispatch/deterministicSignals.d.ts +61 -0
  13. package/dist/tools/dispatch/deterministicSignals.d.ts.map +1 -0
  14. package/dist/tools/dispatch/deterministicSignals.js +136 -0
  15. package/dist/tools/dispatch/deterministicSignals.js.map +1 -0
  16. package/dist/tools/dispatch/index.d.ts +5 -0
  17. package/dist/tools/dispatch/index.d.ts.map +1 -0
  18. package/dist/tools/dispatch/index.js +3 -0
  19. package/dist/tools/dispatch/index.js.map +1 -0
  20. package/dist/tools/dispatch/vibePaths.d.ts +7 -0
  21. package/dist/tools/dispatch/vibePaths.d.ts.map +1 -0
  22. package/dist/tools/dispatch/vibePaths.js +35 -0
  23. package/dist/tools/dispatch/vibePaths.js.map +1 -0
  24. package/dist/tools/index.d.ts +5 -0
  25. package/dist/tools/index.d.ts.map +1 -1
  26. package/dist/tools/index.js +4 -0
  27. package/dist/tools/index.js.map +1 -1
  28. package/dist/tools/spec/index.d.ts +2 -0
  29. package/dist/tools/spec/index.d.ts.map +1 -1
  30. package/dist/tools/spec/index.js +2 -0
  31. package/dist/tools/spec/index.js.map +1 -1
  32. package/dist/tools/spec/validateSpecDocument.d.ts +30 -0
  33. package/dist/tools/spec/validateSpecDocument.d.ts.map +1 -0
  34. package/dist/tools/spec/validateSpecDocument.js +201 -0
  35. package/dist/tools/spec/validateSpecDocument.js.map +1 -0
  36. package/hooks/scripts/code-check.js +90 -16
  37. package/hooks/scripts/lib/anchor.js +15 -4
  38. package/hooks/scripts/lib/inbox.js +10 -2
  39. package/package.json +1 -1
  40. package/skills/vibe/SKILL.md +18 -5
  41. package/skills/vibe.image/SKILL.md +8 -0
  42. package/skills/vibe.review/SKILL.md +8 -0
  43. package/skills/vibe.spec/SKILL.md +21 -0
  44. package/vibe/rules/loop-contract.md +31 -0
  45. package/dist/infra/lib/DeepInit.d.ts +0 -60
  46. package/dist/infra/lib/DeepInit.d.ts.map +0 -1
  47. package/dist/infra/lib/DeepInit.js +0 -245
  48. package/dist/infra/lib/DeepInit.js.map +0 -1
  49. package/dist/infra/lib/FrameworkDetector.d.ts +0 -56
  50. package/dist/infra/lib/FrameworkDetector.d.ts.map +0 -1
  51. package/dist/infra/lib/FrameworkDetector.js +0 -287
  52. package/dist/infra/lib/FrameworkDetector.js.map +0 -1
  53. package/dist/infra/lib/ModelRouter.d.ts +0 -48
  54. package/dist/infra/lib/ModelRouter.d.ts.map +0 -1
  55. package/dist/infra/lib/ModelRouter.js +0 -216
  56. package/dist/infra/lib/ModelRouter.js.map +0 -1
  57. package/dist/infra/lib/OrchestrateWorkflow.d.ts +0 -88
  58. package/dist/infra/lib/OrchestrateWorkflow.d.ts.map +0 -1
  59. package/dist/infra/lib/OrchestrateWorkflow.js +0 -259
  60. package/dist/infra/lib/OrchestrateWorkflow.js.map +0 -1
  61. package/dist/infra/lib/ReviewRace.d.ts +0 -86
  62. package/dist/infra/lib/ReviewRace.d.ts.map +0 -1
  63. package/dist/infra/lib/ReviewRace.js +0 -454
  64. package/dist/infra/lib/ReviewRace.js.map +0 -1
  65. package/dist/infra/lib/RuleBuildSystem.d.ts +0 -157
  66. package/dist/infra/lib/RuleBuildSystem.d.ts.map +0 -1
  67. package/dist/infra/lib/RuleBuildSystem.js +0 -550
  68. package/dist/infra/lib/RuleBuildSystem.js.map +0 -1
  69. package/dist/infra/lib/SkillQualityGate.d.ts +0 -42
  70. package/dist/infra/lib/SkillQualityGate.d.ts.map +0 -1
  71. package/dist/infra/lib/SkillQualityGate.js +0 -220
  72. package/dist/infra/lib/SkillQualityGate.js.map +0 -1
  73. package/dist/infra/lib/SkillRepository.d.ts +0 -134
  74. package/dist/infra/lib/SkillRepository.d.ts.map +0 -1
  75. package/dist/infra/lib/SkillRepository.js +0 -500
  76. package/dist/infra/lib/SkillRepository.js.map +0 -1
  77. package/dist/infra/lib/UltraQA.d.ts +0 -89
  78. package/dist/infra/lib/UltraQA.d.ts.map +0 -1
  79. package/dist/infra/lib/UltraQA.js +0 -301
  80. package/dist/infra/lib/UltraQA.js.map +0 -1
@@ -103,12 +103,25 @@ user-invocable: true
103
103
 
104
104
  ### Phase 2: Smart Resume 감지
105
105
 
106
+ **파일 존재 검사는 눈으로 하지 않는다 — 명령이 확정한다.** Phase 0 의 URL·첨부 분류와
107
+ stakes 의 결정론 신호(config 유무·임시 디렉토리·git 여부)도 이 한 번의 호출로 함께 받는다:
108
+
109
+ ```bash
110
+ node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { console.log(JSON.stringify(t.collectDispatchSignals(process.cwd(), {urls: [], attachments: [], feature: undefined}), null, 2)); })"
106
111
  ```
107
- .vibe/.last-feature 존재 → 직전 feature 이름 추출
108
- .vibe/specs/{feature}/ 또는 .vibe/specs/{feature}.md 존재 → spec 단계 완료
109
- .vibe/features/{feature}/ 또는 .vibe/features/{feature}.feature 존재 → feature 단계 완료
110
- .vibe/plans/{feature}.md · .vibe/interviews/{feature}.md 존재 → 레거시 아티팩트 (구버전) — spec 패스의 입력 컨텍스트로만 사용, 재생성 금지
111
- ```
112
+
113
+ 반환값을 **사실로 받는다**:
114
+
115
+ | 필드 | 의미 |
116
+ |---|---|
117
+ | `resume.resumeFrom` | `run`(SPEC 있음) / `none`(처음부터) |
118
+ | `resume.specPath` · `featurePath` | 실제 경로 (분할 SPEC `_index.md` 포함) |
119
+ | `resume.legacyArtifacts` | 구버전 plans/interviews — **입력 컨텍스트로만** 쓰고 재생성 금지 |
120
+ | `stakes.hasVibeConfig` · `isTempDir` · `isGitRepo` | Phase 1-b 의 결정론 신호 (언어 신호는 모델 판단으로 남는다) |
121
+ | `urls[].kind` | `figma` / `github` / `youtube` / `web` |
122
+ | `attachments[].kind` · `exists` | `spec` / `feature` / `document` / `image` / `code` |
123
+
124
+ > 의도 분류(Phase 1)는 그대로 모델이 한다 — 애매한 판단은 모델, 파일 존재·도메인·확장자는 코드다.
112
125
 
113
126
  감지된 진행 상태가 있으면 사용자에게 명시:
114
127
 
@@ -34,6 +34,14 @@ Generate images using the Antigravity image backend.
34
34
  **Step 0: Script path:**
35
35
  - `[LLM_SCRIPT]` = `{{VIBE_PATH}}/hooks/scripts/llm-orchestrate.js`
36
36
 
37
+ **Step 0-b: 비용 게이트 (생성 전 의무)** — 이미지 생성은 되돌릴 수 없는 지출이다. SSOT: `vibe/rules/loop-contract.md` 비용 게이트 절.
38
+
39
+ ```bash
40
+ node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { const op={kind:'paid-generation',provider:'antigravity',label:'이미지 {N}장 생성'}; console.log(t.formatCostGate(op, t.evaluateCostGate(op))); })"
41
+ ```
42
+
43
+ `ask` 면 생성 전에 무엇을 몇 장 만들지 제시하고 확인받는다. `autonomous` 면 묻지 않고 인박스에 기록한 뒤 진행한다. `.vibe/config.json` 의 `costGate.paidGenerationRequiresApproval: false` 로 끌 수 있다.
44
+
37
45
  **General image generation (Antigravity fast image):**
38
46
  ```bash
39
47
  node "[LLM_SCRIPT]" antigravity image "IMAGE_DESCRIPTION" --output "OUTPUT_PATH"
@@ -124,6 +124,14 @@ Detect project tech stack FIRST before launching reviewers.
124
124
 
125
125
  **Spawn one reviewer per focus, as concurrently as the harness allows** — a `code-reviewer` instance per focus plus `security-reviewer`, each scoped to the changed files.
126
126
 
127
+ **스폰 직전 비용 게이트** (SSOT: `vibe/rules/loop-contract.md` 비용 게이트 절). 위 표대로 정한 리뷰어 수를 그대로 넣는다:
128
+
129
+ ```bash
130
+ node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { const op={kind:'agent-fanout',agentCount:{N},label:'리뷰어 {N}종 병렬'}; console.log(t.formatCostGate(op, t.evaluateCostGate(op))); })"
131
+ ```
132
+
133
+ 기본 임계값(12)에서 demo 2종·prototype 3종·production 8종은 전부 **통과**한다 — 평상시 규모는 멈추지 않는다. `ask` 가 나오면 스폰 전에 사용자에게 확인하고, `record` (autonomous) 면 묻지 않고 인박스에 남긴 뒤 진행한다.
134
+
127
135
  호출 계약(하네스 무관): "에이전트 `{agent}` 를 인자 `Review {FILES} — focus: {focus}` 로 실행한다"
128
136
 
129
137
  ```
@@ -35,6 +35,8 @@ Input 분석 + Smart Resume
35
35
 
36
36
  Execute the bundled implementation below — 단일 패스: 컨텍스트 수집 → (필요시) 인라인 질문 → SPEC + Feature 작성 → 셀프 리뷰 1회
37
37
 
38
+ SPEC Code Guard (아래) — P1 이 있으면 승인으로 가지 않고 SPEC 작성으로 되돌아간다
39
+
38
40
  SPEC 승인 (1회 — automationLevel: autonomous 면 생략)
39
41
 
40
42
  /vibe.run "{feature-name}"
@@ -65,6 +67,25 @@ Legacy `.vibe/interviews/` or `.vibe/plans/` artifacts가 실제로 감지된
65
67
  - 개인 작업 포인터이므로 git 커밋 금지 (`.gitignore` 에 `.vibe/.last-feature`).
66
68
  - 워크플로 완주(verify 통과) 시 삭제.
67
69
 
70
+ ## SPEC Code Guard (승인 전 의무)
71
+
72
+ SPEC 을 쓴 직후, **승인을 요청하기 전에** 실행한다. 셀프 리뷰가 아니라 코드 판정이다:
73
+
74
+ ```bash
75
+ node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { const fs=require('fs'); const p='.vibe/specs/{feature-name}.md'; const r=t.validateSpecDocument(fs.readFileSync(p,'utf-8'),{specPath:p}); console.log(t.formatSpecValidation(r)); process.exitCode = r.valid ? 0 : 1; })"
76
+ ```
77
+
78
+ | 검사 | 심각도 | 왜 하류가 깨지는가 |
79
+ |---|---|---|
80
+ | REQ-* ID 부재 | P1 | RTM 이 `status:"empty"` — 커버리지 게이트가 판정불가가 된다 |
81
+ | Stakes 부재/오값 | P1 | 디스패처가 파이프라인 깊이를 정할 입력이 없다 |
82
+ | Done Criteria 부재/빈 섹션 | P1 | JUDGE 가 판정할 기준이 없다 |
83
+ | 미치환 placeholder | P1 | 직역 하네스가 예시 텍스트를 실데이터로 넣는다 |
84
+ | Scenarios 부재 | P2 | `vibe.run` 시나리오 루프의 분해 단위가 없다 |
85
+ | REQ 슬러그 ≠ 파일명 | P2 | 게이트는 통과하나 ID 규약 이탈로 추적이 흐려진다 |
86
+
87
+ **P1 이 하나라도 있으면 승인 요청으로 넘어가지 않는다** — SPEC 작성으로 되돌아가 고치고 다시 검사한다 (backward edge). 2회 연속 같은 findings 면 stuck 으로 처리한다 (SSOT: `vibe/rules/loop-contract.md`). P2 는 통과를 막지 않고 승인 메시지에 함께 표시한다.
88
+
68
89
  ## 승인과 루프
69
90
 
70
91
  SPEC 승인이 `vibe/rules/loop-contract.md` 가 정의하는 **유일한 의무적 사람 개입**이다. 승인 후에는 ANCHOR→ACT→JUDGE→RECORD 루프가 게이트 통과까지 자동 반복한다 (`/vibe.run` → `/vibe.verify`). 별도의 파이프라인 승인·단계별 stop gate 는 없다.
@@ -62,6 +62,37 @@ node "$HOOKS_DIR/loop-ledger.js" anchor [feature]
62
62
 
63
63
  > `autonomous` 의 "계속" 은 **stuck 난 루프를 더 돌린다는 뜻이 아니다** — 2회 연속 동일 발견은 정의상 재시도가 무의미하다. 같은 목표를 붙잡지 않고 다음 단위로 넘어간다는 뜻이며, 미달은 TODO/인박스에 남는다. 미달 상태를 **완료로 기록하지 않는다.**
64
64
 
65
+ ### 비용 게이트 — 사람은 시작점에만 서지 않는다
66
+
67
+ SPEC 승인은 **유일한 의무 게이트**로 남는다. 다만 승인 이후 max_iterations 까지 무인이라, 그 안의 되돌릴 수 없는 지출과 이상 규모 팬아웃을 아무도 보지 못했다. 비용 게이트는 그 둘만 잡는다 — 평상시 규모는 그대로 통과시킨다.
68
+
69
+ ```bash
70
+ node -e "import('{{VIBE_PATH_URL}}/node_modules/@su-record/vibe/dist/tools/index.js').then(t => { const d=t.evaluateCostGate({kind:'agent-fanout',agentCount:N}); console.log(t.formatCostGate({kind:'agent-fanout',agentCount:N}, d)); })"
71
+ ```
72
+
73
+ | 작업 | 기본 판정 | 근거 |
74
+ |---|---|---|
75
+ | `paid-generation` | **묻는다** | 되돌릴 수 없는 지출 |
76
+ | `agent-fanout` > 12 | **묻는다** | 위임마다 컨텍스트 재주입 — 비용이 개수에 비례 |
77
+ | `agent-fanout` ≤ 12 | 통과 | production 기본 리뷰어 셋(8종)+조건부는 평상시 규모다 |
78
+
79
+ - 임계값을 기본 셋 아래로 두면 매 리뷰가 멈춘다 — **의례가 된 게이트는 무시당한다.** 조정은 `.vibe/config.json` 의 `costGate.{enabled, maxAgentsWithoutApproval, paidGenerationRequiresApproval}`.
80
+ - `autonomous` 는 **묻지 않는다.** 대신 결정을 인박스에 기록한다 (`loop-ledger.js inbox`) — stuck 처리와 같은 원칙: 비대화형이라고 판정을 없애지 않고, 사람이 볼 자리로 옮긴다.
81
+
82
+ ### 노드 가드 — 게이트를 끝에만 두지 않는다
83
+
84
+ 결정론 게이트가 전부 JUDGE(파이프라인 끝)에만 있으면, 쓸 수 없는 산출물이 체인을 끝까지 타고 간 뒤에야 걸린다. 실패는 **만들어진 노드에서** 잡는 것이 싸다.
85
+
86
+ - 산출물을 내는 노드는 그 산출물이 **하류가 요구하는 형태인지** 코드로 검사한다. 취향이 아니라 계약을 검사한다 — "이게 없으면 하류의 무엇이 깨지는가"로 항목을 정한다.
87
+ - 실패하면 다음 노드로 가지 않고 **그 노드로 되돌아간다** (backward edge). 루프 전체를 재시작하지 않는다.
88
+ - 되돌린 뒤에도 같은 findings 가 2회 연속이면 stuck 이다 (위 stuck 절).
89
+
90
+ | 노드 | 가드 | 검사 근거 |
91
+ |---|---|---|
92
+ | `vibe.spec` | `validateSpecDocument` | RTM 이 게이트로 동작할 REQ-* / JUDGE 입력인 Done Criteria / 디스패처 입력인 Stakes / 직역 하네스가 실데이터로 넣는 placeholder |
93
+ | `vibe.run` | 테스트 exit code · run-ledger | 기존 JUDGE |
94
+ | `vibe.clone` · `vibe.figma` | pixelmatch diffRatio · computed CSS delta | 측정된 P1 (위 Judge 권한 경계 표) |
95
+
65
96
  ### 실행 실패 (error) — stuck 과 다른 종료 사유
66
97
 
67
98
  stuck 은 **같은 발견이 반복되는** 상태다. 스킬이 로드되지 않거나, 도구가 없거나, 파일이 없거나, 명령이 비정상 종료하는 것은 stuck 이 아니라 **실행 실패**이며 해시 비교로는 잡히지 않는다. 재시도 대상도 아니다 — 환경이 바뀌지 않는 한 결과가 같다.
@@ -1,60 +0,0 @@
1
- /**
2
- * DeepInit - Hierarchical AGENTS.md Generation
3
- * Creates AI-readable documentation hierarchy with parent references
4
- */
5
- export interface DirectoryInfo {
6
- path: string;
7
- name: string;
8
- depth: number;
9
- parent?: string;
10
- children: string[];
11
- files: FileInfo[];
12
- purpose?: string;
13
- }
14
- export interface FileInfo {
15
- name: string;
16
- path: string;
17
- extension: string;
18
- size?: number;
19
- isEntry?: boolean;
20
- description?: string;
21
- }
22
- export interface AgentsMdContent {
23
- header: string;
24
- parentRef?: string;
25
- purpose: string;
26
- structure: string;
27
- keyFiles: string;
28
- conventions: string;
29
- dependencies: string;
30
- notes: string;
31
- }
32
- /**
33
- * Detect directory purpose from name
34
- */
35
- export declare function detectDirectoryPurpose(dirName: string): string;
36
- /**
37
- * Check if file is an entry point
38
- */
39
- export declare function isEntryPoint(fileName: string): boolean;
40
- /**
41
- * Generate AGENTS.md content for a directory
42
- */
43
- export declare function generateAgentsMd(dir: DirectoryInfo): AgentsMdContent;
44
- /**
45
- * Format full AGENTS.md content
46
- */
47
- export declare function formatAgentsMd(content: AgentsMdContent): string;
48
- /**
49
- * Preserve manual notes from existing AGENTS.md
50
- */
51
- export declare function preserveManualNotes(existing: string, newContent: string): string;
52
- /**
53
- * Generate navigation header
54
- */
55
- export declare function generateNavigationHeader(dir: DirectoryInfo, rootPath: string): string;
56
- /**
57
- * Describe DeepInit workflow
58
- */
59
- export declare function describeDeepInitWorkflow(): string;
60
- //# sourceMappingURL=DeepInit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeepInit.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/DeepInit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AA6CD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAoFpE;AAsCD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAe/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAahF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAarF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CA0BjD"}
@@ -1,245 +0,0 @@
1
- /**
2
- * DeepInit - Hierarchical AGENTS.md Generation
3
- * Creates AI-readable documentation hierarchy with parent references
4
- */
5
- import path from 'path';
6
- // Common directory purposes
7
- const DIRECTORY_PURPOSES = {
8
- src: 'Source code directory',
9
- lib: 'Library/utility code',
10
- utils: 'Utility functions',
11
- helpers: 'Helper functions',
12
- components: 'UI components',
13
- pages: 'Page components/routes',
14
- hooks: 'React/custom hooks',
15
- services: 'Business logic services',
16
- api: 'API endpoints/clients',
17
- models: 'Data models/schemas',
18
- types: 'TypeScript type definitions',
19
- interfaces: 'Interface definitions',
20
- controllers: 'Request controllers',
21
- routes: 'Route definitions',
22
- middleware: 'Middleware functions',
23
- config: 'Configuration files',
24
- constants: 'Constant values',
25
- assets: 'Static assets',
26
- styles: 'CSS/styling files',
27
- tests: 'Test files',
28
- __tests__: 'Jest test directory',
29
- spec: 'Test specifications',
30
- fixtures: 'Test fixtures/data',
31
- mocks: 'Mock implementations',
32
- scripts: 'Build/utility scripts',
33
- tools: 'Development tools',
34
- docs: 'Documentation',
35
- dist: 'Build output',
36
- build: 'Build output',
37
- node_modules: 'Dependencies (skip)',
38
- '.git': 'Git directory (skip)',
39
- };
40
- // File patterns to identify entry points
41
- const ENTRY_PATTERNS = [
42
- /^index\.(ts|js|tsx|jsx)$/,
43
- /^main\.(ts|js|tsx|jsx)$/,
44
- /^app\.(ts|js|tsx|jsx)$/,
45
- /^server\.(ts|js|tsx|jsx)$/,
46
- ];
47
- /**
48
- * Detect directory purpose from name
49
- */
50
- export function detectDirectoryPurpose(dirName) {
51
- const lower = dirName.toLowerCase();
52
- return DIRECTORY_PURPOSES[lower] || DIRECTORY_PURPOSES[dirName] || 'Project directory';
53
- }
54
- /**
55
- * Check if file is an entry point
56
- */
57
- export function isEntryPoint(fileName) {
58
- return ENTRY_PATTERNS.some(pattern => pattern.test(fileName));
59
- }
60
- /**
61
- * Generate AGENTS.md content for a directory
62
- */
63
- export function generateAgentsMd(dir) {
64
- const header = `# AGENTS.md - ${dir.name}`;
65
- // Parent reference
66
- const parentRef = dir.parent
67
- ? `<!-- Parent: ${path.relative(dir.path, dir.parent)}/AGENTS.md -->`
68
- : undefined;
69
- // Purpose
70
- const purpose = `## Purpose\n\n${dir.purpose || detectDirectoryPurpose(dir.name)}`;
71
- // Structure
72
- const structureLines = ['## Structure\n', '```'];
73
- structureLines.push(`${dir.name}/`);
74
- for (const child of dir.children) {
75
- structureLines.push(`├── ${child}/`);
76
- }
77
- for (const file of dir.files) {
78
- const marker = isEntryPoint(file.name) ? ' ← entry' : '';
79
- structureLines.push(`├── ${file.name}${marker}`);
80
- }
81
- structureLines.push('```');
82
- const structure = structureLines.join('\n');
83
- // Key files
84
- const keyFilesLines = ['## Key Files\n'];
85
- const entryFiles = dir.files.filter(f => isEntryPoint(f.name));
86
- if (entryFiles.length > 0) {
87
- keyFilesLines.push('### Entry Points');
88
- for (const file of entryFiles) {
89
- keyFilesLines.push(`- \`${file.name}\`: ${file.description || 'Main entry point'}`);
90
- }
91
- keyFilesLines.push('');
92
- }
93
- // Group by extension
94
- const byExtension = new Map();
95
- for (const file of dir.files) {
96
- const ext = file.extension || 'other';
97
- if (!byExtension.has(ext))
98
- byExtension.set(ext, []);
99
- byExtension.get(ext).push(file);
100
- }
101
- for (const [ext, files] of byExtension) {
102
- if (files.length > 5) {
103
- keyFilesLines.push(`- \`*.${ext}\`: ${files.length} files`);
104
- }
105
- else {
106
- for (const file of files) {
107
- if (!isEntryPoint(file.name)) {
108
- keyFilesLines.push(`- \`${file.name}\``);
109
- }
110
- }
111
- }
112
- }
113
- const keyFiles = keyFilesLines.join('\n');
114
- // Conventions (auto-detected)
115
- const conventions = generateConventions(dir);
116
- // Dependencies (child directories)
117
- const dependenciesLines = ['## Dependencies\n'];
118
- if (dir.children.length > 0) {
119
- dependenciesLines.push('### Child Modules');
120
- for (const child of dir.children) {
121
- dependenciesLines.push(`- [\`${child}/\`](./${child}/AGENTS.md)`);
122
- }
123
- }
124
- else {
125
- dependenciesLines.push('No child modules.');
126
- }
127
- const dependencies = dependenciesLines.join('\n');
128
- // Notes placeholder
129
- const notes = '## Notes\n\n<!-- Add manual notes here. They will be preserved on regeneration. -->';
130
- return {
131
- header,
132
- parentRef,
133
- purpose,
134
- structure,
135
- keyFiles,
136
- conventions,
137
- dependencies,
138
- notes,
139
- };
140
- }
141
- /**
142
- * Generate conventions based on file patterns
143
- */
144
- function generateConventions(dir) {
145
- const lines = ['## Conventions\n'];
146
- // Detect naming conventions
147
- const hasKebab = dir.files.some(f => f.name.includes('-'));
148
- const hasCamel = dir.files.some(f => /[a-z][A-Z]/.test(f.name));
149
- const hasPascal = dir.files.some(f => /^[A-Z]/.test(f.name));
150
- if (hasPascal)
151
- lines.push('- **Naming**: PascalCase for components/classes');
152
- if (hasCamel)
153
- lines.push('- **Naming**: camelCase for utilities/functions');
154
- if (hasKebab)
155
- lines.push('- **Naming**: kebab-case for files');
156
- // Detect test patterns
157
- const hasTestFiles = dir.files.some(f => f.name.includes('.test.') || f.name.includes('.spec.'));
158
- if (hasTestFiles) {
159
- lines.push('- **Testing**: Co-located test files (*.test.ts, *.spec.ts)');
160
- }
161
- // Detect TypeScript
162
- const hasTs = dir.files.some(f => f.extension === 'ts' || f.extension === 'tsx');
163
- if (hasTs) {
164
- lines.push('- **Language**: TypeScript');
165
- }
166
- if (lines.length === 1) {
167
- lines.push('No specific conventions detected.');
168
- }
169
- return lines.join('\n');
170
- }
171
- /**
172
- * Format full AGENTS.md content
173
- */
174
- export function formatAgentsMd(content) {
175
- const sections = [content.header];
176
- if (content.parentRef) {
177
- sections.push('', content.parentRef);
178
- }
179
- sections.push('', content.purpose);
180
- sections.push('', content.structure);
181
- sections.push('', content.keyFiles);
182
- sections.push('', content.conventions);
183
- sections.push('', content.dependencies);
184
- sections.push('', content.notes);
185
- return sections.join('\n');
186
- }
187
- /**
188
- * Preserve manual notes from existing AGENTS.md
189
- */
190
- export function preserveManualNotes(existing, newContent) {
191
- // Extract notes section from existing
192
- const notesMatch = existing.match(/## Notes\n\n([\s\S]*?)(?=\n## |$)/);
193
- if (!notesMatch || notesMatch[1].trim() === '<!-- Add manual notes here. They will be preserved on regeneration. -->') {
194
- return newContent;
195
- }
196
- // Replace notes section in new content
197
- const preservedNotes = notesMatch[1].trim();
198
- return newContent.replace(/## Notes\n\n<!-- Add manual notes here\. They will be preserved on regeneration\. -->/, `## Notes\n\n${preservedNotes}`);
199
- }
200
- /**
201
- * Generate navigation header
202
- */
203
- export function generateNavigationHeader(dir, rootPath) {
204
- const parts = dir.path.replace(rootPath, '').split(path.sep).filter(Boolean);
205
- const breadcrumbs = parts.map((part, i) => {
206
- const depth = parts.length - i;
207
- const prefix = '../'.repeat(depth);
208
- return `[${part}](${prefix}AGENTS.md)`;
209
- });
210
- if (breadcrumbs.length === 0) {
211
- return '📍 Root';
212
- }
213
- return `📍 ${breadcrumbs.join(' / ')}`;
214
- }
215
- /**
216
- * Describe DeepInit workflow
217
- */
218
- export function describeDeepInitWorkflow() {
219
- return `
220
- ## DeepInit Workflow
221
-
222
- Hierarchical AI-readable documentation generation:
223
-
224
- \`\`\`
225
- project/
226
- ├── AGENTS.md ← Root documentation
227
- ├── src/
228
- │ ├── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
229
- │ ├── components/
230
- │ │ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
231
- │ └── services/
232
- │ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
233
- └── tests/
234
- └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
235
- \`\`\`
236
-
237
- Features:
238
- - Parent references for navigation
239
- - Auto-detected purpose and conventions
240
- - Preserved manual notes on regeneration
241
- - Entry point identification
242
- - Child module linking
243
- `.trim();
244
- }
245
- //# sourceMappingURL=DeepInit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DeepInit.js","sourceRoot":"","sources":["../../../src/infra/lib/DeepInit.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- /**
2
- * Framework Detector - Automatically detect project framework from package.json
3
- * Inspired by Vercel's deploy script
4
- */
5
- export interface FrameworkInfo {
6
- id: string;
7
- name: string;
8
- category: 'frontend' | 'backend' | 'fullstack' | 'static' | 'docs';
9
- runtime?: 'node' | 'bun' | 'deno' | 'browser';
10
- features?: string[];
11
- }
12
- export declare const FRAMEWORKS: Record<string, FrameworkInfo>;
13
- export interface PackageJson {
14
- name?: string;
15
- version?: string;
16
- dependencies?: Record<string, string>;
17
- devDependencies?: Record<string, string>;
18
- scripts?: Record<string, string>;
19
- }
20
- export interface DetectionResult {
21
- framework: FrameworkInfo | null;
22
- confidence: 'high' | 'medium' | 'low';
23
- matchedDep?: string;
24
- allDetected: string[];
25
- packageJson?: PackageJson;
26
- projectType: 'monorepo' | 'single' | 'static' | 'unknown';
27
- }
28
- /**
29
- * Detect framework from package.json
30
- */
31
- export declare function detectFramework(projectPath: string): Promise<DetectionResult>;
32
- /**
33
- * Detect framework from string content (for analysis without file access)
34
- */
35
- export declare function detectFrameworkFromContent(content: string): DetectionResult;
36
- /**
37
- * Get recommended rules/agents based on framework
38
- */
39
- export declare function getFrameworkRecommendations(framework: FrameworkInfo): {
40
- reviewers: string[];
41
- rules: string[];
42
- features: string[];
43
- };
44
- /**
45
- * Format detection result for display
46
- */
47
- export declare function formatDetectionResult(result: DetectionResult): string;
48
- /**
49
- * Quick check if project uses a specific framework
50
- */
51
- export declare function isFramework(projectPath: string, frameworkId: string): Promise<boolean>;
52
- /**
53
- * Get all supported frameworks grouped by category
54
- */
55
- export declare function getSupportedFrameworks(): Record<string, FrameworkInfo[]>;
56
- //# sourceMappingURL=FrameworkDetector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FrameworkDetector.d.ts","sourceRoot":"","sources":["../../../src/infra/lib/FrameworkDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAGD,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAoDpD,CAAC;AA6DF,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC3D;AAoDD;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAmCnF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAmB3E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,aAAa,GAAG;IACrE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAoCA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAyBrE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAcxE"}