@liangjie559567/ultrapower 5.5.44 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +12 -3
- package/commands/ccg-workflow.md +36 -0
- package/dist/features/ccg/ccg-skill.d.ts +2 -0
- package/dist/features/ccg/ccg-skill.d.ts.map +1 -0
- package/dist/features/ccg/ccg-skill.js +20 -0
- package/dist/features/ccg/ccg-skill.js.map +1 -0
- package/dist/features/ccg/ci-validator.d.ts +7 -0
- package/dist/features/ccg/ci-validator.d.ts.map +1 -0
- package/dist/features/ccg/ci-validator.js +31 -0
- package/dist/features/ccg/ci-validator.js.map +1 -0
- package/dist/features/ccg/codex-fallback.d.ts +19 -0
- package/dist/features/ccg/codex-fallback.d.ts.map +1 -0
- package/dist/features/ccg/codex-fallback.js +40 -0
- package/dist/features/ccg/codex-fallback.js.map +1 -0
- package/dist/features/ccg/doc-cache.d.ts +11 -0
- package/dist/features/ccg/doc-cache.d.ts.map +1 -0
- package/dist/features/ccg/doc-cache.js +31 -0
- package/dist/features/ccg/doc-cache.js.map +1 -0
- package/dist/features/ccg/doc-manager.d.ts +7 -0
- package/dist/features/ccg/doc-manager.d.ts.map +1 -0
- package/dist/features/ccg/doc-manager.js +35 -0
- package/dist/features/ccg/doc-manager.js.map +1 -0
- package/dist/features/ccg/file-cache.d.ts +21 -0
- package/dist/features/ccg/file-cache.d.ts.map +1 -0
- package/dist/features/ccg/file-cache.js +47 -0
- package/dist/features/ccg/file-cache.js.map +1 -0
- package/dist/features/ccg/incremental-processor.d.ts +4 -0
- package/dist/features/ccg/incremental-processor.d.ts.map +1 -0
- package/dist/features/ccg/incremental-processor.js +29 -0
- package/dist/features/ccg/incremental-processor.js.map +1 -0
- package/dist/features/ccg/input-sanitizer.d.ts +12 -0
- package/dist/features/ccg/input-sanitizer.d.ts.map +1 -0
- package/dist/features/ccg/input-sanitizer.js +41 -0
- package/dist/features/ccg/input-sanitizer.js.map +1 -0
- package/dist/features/ccg/loop-controller.d.ts +14 -0
- package/dist/features/ccg/loop-controller.d.ts.map +1 -0
- package/dist/features/ccg/loop-controller.js +23 -0
- package/dist/features/ccg/loop-controller.js.map +1 -0
- package/dist/features/ccg/microservice-detector.d.ts +7 -0
- package/dist/features/ccg/microservice-detector.d.ts.map +1 -0
- package/dist/features/ccg/microservice-detector.js +41 -0
- package/dist/features/ccg/microservice-detector.js.map +1 -0
- package/dist/features/ccg/microservice-handler.d.ts +2 -0
- package/dist/features/ccg/microservice-handler.d.ts.map +1 -0
- package/dist/features/ccg/microservice-handler.js +25 -0
- package/dist/features/ccg/microservice-handler.js.map +1 -0
- package/dist/features/ccg/module-loop-controller.d.ts +30 -0
- package/dist/features/ccg/module-loop-controller.d.ts.map +1 -0
- package/dist/features/ccg/module-loop-controller.js +89 -0
- package/dist/features/ccg/module-loop-controller.js.map +1 -0
- package/dist/features/ccg/module-splitter.d.ts +2 -0
- package/dist/features/ccg/module-splitter.d.ts.map +1 -0
- package/dist/features/ccg/module-splitter.js +74 -0
- package/dist/features/ccg/module-splitter.js.map +1 -0
- package/dist/features/ccg/progress-bar.d.ts +11 -0
- package/dist/features/ccg/progress-bar.d.ts.map +1 -0
- package/dist/features/ccg/progress-bar.js +28 -0
- package/dist/features/ccg/progress-bar.js.map +1 -0
- package/dist/features/ccg/project-detector.d.ts +9 -0
- package/dist/features/ccg/project-detector.d.ts.map +1 -0
- package/dist/features/ccg/project-detector.js +39 -0
- package/dist/features/ccg/project-detector.js.map +1 -0
- package/dist/features/ccg/stream-processor.d.ts +3 -0
- package/dist/features/ccg/stream-processor.d.ts.map +1 -0
- package/dist/features/ccg/stream-processor.js +15 -0
- package/dist/features/ccg/stream-processor.js.map +1 -0
- package/dist/features/ccg/workflow-router.d.ts +8 -0
- package/dist/features/ccg/workflow-router.d.ts.map +1 -0
- package/dist/features/ccg/workflow-router.js +9 -0
- package/dist/features/ccg/workflow-router.js.map +1 -0
- package/dist/features/ccg/workflows/new-project-workflow.d.ts +11 -0
- package/dist/features/ccg/workflows/new-project-workflow.d.ts.map +1 -0
- package/dist/features/ccg/workflows/new-project-workflow.js +21 -0
- package/dist/features/ccg/workflows/new-project-workflow.js.map +1 -0
- package/dist/features/ccg/workflows/old-project-workflow.d.ts +10 -0
- package/dist/features/ccg/workflows/old-project-workflow.d.ts.map +1 -0
- package/dist/features/ccg/workflows/old-project-workflow.js +19 -0
- package/dist/features/ccg/workflows/old-project-workflow.js.map +1 -0
- package/dist/features/ccg/workflows/phase-development.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-development.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-development.js +10 -0
- package/dist/features/ccg/workflows/phase-development.js.map +1 -0
- package/dist/features/ccg/workflows/phase-modification-plan.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-modification-plan.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-modification-plan.js +9 -0
- package/dist/features/ccg/workflows/phase-modification-plan.js.map +1 -0
- package/dist/features/ccg/workflows/phase-module-split.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-module-split.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-module-split.js +10 -0
- package/dist/features/ccg/workflows/phase-module-split.js.map +1 -0
- package/dist/features/ccg/workflows/phase-optimization.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-optimization.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-optimization.js +17 -0
- package/dist/features/ccg/workflows/phase-optimization.js.map +1 -0
- package/dist/features/ccg/workflows/phase-read-status.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-read-status.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-read-status.js +10 -0
- package/dist/features/ccg/workflows/phase-read-status.js.map +1 -0
- package/dist/features/ccg/workflows/phase-requirement.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-requirement.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-requirement.js +18 -0
- package/dist/features/ccg/workflows/phase-requirement.js.map +1 -0
- package/dist/features/ccg/workflows/phase-testing.d.ts +2 -0
- package/dist/features/ccg/workflows/phase-testing.d.ts.map +1 -0
- package/dist/features/ccg/workflows/phase-testing.js +17 -0
- package/dist/features/ccg/workflows/phase-testing.js.map +1 -0
- package/dist/features/token-tracker/index.d.ts.map +1 -1
- package/dist/features/token-tracker/index.js +6 -2
- package/dist/features/token-tracker/index.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +11 -0
- package/dist/installer/index.js.map +1 -1
- package/docs/CLAUDE.md +1 -1
- package/docs/INSTALL.md +2 -2
- package/docs/REFERENCE.md +1 -1
- package/docs/ccg-workflow/API.md +483 -0
- package/docs/ccg-workflow/BEST_PRACTICES.md +489 -0
- package/docs/ccg-workflow/README.md +176 -0
- package/docs/ccg-workflow/TROUBLESHOOTING.md +397 -0
- package/docs/ccg-workflow/VALIDATION_GUIDE.md +200 -0
- package/docs/standards/README.md +1 -1
- package/package.json +1 -1
- package/skills/ccg-workflow/SKILL.md +25 -0
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
{
|
|
9
9
|
"name": "ultrapower",
|
|
10
10
|
"description": "Disciplined multi-agent orchestration: workflow enforcement + parallel execution",
|
|
11
|
-
"version": "5.
|
|
11
|
+
"version": "5.6.0",
|
|
12
12
|
"source": {
|
|
13
13
|
"source": "npm",
|
|
14
14
|
"package": "@liangjie559567/ultrapower",
|
|
15
|
-
"version": "5.
|
|
15
|
+
"version": "5.6.0"
|
|
16
16
|
},
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "liangjie559567"
|
package/.mcp.json
CHANGED
|
@@ -2,15 +2,24 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"t": {
|
|
4
4
|
"command": "node",
|
|
5
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/mcp-server.cjs"]
|
|
5
|
+
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/mcp-server.cjs"],
|
|
6
|
+
"env": {
|
|
7
|
+
"CLAUDE_PLUGIN_ROOT": "C:\\Users\\ljyih\\Desktop\\ultrapower"
|
|
8
|
+
}
|
|
6
9
|
},
|
|
7
10
|
"x": {
|
|
8
11
|
"command": "node",
|
|
9
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/codex-server.cjs"]
|
|
12
|
+
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/codex-server.cjs"],
|
|
13
|
+
"env": {
|
|
14
|
+
"CLAUDE_PLUGIN_ROOT": "C:\\Users\\ljyih\\Desktop\\ultrapower"
|
|
15
|
+
}
|
|
10
16
|
},
|
|
11
17
|
"g": {
|
|
12
18
|
"command": "node",
|
|
13
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/gemini-server.cjs"]
|
|
19
|
+
"args": ["${CLAUDE_PLUGIN_ROOT}/bridge/gemini-server.cjs"],
|
|
20
|
+
"env": {
|
|
21
|
+
"CLAUDE_PLUGIN_ROOT": "C:\\Users\\ljyih\\Desktop\\ultrapower"
|
|
22
|
+
}
|
|
14
23
|
}
|
|
15
24
|
}
|
|
16
25
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ccg-workflow
|
|
3
|
+
description: Claude-Codex 协作工作流 - 自动检测项目类型并执行完整开发闭环
|
|
4
|
+
skill: ccg-workflow
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CCG Workflow
|
|
8
|
+
|
|
9
|
+
启动 Claude-Codex 协作工作流。
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
/ccg-workflow [new|old]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Parameters
|
|
18
|
+
|
|
19
|
+
- `new` - 强制使用新项目流程
|
|
20
|
+
- `old` - 强制使用老项目流程
|
|
21
|
+
- 不提供参数时自动检测
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
### 新项目流程
|
|
26
|
+
1. 需求分析 (Claude)
|
|
27
|
+
2. 技术设计 (Claude)
|
|
28
|
+
3. 代码开发 (Codex)
|
|
29
|
+
4. 优化循环 (Claude ↔ Codex)
|
|
30
|
+
5. 测试循环 (Claude ↔ Codex)
|
|
31
|
+
|
|
32
|
+
### 老项目流程
|
|
33
|
+
1. 读取现状 (Codex)
|
|
34
|
+
2. 生成修改计划 (Claude)
|
|
35
|
+
3. 模块拆分 (Codex)
|
|
36
|
+
4. 逐模块闭环 (Claude ↔ Codex)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ccg-skill.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/ccg-skill.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { routeWorkflow } from './workflow-router.js';
|
|
2
|
+
import { sanitizeCCGInput } from './input-sanitizer.js';
|
|
3
|
+
export async function executeCCGSkill(workingDir, args) {
|
|
4
|
+
const sanitized = sanitizeCCGInput({
|
|
5
|
+
workingDir,
|
|
6
|
+
projectType: args
|
|
7
|
+
});
|
|
8
|
+
const context = await routeWorkflow(sanitized.workingDir, sanitized.projectType);
|
|
9
|
+
console.log(`[CCG] Project type: ${context.projectType}`);
|
|
10
|
+
console.log(`[CCG] Working directory: ${context.workingDir}`);
|
|
11
|
+
if (context.projectType === 'new') {
|
|
12
|
+
console.log('[CCG] Routing to new project workflow...');
|
|
13
|
+
// TODO: T1.4 - Implement new project workflow
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log('[CCG] Routing to old project workflow...');
|
|
17
|
+
// TODO: T2.1 - Implement old project workflow
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ccg-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ccg-skill.js","sourceRoot":"","sources":["../../../src/features/ccg/ccg-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmB,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,IAAa;IAEb,MAAM,SAAS,GAAG,gBAAgB,CAAC;QACjC,UAAU;QACV,WAAW,EAAE,IAA+B;KAC7C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAEjF,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAE9D,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,8CAA8C;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,8CAA8C;IAChD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-validator.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/ci-validator.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,CAAC,CA2BzD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export async function runCIValidation() {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const warnings = [];
|
|
7
|
+
try {
|
|
8
|
+
await execAsync('tsc --noEmit', { cwd: process.cwd() });
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
errors.push(`TypeScript compilation failed: ${err.message}`);
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
await execAsync('npm run build', { cwd: process.cwd() });
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
errors.push(`Build failed: ${err.message}`);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
await execAsync('npm test', { cwd: process.cwd() });
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
errors.push(`Tests failed: ${err.message}`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
success: errors.length === 0,
|
|
27
|
+
errors,
|
|
28
|
+
warnings,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ci-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-validator.js","sourceRoot":"","sources":["../../../src/features/ccg/ci-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAQlC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC5B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Fallback Strategy
|
|
3
|
+
* T3.2: Implements fallback to Agent when Codex MCP is unavailable/timeout
|
|
4
|
+
*/
|
|
5
|
+
export interface CodexFallbackResult<T> {
|
|
6
|
+
success: boolean;
|
|
7
|
+
data?: T;
|
|
8
|
+
fallbackUsed: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Execute with Codex MCP, fallback to Agent on failure/timeout
|
|
13
|
+
*/
|
|
14
|
+
export declare function executeWithFallback<T>(codexFn: () => Promise<T>, fallbackFn: () => Promise<T>, taskName: string): Promise<CodexFallbackResult<T>>;
|
|
15
|
+
/**
|
|
16
|
+
* Check if Codex MCP tool is available
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCodexAvailable(): boolean;
|
|
19
|
+
//# sourceMappingURL=codex-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-fallback.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/codex-fallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAqBjC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Fallback Strategy
|
|
3
|
+
* T3.2: Implements fallback to Agent when Codex MCP is unavailable/timeout
|
|
4
|
+
*/
|
|
5
|
+
import { withTimeout } from '../../mcp/timeout.js';
|
|
6
|
+
const CODEX_TIMEOUT_MS = 30000; // 30s
|
|
7
|
+
/**
|
|
8
|
+
* Execute with Codex MCP, fallback to Agent on failure/timeout
|
|
9
|
+
*/
|
|
10
|
+
export async function executeWithFallback(codexFn, fallbackFn, taskName) {
|
|
11
|
+
try {
|
|
12
|
+
const data = await withTimeout(codexFn, CODEX_TIMEOUT_MS);
|
|
13
|
+
console.log(`[Fallback] ${taskName}: Codex succeeded`);
|
|
14
|
+
return { success: true, data, fallbackUsed: false };
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
18
|
+
console.warn(`[Fallback] ${taskName}: Codex failed (${errorMsg}), using Agent fallback`);
|
|
19
|
+
try {
|
|
20
|
+
const data = await fallbackFn();
|
|
21
|
+
return { success: true, data, fallbackUsed: true };
|
|
22
|
+
}
|
|
23
|
+
catch (fallbackError) {
|
|
24
|
+
const fallbackMsg = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
fallbackUsed: true,
|
|
28
|
+
error: `Both Codex and fallback failed: ${errorMsg} | ${fallbackMsg}`
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if Codex MCP tool is available
|
|
35
|
+
*/
|
|
36
|
+
export function isCodexAvailable() {
|
|
37
|
+
// Check if MCP tool exists in global scope
|
|
38
|
+
return typeof globalThis.mcp__plugin_ultrapower_x__ask_codex === 'function';
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=codex-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-fallback.js","sourceRoot":"","sources":["../../../src/features/ccg/codex-fallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,MAAM;AAStC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAyB,EACzB,UAA4B,EAC5B,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,mBAAmB,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,mBAAmB,QAAQ,yBAAyB,CAAC,CAAC;QAEzF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,aAAa,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACnG,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,mCAAmC,QAAQ,MAAM,WAAW,EAAE;aACtE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,2CAA2C;IAC3C,OAAO,OAAQ,UAAkB,CAAC,mCAAmC,KAAK,UAAU,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare class DocCache {
|
|
2
|
+
private cache;
|
|
3
|
+
private readonly TTL;
|
|
4
|
+
get(path: string): Promise<string | null>;
|
|
5
|
+
set(path: string, content: string): void;
|
|
6
|
+
clear(): void;
|
|
7
|
+
readWithCache(path: string): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
export declare const docCache: DocCache;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=doc-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-cache.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/doc-cache.ts"],"names":[],"mappings":"AAOA,cAAM,QAAQ;IACZ,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAExB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY/C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIxC,KAAK,IAAI,IAAI;IAIP,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAQnD;AAED,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
class DocCache {
|
|
3
|
+
cache = new Map();
|
|
4
|
+
TTL = 300000; // 5 minutes
|
|
5
|
+
async get(path) {
|
|
6
|
+
const entry = this.cache.get(path);
|
|
7
|
+
if (!entry)
|
|
8
|
+
return null;
|
|
9
|
+
if (Date.now() - entry.timestamp > this.TTL) {
|
|
10
|
+
this.cache.delete(path);
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return entry.content;
|
|
14
|
+
}
|
|
15
|
+
set(path, content) {
|
|
16
|
+
this.cache.set(path, { content, timestamp: Date.now() });
|
|
17
|
+
}
|
|
18
|
+
clear() {
|
|
19
|
+
this.cache.clear();
|
|
20
|
+
}
|
|
21
|
+
async readWithCache(path) {
|
|
22
|
+
const cached = await this.get(path);
|
|
23
|
+
if (cached !== null)
|
|
24
|
+
return cached;
|
|
25
|
+
const content = await fs.readFile(path, 'utf-8');
|
|
26
|
+
this.set(path, content);
|
|
27
|
+
return content;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export const docCache = new DocCache();
|
|
31
|
+
//# sourceMappingURL=doc-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-cache.js","sourceRoot":"","sources":["../../../src/features/ccg/doc-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAOlC,MAAM,QAAQ;IACJ,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7B,GAAG,GAAG,MAAM,CAAC,CAAC,YAAY;IAE3C,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,OAAe;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QAEnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function getDocPath(type: string): string;
|
|
2
|
+
export declare function createDocFromTemplate(type: string, vars: Record<string, string>): Promise<string>;
|
|
3
|
+
export declare function batchCreateDocs(requests: Array<{
|
|
4
|
+
type: string;
|
|
5
|
+
vars: Record<string, string>;
|
|
6
|
+
}>): Promise<string[]>;
|
|
7
|
+
//# sourceMappingURL=doc-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-manager.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/doc-manager.ts"],"names":[],"mappings":"AAiBA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,GAC9D,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { assertValidDocType } from './input-sanitizer.js';
|
|
3
|
+
import { docCache } from './doc-cache.js';
|
|
4
|
+
const ALLOWED_DOC_TYPES = [
|
|
5
|
+
'requirements',
|
|
6
|
+
'tech-design',
|
|
7
|
+
'feature-flow',
|
|
8
|
+
'modification-plan',
|
|
9
|
+
'optimization-list',
|
|
10
|
+
'test-checklist',
|
|
11
|
+
'dev-module',
|
|
12
|
+
];
|
|
13
|
+
export function getDocPath(type) {
|
|
14
|
+
const validType = assertValidDocType(type);
|
|
15
|
+
return path.join(__dirname, 'templates', `${validType}.md`);
|
|
16
|
+
}
|
|
17
|
+
export async function createDocFromTemplate(type, vars) {
|
|
18
|
+
const templatePath = getDocPath(type);
|
|
19
|
+
let content = await docCache.readWithCache(templatePath);
|
|
20
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
21
|
+
if (key.length > 100) {
|
|
22
|
+
throw new Error(`Template variable key too long: ${key.slice(0, 50)}...`);
|
|
23
|
+
}
|
|
24
|
+
if (value.length > 10000) {
|
|
25
|
+
throw new Error(`Template variable value too long for key: ${key}`);
|
|
26
|
+
}
|
|
27
|
+
const safeKey = key.replace(/[^a-zA-Z0-9_-]/g, '');
|
|
28
|
+
content = content.replace(new RegExp(`{{${safeKey}}}`, 'g'), value);
|
|
29
|
+
}
|
|
30
|
+
return content;
|
|
31
|
+
}
|
|
32
|
+
export async function batchCreateDocs(requests) {
|
|
33
|
+
return Promise.all(requests.map(req => createDocFromTemplate(req.type, req.vars)));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=doc-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-manager.js","sourceRoot":"","sources":["../../../src/features/ccg/doc-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,iBAAiB,GAAG;IACxB,cAAc;IACd,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,YAAY;CACJ,CAAC;AAIX,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,SAAS,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,IAA4B;IAE5B,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,OAAO,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAA+D;IAE/D,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
declare class FileCache {
|
|
2
|
+
private dirCache;
|
|
3
|
+
private readonly TTL;
|
|
4
|
+
private readonly MAX_SIZE;
|
|
5
|
+
private hits;
|
|
6
|
+
private misses;
|
|
7
|
+
readdir(dirPath: string, useCache?: boolean): Promise<string[]>;
|
|
8
|
+
clear(): void;
|
|
9
|
+
getStats(): {
|
|
10
|
+
size: number;
|
|
11
|
+
maxSize: number;
|
|
12
|
+
ttl: number;
|
|
13
|
+
hits: number;
|
|
14
|
+
misses: number;
|
|
15
|
+
hitRate: string;
|
|
16
|
+
};
|
|
17
|
+
resetStats(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare const fileCache: FileCache;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=file-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/file-cache.ts"],"names":[],"mappings":"AAOA,cAAM,SAAS;IACb,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAO;IAChC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IAEb,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBlE,KAAK,IAAI,IAAI;IAIb,QAAQ;;;;;;;;IAYR,UAAU,IAAI,IAAI;CAInB;AAED,eAAO,MAAM,SAAS,WAAkB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
class FileCache {
|
|
3
|
+
dirCache = new Map();
|
|
4
|
+
TTL = 300000; // 5 minutes
|
|
5
|
+
MAX_SIZE = 100;
|
|
6
|
+
hits = 0;
|
|
7
|
+
misses = 0;
|
|
8
|
+
async readdir(dirPath, useCache = true) {
|
|
9
|
+
if (!useCache) {
|
|
10
|
+
return fs.readdir(dirPath);
|
|
11
|
+
}
|
|
12
|
+
const cached = this.dirCache.get(dirPath);
|
|
13
|
+
if (cached && Date.now() - cached.timestamp < this.TTL) {
|
|
14
|
+
this.hits++;
|
|
15
|
+
return cached.entries;
|
|
16
|
+
}
|
|
17
|
+
this.misses++;
|
|
18
|
+
const entries = await fs.readdir(dirPath);
|
|
19
|
+
if (this.dirCache.size >= this.MAX_SIZE) {
|
|
20
|
+
const oldest = Array.from(this.dirCache.entries())
|
|
21
|
+
.sort((a, b) => a[1].timestamp - b[1].timestamp)[0];
|
|
22
|
+
this.dirCache.delete(oldest[0]);
|
|
23
|
+
}
|
|
24
|
+
this.dirCache.set(dirPath, { entries, timestamp: Date.now() });
|
|
25
|
+
return entries;
|
|
26
|
+
}
|
|
27
|
+
clear() {
|
|
28
|
+
this.dirCache.clear();
|
|
29
|
+
}
|
|
30
|
+
getStats() {
|
|
31
|
+
const total = this.hits + this.misses;
|
|
32
|
+
return {
|
|
33
|
+
size: this.dirCache.size,
|
|
34
|
+
maxSize: this.MAX_SIZE,
|
|
35
|
+
ttl: this.TTL,
|
|
36
|
+
hits: this.hits,
|
|
37
|
+
misses: this.misses,
|
|
38
|
+
hitRate: total > 0 ? (this.hits / total * 100).toFixed(2) + '%' : '0%'
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
resetStats() {
|
|
42
|
+
this.hits = 0;
|
|
43
|
+
this.misses = 0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export const fileCache = new FileCache();
|
|
47
|
+
//# sourceMappingURL=file-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../../src/features/ccg/file-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AAOpC,MAAM,SAAS;IACL,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnC,GAAG,GAAG,MAAM,CAAC,CAAC,YAAY;IAC1B,QAAQ,GAAG,GAAG,CAAC;IACxB,IAAI,GAAG,CAAC,CAAC;IACT,MAAM,GAAG,CAAC,CAAC;IAEnB,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,QAAQ,GAAG,IAAI;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;iBAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;SACvE,CAAC;IACJ,CAAC;IAED,UAAU;QACR,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function getChangedFiles(baseBranch?: string): Promise<string[]>;
|
|
2
|
+
export declare function getUntrackedFiles(): Promise<string[]>;
|
|
3
|
+
export declare function getAllChangedFiles(baseBranch?: string): Promise<string[]>;
|
|
4
|
+
//# sourceMappingURL=incremental-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-processor.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/incremental-processor.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,UAAU,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO5E;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAO3D;AAED,wBAAsB,kBAAkB,CAAC,UAAU,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAM/E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export async function getChangedFiles(baseBranch = 'main') {
|
|
5
|
+
try {
|
|
6
|
+
const { stdout } = await execAsync(`git diff --name-only --cached`);
|
|
7
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function getUntrackedFiles() {
|
|
14
|
+
try {
|
|
15
|
+
const { stdout } = await execAsync('git ls-files --others --exclude-standard');
|
|
16
|
+
return stdout.trim().split('\n').filter(Boolean);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function getAllChangedFiles(baseBranch = 'main') {
|
|
23
|
+
const [changed, untracked] = await Promise.all([
|
|
24
|
+
getChangedFiles(baseBranch),
|
|
25
|
+
getUntrackedFiles()
|
|
26
|
+
]);
|
|
27
|
+
return [...new Set([...changed, ...untracked])];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=incremental-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-processor.js","sourceRoot":"","sources":["../../../src/features/ccg/incremental-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAU,GAAG,MAAM;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACpE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAC/E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAU,GAAG,MAAM;IAC1D,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,eAAe,CAAC,UAAU,CAAC;QAC3B,iBAAiB,EAAE;KACpB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare const ALLOWED_DOC_TYPES: readonly ["requirements", "tech-design", "feature-flow", "modification-plan", "optimization-list", "test-checklist", "dev-module"];
|
|
2
|
+
type DocType = typeof ALLOWED_DOC_TYPES[number];
|
|
3
|
+
export interface CCGInput {
|
|
4
|
+
workingDir: string;
|
|
5
|
+
projectType?: 'new' | 'old';
|
|
6
|
+
docType?: DocType;
|
|
7
|
+
vars?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function sanitizeCCGInput(raw: unknown): CCGInput;
|
|
10
|
+
export declare function assertValidDocType(type: unknown): DocType;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=input-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-sanitizer.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/input-sanitizer.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,oIAQb,CAAC;AAEX,KAAK,OAAO,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAShD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAsBvD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAKzD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const ALLOWED_DOC_TYPES = [
|
|
3
|
+
'requirements',
|
|
4
|
+
'tech-design',
|
|
5
|
+
'feature-flow',
|
|
6
|
+
'modification-plan',
|
|
7
|
+
'optimization-list',
|
|
8
|
+
'test-checklist',
|
|
9
|
+
'dev-module',
|
|
10
|
+
];
|
|
11
|
+
const CCGInputSchema = z.object({
|
|
12
|
+
workingDir: z.string().max(500),
|
|
13
|
+
projectType: z.enum(['new', 'old']).optional(),
|
|
14
|
+
docType: z.enum(ALLOWED_DOC_TYPES).optional(),
|
|
15
|
+
vars: z.record(z.string(), z.string()).optional(),
|
|
16
|
+
}).strict();
|
|
17
|
+
export function sanitizeCCGInput(raw) {
|
|
18
|
+
const parsed = CCGInputSchema.safeParse(raw);
|
|
19
|
+
if (!parsed.success) {
|
|
20
|
+
throw new Error(`Invalid CCG input: ${parsed.error.issues.map(i => i.message).join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
const { workingDir, projectType, docType, vars } = parsed.data;
|
|
23
|
+
if (workingDir.includes('..') || workingDir.includes('\0')) {
|
|
24
|
+
throw new Error('Path traversal detected in workingDir');
|
|
25
|
+
}
|
|
26
|
+
if (vars) {
|
|
27
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
28
|
+
if (key.length > 100 || value.length > 10000) {
|
|
29
|
+
throw new Error(`Template variable "${key}" exceeds size limit`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { workingDir, projectType, docType, vars };
|
|
34
|
+
}
|
|
35
|
+
export function assertValidDocType(type) {
|
|
36
|
+
if (typeof type !== 'string' || !ALLOWED_DOC_TYPES.includes(type)) {
|
|
37
|
+
throw new Error(`Invalid document type: ${type}. Allowed: ${ALLOWED_DOC_TYPES.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
return type;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=input-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-sanitizer.js","sourceRoot":"","sources":["../../../src/features/ccg/input-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,iBAAiB,GAAG;IACxB,cAAc;IACd,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,YAAY;CACJ,CAAC;AAIX,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC,MAAM,EAAE,CAAC;AASZ,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAE/D,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,sBAAsB,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAe,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,cAAc,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,IAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface LoopConfig {
|
|
2
|
+
maxRounds: number;
|
|
3
|
+
timeout: number;
|
|
4
|
+
convergenceCheck: (result: any) => boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface LoopResult {
|
|
7
|
+
completed: boolean;
|
|
8
|
+
rounds: number;
|
|
9
|
+
reason: 'converged' | 'max_rounds' | 'timeout';
|
|
10
|
+
}
|
|
11
|
+
export declare class LoopController {
|
|
12
|
+
execute(config: LoopConfig, task: () => Promise<any>): Promise<LoopResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=loop-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-controller.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/loop-controller.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;CAChD;AAED,qBAAa,cAAc;IACnB,OAAO,CACX,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,UAAU,CAAC;CAuBvB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class LoopController {
|
|
2
|
+
async execute(config, task) {
|
|
3
|
+
for (let round = 1; round <= config.maxRounds; round++) {
|
|
4
|
+
try {
|
|
5
|
+
const result = await Promise.race([
|
|
6
|
+
task(),
|
|
7
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), config.timeout)),
|
|
8
|
+
]);
|
|
9
|
+
if (config.convergenceCheck(result)) {
|
|
10
|
+
return { completed: true, rounds: round, reason: 'converged' };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (err instanceof Error && err.message === 'timeout') {
|
|
15
|
+
return { completed: false, rounds: round, reason: 'timeout' };
|
|
16
|
+
}
|
|
17
|
+
throw err;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return { completed: true, rounds: config.maxRounds, reason: 'max_rounds' };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=loop-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-controller.js","sourceRoot":"","sources":["../../../src/features/ccg/loop-controller.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,cAAc;IACzB,KAAK,CAAC,OAAO,CACX,MAAkB,EAClB,IAAwB;QAExB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAChC,IAAI,EAAE;oBACN,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACxB,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAC/D;iBACF,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACpC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;gBACjE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBACtD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBAChE,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC7E,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microservice-detector.d.ts","sourceRoot":"","sources":["../../../src/features/ccg/microservice-detector.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAqBpF"}
|