@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.
Files changed (125) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.mcp.json +12 -3
  4. package/commands/ccg-workflow.md +36 -0
  5. package/dist/features/ccg/ccg-skill.d.ts +2 -0
  6. package/dist/features/ccg/ccg-skill.d.ts.map +1 -0
  7. package/dist/features/ccg/ccg-skill.js +20 -0
  8. package/dist/features/ccg/ccg-skill.js.map +1 -0
  9. package/dist/features/ccg/ci-validator.d.ts +7 -0
  10. package/dist/features/ccg/ci-validator.d.ts.map +1 -0
  11. package/dist/features/ccg/ci-validator.js +31 -0
  12. package/dist/features/ccg/ci-validator.js.map +1 -0
  13. package/dist/features/ccg/codex-fallback.d.ts +19 -0
  14. package/dist/features/ccg/codex-fallback.d.ts.map +1 -0
  15. package/dist/features/ccg/codex-fallback.js +40 -0
  16. package/dist/features/ccg/codex-fallback.js.map +1 -0
  17. package/dist/features/ccg/doc-cache.d.ts +11 -0
  18. package/dist/features/ccg/doc-cache.d.ts.map +1 -0
  19. package/dist/features/ccg/doc-cache.js +31 -0
  20. package/dist/features/ccg/doc-cache.js.map +1 -0
  21. package/dist/features/ccg/doc-manager.d.ts +7 -0
  22. package/dist/features/ccg/doc-manager.d.ts.map +1 -0
  23. package/dist/features/ccg/doc-manager.js +35 -0
  24. package/dist/features/ccg/doc-manager.js.map +1 -0
  25. package/dist/features/ccg/file-cache.d.ts +21 -0
  26. package/dist/features/ccg/file-cache.d.ts.map +1 -0
  27. package/dist/features/ccg/file-cache.js +47 -0
  28. package/dist/features/ccg/file-cache.js.map +1 -0
  29. package/dist/features/ccg/incremental-processor.d.ts +4 -0
  30. package/dist/features/ccg/incremental-processor.d.ts.map +1 -0
  31. package/dist/features/ccg/incremental-processor.js +29 -0
  32. package/dist/features/ccg/incremental-processor.js.map +1 -0
  33. package/dist/features/ccg/input-sanitizer.d.ts +12 -0
  34. package/dist/features/ccg/input-sanitizer.d.ts.map +1 -0
  35. package/dist/features/ccg/input-sanitizer.js +41 -0
  36. package/dist/features/ccg/input-sanitizer.js.map +1 -0
  37. package/dist/features/ccg/loop-controller.d.ts +14 -0
  38. package/dist/features/ccg/loop-controller.d.ts.map +1 -0
  39. package/dist/features/ccg/loop-controller.js +23 -0
  40. package/dist/features/ccg/loop-controller.js.map +1 -0
  41. package/dist/features/ccg/microservice-detector.d.ts +7 -0
  42. package/dist/features/ccg/microservice-detector.d.ts.map +1 -0
  43. package/dist/features/ccg/microservice-detector.js +41 -0
  44. package/dist/features/ccg/microservice-detector.js.map +1 -0
  45. package/dist/features/ccg/microservice-handler.d.ts +2 -0
  46. package/dist/features/ccg/microservice-handler.d.ts.map +1 -0
  47. package/dist/features/ccg/microservice-handler.js +25 -0
  48. package/dist/features/ccg/microservice-handler.js.map +1 -0
  49. package/dist/features/ccg/module-loop-controller.d.ts +30 -0
  50. package/dist/features/ccg/module-loop-controller.d.ts.map +1 -0
  51. package/dist/features/ccg/module-loop-controller.js +89 -0
  52. package/dist/features/ccg/module-loop-controller.js.map +1 -0
  53. package/dist/features/ccg/module-splitter.d.ts +2 -0
  54. package/dist/features/ccg/module-splitter.d.ts.map +1 -0
  55. package/dist/features/ccg/module-splitter.js +74 -0
  56. package/dist/features/ccg/module-splitter.js.map +1 -0
  57. package/dist/features/ccg/progress-bar.d.ts +11 -0
  58. package/dist/features/ccg/progress-bar.d.ts.map +1 -0
  59. package/dist/features/ccg/progress-bar.js +28 -0
  60. package/dist/features/ccg/progress-bar.js.map +1 -0
  61. package/dist/features/ccg/project-detector.d.ts +9 -0
  62. package/dist/features/ccg/project-detector.d.ts.map +1 -0
  63. package/dist/features/ccg/project-detector.js +39 -0
  64. package/dist/features/ccg/project-detector.js.map +1 -0
  65. package/dist/features/ccg/stream-processor.d.ts +3 -0
  66. package/dist/features/ccg/stream-processor.d.ts.map +1 -0
  67. package/dist/features/ccg/stream-processor.js +15 -0
  68. package/dist/features/ccg/stream-processor.js.map +1 -0
  69. package/dist/features/ccg/workflow-router.d.ts +8 -0
  70. package/dist/features/ccg/workflow-router.d.ts.map +1 -0
  71. package/dist/features/ccg/workflow-router.js +9 -0
  72. package/dist/features/ccg/workflow-router.js.map +1 -0
  73. package/dist/features/ccg/workflows/new-project-workflow.d.ts +11 -0
  74. package/dist/features/ccg/workflows/new-project-workflow.d.ts.map +1 -0
  75. package/dist/features/ccg/workflows/new-project-workflow.js +21 -0
  76. package/dist/features/ccg/workflows/new-project-workflow.js.map +1 -0
  77. package/dist/features/ccg/workflows/old-project-workflow.d.ts +10 -0
  78. package/dist/features/ccg/workflows/old-project-workflow.d.ts.map +1 -0
  79. package/dist/features/ccg/workflows/old-project-workflow.js +19 -0
  80. package/dist/features/ccg/workflows/old-project-workflow.js.map +1 -0
  81. package/dist/features/ccg/workflows/phase-development.d.ts +2 -0
  82. package/dist/features/ccg/workflows/phase-development.d.ts.map +1 -0
  83. package/dist/features/ccg/workflows/phase-development.js +10 -0
  84. package/dist/features/ccg/workflows/phase-development.js.map +1 -0
  85. package/dist/features/ccg/workflows/phase-modification-plan.d.ts +2 -0
  86. package/dist/features/ccg/workflows/phase-modification-plan.d.ts.map +1 -0
  87. package/dist/features/ccg/workflows/phase-modification-plan.js +9 -0
  88. package/dist/features/ccg/workflows/phase-modification-plan.js.map +1 -0
  89. package/dist/features/ccg/workflows/phase-module-split.d.ts +2 -0
  90. package/dist/features/ccg/workflows/phase-module-split.d.ts.map +1 -0
  91. package/dist/features/ccg/workflows/phase-module-split.js +10 -0
  92. package/dist/features/ccg/workflows/phase-module-split.js.map +1 -0
  93. package/dist/features/ccg/workflows/phase-optimization.d.ts +2 -0
  94. package/dist/features/ccg/workflows/phase-optimization.d.ts.map +1 -0
  95. package/dist/features/ccg/workflows/phase-optimization.js +17 -0
  96. package/dist/features/ccg/workflows/phase-optimization.js.map +1 -0
  97. package/dist/features/ccg/workflows/phase-read-status.d.ts +2 -0
  98. package/dist/features/ccg/workflows/phase-read-status.d.ts.map +1 -0
  99. package/dist/features/ccg/workflows/phase-read-status.js +10 -0
  100. package/dist/features/ccg/workflows/phase-read-status.js.map +1 -0
  101. package/dist/features/ccg/workflows/phase-requirement.d.ts +2 -0
  102. package/dist/features/ccg/workflows/phase-requirement.d.ts.map +1 -0
  103. package/dist/features/ccg/workflows/phase-requirement.js +18 -0
  104. package/dist/features/ccg/workflows/phase-requirement.js.map +1 -0
  105. package/dist/features/ccg/workflows/phase-testing.d.ts +2 -0
  106. package/dist/features/ccg/workflows/phase-testing.d.ts.map +1 -0
  107. package/dist/features/ccg/workflows/phase-testing.js +17 -0
  108. package/dist/features/ccg/workflows/phase-testing.js.map +1 -0
  109. package/dist/features/token-tracker/index.d.ts.map +1 -1
  110. package/dist/features/token-tracker/index.js +6 -2
  111. package/dist/features/token-tracker/index.js.map +1 -1
  112. package/dist/installer/index.d.ts.map +1 -1
  113. package/dist/installer/index.js +11 -0
  114. package/dist/installer/index.js.map +1 -1
  115. package/docs/CLAUDE.md +1 -1
  116. package/docs/INSTALL.md +2 -2
  117. package/docs/REFERENCE.md +1 -1
  118. package/docs/ccg-workflow/API.md +483 -0
  119. package/docs/ccg-workflow/BEST_PRACTICES.md +489 -0
  120. package/docs/ccg-workflow/README.md +176 -0
  121. package/docs/ccg-workflow/TROUBLESHOOTING.md +397 -0
  122. package/docs/ccg-workflow/VALIDATION_GUIDE.md +200 -0
  123. package/docs/standards/README.md +1 -1
  124. package/package.json +1 -1
  125. 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.5.44",
11
+ "version": "5.6.0",
12
12
  "source": {
13
13
  "source": "npm",
14
14
  "package": "@liangjie559567/ultrapower",
15
- "version": "5.5.44"
15
+ "version": "5.6.0"
16
16
  },
17
17
  "author": {
18
18
  "name": "liangjie559567"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultrapower",
3
3
  "description": "Disciplined multi-agent orchestration: workflow enforcement + parallel execution",
4
- "version": "5.5.44",
4
+ "version": "5.6.0",
5
5
  "author": {
6
6
  "name": "liangjie559567"
7
7
  },
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,2 @@
1
+ export declare function executeCCGSkill(workingDir: string, args?: string): Promise<void>;
2
+ //# sourceMappingURL=ccg-skill.d.ts.map
@@ -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,7 @@
1
+ export interface CIResult {
2
+ success: boolean;
3
+ errors: string[];
4
+ warnings: string[];
5
+ }
6
+ export declare function runCIValidation(): Promise<CIResult>;
7
+ //# sourceMappingURL=ci-validator.d.ts.map
@@ -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,7 @@
1
+ export interface ServiceInfo {
2
+ name: string;
3
+ path: string;
4
+ dependencies: string[];
5
+ }
6
+ export declare function detectMicroservices(workingDir: string): Promise<ServiceInfo[]>;
7
+ //# sourceMappingURL=microservice-detector.d.ts.map
@@ -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"}