@mycodemap/mycodemap 0.5.0 → 0.5.2-beta.1

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 (254) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +77 -9
  3. package/dist/cli/commands/analyze.d.ts +18 -0
  4. package/dist/cli/commands/analyze.d.ts.map +1 -1
  5. package/dist/cli/commands/analyze.js +239 -6
  6. package/dist/cli/commands/analyze.js.map +1 -1
  7. package/dist/cli/commands/check.d.ts +22 -0
  8. package/dist/cli/commands/check.d.ts.map +1 -0
  9. package/dist/cli/commands/check.js +168 -0
  10. package/dist/cli/commands/check.js.map +1 -0
  11. package/dist/cli/commands/ci.d.ts +25 -0
  12. package/dist/cli/commands/ci.d.ts.map +1 -1
  13. package/dist/cli/commands/ci.js +139 -36
  14. package/dist/cli/commands/ci.js.map +1 -1
  15. package/dist/cli/commands/complexity.d.ts.map +1 -1
  16. package/dist/cli/commands/complexity.js +6 -0
  17. package/dist/cli/commands/complexity.js.map +1 -1
  18. package/dist/cli/commands/design.d.ts +5 -0
  19. package/dist/cli/commands/design.d.ts.map +1 -1
  20. package/dist/cli/commands/design.js +6 -0
  21. package/dist/cli/commands/design.js.map +1 -1
  22. package/dist/cli/commands/generate.d.ts +1 -0
  23. package/dist/cli/commands/generate.d.ts.map +1 -1
  24. package/dist/cli/commands/generate.js +121 -8
  25. package/dist/cli/commands/generate.js.map +1 -1
  26. package/dist/cli/commands/history.d.ts +26 -0
  27. package/dist/cli/commands/history.d.ts.map +1 -0
  28. package/dist/cli/commands/history.js +92 -0
  29. package/dist/cli/commands/history.js.map +1 -0
  30. package/dist/cli/commands/mcp.d.ts +13 -0
  31. package/dist/cli/commands/mcp.d.ts.map +1 -0
  32. package/dist/cli/commands/mcp.js +108 -0
  33. package/dist/cli/commands/mcp.js.map +1 -0
  34. package/dist/cli/commands/workflow.d.ts.map +1 -1
  35. package/dist/cli/commands/workflow.js +22 -2
  36. package/dist/cli/commands/workflow.js.map +1 -1
  37. package/dist/cli/config-loader.d.ts.map +1 -1
  38. package/dist/cli/config-loader.js +3 -2
  39. package/dist/cli/config-loader.js.map +1 -1
  40. package/dist/cli/contract-checker.d.ts +33 -0
  41. package/dist/cli/contract-checker.d.ts.map +1 -0
  42. package/dist/cli/contract-checker.js +719 -0
  43. package/dist/cli/contract-checker.js.map +1 -0
  44. package/dist/cli/contract-diff-scope.d.ts +14 -0
  45. package/dist/cli/contract-diff-scope.d.ts.map +1 -0
  46. package/dist/cli/contract-diff-scope.js +127 -0
  47. package/dist/cli/contract-diff-scope.js.map +1 -0
  48. package/dist/cli/contract-gate-thresholds.d.ts +14 -0
  49. package/dist/cli/contract-gate-thresholds.d.ts.map +1 -0
  50. package/dist/cli/contract-gate-thresholds.js +19 -0
  51. package/dist/cli/contract-gate-thresholds.js.map +1 -0
  52. package/dist/cli/design-contract-loader.d.ts.map +1 -1
  53. package/dist/cli/design-contract-loader.js +355 -3
  54. package/dist/cli/design-contract-loader.js.map +1 -1
  55. package/dist/cli/design-scope-resolver.d.ts.map +1 -1
  56. package/dist/cli/design-scope-resolver.js +89 -41
  57. package/dist/cli/design-scope-resolver.js.map +1 -1
  58. package/dist/cli/index.js +18 -6
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/paths.d.ts.map +1 -1
  61. package/dist/cli/paths.js +30 -7
  62. package/dist/cli/paths.js.map +1 -1
  63. package/dist/core/analyzer.d.ts.map +1 -1
  64. package/dist/core/analyzer.js +16 -0
  65. package/dist/core/analyzer.js.map +1 -1
  66. package/dist/domain/entities/CodeGraph.d.ts +5 -1
  67. package/dist/domain/entities/CodeGraph.d.ts.map +1 -1
  68. package/dist/domain/entities/CodeGraph.js +29 -12
  69. package/dist/domain/entities/CodeGraph.js.map +1 -1
  70. package/dist/domain/entities/Dependency.d.ts +8 -1
  71. package/dist/domain/entities/Dependency.d.ts.map +1 -1
  72. package/dist/domain/entities/Dependency.js +19 -4
  73. package/dist/domain/entities/Dependency.js.map +1 -1
  74. package/dist/domain/entities/Symbol.d.ts +2 -1
  75. package/dist/domain/entities/Symbol.d.ts.map +1 -1
  76. package/dist/domain/entities/Symbol.js +6 -3
  77. package/dist/domain/entities/Symbol.js.map +1 -1
  78. package/dist/infrastructure/storage/StorageFactory.d.ts +1 -0
  79. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
  80. package/dist/infrastructure/storage/StorageFactory.js +7 -2
  81. package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
  82. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +3 -1
  83. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -1
  84. package/dist/infrastructure/storage/adapters/FileSystemStorage.js +10 -2
  85. package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -1
  86. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +3 -1
  87. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -1
  88. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +9 -1
  89. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -1
  90. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +3 -1
  91. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -1
  92. package/dist/infrastructure/storage/adapters/MemoryStorage.js +9 -1
  93. package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -1
  94. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts +53 -0
  95. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -0
  96. package/dist/infrastructure/storage/adapters/SQLiteStorage.js +879 -0
  97. package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -0
  98. package/dist/infrastructure/storage/graph-helpers.d.ts +3 -1
  99. package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -1
  100. package/dist/infrastructure/storage/graph-helpers.js +90 -0
  101. package/dist/infrastructure/storage/graph-helpers.js.map +1 -1
  102. package/dist/infrastructure/storage/index.d.ts +1 -1
  103. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  104. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +3 -1
  105. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -1
  106. package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -1
  107. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts +27 -0
  108. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts.map +1 -0
  109. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js +246 -0
  110. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js.map +1 -0
  111. package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts +25 -0
  112. package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts.map +1 -0
  113. package/dist/infrastructure/storage/sqlite/perf-thresholds.js +25 -0
  114. package/dist/infrastructure/storage/sqlite/perf-thresholds.js.map +1 -0
  115. package/dist/infrastructure/storage/sqlite/schema.d.ts +4 -0
  116. package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
  117. package/dist/infrastructure/storage/sqlite/schema.js +111 -0
  118. package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
  119. package/dist/interface/types/design-check.d.ts +73 -0
  120. package/dist/interface/types/design-check.d.ts.map +1 -0
  121. package/dist/interface/types/design-check.js +4 -0
  122. package/dist/interface/types/design-check.js.map +1 -0
  123. package/dist/interface/types/design-contract.d.ts +56 -1
  124. package/dist/interface/types/design-contract.d.ts.map +1 -1
  125. package/dist/interface/types/history-risk.d.ts +90 -0
  126. package/dist/interface/types/history-risk.d.ts.map +1 -0
  127. package/dist/interface/types/history-risk.js +4 -0
  128. package/dist/interface/types/history-risk.js.map +1 -0
  129. package/dist/interface/types/index.d.ts +17 -2
  130. package/dist/interface/types/index.d.ts.map +1 -1
  131. package/dist/interface/types/storage.d.ts +28 -1
  132. package/dist/interface/types/storage.d.ts.map +1 -1
  133. package/dist/orchestrator/adapters/ast-grep-adapter.d.ts +10 -0
  134. package/dist/orchestrator/adapters/ast-grep-adapter.d.ts.map +1 -1
  135. package/dist/orchestrator/adapters/ast-grep-adapter.js +46 -17
  136. package/dist/orchestrator/adapters/ast-grep-adapter.js.map +1 -1
  137. package/dist/orchestrator/adapters/codemap-adapter.d.ts.map +1 -1
  138. package/dist/orchestrator/adapters/codemap-adapter.js +2 -22
  139. package/dist/orchestrator/adapters/codemap-adapter.js.map +1 -1
  140. package/dist/orchestrator/history-risk-service.d.ts +55 -0
  141. package/dist/orchestrator/history-risk-service.d.ts.map +1 -0
  142. package/dist/orchestrator/history-risk-service.js +680 -0
  143. package/dist/orchestrator/history-risk-service.js.map +1 -0
  144. package/dist/orchestrator/types.d.ts +19 -1
  145. package/dist/orchestrator/types.d.ts.map +1 -1
  146. package/dist/orchestrator/types.js +19 -0
  147. package/dist/orchestrator/types.js.map +1 -1
  148. package/dist/server/mcp/index.d.ts +4 -0
  149. package/dist/server/mcp/index.d.ts.map +1 -0
  150. package/dist/server/mcp/index.js +5 -0
  151. package/dist/server/mcp/index.js.map +1 -0
  152. package/dist/server/mcp/server.d.ts +17 -0
  153. package/dist/server/mcp/server.d.ts.map +1 -0
  154. package/dist/server/mcp/server.js +84 -0
  155. package/dist/server/mcp/server.js.map +1 -0
  156. package/dist/server/mcp/service.d.ts +22 -0
  157. package/dist/server/mcp/service.d.ts.map +1 -0
  158. package/dist/server/mcp/service.js +177 -0
  159. package/dist/server/mcp/service.js.map +1 -0
  160. package/dist/server/mcp/types.d.ts +56 -0
  161. package/dist/server/mcp/types.d.ts.map +1 -0
  162. package/dist/server/mcp/types.js +4 -0
  163. package/dist/server/mcp/types.js.map +1 -0
  164. package/docs/AI_ASSISTANT_SETUP.md +1 -1
  165. package/docs/PUBLISHING.md +41 -12
  166. package/docs/SETUP_GUIDE.md +6 -6
  167. package/docs/ai-guide/COMMANDS.md +98 -4
  168. package/docs/ai-guide/INTEGRATION.md +137 -433
  169. package/docs/ai-guide/OUTPUT.md +476 -6
  170. package/docs/ai-guide/PATTERNS.md +41 -11
  171. package/docs/ai-guide/PROMPTS.md +11 -6
  172. package/docs/backlog.md +177 -0
  173. package/docs/eatdogfood-reports/2026-04-17-eatdogfood-agent-experience.md +231 -0
  174. package/docs/exec-plans/completed/2026-04-17-eatdogfood-codemap-cli.md +103 -0
  175. package/docs/ideation/2026-04-15-executable-architecture-constitution-ideation.md +102 -0
  176. package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +47 -0
  177. package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +11 -10
  178. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +10 -10
  179. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +17 -12
  180. package/docs/rules/README.md +16 -11
  181. package/docs/rules/architecture-guardrails.md +24 -336
  182. package/docs/rules/code-quality-redlines.md +25 -311
  183. package/docs/rules/engineering-with-codex-openai.md +14 -1
  184. package/docs/rules/pre-release-checklist.md +9 -4
  185. package/docs/rules/validation.md +91 -40
  186. package/mycodemap.config.schema.json +3 -3
  187. package/package.json +7 -2
  188. package/scripts/benchmark-governance-graph.mjs +132 -0
  189. package/scripts/calibrate-contract-gate.mjs +221 -0
  190. package/scripts/capability-report.py +255 -0
  191. package/scripts/pre-release-check.js +2 -2
  192. package/scripts/qa-rule-control.sh +254 -0
  193. package/scripts/report-high-risk-files.mjs +395 -0
  194. package/scripts/rule-context.mjs +155 -0
  195. package/scripts/smoke-sqlite-impact.mjs +85 -0
  196. package/scripts/sync-analyze-docs.js +1 -0
  197. package/scripts/tests/test_capability_report.py +89 -0
  198. package/scripts/tests/test_rule_control_workflow.py +51 -0
  199. package/scripts/tests/test_validate_rules.py +81 -0
  200. package/scripts/validate-ai-docs.js +283 -1
  201. package/scripts/validate-docs.js +249 -42
  202. package/scripts/validate-rules.py +254 -0
  203. package/dist/ai/claude.d.ts +0 -38
  204. package/dist/ai/claude.d.ts.map +0 -1
  205. package/dist/ai/claude.js +0 -169
  206. package/dist/ai/claude.js.map +0 -1
  207. package/dist/ai/codex.d.ts +0 -38
  208. package/dist/ai/codex.d.ts.map +0 -1
  209. package/dist/ai/codex.js +0 -169
  210. package/dist/ai/codex.js.map +0 -1
  211. package/dist/ai/factory.d.ts +0 -48
  212. package/dist/ai/factory.d.ts.map +0 -1
  213. package/dist/ai/factory.js +0 -95
  214. package/dist/ai/factory.js.map +0 -1
  215. package/dist/ai/index.d.ts +0 -12
  216. package/dist/ai/index.d.ts.map +0 -1
  217. package/dist/ai/index.js +0 -29
  218. package/dist/ai/index.js.map +0 -1
  219. package/dist/ai/provider.d.ts +0 -70
  220. package/dist/ai/provider.d.ts.map +0 -1
  221. package/dist/ai/provider.js +0 -31
  222. package/dist/ai/provider.js.map +0 -1
  223. package/dist/ai/subagent-caller.d.ts +0 -90
  224. package/dist/ai/subagent-caller.d.ts.map +0 -1
  225. package/dist/ai/subagent-caller.js +0 -280
  226. package/dist/ai/subagent-caller.js.map +0 -1
  227. package/dist/ai/types.d.ts +0 -70
  228. package/dist/ai/types.d.ts.map +0 -1
  229. package/dist/ai/types.js +0 -5
  230. package/dist/ai/types.js.map +0 -1
  231. package/dist/cli/commands/server.d.ts +0 -9
  232. package/dist/cli/commands/server.d.ts.map +0 -1
  233. package/dist/cli/commands/server.js +0 -65
  234. package/dist/cli/commands/server.js.map +0 -1
  235. package/dist/cli-new/commands/server.d.ts +0 -13
  236. package/dist/cli-new/commands/server.d.ts.map +0 -1
  237. package/dist/cli-new/commands/server.js +0 -90
  238. package/dist/cli-new/commands/server.js.map +0 -1
  239. package/dist/generator/ai-overview.d.ts +0 -51
  240. package/dist/generator/ai-overview.d.ts.map +0 -1
  241. package/dist/generator/ai-overview.js +0 -160
  242. package/dist/generator/ai-overview.js.map +0 -1
  243. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +0 -41
  244. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +0 -1
  245. package/dist/infrastructure/storage/adapters/Neo4jStorage.js +0 -162
  246. package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +0 -1
  247. package/dist/orchestrator/ai-feed-generator.d.ts +0 -210
  248. package/dist/orchestrator/ai-feed-generator.d.ts.map +0 -1
  249. package/dist/orchestrator/ai-feed-generator.js +0 -377
  250. package/dist/orchestrator/ai-feed-generator.js.map +0 -1
  251. package/docs/archive/test-report-symbol-search.md +0 -384
  252. package/docs/archive/test-scenario-4-complexity-analysis.md +0 -460
  253. package/docs/archive/test_report_scenario5.md +0 -615
  254. package/docs/archive/test_scenario_3_impact_analysis_report.md +0 -520
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env python3
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import json
7
+ import subprocess
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Any, Callable, Sequence
11
+
12
+ REPO_ROOT = Path(__file__).resolve().parent.parent
13
+ DIST_CLI_PATH = REPO_ROOT / "dist" / "cli" / "index.js"
14
+ ALLOWED_LEVELS = ("P0", "P1", "P2")
15
+ ALLOWED_STATUSES = ("passed", "failed", "unavailable")
16
+ TYPECHECK_COMMAND = "npm run typecheck"
17
+ TEST_COMMAND = "npm test"
18
+ LINT_COMMAND = "npm run lint"
19
+ ARCH_COMMAND = "node dist/cli/index.js deps -m src/domain"
20
+ Runner = Callable[[Sequence[str]], dict[str, str]]
21
+
22
+
23
+ def command_to_string(command: Sequence[str]) -> str:
24
+ return " ".join(command)
25
+
26
+
27
+ def combine_output(stdout: str | None, stderr: str | None) -> str:
28
+ parts = [part.strip() for part in (stdout, stderr) if part and part.strip()]
29
+ if parts:
30
+ return "\n".join(parts)
31
+ return "(no output)"
32
+
33
+
34
+ def run_command(command: Sequence[str]) -> dict[str, str]:
35
+ try:
36
+ completed = subprocess.run(
37
+ list(command),
38
+ cwd=REPO_ROOT,
39
+ capture_output=True,
40
+ text=True,
41
+ timeout=300,
42
+ check=False,
43
+ )
44
+ except FileNotFoundError as error:
45
+ return {"status": "unavailable", "output": str(error)}
46
+ except OSError as error:
47
+ return {"status": "unavailable", "output": str(error)}
48
+ except subprocess.TimeoutExpired as error:
49
+ return {
50
+ "status": "failed",
51
+ "output": combine_output(error.stdout, error.stderr)
52
+ + "\nCommand timed out after 300 seconds.",
53
+ }
54
+
55
+ return {
56
+ "status": "passed" if completed.returncode == 0 else "failed",
57
+ "output": combine_output(completed.stdout, completed.stderr),
58
+ }
59
+
60
+
61
+ def make_check(
62
+ name: str,
63
+ level: str,
64
+ command: Sequence[str],
65
+ status: str,
66
+ output: str,
67
+ ) -> dict[str, str]:
68
+ if level not in ALLOWED_LEVELS:
69
+ raise ValueError(f"Unsupported level: {level}")
70
+ if status not in ALLOWED_STATUSES:
71
+ raise ValueError(f"Unsupported status: {status}")
72
+
73
+ return {
74
+ "name": name,
75
+ "level": level,
76
+ "status": status,
77
+ "command": command_to_string(command),
78
+ "output": output,
79
+ }
80
+
81
+
82
+ def code_check_specs() -> list[dict[str, Any]]:
83
+ return [
84
+ {
85
+ "name": "typecheck",
86
+ "level": "P0",
87
+ "command": TYPECHECK_COMMAND.split(),
88
+ },
89
+ {
90
+ "name": "test",
91
+ "level": "P0",
92
+ "command": TEST_COMMAND.split(),
93
+ },
94
+ {
95
+ "name": "lint",
96
+ "level": "P1",
97
+ "command": LINT_COMMAND.split(),
98
+ },
99
+ ]
100
+
101
+
102
+ def arch_check_specs(dist_cli_path: Path = DIST_CLI_PATH) -> list[dict[str, Any]]:
103
+ command = ARCH_COMMAND.split()
104
+ if not dist_cli_path.exists():
105
+ return [
106
+ make_check(
107
+ name="architecture-domain-deps",
108
+ level="P0",
109
+ command=command,
110
+ status="unavailable",
111
+ output=f"dist CLI is unavailable: {dist_cli_path} was not found.",
112
+ )
113
+ ]
114
+
115
+ return [
116
+ {
117
+ "name": "architecture-domain-deps",
118
+ "level": "P0",
119
+ "command": command,
120
+ }
121
+ ]
122
+
123
+
124
+ def build_specs(target: str, dist_cli_path: Path = DIST_CLI_PATH) -> list[dict[str, Any]]:
125
+ if target == "code":
126
+ return code_check_specs()
127
+ if target == "arch":
128
+ return arch_check_specs(dist_cli_path=dist_cli_path)
129
+ if target == "all":
130
+ return code_check_specs() + arch_check_specs(dist_cli_path=dist_cli_path)
131
+ raise ValueError(f"Unsupported target: {target}")
132
+
133
+
134
+ def execute_checks(
135
+ target: str,
136
+ runner: Runner = run_command,
137
+ dist_cli_path: Path = DIST_CLI_PATH,
138
+ ) -> list[dict[str, str]]:
139
+ checks: list[dict[str, str]] = []
140
+
141
+ for spec in build_specs(target=target, dist_cli_path=dist_cli_path):
142
+ if "status" in spec:
143
+ checks.append(spec)
144
+ continue
145
+
146
+ result = runner(spec["command"])
147
+ checks.append(
148
+ make_check(
149
+ name=spec["name"],
150
+ level=spec["level"],
151
+ command=spec["command"],
152
+ status=result["status"],
153
+ output=result["output"],
154
+ )
155
+ )
156
+
157
+ return checks
158
+
159
+
160
+ def count_checks(checks: list[dict[str, str]], *, status: str, level: str | None = None) -> int:
161
+ return sum(
162
+ 1
163
+ for check in checks
164
+ if check["status"] == status and (level is None or check["level"] == level)
165
+ )
166
+
167
+
168
+ def resolve_exit_code(checks: list[dict[str, str]], report_only: bool) -> int:
169
+ if report_only:
170
+ return 0
171
+ if any(check["status"] == "unavailable" for check in checks):
172
+ return 4
173
+ if any(check["status"] == "failed" and check["level"] == "P0" for check in checks):
174
+ return 1
175
+ if any(check["status"] == "failed" and check["level"] == "P1" for check in checks):
176
+ return 2
177
+ if any(check["status"] == "failed" and check["level"] == "P2" for check in checks):
178
+ return 3
179
+ return 0
180
+
181
+
182
+ def build_summary(checks: list[dict[str, str]], exit_code: int, report_only: bool) -> dict[str, Any]:
183
+ return {
184
+ "reportOnly": report_only,
185
+ "exitCode": exit_code,
186
+ "failedByLevel": {
187
+ level: count_checks(checks, status="failed", level=level)
188
+ for level in ALLOWED_LEVELS
189
+ },
190
+ "passed": count_checks(checks, status="passed"),
191
+ "unavailable": count_checks(checks, status="unavailable"),
192
+ }
193
+
194
+
195
+ def build_report(target: str, checks: list[dict[str, str]], report_only: bool) -> dict[str, Any]:
196
+ exit_code = resolve_exit_code(checks, report_only=report_only)
197
+ return {
198
+ "target": target,
199
+ "checks": checks,
200
+ "summary": build_summary(checks, exit_code=exit_code, report_only=report_only),
201
+ }
202
+
203
+
204
+ def summary_text(report: dict[str, Any]) -> str:
205
+ summary = report["summary"]
206
+ failed = summary["failedByLevel"]
207
+ return (
208
+ "SUMMARY "
209
+ f"target={report['target']} "
210
+ f"report_only={str(summary['reportOnly']).lower()} "
211
+ f"exit_code={summary['exitCode']} "
212
+ f"P0={failed['P0']} "
213
+ f"P1={failed['P1']} "
214
+ f"P2={failed['P2']} "
215
+ f"unavailable={summary['unavailable']}"
216
+ )
217
+
218
+
219
+ def parse_args(argv: Sequence[str]) -> argparse.Namespace:
220
+ parser = argparse.ArgumentParser(
221
+ description="Validate repo-local rule checks for code and architecture gates."
222
+ )
223
+ parser.add_argument("target", choices=("code", "arch", "all"))
224
+ parser.add_argument("--report-only", action="store_true", dest="report_only")
225
+ return parser.parse_args(argv)
226
+
227
+
228
+ def exit_process(exit_code: int) -> None:
229
+ if exit_code == 0:
230
+ sys.exit(0)
231
+ if exit_code == 1:
232
+ sys.exit(1)
233
+ if exit_code == 2:
234
+ sys.exit(2)
235
+ if exit_code == 3:
236
+ sys.exit(3)
237
+ sys.exit(4)
238
+
239
+
240
+ def main(argv: Sequence[str] | None = None) -> int:
241
+ args = parse_args(argv if argv is not None else sys.argv[1:])
242
+ report = build_report(
243
+ target=args.target,
244
+ checks=execute_checks(target=args.target),
245
+ report_only=args.report_only,
246
+ )
247
+ json.dump(report, sys.stdout, ensure_ascii=False, indent=2)
248
+ sys.stdout.write("\n")
249
+ print(summary_text(report), file=sys.stderr)
250
+ return int(report["summary"]["exitCode"])
251
+
252
+
253
+ if __name__ == "__main__":
254
+ exit_process(main())
@@ -1,38 +0,0 @@
1
- import { AIProvider, type AIProviderConfig, type AIResponse } from './provider.js';
2
- import type { CodeMap } from '../types/index.js';
3
- /**
4
- * Claude Provider 配置
5
- */
6
- export interface ClaudeProviderConfig extends AIProviderConfig {
7
- /** CLI 路径,默认 claude */
8
- cliPath?: string;
9
- }
10
- /**
11
- * Claude Provider - 通过 CLI 调用 Claude
12
- */
13
- export declare class ClaudeProvider extends AIProvider {
14
- readonly name: "claude";
15
- private cliPath;
16
- constructor(config?: ClaudeProviderConfig);
17
- /**
18
- * 执行 AI 推理
19
- */
20
- execute(prompt: string, context?: CodeMap): Promise<AIResponse>;
21
- /**
22
- * 检查 Claude CLI 是否可用
23
- */
24
- isAvailable(): Promise<boolean>;
25
- /**
26
- * 构建提示词
27
- */
28
- private buildPrompt;
29
- /**
30
- * 总结 CodeMap 上下文
31
- */
32
- private summarizeContext;
33
- /**
34
- * 解析 Claude CLI JSON 响应
35
- */
36
- private parseResponse;
37
- }
38
- //# sourceMappingURL=claude.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/ai/claude.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAWjD;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,SAAgB,IAAI,EAAG,QAAQ,CAAU;IACzC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,oBAAyB;IAK7C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAoErE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA6BtB"}
package/dist/ai/claude.js DELETED
@@ -1,169 +0,0 @@
1
- // ============================================
2
- // Claude CLI Provider 实现
3
- // ============================================
4
- import { spawn } from 'child_process';
5
- import { AIProvider } from './provider.js';
6
- /**
7
- * Claude Provider - 通过 CLI 调用 Claude
8
- */
9
- export class ClaudeProvider extends AIProvider {
10
- name = 'claude';
11
- cliPath;
12
- constructor(config = {}) {
13
- super(config);
14
- this.cliPath = config.cliPath || 'claude';
15
- }
16
- /**
17
- * 执行 AI 推理
18
- */
19
- async execute(prompt, context) {
20
- const timeout = this.config.timeout || 60000;
21
- // 构建包含上下文的完整提示词
22
- const fullPrompt = this.buildPrompt(prompt, context);
23
- return new Promise((resolve, reject) => {
24
- const args = [
25
- '-p',
26
- '--output-format', 'json',
27
- '--dangerously-skip-permissions'
28
- ];
29
- let stdout = '';
30
- let stderr = '';
31
- let killed = false;
32
- const proc = spawn(this.cliPath, args, {
33
- stdio: ['pipe', 'pipe', 'pipe'],
34
- timeout
35
- });
36
- // 超时处理
37
- const timeoutId = setTimeout(() => {
38
- killed = true;
39
- proc.kill('SIGTERM');
40
- reject(new Error(`Claude 执行超时(${timeout / 1000}秒)`));
41
- }, timeout);
42
- proc.stdout.on('data', (data) => {
43
- stdout += data.toString();
44
- });
45
- proc.stderr.on('data', (data) => {
46
- stderr += data.toString();
47
- });
48
- proc.on('close', (code) => {
49
- clearTimeout(timeoutId);
50
- if (killed)
51
- return;
52
- if (code !== 0 && code !== null) {
53
- reject(new Error(`Claude CLI 错误: ${stderr || `exit code ${code}`}`));
54
- return;
55
- }
56
- try {
57
- const response = this.parseResponse(stdout);
58
- resolve(response);
59
- }
60
- catch (error) {
61
- reject(new Error(`解析 Claude 响应失败: ${error instanceof Error ? error.message : String(error)}`));
62
- }
63
- });
64
- proc.on('error', (error) => {
65
- clearTimeout(timeoutId);
66
- if (!killed) {
67
- reject(new Error(`Claude CLI 执行失败: ${error.message}`));
68
- }
69
- });
70
- // 发送提示词
71
- proc.stdin.write(fullPrompt);
72
- proc.stdin.end();
73
- });
74
- }
75
- /**
76
- * 检查 Claude CLI 是否可用
77
- */
78
- async isAvailable() {
79
- return new Promise((resolve) => {
80
- const proc = spawn(this.cliPath, ['--version'], {
81
- stdio: 'ignore'
82
- });
83
- proc.on('close', (code) => {
84
- resolve(code === 0);
85
- });
86
- proc.on('error', () => {
87
- resolve(false);
88
- });
89
- // 2 秒超时
90
- setTimeout(() => {
91
- proc.kill();
92
- resolve(false);
93
- }, 2000);
94
- });
95
- }
96
- /**
97
- * 构建提示词
98
- */
99
- buildPrompt(prompt, context) {
100
- let fullPrompt = prompt;
101
- if (context) {
102
- const contextInfo = this.summarizeContext(context);
103
- fullPrompt = `${contextInfo}\n\n---\n\n${prompt}`;
104
- }
105
- return fullPrompt;
106
- }
107
- /**
108
- * 总结 CodeMap 上下文
109
- */
110
- summarizeContext(codeMap) {
111
- const lines = [];
112
- lines.push('# Project Context');
113
- lines.push('');
114
- lines.push(`Project: ${codeMap.project.name}`);
115
- lines.push(`Total Files: ${codeMap.summary.totalFiles}`);
116
- lines.push(`Total Modules: ${codeMap.summary.totalModules}`);
117
- lines.push('');
118
- // 入口点
119
- const entryPoints = codeMap.modules.filter(m => {
120
- const basename = require('path').basename(m.path);
121
- return basename === 'index.ts' || basename === 'main.ts' || basename === 'app.ts';
122
- });
123
- if (entryPoints.length > 0) {
124
- lines.push('## Entry Points');
125
- for (const ep of entryPoints.slice(0, 5)) {
126
- lines.push(`- ${ep.path}`);
127
- }
128
- lines.push('');
129
- }
130
- // 模块列表
131
- lines.push('## Modules');
132
- for (const mod of codeMap.modules.slice(0, 20)) {
133
- const exports = mod.exports.map(e => e.name).join(', ');
134
- lines.push(`- ${mod.path}: ${exports || '(no exports)'}`);
135
- }
136
- if (codeMap.modules.length > 20) {
137
- lines.push(`- ... and ${codeMap.modules.length - 20} more`);
138
- }
139
- return lines.join('\n');
140
- }
141
- /**
142
- * 解析 Claude CLI JSON 响应
143
- */
144
- parseResponse(stdout) {
145
- // Claude 可能输出多行 JSON,需要找到有效的 JSON
146
- const lines = stdout.trim().split('\n');
147
- let jsonStr = '';
148
- // 从后往前找有效的 JSON 对象
149
- for (let i = lines.length - 1; i >= 0; i--) {
150
- const line = lines[i].trim();
151
- if (line.startsWith('{') && line.endsWith('}')) {
152
- jsonStr = line;
153
- break;
154
- }
155
- }
156
- if (!jsonStr) {
157
- // 如果没有 JSON,直接返回原始输出
158
- return { content: stdout.trim() };
159
- }
160
- const parsed = JSON.parse(jsonStr);
161
- if (parsed.error) {
162
- throw new Error(parsed.error);
163
- }
164
- return {
165
- content: parsed.result || stdout.trim()
166
- };
167
- }
168
- }
169
- //# sourceMappingURL=claude.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/ai/claude.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import { AIProvider, type AIProviderConfig, type AIResponse } from './provider.js';
2
- import type { CodeMap } from '../types/index.js';
3
- /**
4
- * Codex Provider 配置
5
- */
6
- export interface CodexProviderConfig extends AIProviderConfig {
7
- /** CLI 路径,默认 codex */
8
- cliPath?: string;
9
- }
10
- /**
11
- * Codex Provider - 通过 CLI 调用 Codex
12
- */
13
- export declare class CodexProvider extends AIProvider {
14
- readonly name: "codex";
15
- private cliPath;
16
- constructor(config?: CodexProviderConfig);
17
- /**
18
- * 执行 AI 推理
19
- */
20
- execute(prompt: string, context?: CodeMap): Promise<AIResponse>;
21
- /**
22
- * 检查 Codex CLI 是否可用
23
- */
24
- isAvailable(): Promise<boolean>;
25
- /**
26
- * 构建提示词
27
- */
28
- private buildPrompt;
29
- /**
30
- * 总结 CodeMap 上下文
31
- */
32
- private summarizeContext;
33
- /**
34
- * 解析 Codex CLI JSON 响应
35
- */
36
- private parseResponse;
37
- }
38
- //# sourceMappingURL=codex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/ai/codex.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAC3C,SAAgB,IAAI,EAAG,OAAO,CAAU;IACxC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,mBAAwB;IAK5C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAiErE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBrC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA4BtB"}
package/dist/ai/codex.js DELETED
@@ -1,169 +0,0 @@
1
- // ============================================
2
- // Codex CLI Provider 实现
3
- // ============================================
4
- import { spawn } from 'child_process';
5
- import { AIProvider } from './provider.js';
6
- /**
7
- * Codex Provider - 通过 CLI 调用 Codex
8
- */
9
- export class CodexProvider extends AIProvider {
10
- name = 'codex';
11
- cliPath;
12
- constructor(config = {}) {
13
- super(config);
14
- this.cliPath = config.cliPath || 'codex';
15
- }
16
- /**
17
- * 执行 AI 推理
18
- */
19
- async execute(prompt, context) {
20
- const timeout = this.config.timeout || 60000;
21
- // 构建包含上下文的完整提示词
22
- const fullPrompt = this.buildPrompt(prompt, context);
23
- return new Promise((resolve, reject) => {
24
- // Codex exec 使用位置参数传递 prompt
25
- const args = [
26
- 'exec',
27
- '--dangerously-bypass-approvals-and-sandbox',
28
- fullPrompt
29
- ];
30
- let stdout = '';
31
- let stderr = '';
32
- let killed = false;
33
- const proc = spawn(this.cliPath, args, {
34
- stdio: ['ignore', 'pipe', 'pipe'],
35
- timeout
36
- });
37
- // 超时处理
38
- const timeoutId = setTimeout(() => {
39
- killed = true;
40
- proc.kill('SIGTERM');
41
- reject(new Error(`Codex 执行超时(${timeout / 1000}秒)`));
42
- }, timeout);
43
- proc.stdout.on('data', (data) => {
44
- stdout += data.toString();
45
- });
46
- proc.stderr.on('data', (data) => {
47
- stderr += data.toString();
48
- });
49
- proc.on('close', (code) => {
50
- clearTimeout(timeoutId);
51
- if (killed)
52
- return;
53
- if (code !== 0 && code !== null) {
54
- reject(new Error(`Codex CLI 错误: ${stderr || `exit code ${code}`}`));
55
- return;
56
- }
57
- try {
58
- const response = this.parseResponse(stdout);
59
- resolve(response);
60
- }
61
- catch (error) {
62
- reject(new Error(`解析 Codex 响应失败: ${error instanceof Error ? error.message : String(error)}`));
63
- }
64
- });
65
- proc.on('error', (error) => {
66
- clearTimeout(timeoutId);
67
- if (!killed) {
68
- reject(new Error(`Codex CLI 执行失败: ${error.message}`));
69
- }
70
- });
71
- });
72
- }
73
- /**
74
- * 检查 Codex CLI 是否可用
75
- */
76
- async isAvailable() {
77
- return new Promise((resolve) => {
78
- const proc = spawn(this.cliPath, ['--version'], {
79
- stdio: 'ignore'
80
- });
81
- proc.on('close', (code) => {
82
- resolve(code === 0);
83
- });
84
- proc.on('error', () => {
85
- resolve(false);
86
- });
87
- // 2 秒超时
88
- setTimeout(() => {
89
- proc.kill();
90
- resolve(false);
91
- }, 2000);
92
- });
93
- }
94
- /**
95
- * 构建提示词
96
- */
97
- buildPrompt(prompt, context) {
98
- let fullPrompt = prompt;
99
- if (context) {
100
- const contextInfo = this.summarizeContext(context);
101
- fullPrompt = `${contextInfo}\n\n---\n\n${prompt}`;
102
- }
103
- return fullPrompt;
104
- }
105
- /**
106
- * 总结 CodeMap 上下文
107
- */
108
- summarizeContext(codeMap) {
109
- const lines = [];
110
- lines.push('# Project Context');
111
- lines.push('');
112
- lines.push(`Project: ${codeMap.project.name}`);
113
- lines.push(`Total Files: ${codeMap.summary.totalFiles}`);
114
- lines.push(`Total Modules: ${codeMap.summary.totalModules}`);
115
- lines.push('');
116
- // 入口点
117
- const entryPoints = codeMap.modules.filter(m => {
118
- const basename = require('path').basename(m.path);
119
- return basename === 'index.ts' || basename === 'main.ts' || basename === 'app.ts';
120
- });
121
- if (entryPoints.length > 0) {
122
- lines.push('## Entry Points');
123
- for (const ep of entryPoints.slice(0, 5)) {
124
- lines.push(`- ${ep.path}`);
125
- }
126
- lines.push('');
127
- }
128
- // 模块列表
129
- lines.push('## Modules');
130
- for (const mod of codeMap.modules.slice(0, 20)) {
131
- const exports = mod.exports.map(e => e.name).join(', ');
132
- lines.push(`- ${mod.path}: ${exports || '(no exports)'}`);
133
- }
134
- if (codeMap.modules.length > 20) {
135
- lines.push(`- ... and ${codeMap.modules.length - 20} more`);
136
- }
137
- return lines.join('\n');
138
- }
139
- /**
140
- * 解析 Codex CLI JSON 响应
141
- */
142
- parseResponse(stdout) {
143
- // 尝试解析 JSON
144
- const trimmed = stdout.trim();
145
- try {
146
- const parsed = JSON.parse(trimmed);
147
- // 处理不同的响应格式
148
- if (parsed.result) {
149
- return { content: parsed.result };
150
- }
151
- if (parsed.output) {
152
- return { content: parsed.output };
153
- }
154
- if (parsed.response) {
155
- return { content: parsed.response };
156
- }
157
- if (parsed.message) {
158
- return { content: parsed.message };
159
- }
160
- // 如果解析成功但没有已知字段,返回 stringify 后的内容
161
- return { content: JSON.stringify(parsed, null, 2) };
162
- }
163
- catch {
164
- // 如果不是 JSON,直接返回原始内容
165
- return { content: trimmed };
166
- }
167
- }
168
- }
169
- //# sourceMappingURL=codex.js.map