@su-record/vibe 2.5.9 → 2.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +448 -348
- package/LICENSE +21 -21
- package/README.md +262 -262
- package/agents/architect-low.md +41 -0
- package/agents/architect-medium.md +59 -0
- package/agents/architect.md +80 -0
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/e2e-tester.md +266 -266
- package/agents/explorer-low.md +42 -0
- package/agents/explorer-medium.md +59 -0
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -0
- package/agents/implementer-medium.md +52 -0
- package/agents/implementer.md +54 -54
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +189 -189
- package/agents/research/codebase-patterns-agent.md +147 -147
- package/agents/research/framework-docs-agent.md +178 -178
- package/agents/research/security-advisory-agent.md +203 -203
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui-previewer.md +129 -129
- package/commands/vibe.analyze.md +356 -356
- package/commands/vibe.reason.md +329 -329
- package/commands/vibe.review.md +326 -326
- package/commands/vibe.run.md +1051 -1031
- package/commands/vibe.spec.md +1058 -1022
- package/commands/vibe.utils.md +296 -296
- package/commands/vibe.verify.md +375 -375
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +102 -102
- package/dist/cli/llm.js +144 -144
- package/dist/lib/DeepInit.d.ts +62 -0
- package/dist/lib/DeepInit.d.ts.map +1 -0
- package/dist/lib/DeepInit.js +247 -0
- package/dist/lib/DeepInit.js.map +1 -0
- package/dist/lib/IterationTracker.d.ts +81 -0
- package/dist/lib/IterationTracker.d.ts.map +1 -0
- package/dist/lib/IterationTracker.js +190 -0
- package/dist/lib/IterationTracker.js.map +1 -0
- package/dist/lib/ModelRouter.d.ts +50 -0
- package/dist/lib/ModelRouter.d.ts.map +1 -0
- package/dist/lib/ModelRouter.js +218 -0
- package/dist/lib/ModelRouter.js.map +1 -0
- package/dist/lib/OrchestrateWorkflow.d.ts +90 -0
- package/dist/lib/OrchestrateWorkflow.d.ts.map +1 -0
- package/dist/lib/OrchestrateWorkflow.js +261 -0
- package/dist/lib/OrchestrateWorkflow.js.map +1 -0
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/SkillFrontmatter.d.ts +64 -0
- package/dist/lib/SkillFrontmatter.d.ts.map +1 -0
- package/dist/lib/SkillFrontmatter.js +221 -0
- package/dist/lib/SkillFrontmatter.js.map +1 -0
- package/dist/lib/SkillQualityGate.d.ts +40 -0
- package/dist/lib/SkillQualityGate.d.ts.map +1 -0
- package/dist/lib/SkillQualityGate.js +218 -0
- package/dist/lib/SkillQualityGate.js.map +1 -0
- package/dist/lib/UltraQA.d.ts +70 -0
- package/dist/lib/UltraQA.d.ts.map +1 -0
- package/dist/lib/UltraQA.js +234 -0
- package/dist/lib/UltraQA.js.map +1 -0
- package/dist/lib/gpt-api.js +4 -4
- package/dist/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/lib/memory/MemorySearch.js +20 -20
- package/dist/lib/memory/MemoryStorage.js +64 -64
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -1
- package/hooks/hooks.json +222 -204
- package/hooks/scripts/code-check.js +22 -22
- package/hooks/scripts/code-review.js +22 -22
- package/hooks/scripts/complexity.js +22 -22
- package/hooks/scripts/compound.js +23 -23
- package/hooks/scripts/context-save.js +33 -33
- package/hooks/scripts/hud-multiline.js +264 -0
- package/hooks/scripts/hud-status.js +293 -0
- package/hooks/scripts/keyword-detector.js +216 -0
- package/hooks/scripts/llm-orchestrate.js +171 -171
- package/hooks/scripts/post-edit.js +97 -97
- package/hooks/scripts/post-tool-verify.js +212 -0
- package/hooks/scripts/pre-tool-guard.js +127 -0
- package/hooks/scripts/recall.js +22 -22
- package/hooks/scripts/session-start.js +30 -30
- package/hooks/scripts/skill-injector.js +193 -0
- package/hooks/scripts/utils.js +97 -97
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +83 -83
- package/skills/context7-usage.md +102 -102
- package/skills/git-worktree.md +181 -181
- package/skills/parallel-research.md +77 -77
- package/skills/priority-todos.md +239 -239
- package/skills/tool-fallback.md +190 -190
- package/skills/vibe-capabilities.md +161 -161
- package/vibe/constitution.md +227 -227
- package/vibe/rules/core/communication-guide.md +98 -98
- package/vibe/rules/core/development-philosophy.md +52 -52
- package/vibe/rules/core/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
- package/dist/cli/mcp.d.ts +0 -49
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -169
- package/dist/cli/mcp.js.map +0 -1
- package/dist/lib/gemini-mcp.d.ts +0 -10
- package/dist/lib/gemini-mcp.d.ts.map +0 -1
- package/dist/lib/gemini-mcp.js +0 -353
- package/dist/lib/gemini-mcp.js.map +0 -1
- package/dist/lib/gpt-mcp.d.ts +0 -10
- package/dist/lib/gpt-mcp.d.ts.map +0 -1
- package/dist/lib/gpt-mcp.js +0 -352
- package/dist/lib/gpt-mcp.js.map +0 -1
- package/dist/tools/analytics/getUsageAnalytics.d.ts +0 -10
- package/dist/tools/analytics/getUsageAnalytics.d.ts.map +0 -1
- package/dist/tools/analytics/getUsageAnalytics.js +0 -246
- package/dist/tools/analytics/getUsageAnalytics.js.map +0 -1
- package/dist/tools/analytics/index.d.ts +0 -5
- package/dist/tools/analytics/index.d.ts.map +0 -1
- package/dist/tools/analytics/index.js +0 -5
- package/dist/tools/analytics/index.js.map +0 -1
- package/dist/tools/convention/getCodingGuide.d.ts +0 -7
- package/dist/tools/convention/getCodingGuide.d.ts.map +0 -1
- package/dist/tools/convention/getCodingGuide.js +0 -69
- package/dist/tools/convention/getCodingGuide.js.map +0 -1
- package/dist/tools/planning/analyzeRequirements.d.ts +0 -9
- package/dist/tools/planning/analyzeRequirements.d.ts.map +0 -1
- package/dist/tools/planning/analyzeRequirements.js +0 -171
- package/dist/tools/planning/analyzeRequirements.js.map +0 -1
- package/dist/tools/planning/createUserStories.d.ts +0 -9
- package/dist/tools/planning/createUserStories.d.ts.map +0 -1
- package/dist/tools/planning/createUserStories.js +0 -124
- package/dist/tools/planning/createUserStories.js.map +0 -1
- package/dist/tools/planning/featureRoadmap.d.ts +0 -10
- package/dist/tools/planning/featureRoadmap.d.ts.map +0 -1
- package/dist/tools/planning/featureRoadmap.js +0 -207
- package/dist/tools/planning/featureRoadmap.js.map +0 -1
- package/dist/tools/planning/generatePrd.d.ts +0 -11
- package/dist/tools/planning/generatePrd.d.ts.map +0 -1
- package/dist/tools/planning/generatePrd.js +0 -161
- package/dist/tools/planning/generatePrd.js.map +0 -1
- package/dist/tools/planning/index.d.ts +0 -8
- package/dist/tools/planning/index.d.ts.map +0 -1
- package/dist/tools/planning/index.js +0 -8
- package/dist/tools/planning/index.js.map +0 -1
- package/dist/tools/prompt/analyzePrompt.d.ts +0 -7
- package/dist/tools/prompt/analyzePrompt.d.ts.map +0 -1
- package/dist/tools/prompt/analyzePrompt.js +0 -150
- package/dist/tools/prompt/analyzePrompt.js.map +0 -1
- package/dist/tools/prompt/enhancePrompt.d.ts +0 -8
- package/dist/tools/prompt/enhancePrompt.d.ts.map +0 -1
- package/dist/tools/prompt/enhancePrompt.js +0 -110
- package/dist/tools/prompt/enhancePrompt.js.map +0 -1
- package/dist/tools/prompt/enhancePromptGemini.d.ts +0 -8
- package/dist/tools/prompt/enhancePromptGemini.d.ts.map +0 -1
- package/dist/tools/prompt/enhancePromptGemini.js +0 -332
- package/dist/tools/prompt/enhancePromptGemini.js.map +0 -1
- package/dist/tools/prompt/index.d.ts +0 -7
- package/dist/tools/prompt/index.d.ts.map +0 -1
- package/dist/tools/prompt/index.js +0 -7
- package/dist/tools/prompt/index.js.map +0 -1
- package/dist/tools/reasoning/applyReasoningFramework.d.ts +0 -8
- package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +0 -1
- package/dist/tools/reasoning/applyReasoningFramework.js +0 -266
- package/dist/tools/reasoning/applyReasoningFramework.js.map +0 -1
- package/dist/tools/reasoning/index.d.ts +0 -5
- package/dist/tools/reasoning/index.d.ts.map +0 -1
- package/dist/tools/reasoning/index.js +0 -5
- package/dist/tools/reasoning/index.js.map +0 -1
- package/dist/tools/thinking/analyzeProblem.d.ts +0 -7
- package/dist/tools/thinking/analyzeProblem.d.ts.map +0 -1
- package/dist/tools/thinking/analyzeProblem.js +0 -55
- package/dist/tools/thinking/analyzeProblem.js.map +0 -1
- package/dist/tools/thinking/breakDownProblem.d.ts +0 -8
- package/dist/tools/thinking/breakDownProblem.d.ts.map +0 -1
- package/dist/tools/thinking/breakDownProblem.js +0 -145
- package/dist/tools/thinking/breakDownProblem.js.map +0 -1
- package/dist/tools/thinking/createThinkingChain.d.ts +0 -7
- package/dist/tools/thinking/createThinkingChain.d.ts.map +0 -1
- package/dist/tools/thinking/createThinkingChain.js +0 -44
- package/dist/tools/thinking/createThinkingChain.js.map +0 -1
- package/dist/tools/thinking/formatAsPlan.d.ts +0 -9
- package/dist/tools/thinking/formatAsPlan.d.ts.map +0 -1
- package/dist/tools/thinking/formatAsPlan.js +0 -78
- package/dist/tools/thinking/formatAsPlan.js.map +0 -1
- package/dist/tools/thinking/index.d.ts +0 -10
- package/dist/tools/thinking/index.d.ts.map +0 -1
- package/dist/tools/thinking/index.js +0 -10
- package/dist/tools/thinking/index.js.map +0 -1
- package/dist/tools/thinking/stepByStepAnalysis.d.ts +0 -8
- package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +0 -1
- package/dist/tools/thinking/stepByStepAnalysis.js +0 -63
- package/dist/tools/thinking/stepByStepAnalysis.js.map +0 -1
- package/dist/tools/thinking/thinkAloudProcess.d.ts +0 -8
- package/dist/tools/thinking/thinkAloudProcess.d.ts.map +0 -1
- package/dist/tools/thinking/thinkAloudProcess.js +0 -80
- package/dist/tools/thinking/thinkAloudProcess.js.map +0 -1
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepInit - Hierarchical AGENTS.md Generation
|
|
3
|
+
* Creates AI-readable documentation hierarchy with parent references
|
|
4
|
+
*
|
|
5
|
+
* Inspired by oh-my-claudecode's deepinit skill (321 lines)
|
|
6
|
+
*/
|
|
7
|
+
import path from 'path';
|
|
8
|
+
// Common directory purposes
|
|
9
|
+
const DIRECTORY_PURPOSES = {
|
|
10
|
+
src: 'Source code directory',
|
|
11
|
+
lib: 'Library/utility code',
|
|
12
|
+
utils: 'Utility functions',
|
|
13
|
+
helpers: 'Helper functions',
|
|
14
|
+
components: 'UI components',
|
|
15
|
+
pages: 'Page components/routes',
|
|
16
|
+
hooks: 'React/custom hooks',
|
|
17
|
+
services: 'Business logic services',
|
|
18
|
+
api: 'API endpoints/clients',
|
|
19
|
+
models: 'Data models/schemas',
|
|
20
|
+
types: 'TypeScript type definitions',
|
|
21
|
+
interfaces: 'Interface definitions',
|
|
22
|
+
controllers: 'Request controllers',
|
|
23
|
+
routes: 'Route definitions',
|
|
24
|
+
middleware: 'Middleware functions',
|
|
25
|
+
config: 'Configuration files',
|
|
26
|
+
constants: 'Constant values',
|
|
27
|
+
assets: 'Static assets',
|
|
28
|
+
styles: 'CSS/styling files',
|
|
29
|
+
tests: 'Test files',
|
|
30
|
+
__tests__: 'Jest test directory',
|
|
31
|
+
spec: 'Test specifications',
|
|
32
|
+
fixtures: 'Test fixtures/data',
|
|
33
|
+
mocks: 'Mock implementations',
|
|
34
|
+
scripts: 'Build/utility scripts',
|
|
35
|
+
tools: 'Development tools',
|
|
36
|
+
docs: 'Documentation',
|
|
37
|
+
dist: 'Build output',
|
|
38
|
+
build: 'Build output',
|
|
39
|
+
node_modules: 'Dependencies (skip)',
|
|
40
|
+
'.git': 'Git directory (skip)',
|
|
41
|
+
};
|
|
42
|
+
// File patterns to identify entry points
|
|
43
|
+
const ENTRY_PATTERNS = [
|
|
44
|
+
/^index\.(ts|js|tsx|jsx)$/,
|
|
45
|
+
/^main\.(ts|js|tsx|jsx)$/,
|
|
46
|
+
/^app\.(ts|js|tsx|jsx)$/,
|
|
47
|
+
/^server\.(ts|js|tsx|jsx)$/,
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Detect directory purpose from name
|
|
51
|
+
*/
|
|
52
|
+
export function detectDirectoryPurpose(dirName) {
|
|
53
|
+
const lower = dirName.toLowerCase();
|
|
54
|
+
return DIRECTORY_PURPOSES[lower] || DIRECTORY_PURPOSES[dirName] || 'Project directory';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if file is an entry point
|
|
58
|
+
*/
|
|
59
|
+
export function isEntryPoint(fileName) {
|
|
60
|
+
return ENTRY_PATTERNS.some(pattern => pattern.test(fileName));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate AGENTS.md content for a directory
|
|
64
|
+
*/
|
|
65
|
+
export function generateAgentsMd(dir) {
|
|
66
|
+
const header = `# AGENTS.md - ${dir.name}`;
|
|
67
|
+
// Parent reference
|
|
68
|
+
const parentRef = dir.parent
|
|
69
|
+
? `<!-- Parent: ${path.relative(dir.path, dir.parent)}/AGENTS.md -->`
|
|
70
|
+
: undefined;
|
|
71
|
+
// Purpose
|
|
72
|
+
const purpose = `## Purpose\n\n${dir.purpose || detectDirectoryPurpose(dir.name)}`;
|
|
73
|
+
// Structure
|
|
74
|
+
const structureLines = ['## Structure\n', '```'];
|
|
75
|
+
structureLines.push(`${dir.name}/`);
|
|
76
|
+
for (const child of dir.children) {
|
|
77
|
+
structureLines.push(`├── ${child}/`);
|
|
78
|
+
}
|
|
79
|
+
for (const file of dir.files) {
|
|
80
|
+
const marker = isEntryPoint(file.name) ? ' ← entry' : '';
|
|
81
|
+
structureLines.push(`├── ${file.name}${marker}`);
|
|
82
|
+
}
|
|
83
|
+
structureLines.push('```');
|
|
84
|
+
const structure = structureLines.join('\n');
|
|
85
|
+
// Key files
|
|
86
|
+
const keyFilesLines = ['## Key Files\n'];
|
|
87
|
+
const entryFiles = dir.files.filter(f => isEntryPoint(f.name));
|
|
88
|
+
if (entryFiles.length > 0) {
|
|
89
|
+
keyFilesLines.push('### Entry Points');
|
|
90
|
+
for (const file of entryFiles) {
|
|
91
|
+
keyFilesLines.push(`- \`${file.name}\`: ${file.description || 'Main entry point'}`);
|
|
92
|
+
}
|
|
93
|
+
keyFilesLines.push('');
|
|
94
|
+
}
|
|
95
|
+
// Group by extension
|
|
96
|
+
const byExtension = new Map();
|
|
97
|
+
for (const file of dir.files) {
|
|
98
|
+
const ext = file.extension || 'other';
|
|
99
|
+
if (!byExtension.has(ext))
|
|
100
|
+
byExtension.set(ext, []);
|
|
101
|
+
byExtension.get(ext).push(file);
|
|
102
|
+
}
|
|
103
|
+
for (const [ext, files] of byExtension) {
|
|
104
|
+
if (files.length > 5) {
|
|
105
|
+
keyFilesLines.push(`- \`*.${ext}\`: ${files.length} files`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
for (const file of files) {
|
|
109
|
+
if (!isEntryPoint(file.name)) {
|
|
110
|
+
keyFilesLines.push(`- \`${file.name}\``);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const keyFiles = keyFilesLines.join('\n');
|
|
116
|
+
// Conventions (auto-detected)
|
|
117
|
+
const conventions = generateConventions(dir);
|
|
118
|
+
// Dependencies (child directories)
|
|
119
|
+
const dependenciesLines = ['## Dependencies\n'];
|
|
120
|
+
if (dir.children.length > 0) {
|
|
121
|
+
dependenciesLines.push('### Child Modules');
|
|
122
|
+
for (const child of dir.children) {
|
|
123
|
+
dependenciesLines.push(`- [\`${child}/\`](./${child}/AGENTS.md)`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
dependenciesLines.push('No child modules.');
|
|
128
|
+
}
|
|
129
|
+
const dependencies = dependenciesLines.join('\n');
|
|
130
|
+
// Notes placeholder
|
|
131
|
+
const notes = '## Notes\n\n<!-- Add manual notes here. They will be preserved on regeneration. -->';
|
|
132
|
+
return {
|
|
133
|
+
header,
|
|
134
|
+
parentRef,
|
|
135
|
+
purpose,
|
|
136
|
+
structure,
|
|
137
|
+
keyFiles,
|
|
138
|
+
conventions,
|
|
139
|
+
dependencies,
|
|
140
|
+
notes,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Generate conventions based on file patterns
|
|
145
|
+
*/
|
|
146
|
+
function generateConventions(dir) {
|
|
147
|
+
const lines = ['## Conventions\n'];
|
|
148
|
+
// Detect naming conventions
|
|
149
|
+
const hasKebab = dir.files.some(f => f.name.includes('-'));
|
|
150
|
+
const hasCamel = dir.files.some(f => /[a-z][A-Z]/.test(f.name));
|
|
151
|
+
const hasPascal = dir.files.some(f => /^[A-Z]/.test(f.name));
|
|
152
|
+
if (hasPascal)
|
|
153
|
+
lines.push('- **Naming**: PascalCase for components/classes');
|
|
154
|
+
if (hasCamel)
|
|
155
|
+
lines.push('- **Naming**: camelCase for utilities/functions');
|
|
156
|
+
if (hasKebab)
|
|
157
|
+
lines.push('- **Naming**: kebab-case for files');
|
|
158
|
+
// Detect test patterns
|
|
159
|
+
const hasTestFiles = dir.files.some(f => f.name.includes('.test.') || f.name.includes('.spec.'));
|
|
160
|
+
if (hasTestFiles) {
|
|
161
|
+
lines.push('- **Testing**: Co-located test files (*.test.ts, *.spec.ts)');
|
|
162
|
+
}
|
|
163
|
+
// Detect TypeScript
|
|
164
|
+
const hasTs = dir.files.some(f => f.extension === 'ts' || f.extension === 'tsx');
|
|
165
|
+
if (hasTs) {
|
|
166
|
+
lines.push('- **Language**: TypeScript');
|
|
167
|
+
}
|
|
168
|
+
if (lines.length === 1) {
|
|
169
|
+
lines.push('No specific conventions detected.');
|
|
170
|
+
}
|
|
171
|
+
return lines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Format full AGENTS.md content
|
|
175
|
+
*/
|
|
176
|
+
export function formatAgentsMd(content) {
|
|
177
|
+
const sections = [content.header];
|
|
178
|
+
if (content.parentRef) {
|
|
179
|
+
sections.push('', content.parentRef);
|
|
180
|
+
}
|
|
181
|
+
sections.push('', content.purpose);
|
|
182
|
+
sections.push('', content.structure);
|
|
183
|
+
sections.push('', content.keyFiles);
|
|
184
|
+
sections.push('', content.conventions);
|
|
185
|
+
sections.push('', content.dependencies);
|
|
186
|
+
sections.push('', content.notes);
|
|
187
|
+
return sections.join('\n');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Preserve manual notes from existing AGENTS.md
|
|
191
|
+
*/
|
|
192
|
+
export function preserveManualNotes(existing, newContent) {
|
|
193
|
+
// Extract notes section from existing
|
|
194
|
+
const notesMatch = existing.match(/## Notes\n\n([\s\S]*?)(?=\n## |$)/);
|
|
195
|
+
if (!notesMatch || notesMatch[1].trim() === '<!-- Add manual notes here. They will be preserved on regeneration. -->') {
|
|
196
|
+
return newContent;
|
|
197
|
+
}
|
|
198
|
+
// Replace notes section in new content
|
|
199
|
+
const preservedNotes = notesMatch[1].trim();
|
|
200
|
+
return newContent.replace(/## Notes\n\n<!-- Add manual notes here\. They will be preserved on regeneration\. -->/, `## Notes\n\n${preservedNotes}`);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate navigation header
|
|
204
|
+
*/
|
|
205
|
+
export function generateNavigationHeader(dir, rootPath) {
|
|
206
|
+
const parts = dir.path.replace(rootPath, '').split(path.sep).filter(Boolean);
|
|
207
|
+
const breadcrumbs = parts.map((part, i) => {
|
|
208
|
+
const depth = parts.length - i;
|
|
209
|
+
const prefix = '../'.repeat(depth);
|
|
210
|
+
return `[${part}](${prefix}AGENTS.md)`;
|
|
211
|
+
});
|
|
212
|
+
if (breadcrumbs.length === 0) {
|
|
213
|
+
return '📍 Root';
|
|
214
|
+
}
|
|
215
|
+
return `📍 ${breadcrumbs.join(' / ')}`;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Describe DeepInit workflow
|
|
219
|
+
*/
|
|
220
|
+
export function describeDeepInitWorkflow() {
|
|
221
|
+
return `
|
|
222
|
+
## DeepInit Workflow
|
|
223
|
+
|
|
224
|
+
Hierarchical AI-readable documentation generation:
|
|
225
|
+
|
|
226
|
+
\`\`\`
|
|
227
|
+
project/
|
|
228
|
+
├── AGENTS.md ← Root documentation
|
|
229
|
+
├── src/
|
|
230
|
+
│ ├── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
231
|
+
│ ├── components/
|
|
232
|
+
│ │ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
233
|
+
│ └── services/
|
|
234
|
+
│ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
235
|
+
└── tests/
|
|
236
|
+
└── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
237
|
+
\`\`\`
|
|
238
|
+
|
|
239
|
+
Features:
|
|
240
|
+
- Parent references for navigation
|
|
241
|
+
- Auto-detected purpose and conventions
|
|
242
|
+
- Preserved manual notes on regeneration
|
|
243
|
+
- Entry point identification
|
|
244
|
+
- Child module linking
|
|
245
|
+
`.trim();
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=DeepInit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeepInit.js","sourceRoot":"","sources":["../../src/lib/DeepInit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAgCxB,4BAA4B;AAC5B,MAAM,kBAAkB,GAA2B;IACjD,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,sBAAsB;IAC3B,KAAK,EAAE,mBAAmB;IAC1B,OAAO,EAAE,kBAAkB;IAC3B,UAAU,EAAE,eAAe;IAC3B,KAAK,EAAE,wBAAwB;IAC/B,KAAK,EAAE,oBAAoB;IAC3B,QAAQ,EAAE,yBAAyB;IACnC,GAAG,EAAE,uBAAuB;IAC5B,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,6BAA6B;IACpC,UAAU,EAAE,uBAAuB;IACnC,WAAW,EAAE,qBAAqB;IAClC,MAAM,EAAE,mBAAmB;IAC3B,UAAU,EAAE,sBAAsB;IAClC,MAAM,EAAE,qBAAqB;IAC7B,SAAS,EAAE,iBAAiB;IAC5B,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,qBAAqB;IAChC,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,oBAAoB;IAC9B,KAAK,EAAE,sBAAsB;IAC7B,OAAO,EAAE,uBAAuB;IAChC,KAAK,EAAE,mBAAmB;IAC1B,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,cAAc;IACrB,YAAY,EAAE,qBAAqB;IACnC,MAAM,EAAE,sBAAsB;CAC/B,CAAC;AAEF,yCAAyC;AACzC,MAAM,cAAc,GAAG;IACrB,0BAA0B;IAC1B,yBAAyB;IACzB,wBAAwB;IACxB,2BAA2B;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC;AACzF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAkB;IACjD,MAAM,MAAM,GAAG,iBAAiB,GAAG,CAAC,IAAI,EAAE,CAAC;IAE3C,mBAAmB;IACnB,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM;QAC1B,CAAC,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB;QACrE,CAAC,CAAC,SAAS,CAAC;IAEd,UAAU;IACV,MAAM,OAAO,GAAG,iBAAiB,GAAG,CAAC,OAAO,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IAEnF,YAAY;IACZ,MAAM,cAAc,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACjD,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,cAAc,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5C,YAAY;IACZ,MAAM,aAAa,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,qBAAqB;IACrB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpD,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,aAAa,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7B,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1C,8BAA8B;IAC9B,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAE7C,mCAAmC;IACnC,MAAM,iBAAiB,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,KAAK,aAAa,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElD,oBAAoB;IACpB,MAAM,KAAK,GAAG,qFAAqF,CAAC;IAEpG,OAAO;QACL,MAAM;QACN,SAAS;QACT,OAAO;QACP,SAAS;QACT,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAkB;IAC7C,MAAM,KAAK,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEnC,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,IAAI,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC7E,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC5E,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAE/D,uBAAuB;IACvB,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACtC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACvD,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC5E,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;IACjF,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAEjC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,UAAkB;IACtE,sCAAsC;IACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvE,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,yEAAyE,EAAE,CAAC;QACtH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,uCAAuC;IACvC,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,UAAU,CAAC,OAAO,CACvB,uFAAuF,EACvF,eAAe,cAAc,EAAE,CAChC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAkB,EAAE,QAAgB;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,IAAI,KAAK,MAAM,YAAY,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iteration Tracker for ULTRAWORK/Ralph Loop
|
|
3
|
+
* 작업 진행 상황을 추적하고 표시
|
|
4
|
+
*
|
|
5
|
+
* Inspired by oh-my-claudecode's Ralph Loop iteration tracking
|
|
6
|
+
*/
|
|
7
|
+
export interface PhaseProgress {
|
|
8
|
+
phaseNumber: number;
|
|
9
|
+
phaseName: string;
|
|
10
|
+
status: 'pending' | 'in_progress' | 'completed' | 'failed' | 'retrying';
|
|
11
|
+
startTime?: Date;
|
|
12
|
+
endTime?: Date;
|
|
13
|
+
retryCount: number;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface IterationState {
|
|
17
|
+
featureName: string;
|
|
18
|
+
totalPhases: number;
|
|
19
|
+
currentPhase: number;
|
|
20
|
+
phases: PhaseProgress[];
|
|
21
|
+
isUltrawork: boolean;
|
|
22
|
+
maxRetries: number;
|
|
23
|
+
startTime: Date;
|
|
24
|
+
endTime?: Date;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 새 작업 시작
|
|
28
|
+
*/
|
|
29
|
+
export declare function startIteration(featureName: string, phaseNames: string[], isUltrawork?: boolean, maxRetries?: number): IterationState;
|
|
30
|
+
/**
|
|
31
|
+
* Phase 시작
|
|
32
|
+
*/
|
|
33
|
+
export declare function startPhase(phaseNumber: number): PhaseProgress | null;
|
|
34
|
+
/**
|
|
35
|
+
* Phase 완료
|
|
36
|
+
*/
|
|
37
|
+
export declare function completePhase(phaseNumber: number): PhaseProgress | null;
|
|
38
|
+
/**
|
|
39
|
+
* Phase 실패 (재시도 가능)
|
|
40
|
+
*/
|
|
41
|
+
export declare function failPhase(phaseNumber: number, error: string): {
|
|
42
|
+
canRetry: boolean;
|
|
43
|
+
phase: PhaseProgress;
|
|
44
|
+
} | null;
|
|
45
|
+
/**
|
|
46
|
+
* 전체 작업 완료
|
|
47
|
+
*/
|
|
48
|
+
export declare function completeIteration(): IterationState | null;
|
|
49
|
+
/**
|
|
50
|
+
* 현재 상태 조회
|
|
51
|
+
*/
|
|
52
|
+
export declare function getCurrentState(): IterationState | null;
|
|
53
|
+
/**
|
|
54
|
+
* 진행 상황 포맷팅 (터미널 출력용)
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatProgress(state?: IterationState): string;
|
|
57
|
+
/**
|
|
58
|
+
* Phase 시작 배너
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatPhaseStart(phaseNumber: number, phaseName: string, totalPhases: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* Phase 완료 배너
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatPhaseComplete(phaseNumber: number, totalPhases: number): string;
|
|
65
|
+
/**
|
|
66
|
+
* 전체 완료 배너
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatIterationComplete(state: IterationState): string;
|
|
69
|
+
/**
|
|
70
|
+
* Split SPEC 감지 및 파싱
|
|
71
|
+
*/
|
|
72
|
+
export declare function detectSplitSpec(specPath: string): {
|
|
73
|
+
isSplit: boolean;
|
|
74
|
+
masterPath?: string;
|
|
75
|
+
phasePaths?: string[];
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* SPEC에서 Phase 이름 추출
|
|
79
|
+
*/
|
|
80
|
+
export declare function extractPhaseNames(specContent: string): string[];
|
|
81
|
+
//# sourceMappingURL=IterationTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IterationTracker.d.ts","sourceRoot":"","sources":["../../src/lib/IterationTracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxE,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAKD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,GAAE,OAAe,EAC5B,UAAU,GAAE,MAAU,GACrB,cAAc,CAiBhB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAWpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUvE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAahH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAQzD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,cAAc,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,GAAE,cAA8B,GAAG,MAAM,CAwB5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAMpG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAgBrE;AAgBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAalH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB/D"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iteration Tracker for ULTRAWORK/Ralph Loop
|
|
3
|
+
* 작업 진행 상황을 추적하고 표시
|
|
4
|
+
*
|
|
5
|
+
* Inspired by oh-my-claudecode's Ralph Loop iteration tracking
|
|
6
|
+
*/
|
|
7
|
+
// 전역 상태 (세션 내 유지)
|
|
8
|
+
let currentState = null;
|
|
9
|
+
/**
|
|
10
|
+
* 새 작업 시작
|
|
11
|
+
*/
|
|
12
|
+
export function startIteration(featureName, phaseNames, isUltrawork = false, maxRetries = 3) {
|
|
13
|
+
currentState = {
|
|
14
|
+
featureName,
|
|
15
|
+
totalPhases: phaseNames.length,
|
|
16
|
+
currentPhase: 0,
|
|
17
|
+
phases: phaseNames.map((name, index) => ({
|
|
18
|
+
phaseNumber: index + 1,
|
|
19
|
+
phaseName: name,
|
|
20
|
+
status: 'pending',
|
|
21
|
+
retryCount: 0,
|
|
22
|
+
})),
|
|
23
|
+
isUltrawork,
|
|
24
|
+
maxRetries,
|
|
25
|
+
startTime: new Date(),
|
|
26
|
+
};
|
|
27
|
+
return currentState;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Phase 시작
|
|
31
|
+
*/
|
|
32
|
+
export function startPhase(phaseNumber) {
|
|
33
|
+
if (!currentState || phaseNumber < 1 || phaseNumber > currentState.totalPhases) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const phase = currentState.phases[phaseNumber - 1];
|
|
37
|
+
phase.status = 'in_progress';
|
|
38
|
+
phase.startTime = new Date();
|
|
39
|
+
currentState.currentPhase = phaseNumber;
|
|
40
|
+
return phase;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Phase 완료
|
|
44
|
+
*/
|
|
45
|
+
export function completePhase(phaseNumber) {
|
|
46
|
+
if (!currentState || phaseNumber < 1 || phaseNumber > currentState.totalPhases) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const phase = currentState.phases[phaseNumber - 1];
|
|
50
|
+
phase.status = 'completed';
|
|
51
|
+
phase.endTime = new Date();
|
|
52
|
+
return phase;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Phase 실패 (재시도 가능)
|
|
56
|
+
*/
|
|
57
|
+
export function failPhase(phaseNumber, error) {
|
|
58
|
+
if (!currentState || phaseNumber < 1 || phaseNumber > currentState.totalPhases) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const phase = currentState.phases[phaseNumber - 1];
|
|
62
|
+
phase.retryCount += 1;
|
|
63
|
+
phase.error = error;
|
|
64
|
+
const canRetry = phase.retryCount < currentState.maxRetries;
|
|
65
|
+
phase.status = canRetry ? 'retrying' : 'failed';
|
|
66
|
+
return { canRetry, phase };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 전체 작업 완료
|
|
70
|
+
*/
|
|
71
|
+
export function completeIteration() {
|
|
72
|
+
if (!currentState)
|
|
73
|
+
return null;
|
|
74
|
+
currentState.endTime = new Date();
|
|
75
|
+
const state = currentState;
|
|
76
|
+
currentState = null;
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 현재 상태 조회
|
|
81
|
+
*/
|
|
82
|
+
export function getCurrentState() {
|
|
83
|
+
return currentState;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 진행 상황 포맷팅 (터미널 출력용)
|
|
87
|
+
*/
|
|
88
|
+
export function formatProgress(state = currentState) {
|
|
89
|
+
if (!state)
|
|
90
|
+
return '';
|
|
91
|
+
const lines = [];
|
|
92
|
+
const mode = state.isUltrawork ? '🚀 ULTRAWORK' : '📋 STANDARD';
|
|
93
|
+
lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
94
|
+
lines.push(`${mode} - ${state.featureName}`);
|
|
95
|
+
lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
96
|
+
for (const phase of state.phases) {
|
|
97
|
+
const statusIcon = getStatusIcon(phase.status);
|
|
98
|
+
const retryInfo = phase.retryCount > 0 ? ` (retry ${phase.retryCount}/${state.maxRetries})` : '';
|
|
99
|
+
const current = phase.phaseNumber === state.currentPhase ? ' ←' : '';
|
|
100
|
+
lines.push(`${statusIcon} Phase ${phase.phaseNumber}/${state.totalPhases}: ${phase.phaseName}${retryInfo}${current}`);
|
|
101
|
+
}
|
|
102
|
+
const completed = state.phases.filter(p => p.status === 'completed').length;
|
|
103
|
+
const progress = Math.round((completed / state.totalPhases) * 100);
|
|
104
|
+
lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
105
|
+
lines.push(`Progress: ${completed}/${state.totalPhases} (${progress}%)`);
|
|
106
|
+
return lines.join('\n');
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Phase 시작 배너
|
|
110
|
+
*/
|
|
111
|
+
export function formatPhaseStart(phaseNumber, phaseName, totalPhases) {
|
|
112
|
+
return `
|
|
113
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
114
|
+
🏔️ BOULDER ROLLING... Phase ${phaseNumber}/${totalPhases}
|
|
115
|
+
${phaseName}
|
|
116
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`.trim();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Phase 완료 배너
|
|
120
|
+
*/
|
|
121
|
+
export function formatPhaseComplete(phaseNumber, totalPhases) {
|
|
122
|
+
return `✅ Phase ${phaseNumber}/${totalPhases} complete`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 전체 완료 배너
|
|
126
|
+
*/
|
|
127
|
+
export function formatIterationComplete(state) {
|
|
128
|
+
const duration = state.endTime
|
|
129
|
+
? Math.round((state.endTime.getTime() - state.startTime.getTime()) / 1000)
|
|
130
|
+
: 0;
|
|
131
|
+
const totalRetries = state.phases.reduce((sum, p) => sum + p.retryCount, 0);
|
|
132
|
+
const retryInfo = totalRetries > 0 ? ` (${totalRetries} retries)` : '';
|
|
133
|
+
return `
|
|
134
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
135
|
+
🎉 BOULDER REACHED THE TOP!
|
|
136
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
137
|
+
Feature: ${state.featureName}
|
|
138
|
+
Phases: ${state.totalPhases}/${state.totalPhases} complete${retryInfo}
|
|
139
|
+
Time: ${duration}s
|
|
140
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`.trim();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 상태 아이콘
|
|
144
|
+
*/
|
|
145
|
+
function getStatusIcon(status) {
|
|
146
|
+
switch (status) {
|
|
147
|
+
case 'completed': return '✅';
|
|
148
|
+
case 'in_progress': return '🔨';
|
|
149
|
+
case 'pending': return '⬜';
|
|
150
|
+
case 'failed': return '❌';
|
|
151
|
+
case 'retrying': return '🔄';
|
|
152
|
+
default: return '⬜';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Split SPEC 감지 및 파싱
|
|
157
|
+
*/
|
|
158
|
+
export function detectSplitSpec(specPath) {
|
|
159
|
+
// 폴더 구조인 경우 (_index.md + phase-*.md)
|
|
160
|
+
if (specPath.includes('_index.md')) {
|
|
161
|
+
const baseDir = specPath.replace('/_index.md', '').replace('\\_index.md', '');
|
|
162
|
+
return {
|
|
163
|
+
isSplit: true,
|
|
164
|
+
masterPath: specPath,
|
|
165
|
+
phasePaths: [], // 실제 사용 시 glob으로 phase-*.md 찾기
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// 단일 파일
|
|
169
|
+
return { isSplit: false };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* SPEC에서 Phase 이름 추출
|
|
173
|
+
*/
|
|
174
|
+
export function extractPhaseNames(specContent) {
|
|
175
|
+
const phaseRegex = /###\s*Phase\s*\d+[:\s]*([^\n]+)/gi;
|
|
176
|
+
const names = [];
|
|
177
|
+
let match;
|
|
178
|
+
while ((match = phaseRegex.exec(specContent)) !== null) {
|
|
179
|
+
names.push(match[1].trim());
|
|
180
|
+
}
|
|
181
|
+
// Phase 이름이 없으면 번호만 사용
|
|
182
|
+
if (names.length === 0) {
|
|
183
|
+
const phaseCount = (specContent.match(/###\s*Phase\s*\d+/gi) || []).length;
|
|
184
|
+
for (let i = 1; i <= phaseCount; i++) {
|
|
185
|
+
names.push(`Phase ${i}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return names;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=IterationTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IterationTracker.js","sourceRoot":"","sources":["../../src/lib/IterationTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent Model Router
|
|
3
|
+
* 작업 복잡도를 자동 분석하여 최적의 모델을 선택
|
|
4
|
+
*
|
|
5
|
+
* Inspired by oh-my-claudecode's model routing system
|
|
6
|
+
*/
|
|
7
|
+
export type ModelTier = 'haiku' | 'sonnet' | 'opus';
|
|
8
|
+
export interface ComplexitySignals {
|
|
9
|
+
fileCount: number;
|
|
10
|
+
lineCount: number;
|
|
11
|
+
hasArchitectureChange: boolean;
|
|
12
|
+
hasSecurityImplication: boolean;
|
|
13
|
+
hasMultipleServices: boolean;
|
|
14
|
+
isRefactoring: boolean;
|
|
15
|
+
isNewFeature: boolean;
|
|
16
|
+
isBugFix: boolean;
|
|
17
|
+
isDocumentation: boolean;
|
|
18
|
+
keywords: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface RoutingResult {
|
|
21
|
+
model: ModelTier;
|
|
22
|
+
score: number;
|
|
23
|
+
reason: string;
|
|
24
|
+
signals: Partial<ComplexitySignals>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 텍스트에서 복잡도 신호 추출
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractComplexitySignals(text: string): ComplexitySignals;
|
|
30
|
+
/**
|
|
31
|
+
* 복잡도 점수 계산
|
|
32
|
+
*/
|
|
33
|
+
export declare function calculateComplexityScore(signals: ComplexitySignals): number;
|
|
34
|
+
/**
|
|
35
|
+
* 최적 모델 선택
|
|
36
|
+
*/
|
|
37
|
+
export declare function selectModel(score: number): ModelTier;
|
|
38
|
+
/**
|
|
39
|
+
* 메인 라우팅 함수
|
|
40
|
+
*/
|
|
41
|
+
export declare function routeToModel(taskDescription: string): RoutingResult;
|
|
42
|
+
/**
|
|
43
|
+
* SPEC 파일 기반 라우팅
|
|
44
|
+
*/
|
|
45
|
+
export declare function routeFromSpec(specContent: string): RoutingResult;
|
|
46
|
+
/**
|
|
47
|
+
* 에이전트 티어 선택 (agent-low, agent-medium, agent 패턴)
|
|
48
|
+
*/
|
|
49
|
+
export declare function selectAgentTier(baseAgentName: string, taskDescription: string): string;
|
|
50
|
+
//# sourceMappingURL=ModelRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelRouter.d.ts","sourceRoot":"","sources":["../../src/lib/ModelRouter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAiDD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA+BxE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CA6B3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAIpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,aAAa,CA4BnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAgChE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAatF"}
|