winter-super-cli 2026.5.32 → 2026.6.6

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 (3103) hide show
  1. package/README.md +9 -5
  2. package/bin/winter.js +39 -4
  3. package/package.json +21 -2
  4. package/resources/local/ecc/.agents/plugins/marketplace.json +21 -0
  5. package/resources/local/ecc/.agents/skills/agent-introspection-debugging/SKILL.md +152 -0
  6. package/resources/local/ecc/.agents/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
  7. package/resources/local/ecc/.agents/skills/agent-sort/SKILL.md +214 -0
  8. package/resources/local/ecc/.agents/skills/agent-sort/agents/openai.yaml +7 -0
  9. package/resources/local/ecc/.agents/skills/api-design/SKILL.md +522 -0
  10. package/resources/local/ecc/.agents/skills/api-design/agents/openai.yaml +7 -0
  11. package/resources/local/ecc/.agents/skills/article-writing/SKILL.md +78 -0
  12. package/resources/local/ecc/.agents/skills/article-writing/agents/openai.yaml +7 -0
  13. package/resources/local/ecc/.agents/skills/backend-patterns/SKILL.md +597 -0
  14. package/resources/local/ecc/.agents/skills/backend-patterns/agents/openai.yaml +7 -0
  15. package/resources/local/ecc/.agents/skills/brand-voice/SKILL.md +96 -0
  16. package/resources/local/ecc/.agents/skills/brand-voice/agents/openai.yaml +7 -0
  17. package/resources/local/ecc/.agents/skills/brand-voice/references/voice-profile-schema.md +55 -0
  18. package/resources/local/ecc/.agents/skills/bun-runtime/SKILL.md +83 -0
  19. package/resources/local/ecc/.agents/skills/bun-runtime/agents/openai.yaml +7 -0
  20. package/resources/local/ecc/.agents/skills/coding-standards/SKILL.md +548 -0
  21. package/resources/local/ecc/.agents/skills/coding-standards/agents/openai.yaml +7 -0
  22. package/resources/local/ecc/.agents/skills/content-engine/SKILL.md +130 -0
  23. package/resources/local/ecc/.agents/skills/content-engine/agents/openai.yaml +7 -0
  24. package/resources/local/ecc/.agents/skills/crosspost/SKILL.md +110 -0
  25. package/resources/local/ecc/.agents/skills/crosspost/agents/openai.yaml +7 -0
  26. package/resources/local/ecc/.agents/skills/deep-research/SKILL.md +154 -0
  27. package/resources/local/ecc/.agents/skills/deep-research/agents/openai.yaml +7 -0
  28. package/resources/local/ecc/.agents/skills/dmux-workflows/SKILL.md +143 -0
  29. package/resources/local/ecc/.agents/skills/dmux-workflows/agents/openai.yaml +7 -0
  30. package/resources/local/ecc/.agents/skills/documentation-lookup/SKILL.md +89 -0
  31. package/resources/local/ecc/.agents/skills/documentation-lookup/agents/openai.yaml +7 -0
  32. package/resources/local/ecc/.agents/skills/e2e-testing/SKILL.md +325 -0
  33. package/resources/local/ecc/.agents/skills/e2e-testing/agents/openai.yaml +7 -0
  34. package/resources/local/ecc/.agents/skills/eval-harness/SKILL.md +235 -0
  35. package/resources/local/ecc/.agents/skills/eval-harness/agents/openai.yaml +7 -0
  36. package/resources/local/ecc/.agents/skills/everything-claude-code/SKILL.md +442 -0
  37. package/resources/local/ecc/.agents/skills/everything-claude-code/agents/openai.yaml +7 -0
  38. package/resources/local/ecc/.agents/skills/exa-search/SKILL.md +169 -0
  39. package/resources/local/ecc/.agents/skills/exa-search/agents/openai.yaml +7 -0
  40. package/resources/local/ecc/.agents/skills/fal-ai-media/SKILL.md +276 -0
  41. package/resources/local/ecc/.agents/skills/fal-ai-media/agents/openai.yaml +7 -0
  42. package/resources/local/ecc/.agents/skills/frontend-patterns/SKILL.md +647 -0
  43. package/resources/local/ecc/.agents/skills/frontend-patterns/agents/openai.yaml +7 -0
  44. package/resources/local/ecc/.agents/skills/frontend-slides/SKILL.md +183 -0
  45. package/resources/local/ecc/.agents/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  46. package/resources/local/ecc/.agents/skills/frontend-slides/agents/openai.yaml +7 -0
  47. package/resources/local/ecc/.agents/skills/investor-materials/SKILL.md +95 -0
  48. package/resources/local/ecc/.agents/skills/investor-materials/agents/openai.yaml +7 -0
  49. package/resources/local/ecc/.agents/skills/investor-outreach/SKILL.md +90 -0
  50. package/resources/local/ecc/.agents/skills/investor-outreach/agents/openai.yaml +7 -0
  51. package/resources/local/ecc/.agents/skills/market-research/SKILL.md +74 -0
  52. package/resources/local/ecc/.agents/skills/market-research/agents/openai.yaml +7 -0
  53. package/resources/local/ecc/.agents/skills/mcp-server-patterns/SKILL.md +66 -0
  54. package/resources/local/ecc/.agents/skills/mcp-server-patterns/agents/openai.yaml +7 -0
  55. package/resources/local/ecc/.agents/skills/mle-workflow/SKILL.md +346 -0
  56. package/resources/local/ecc/.agents/skills/mle-workflow/agents/openai.yaml +7 -0
  57. package/resources/local/ecc/.agents/skills/nextjs-turbopack/SKILL.md +43 -0
  58. package/resources/local/ecc/.agents/skills/nextjs-turbopack/agents/openai.yaml +7 -0
  59. package/resources/local/ecc/.agents/skills/product-capability/SKILL.md +140 -0
  60. package/resources/local/ecc/.agents/skills/product-capability/agents/openai.yaml +7 -0
  61. package/resources/local/ecc/.agents/skills/security-review/SKILL.md +494 -0
  62. package/resources/local/ecc/.agents/skills/security-review/agents/openai.yaml +7 -0
  63. package/resources/local/ecc/.agents/skills/strategic-compact/SKILL.md +102 -0
  64. package/resources/local/ecc/.agents/skills/strategic-compact/agents/openai.yaml +7 -0
  65. package/resources/local/ecc/.agents/skills/tdd-workflow/SKILL.md +409 -0
  66. package/resources/local/ecc/.agents/skills/tdd-workflow/agents/openai.yaml +7 -0
  67. package/resources/local/ecc/.agents/skills/verification-loop/SKILL.md +125 -0
  68. package/resources/local/ecc/.agents/skills/verification-loop/agents/openai.yaml +7 -0
  69. package/resources/local/ecc/.agents/skills/video-editing/SKILL.md +307 -0
  70. package/resources/local/ecc/.agents/skills/video-editing/agents/openai.yaml +7 -0
  71. package/resources/local/ecc/.agents/skills/x-api/SKILL.md +229 -0
  72. package/resources/local/ecc/.agents/skills/x-api/agents/openai.yaml +7 -0
  73. package/resources/local/ecc/.claude/commands/add-language-rules.md +39 -0
  74. package/resources/local/ecc/.claude/commands/database-migration.md +36 -0
  75. package/resources/local/ecc/.claude/commands/feature-development.md +38 -0
  76. package/resources/local/ecc/.claude/ecc-tools.json +334 -0
  77. package/resources/local/ecc/.claude/enterprise/controls.md +15 -0
  78. package/resources/local/ecc/.claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml +162 -0
  79. package/resources/local/ecc/.claude/identity.json +14 -0
  80. package/resources/local/ecc/.claude/package-manager.json +4 -0
  81. package/resources/local/ecc/.claude/research/everything-claude-code-research-playbook.md +21 -0
  82. package/resources/local/ecc/.claude/rules/everything-claude-code-guardrails.md +43 -0
  83. package/resources/local/ecc/.claude/rules/node.md +56 -0
  84. package/resources/local/ecc/.claude/skills/everything-claude-code/SKILL.md +442 -0
  85. package/resources/local/ecc/.claude/team/everything-claude-code-team-config.json +15 -0
  86. package/resources/local/ecc/.claude-plugin/README.md +17 -0
  87. package/resources/local/ecc/.claude-plugin/marketplace.json +47 -0
  88. package/resources/local/ecc/.claude-plugin/plugin.json +32 -0
  89. package/resources/local/ecc/.codebuddy/README.md +98 -0
  90. package/resources/local/ecc/.codebuddy/install.js +312 -0
  91. package/resources/local/ecc/.codebuddy/install.sh +231 -0
  92. package/resources/local/ecc/.codebuddy/uninstall.js +291 -0
  93. package/resources/local/ecc/.codebuddy/uninstall.sh +184 -0
  94. package/resources/local/ecc/.codex/AGENTS.md +102 -0
  95. package/resources/local/ecc/.codex/agents/docs-researcher.toml +9 -0
  96. package/resources/local/ecc/.codex/agents/explorer.toml +9 -0
  97. package/resources/local/ecc/.codex/agents/reviewer.toml +9 -0
  98. package/resources/local/ecc/.codex/config.toml +120 -0
  99. package/resources/local/ecc/.codex-plugin/README.md +64 -0
  100. package/resources/local/ecc/.codex-plugin/plugin.json +30 -0
  101. package/resources/local/ecc/.cursor/hooks/adapter.js +81 -0
  102. package/resources/local/ecc/.cursor/hooks/after-file-edit.js +19 -0
  103. package/resources/local/ecc/.cursor/hooks/after-mcp-execution.js +12 -0
  104. package/resources/local/ecc/.cursor/hooks/after-shell-execution.js +28 -0
  105. package/resources/local/ecc/.cursor/hooks/after-tab-file-edit.js +12 -0
  106. package/resources/local/ecc/.cursor/hooks/before-mcp-execution.js +11 -0
  107. package/resources/local/ecc/.cursor/hooks/before-read-file.js +13 -0
  108. package/resources/local/ecc/.cursor/hooks/before-shell-execution.js +41 -0
  109. package/resources/local/ecc/.cursor/hooks/before-submit-prompt.js +23 -0
  110. package/resources/local/ecc/.cursor/hooks/before-tab-file-read.js +13 -0
  111. package/resources/local/ecc/.cursor/hooks/pre-compact.js +7 -0
  112. package/resources/local/ecc/.cursor/hooks/session-end.js +10 -0
  113. package/resources/local/ecc/.cursor/hooks/session-start.js +10 -0
  114. package/resources/local/ecc/.cursor/hooks/stop.js +21 -0
  115. package/resources/local/ecc/.cursor/hooks/subagent-start.js +10 -0
  116. package/resources/local/ecc/.cursor/hooks/subagent-stop.js +10 -0
  117. package/resources/local/ecc/.cursor/hooks.json +115 -0
  118. package/resources/local/ecc/.cursor/rules/common-agents.md +53 -0
  119. package/resources/local/ecc/.cursor/rules/common-coding-style.md +52 -0
  120. package/resources/local/ecc/.cursor/rules/common-development-workflow.md +33 -0
  121. package/resources/local/ecc/.cursor/rules/common-git-workflow.md +28 -0
  122. package/resources/local/ecc/.cursor/rules/common-hooks.md +34 -0
  123. package/resources/local/ecc/.cursor/rules/common-patterns.md +35 -0
  124. package/resources/local/ecc/.cursor/rules/common-performance.md +59 -0
  125. package/resources/local/ecc/.cursor/rules/common-security.md +33 -0
  126. package/resources/local/ecc/.cursor/rules/common-testing.md +33 -0
  127. package/resources/local/ecc/.cursor/rules/golang-coding-style.md +31 -0
  128. package/resources/local/ecc/.cursor/rules/golang-hooks.md +16 -0
  129. package/resources/local/ecc/.cursor/rules/golang-patterns.md +44 -0
  130. package/resources/local/ecc/.cursor/rules/golang-security.md +33 -0
  131. package/resources/local/ecc/.cursor/rules/golang-testing.md +30 -0
  132. package/resources/local/ecc/.cursor/rules/kotlin-coding-style.md +39 -0
  133. package/resources/local/ecc/.cursor/rules/kotlin-hooks.md +16 -0
  134. package/resources/local/ecc/.cursor/rules/kotlin-patterns.md +50 -0
  135. package/resources/local/ecc/.cursor/rules/kotlin-security.md +58 -0
  136. package/resources/local/ecc/.cursor/rules/kotlin-testing.md +38 -0
  137. package/resources/local/ecc/.cursor/rules/php-coding-style.md +25 -0
  138. package/resources/local/ecc/.cursor/rules/php-hooks.md +21 -0
  139. package/resources/local/ecc/.cursor/rules/php-patterns.md +23 -0
  140. package/resources/local/ecc/.cursor/rules/php-security.md +24 -0
  141. package/resources/local/ecc/.cursor/rules/php-testing.md +26 -0
  142. package/resources/local/ecc/.cursor/rules/python-coding-style.md +42 -0
  143. package/resources/local/ecc/.cursor/rules/python-hooks.md +19 -0
  144. package/resources/local/ecc/.cursor/rules/python-patterns.md +39 -0
  145. package/resources/local/ecc/.cursor/rules/python-security.md +30 -0
  146. package/resources/local/ecc/.cursor/rules/python-testing.md +38 -0
  147. package/resources/local/ecc/.cursor/rules/swift-coding-style.md +47 -0
  148. package/resources/local/ecc/.cursor/rules/swift-hooks.md +20 -0
  149. package/resources/local/ecc/.cursor/rules/swift-patterns.md +66 -0
  150. package/resources/local/ecc/.cursor/rules/swift-security.md +33 -0
  151. package/resources/local/ecc/.cursor/rules/swift-testing.md +45 -0
  152. package/resources/local/ecc/.cursor/rules/typescript-coding-style.md +63 -0
  153. package/resources/local/ecc/.cursor/rules/typescript-hooks.md +20 -0
  154. package/resources/local/ecc/.cursor/rules/typescript-patterns.md +50 -0
  155. package/resources/local/ecc/.cursor/rules/typescript-security.md +26 -0
  156. package/resources/local/ecc/.cursor/rules/typescript-testing.md +16 -0
  157. package/resources/local/ecc/.cursor/skills/article-writing/SKILL.md +85 -0
  158. package/resources/local/ecc/.cursor/skills/bun-runtime/SKILL.md +84 -0
  159. package/resources/local/ecc/.cursor/skills/content-engine/SKILL.md +88 -0
  160. package/resources/local/ecc/.cursor/skills/documentation-lookup/SKILL.md +90 -0
  161. package/resources/local/ecc/.cursor/skills/frontend-slides/SKILL.md +184 -0
  162. package/resources/local/ecc/.cursor/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  163. package/resources/local/ecc/.cursor/skills/investor-materials/SKILL.md +96 -0
  164. package/resources/local/ecc/.cursor/skills/investor-outreach/SKILL.md +76 -0
  165. package/resources/local/ecc/.cursor/skills/market-research/SKILL.md +75 -0
  166. package/resources/local/ecc/.cursor/skills/mcp-server-patterns/SKILL.md +67 -0
  167. package/resources/local/ecc/.cursor/skills/nextjs-turbopack/SKILL.md +44 -0
  168. package/resources/local/ecc/.env.example +48 -0
  169. package/resources/local/ecc/.gemini/GEMINI.md +48 -0
  170. package/resources/local/ecc/.github/FUNDING.yml +2 -0
  171. package/resources/local/ecc/.github/ISSUE_TEMPLATE/copilot-task.md +17 -0
  172. package/resources/local/ecc/.github/PULL_REQUEST_TEMPLATE.md +33 -0
  173. package/resources/local/ecc/.github/copilot-instructions.md +115 -0
  174. package/resources/local/ecc/.github/dependabot.yml +21 -0
  175. package/resources/local/ecc/.github/prompts/build-fix.prompt.md +47 -0
  176. package/resources/local/ecc/.github/prompts/code-review.prompt.md +56 -0
  177. package/resources/local/ecc/.github/prompts/plan.prompt.md +52 -0
  178. package/resources/local/ecc/.github/prompts/refactor.prompt.md +50 -0
  179. package/resources/local/ecc/.github/prompts/security-review.prompt.md +70 -0
  180. package/resources/local/ecc/.github/prompts/tdd.prompt.md +47 -0
  181. package/resources/local/ecc/.github/release.yml +20 -0
  182. package/resources/local/ecc/.github/workflows/ci.yml +243 -0
  183. package/resources/local/ecc/.github/workflows/maintenance.yml +56 -0
  184. package/resources/local/ecc/.github/workflows/monthly-metrics.yml +192 -0
  185. package/resources/local/ecc/.github/workflows/release.yml +151 -0
  186. package/resources/local/ecc/.github/workflows/reusable-release.yml +169 -0
  187. package/resources/local/ecc/.github/workflows/reusable-test.yml +95 -0
  188. package/resources/local/ecc/.github/workflows/reusable-validate.yml +55 -0
  189. package/resources/local/ecc/.github/workflows/supply-chain-watch.yml +65 -0
  190. package/resources/local/ecc/.kiro/README.md +607 -0
  191. package/resources/local/ecc/.kiro/agents/architect.json +16 -0
  192. package/resources/local/ecc/.kiro/agents/architect.md +212 -0
  193. package/resources/local/ecc/.kiro/agents/build-error-resolver.json +17 -0
  194. package/resources/local/ecc/.kiro/agents/build-error-resolver.md +116 -0
  195. package/resources/local/ecc/.kiro/agents/chief-of-staff.json +17 -0
  196. package/resources/local/ecc/.kiro/agents/chief-of-staff.md +153 -0
  197. package/resources/local/ecc/.kiro/agents/code-reviewer.json +16 -0
  198. package/resources/local/ecc/.kiro/agents/code-reviewer.md +238 -0
  199. package/resources/local/ecc/.kiro/agents/database-reviewer.json +16 -0
  200. package/resources/local/ecc/.kiro/agents/database-reviewer.md +92 -0
  201. package/resources/local/ecc/.kiro/agents/doc-updater.json +16 -0
  202. package/resources/local/ecc/.kiro/agents/doc-updater.md +108 -0
  203. package/resources/local/ecc/.kiro/agents/e2e-runner.json +17 -0
  204. package/resources/local/ecc/.kiro/agents/e2e-runner.md +109 -0
  205. package/resources/local/ecc/.kiro/agents/go-build-resolver.json +17 -0
  206. package/resources/local/ecc/.kiro/agents/go-build-resolver.md +96 -0
  207. package/resources/local/ecc/.kiro/agents/go-reviewer.json +16 -0
  208. package/resources/local/ecc/.kiro/agents/go-reviewer.md +77 -0
  209. package/resources/local/ecc/.kiro/agents/harness-optimizer.json +15 -0
  210. package/resources/local/ecc/.kiro/agents/harness-optimizer.md +34 -0
  211. package/resources/local/ecc/.kiro/agents/loop-operator.json +16 -0
  212. package/resources/local/ecc/.kiro/agents/loop-operator.md +36 -0
  213. package/resources/local/ecc/.kiro/agents/planner.json +15 -0
  214. package/resources/local/ecc/.kiro/agents/planner.md +212 -0
  215. package/resources/local/ecc/.kiro/agents/python-reviewer.json +16 -0
  216. package/resources/local/ecc/.kiro/agents/python-reviewer.md +99 -0
  217. package/resources/local/ecc/.kiro/agents/refactor-cleaner.json +17 -0
  218. package/resources/local/ecc/.kiro/agents/refactor-cleaner.md +87 -0
  219. package/resources/local/ecc/.kiro/agents/security-reviewer.json +16 -0
  220. package/resources/local/ecc/.kiro/agents/security-reviewer.md +109 -0
  221. package/resources/local/ecc/.kiro/agents/tdd-guide.json +17 -0
  222. package/resources/local/ecc/.kiro/agents/tdd-guide.md +93 -0
  223. package/resources/local/ecc/.kiro/docs/longform-guide.md +301 -0
  224. package/resources/local/ecc/.kiro/docs/security-guide.md +496 -0
  225. package/resources/local/ecc/.kiro/docs/shortform-guide.md +360 -0
  226. package/resources/local/ecc/.kiro/hooks/README.md +93 -0
  227. package/resources/local/ecc/.kiro/hooks/auto-format.kiro.hook +14 -0
  228. package/resources/local/ecc/.kiro/hooks/code-review-on-write.kiro.hook +14 -0
  229. package/resources/local/ecc/.kiro/hooks/console-log-check.kiro.hook +14 -0
  230. package/resources/local/ecc/.kiro/hooks/doc-file-warning.kiro.hook +14 -0
  231. package/resources/local/ecc/.kiro/hooks/extract-patterns.kiro.hook +13 -0
  232. package/resources/local/ecc/.kiro/hooks/git-push-review.kiro.hook +14 -0
  233. package/resources/local/ecc/.kiro/hooks/quality-gate.kiro.hook +13 -0
  234. package/resources/local/ecc/.kiro/hooks/session-summary.kiro.hook +13 -0
  235. package/resources/local/ecc/.kiro/hooks/tdd-reminder.kiro.hook +14 -0
  236. package/resources/local/ecc/.kiro/hooks/typecheck-on-edit.kiro.hook +14 -0
  237. package/resources/local/ecc/.kiro/install.sh +143 -0
  238. package/resources/local/ecc/.kiro/scripts/format.sh +70 -0
  239. package/resources/local/ecc/.kiro/scripts/quality-gate.sh +120 -0
  240. package/resources/local/ecc/.kiro/settings/mcp.json.example +50 -0
  241. package/resources/local/ecc/.kiro/skills/agentic-engineering/SKILL.md +135 -0
  242. package/resources/local/ecc/.kiro/skills/api-design/SKILL.md +525 -0
  243. package/resources/local/ecc/.kiro/skills/backend-patterns/SKILL.md +600 -0
  244. package/resources/local/ecc/.kiro/skills/coding-standards/SKILL.md +532 -0
  245. package/resources/local/ecc/.kiro/skills/database-migrations/SKILL.md +348 -0
  246. package/resources/local/ecc/.kiro/skills/deployment-patterns/SKILL.md +440 -0
  247. package/resources/local/ecc/.kiro/skills/docker-patterns/SKILL.md +376 -0
  248. package/resources/local/ecc/.kiro/skills/e2e-testing/SKILL.md +328 -0
  249. package/resources/local/ecc/.kiro/skills/frontend-patterns/SKILL.md +644 -0
  250. package/resources/local/ecc/.kiro/skills/golang-patterns/SKILL.md +227 -0
  251. package/resources/local/ecc/.kiro/skills/golang-testing/SKILL.md +332 -0
  252. package/resources/local/ecc/.kiro/skills/postgres-patterns/SKILL.md +161 -0
  253. package/resources/local/ecc/.kiro/skills/python-patterns/SKILL.md +428 -0
  254. package/resources/local/ecc/.kiro/skills/python-testing/SKILL.md +497 -0
  255. package/resources/local/ecc/.kiro/skills/search-first/SKILL.md +179 -0
  256. package/resources/local/ecc/.kiro/skills/security-review/SKILL.md +497 -0
  257. package/resources/local/ecc/.kiro/skills/tdd-workflow/SKILL.md +414 -0
  258. package/resources/local/ecc/.kiro/skills/verification-loop/SKILL.md +128 -0
  259. package/resources/local/ecc/.kiro/steering/coding-style.md +53 -0
  260. package/resources/local/ecc/.kiro/steering/dev-mode.md +44 -0
  261. package/resources/local/ecc/.kiro/steering/development-workflow.md +34 -0
  262. package/resources/local/ecc/.kiro/steering/git-workflow.md +29 -0
  263. package/resources/local/ecc/.kiro/steering/golang-patterns.md +45 -0
  264. package/resources/local/ecc/.kiro/steering/lessons-learned.md +84 -0
  265. package/resources/local/ecc/.kiro/steering/patterns.md +36 -0
  266. package/resources/local/ecc/.kiro/steering/performance.md +54 -0
  267. package/resources/local/ecc/.kiro/steering/python-patterns.md +40 -0
  268. package/resources/local/ecc/.kiro/steering/research-mode.md +62 -0
  269. package/resources/local/ecc/.kiro/steering/review-mode.md +56 -0
  270. package/resources/local/ecc/.kiro/steering/security.md +34 -0
  271. package/resources/local/ecc/.kiro/steering/swift-patterns.md +67 -0
  272. package/resources/local/ecc/.kiro/steering/testing.md +34 -0
  273. package/resources/local/ecc/.kiro/steering/typescript-patterns.md +51 -0
  274. package/resources/local/ecc/.kiro/steering/typescript-security.md +98 -0
  275. package/resources/local/ecc/.markdownlint.json +19 -0
  276. package/resources/local/ecc/.mcp.json +28 -0
  277. package/resources/local/ecc/.opencode/MIGRATION.md +368 -0
  278. package/resources/local/ecc/.opencode/README.md +204 -0
  279. package/resources/local/ecc/.opencode/commands/build-fix.md +56 -0
  280. package/resources/local/ecc/.opencode/commands/checkpoint.md +67 -0
  281. package/resources/local/ecc/.opencode/commands/code-review.md +68 -0
  282. package/resources/local/ecc/.opencode/commands/e2e.md +105 -0
  283. package/resources/local/ecc/.opencode/commands/eval.md +88 -0
  284. package/resources/local/ecc/.opencode/commands/evolve.md +36 -0
  285. package/resources/local/ecc/.opencode/commands/go-build.md +87 -0
  286. package/resources/local/ecc/.opencode/commands/go-review.md +71 -0
  287. package/resources/local/ecc/.opencode/commands/go-test.md +131 -0
  288. package/resources/local/ecc/.opencode/commands/harness-audit.md +77 -0
  289. package/resources/local/ecc/.opencode/commands/instinct-export.md +93 -0
  290. package/resources/local/ecc/.opencode/commands/instinct-import.md +88 -0
  291. package/resources/local/ecc/.opencode/commands/instinct-status.md +29 -0
  292. package/resources/local/ecc/.opencode/commands/learn.md +61 -0
  293. package/resources/local/ecc/.opencode/commands/loop-start.md +32 -0
  294. package/resources/local/ecc/.opencode/commands/loop-status.md +24 -0
  295. package/resources/local/ecc/.opencode/commands/model-route.md +26 -0
  296. package/resources/local/ecc/.opencode/commands/orchestrate.md +88 -0
  297. package/resources/local/ecc/.opencode/commands/plan.md +49 -0
  298. package/resources/local/ecc/.opencode/commands/projects.md +23 -0
  299. package/resources/local/ecc/.opencode/commands/promote.md +23 -0
  300. package/resources/local/ecc/.opencode/commands/quality-gate.md +29 -0
  301. package/resources/local/ecc/.opencode/commands/refactor-clean.md +102 -0
  302. package/resources/local/ecc/.opencode/commands/rust-build.md +78 -0
  303. package/resources/local/ecc/.opencode/commands/rust-review.md +65 -0
  304. package/resources/local/ecc/.opencode/commands/rust-test.md +104 -0
  305. package/resources/local/ecc/.opencode/commands/security-scan.md +92 -0
  306. package/resources/local/ecc/.opencode/commands/security.md +89 -0
  307. package/resources/local/ecc/.opencode/commands/setup-pm.md +67 -0
  308. package/resources/local/ecc/.opencode/commands/skill-create.md +117 -0
  309. package/resources/local/ecc/.opencode/commands/tdd.md +66 -0
  310. package/resources/local/ecc/.opencode/commands/test-coverage.md +80 -0
  311. package/resources/local/ecc/.opencode/commands/update-codemaps.md +81 -0
  312. package/resources/local/ecc/.opencode/commands/update-docs.md +67 -0
  313. package/resources/local/ecc/.opencode/commands/verify.md +67 -0
  314. package/resources/local/ecc/.opencode/index.ts +80 -0
  315. package/resources/local/ecc/.opencode/instructions/INSTRUCTIONS.md +337 -0
  316. package/resources/local/ecc/.opencode/opencode.json +467 -0
  317. package/resources/local/ecc/.opencode/package-lock.json +169 -0
  318. package/resources/local/ecc/.opencode/package.json +70 -0
  319. package/resources/local/ecc/.opencode/plugins/ecc-hooks.ts +520 -0
  320. package/resources/local/ecc/.opencode/plugins/index.ts +12 -0
  321. package/resources/local/ecc/.opencode/plugins/lib/changed-files-store.ts +98 -0
  322. package/resources/local/ecc/.opencode/prompts/agents/architect.txt +175 -0
  323. package/resources/local/ecc/.opencode/prompts/agents/build-error-resolver.txt +233 -0
  324. package/resources/local/ecc/.opencode/prompts/agents/code-reviewer.txt +103 -0
  325. package/resources/local/ecc/.opencode/prompts/agents/cpp-build-resolver.txt +81 -0
  326. package/resources/local/ecc/.opencode/prompts/agents/cpp-reviewer.txt +65 -0
  327. package/resources/local/ecc/.opencode/prompts/agents/database-reviewer.txt +247 -0
  328. package/resources/local/ecc/.opencode/prompts/agents/doc-updater.txt +192 -0
  329. package/resources/local/ecc/.opencode/prompts/agents/docs-lookup.txt +57 -0
  330. package/resources/local/ecc/.opencode/prompts/agents/e2e-runner.txt +305 -0
  331. package/resources/local/ecc/.opencode/prompts/agents/go-build-resolver.txt +325 -0
  332. package/resources/local/ecc/.opencode/prompts/agents/go-reviewer.txt +241 -0
  333. package/resources/local/ecc/.opencode/prompts/agents/harness-optimizer.txt +27 -0
  334. package/resources/local/ecc/.opencode/prompts/agents/java-build-resolver.txt +125 -0
  335. package/resources/local/ecc/.opencode/prompts/agents/java-reviewer.txt +99 -0
  336. package/resources/local/ecc/.opencode/prompts/agents/kotlin-build-resolver.txt +120 -0
  337. package/resources/local/ecc/.opencode/prompts/agents/kotlin-reviewer.txt +127 -0
  338. package/resources/local/ecc/.opencode/prompts/agents/loop-operator.txt +39 -0
  339. package/resources/local/ecc/.opencode/prompts/agents/planner.txt +112 -0
  340. package/resources/local/ecc/.opencode/prompts/agents/python-reviewer.txt +85 -0
  341. package/resources/local/ecc/.opencode/prompts/agents/refactor-cleaner.txt +241 -0
  342. package/resources/local/ecc/.opencode/prompts/agents/rust-build-resolver.txt +93 -0
  343. package/resources/local/ecc/.opencode/prompts/agents/rust-reviewer.txt +61 -0
  344. package/resources/local/ecc/.opencode/prompts/agents/security-reviewer.txt +207 -0
  345. package/resources/local/ecc/.opencode/prompts/agents/tdd-guide.txt +211 -0
  346. package/resources/local/ecc/.opencode/tools/changed-files.ts +83 -0
  347. package/resources/local/ecc/.opencode/tools/check-coverage.ts +172 -0
  348. package/resources/local/ecc/.opencode/tools/format-code.ts +70 -0
  349. package/resources/local/ecc/.opencode/tools/git-summary.ts +56 -0
  350. package/resources/local/ecc/.opencode/tools/index.ts +14 -0
  351. package/resources/local/ecc/.opencode/tools/lint-check.ts +87 -0
  352. package/resources/local/ecc/.opencode/tools/run-tests.ts +141 -0
  353. package/resources/local/ecc/.opencode/tools/security-audit.ts +279 -0
  354. package/resources/local/ecc/.opencode/tsconfig.json +30 -0
  355. package/resources/local/ecc/.prettierrc +8 -0
  356. package/resources/local/ecc/.qwen/QWEN.md +25 -0
  357. package/resources/local/ecc/.tool-versions +6 -0
  358. package/resources/local/ecc/.trae/README.md +184 -0
  359. package/resources/local/ecc/.trae/install.sh +234 -0
  360. package/resources/local/ecc/.trae/uninstall.sh +194 -0
  361. package/resources/local/ecc/.vscode/settings.json +17 -0
  362. package/resources/local/ecc/.yarnrc.yml +1 -0
  363. package/resources/local/ecc/.zed/settings.json +41 -0
  364. package/resources/local/ecc/AGENTS.md +170 -0
  365. package/resources/local/ecc/CHANGELOG.md +203 -0
  366. package/resources/local/ecc/CLAUDE.md +81 -0
  367. package/resources/local/ecc/CODE_OF_CONDUCT.md +128 -0
  368. package/resources/local/ecc/COMMANDS-QUICK-REF.md +159 -0
  369. package/resources/local/ecc/CONTRIBUTING.md +507 -0
  370. package/resources/local/ecc/EVALUATION.md +122 -0
  371. package/resources/local/ecc/LICENSE +21 -0
  372. package/resources/local/ecc/README.md +1760 -0
  373. package/resources/local/ecc/REPO-ASSESSMENT.md +196 -0
  374. package/resources/local/ecc/RULES.md +38 -0
  375. package/resources/local/ecc/SECURITY.md +101 -0
  376. package/resources/local/ecc/SOUL.md +17 -0
  377. package/resources/local/ecc/SPONSORING.md +43 -0
  378. package/resources/local/ecc/SPONSORS.md +76 -0
  379. package/resources/local/ecc/TROUBLESHOOTING.md +432 -0
  380. package/resources/local/ecc/VERSION +1 -0
  381. package/resources/local/ecc/WORKING-CONTEXT.md +179 -0
  382. package/resources/local/ecc/agent.yaml +238 -0
  383. package/resources/local/ecc/agents/a11y-architect.md +149 -0
  384. package/resources/local/ecc/agents/architect.md +220 -0
  385. package/resources/local/ecc/agents/build-error-resolver.md +123 -0
  386. package/resources/local/ecc/agents/chief-of-staff.md +160 -0
  387. package/resources/local/ecc/agents/code-architect.md +80 -0
  388. package/resources/local/ecc/agents/code-explorer.md +78 -0
  389. package/resources/local/ecc/agents/code-reviewer.md +323 -0
  390. package/resources/local/ecc/agents/code-simplifier.md +56 -0
  391. package/resources/local/ecc/agents/comment-analyzer.md +54 -0
  392. package/resources/local/ecc/agents/conversation-analyzer.md +61 -0
  393. package/resources/local/ecc/agents/cpp-build-resolver.md +99 -0
  394. package/resources/local/ecc/agents/cpp-reviewer.md +81 -0
  395. package/resources/local/ecc/agents/csharp-reviewer.md +110 -0
  396. package/resources/local/ecc/agents/dart-build-resolver.md +210 -0
  397. package/resources/local/ecc/agents/database-reviewer.md +100 -0
  398. package/resources/local/ecc/agents/django-build-resolver.md +252 -0
  399. package/resources/local/ecc/agents/django-reviewer.md +169 -0
  400. package/resources/local/ecc/agents/doc-updater.md +116 -0
  401. package/resources/local/ecc/agents/docs-lookup.md +77 -0
  402. package/resources/local/ecc/agents/e2e-runner.md +116 -0
  403. package/resources/local/ecc/agents/fastapi-reviewer.md +79 -0
  404. package/resources/local/ecc/agents/flutter-reviewer.md +252 -0
  405. package/resources/local/ecc/agents/fsharp-reviewer.md +109 -0
  406. package/resources/local/ecc/agents/gan-evaluator.md +218 -0
  407. package/resources/local/ecc/agents/gan-generator.md +140 -0
  408. package/resources/local/ecc/agents/gan-planner.md +108 -0
  409. package/resources/local/ecc/agents/go-build-resolver.md +103 -0
  410. package/resources/local/ecc/agents/go-reviewer.md +85 -0
  411. package/resources/local/ecc/agents/harmonyos-app-resolver.md +182 -0
  412. package/resources/local/ecc/agents/harness-optimizer.md +44 -0
  413. package/resources/local/ecc/agents/healthcare-reviewer.md +92 -0
  414. package/resources/local/ecc/agents/homelab-architect.md +107 -0
  415. package/resources/local/ecc/agents/java-build-resolver.md +275 -0
  416. package/resources/local/ecc/agents/java-reviewer.md +190 -0
  417. package/resources/local/ecc/agents/kotlin-build-resolver.md +127 -0
  418. package/resources/local/ecc/agents/kotlin-reviewer.md +168 -0
  419. package/resources/local/ecc/agents/loop-operator.md +45 -0
  420. package/resources/local/ecc/agents/mle-reviewer.md +162 -0
  421. package/resources/local/ecc/agents/network-architect.md +106 -0
  422. package/resources/local/ecc/agents/network-config-reviewer.md +106 -0
  423. package/resources/local/ecc/agents/network-troubleshooter.md +128 -0
  424. package/resources/local/ecc/agents/opensource-forker.md +207 -0
  425. package/resources/local/ecc/agents/opensource-packager.md +258 -0
  426. package/resources/local/ecc/agents/opensource-sanitizer.md +197 -0
  427. package/resources/local/ecc/agents/performance-optimizer.md +455 -0
  428. package/resources/local/ecc/agents/planner.md +221 -0
  429. package/resources/local/ecc/agents/pr-test-analyzer.md +54 -0
  430. package/resources/local/ecc/agents/python-reviewer.md +107 -0
  431. package/resources/local/ecc/agents/pytorch-build-resolver.md +129 -0
  432. package/resources/local/ecc/agents/refactor-cleaner.md +94 -0
  433. package/resources/local/ecc/agents/rust-build-resolver.md +157 -0
  434. package/resources/local/ecc/agents/rust-reviewer.md +103 -0
  435. package/resources/local/ecc/agents/security-reviewer.md +117 -0
  436. package/resources/local/ecc/agents/seo-specialist.md +71 -0
  437. package/resources/local/ecc/agents/silent-failure-hunter.md +59 -0
  438. package/resources/local/ecc/agents/swift-build-resolver.md +170 -0
  439. package/resources/local/ecc/agents/swift-reviewer.md +116 -0
  440. package/resources/local/ecc/agents/tdd-guide.md +100 -0
  441. package/resources/local/ecc/agents/type-design-analyzer.md +50 -0
  442. package/resources/local/ecc/agents/typescript-reviewer.md +121 -0
  443. package/resources/local/ecc/assets/hero.png +0 -0
  444. package/resources/local/ecc/assets/images/ecc-logo.png +0 -0
  445. package/resources/local/ecc/assets/images/guides/longform-guide.png +0 -0
  446. package/resources/local/ecc/assets/images/guides/shorthand-guide.png +0 -0
  447. package/resources/local/ecc/assets/images/longform/01-header.png +0 -0
  448. package/resources/local/ecc/assets/images/longform/02-shortform-reference.png +0 -0
  449. package/resources/local/ecc/assets/images/longform/03-session-storage.png +0 -0
  450. package/resources/local/ecc/assets/images/longform/03b-session-storage-alt.png +0 -0
  451. package/resources/local/ecc/assets/images/longform/04-model-selection.png +0 -0
  452. package/resources/local/ecc/assets/images/longform/05-pricing-table.png +0 -0
  453. package/resources/local/ecc/assets/images/longform/06-mgrep-benchmark.png +0 -0
  454. package/resources/local/ecc/assets/images/longform/07-boris-parallel.png +0 -0
  455. package/resources/local/ecc/assets/images/longform/08-two-terminals.png +0 -0
  456. package/resources/local/ecc/assets/images/longform/09-25k-stars.png +0 -0
  457. package/resources/local/ecc/assets/images/security/attack-chain.png +0 -0
  458. package/resources/local/ecc/assets/images/security/attack-vectors.png +0 -0
  459. package/resources/local/ecc/assets/images/security/ghostyy-overflow.jpeg +0 -0
  460. package/resources/local/ecc/assets/images/security/observability.png +0 -0
  461. package/resources/local/ecc/assets/images/security/sandboxing-brain.png +0 -0
  462. package/resources/local/ecc/assets/images/security/sandboxing-comparison.png +0 -0
  463. package/resources/local/ecc/assets/images/security/sandboxing.png +0 -0
  464. package/resources/local/ecc/assets/images/security/sanitization-utility.png +0 -0
  465. package/resources/local/ecc/assets/images/security/sanitization.png +0 -0
  466. package/resources/local/ecc/assets/images/security/security-guide-header.png +0 -0
  467. package/resources/local/ecc/assets/images/shortform/00-header.png +0 -0
  468. package/resources/local/ecc/assets/images/shortform/01-hackathon-tweet.png +0 -0
  469. package/resources/local/ecc/assets/images/shortform/02-chaining-commands.jpeg +0 -0
  470. package/resources/local/ecc/assets/images/shortform/03-posttooluse-hook.png +0 -0
  471. package/resources/local/ecc/assets/images/shortform/04-supabase-mcp.jpeg +0 -0
  472. package/resources/local/ecc/assets/images/shortform/05-plugins-interface.jpeg +0 -0
  473. package/resources/local/ecc/assets/images/shortform/06-marketplaces-mgrep.jpeg +0 -0
  474. package/resources/local/ecc/assets/images/shortform/07-tmux-video.mp4 +0 -0
  475. package/resources/local/ecc/assets/images/shortform/08-github-pr-review.jpeg +0 -0
  476. package/resources/local/ecc/assets/images/shortform/09-zed-editor.jpeg +0 -0
  477. package/resources/local/ecc/assets/images/shortform/10-vscode-extension.jpeg +0 -0
  478. package/resources/local/ecc/assets/images/shortform/11-statusline.jpeg +0 -0
  479. package/resources/local/ecc/commands/aside.md +164 -0
  480. package/resources/local/ecc/commands/auto-update.md +28 -0
  481. package/resources/local/ecc/commands/build-fix.md +66 -0
  482. package/resources/local/ecc/commands/checkpoint.md +78 -0
  483. package/resources/local/ecc/commands/code-review.md +289 -0
  484. package/resources/local/ecc/commands/cost-report.md +107 -0
  485. package/resources/local/ecc/commands/cpp-build.md +173 -0
  486. package/resources/local/ecc/commands/cpp-review.md +132 -0
  487. package/resources/local/ecc/commands/cpp-test.md +251 -0
  488. package/resources/local/ecc/commands/ecc-guide.md +93 -0
  489. package/resources/local/ecc/commands/evolve.md +178 -0
  490. package/resources/local/ecc/commands/fastapi-review.md +39 -0
  491. package/resources/local/ecc/commands/feature-dev.md +49 -0
  492. package/resources/local/ecc/commands/flutter-build.md +164 -0
  493. package/resources/local/ecc/commands/flutter-review.md +116 -0
  494. package/resources/local/ecc/commands/flutter-test.md +144 -0
  495. package/resources/local/ecc/commands/gan-build.md +103 -0
  496. package/resources/local/ecc/commands/gan-design.md +39 -0
  497. package/resources/local/ecc/commands/go-build.md +183 -0
  498. package/resources/local/ecc/commands/go-review.md +148 -0
  499. package/resources/local/ecc/commands/go-test.md +268 -0
  500. package/resources/local/ecc/commands/gradle-build.md +70 -0
  501. package/resources/local/ecc/commands/harness-audit.md +77 -0
  502. package/resources/local/ecc/commands/hookify-configure.md +14 -0
  503. package/resources/local/ecc/commands/hookify-help.md +46 -0
  504. package/resources/local/ecc/commands/hookify-list.md +21 -0
  505. package/resources/local/ecc/commands/hookify.md +50 -0
  506. package/resources/local/ecc/commands/instinct-export.md +66 -0
  507. package/resources/local/ecc/commands/instinct-import.md +114 -0
  508. package/resources/local/ecc/commands/instinct-status.md +59 -0
  509. package/resources/local/ecc/commands/jira.md +106 -0
  510. package/resources/local/ecc/commands/kotlin-build.md +174 -0
  511. package/resources/local/ecc/commands/kotlin-review.md +140 -0
  512. package/resources/local/ecc/commands/kotlin-test.md +312 -0
  513. package/resources/local/ecc/commands/learn-eval.md +116 -0
  514. package/resources/local/ecc/commands/learn.md +74 -0
  515. package/resources/local/ecc/commands/loop-start.md +36 -0
  516. package/resources/local/ecc/commands/loop-status.md +77 -0
  517. package/resources/local/ecc/commands/model-route.md +30 -0
  518. package/resources/local/ecc/commands/multi-backend.md +162 -0
  519. package/resources/local/ecc/commands/multi-execute.md +319 -0
  520. package/resources/local/ecc/commands/multi-frontend.md +162 -0
  521. package/resources/local/ecc/commands/multi-plan.md +272 -0
  522. package/resources/local/ecc/commands/multi-workflow.md +195 -0
  523. package/resources/local/ecc/commands/plan-prd.md +160 -0
  524. package/resources/local/ecc/commands/plan.md +200 -0
  525. package/resources/local/ecc/commands/pm2.md +276 -0
  526. package/resources/local/ecc/commands/pr.md +184 -0
  527. package/resources/local/ecc/commands/project-init.md +86 -0
  528. package/resources/local/ecc/commands/projects.md +39 -0
  529. package/resources/local/ecc/commands/promote.md +41 -0
  530. package/resources/local/ecc/commands/prp-commit.md +112 -0
  531. package/resources/local/ecc/commands/prp-implement.md +385 -0
  532. package/resources/local/ecc/commands/prp-plan.md +502 -0
  533. package/resources/local/ecc/commands/prp-pr.md +184 -0
  534. package/resources/local/ecc/commands/prp-prd.md +447 -0
  535. package/resources/local/ecc/commands/prune.md +31 -0
  536. package/resources/local/ecc/commands/python-review.md +297 -0
  537. package/resources/local/ecc/commands/quality-gate.md +33 -0
  538. package/resources/local/ecc/commands/refactor-clean.md +84 -0
  539. package/resources/local/ecc/commands/resume-session.md +156 -0
  540. package/resources/local/ecc/commands/review-pr.md +37 -0
  541. package/resources/local/ecc/commands/rust-build.md +187 -0
  542. package/resources/local/ecc/commands/rust-review.md +142 -0
  543. package/resources/local/ecc/commands/rust-test.md +308 -0
  544. package/resources/local/ecc/commands/santa-loop.md +175 -0
  545. package/resources/local/ecc/commands/save-session.md +275 -0
  546. package/resources/local/ecc/commands/security-scan.md +92 -0
  547. package/resources/local/ecc/commands/sessions.md +339 -0
  548. package/resources/local/ecc/commands/setup-pm.md +80 -0
  549. package/resources/local/ecc/commands/skill-create.md +174 -0
  550. package/resources/local/ecc/commands/skill-health.md +54 -0
  551. package/resources/local/ecc/commands/test-coverage.md +73 -0
  552. package/resources/local/ecc/commands/update-codemaps.md +76 -0
  553. package/resources/local/ecc/commands/update-docs.md +88 -0
  554. package/resources/local/ecc/commitlint.config.js +11 -0
  555. package/resources/local/ecc/config/project-stack-mappings.json +539 -0
  556. package/resources/local/ecc/contexts/dev.md +20 -0
  557. package/resources/local/ecc/contexts/research.md +26 -0
  558. package/resources/local/ecc/contexts/review.md +22 -0
  559. package/resources/local/ecc/docs/ANTIGRAVITY-GUIDE.md +156 -0
  560. package/resources/local/ecc/docs/ARCHITECTURE-IMPROVEMENTS.md +146 -0
  561. package/resources/local/ecc/docs/COMMAND-AGENT-MAP.md +67 -0
  562. package/resources/local/ecc/docs/COMMAND-REGISTRY.json +898 -0
  563. package/resources/local/ecc/docs/ECC-2.0-GA-ROADMAP.md +1026 -0
  564. package/resources/local/ecc/docs/ECC-2.0-REFERENCE-ARCHITECTURE.md +246 -0
  565. package/resources/local/ecc/docs/ECC-2.0-SESSION-ADAPTER-DISCOVERY.md +322 -0
  566. package/resources/local/ecc/docs/HERMES-OPENCLAW-MIGRATION.md +239 -0
  567. package/resources/local/ecc/docs/HERMES-SETUP.md +125 -0
  568. package/resources/local/ecc/docs/JOYCODE-GUIDE.md +55 -0
  569. package/resources/local/ecc/docs/MANUAL-ADAPTATION-GUIDE.md +214 -0
  570. package/resources/local/ecc/docs/MEGA-PLAN-REPO-PROMPTS-2026-03-12.md +286 -0
  571. package/resources/local/ecc/docs/PHASE1-ISSUE-BUNDLE-2026-03-12.md +272 -0
  572. package/resources/local/ecc/docs/PLAN-PRD-PATTERN.md +154 -0
  573. package/resources/local/ecc/docs/PR-399-REVIEW-2026-03-12.md +59 -0
  574. package/resources/local/ecc/docs/PR-QUEUE-TRIAGE-2026-03-13.md +355 -0
  575. package/resources/local/ecc/docs/QWEN-GUIDE.md +54 -0
  576. package/resources/local/ecc/docs/SELECTIVE-INSTALL-ARCHITECTURE.md +933 -0
  577. package/resources/local/ecc/docs/SELECTIVE-INSTALL-DESIGN.md +489 -0
  578. package/resources/local/ecc/docs/SESSION-ADAPTER-CONTRACT.md +293 -0
  579. package/resources/local/ecc/docs/SKILL-DEVELOPMENT-GUIDE.md +919 -0
  580. package/resources/local/ecc/docs/SKILL-PLACEMENT-POLICY.md +104 -0
  581. package/resources/local/ecc/docs/TROUBLESHOOTING.md +75 -0
  582. package/resources/local/ecc/docs/architecture/agentshield-enterprise-research-roadmap.md +373 -0
  583. package/resources/local/ecc/docs/architecture/cross-harness.md +133 -0
  584. package/resources/local/ecc/docs/architecture/discussion-response-playbook.md +90 -0
  585. package/resources/local/ecc/docs/architecture/evaluator-rag-prototype.md +158 -0
  586. package/resources/local/ecc/docs/architecture/harness-adapter-compliance.md +105 -0
  587. package/resources/local/ecc/docs/architecture/hud-status-session-control.md +80 -0
  588. package/resources/local/ecc/docs/architecture/observability-readiness.md +85 -0
  589. package/resources/local/ecc/docs/architecture/progress-sync-contract.md +67 -0
  590. package/resources/local/ecc/docs/business/metrics-and-sponsorship.md +74 -0
  591. package/resources/local/ecc/docs/business/social-launch-copy.md +72 -0
  592. package/resources/local/ecc/docs/capability-surface-selection.md +140 -0
  593. package/resources/local/ecc/docs/continuous-learning-v2-spec.md +14 -0
  594. package/resources/local/ecc/docs/drafts/release-1.10.1-announcement.md +63 -0
  595. package/resources/local/ecc/docs/examples/product-capability-template.md +84 -0
  596. package/resources/local/ecc/docs/examples/project-guidelines-template.md +347 -0
  597. package/resources/local/ecc/docs/fixes/HOOK-FIX-20260421-ADDENDUM.md +109 -0
  598. package/resources/local/ecc/docs/fixes/HOOK-FIX-20260421.md +144 -0
  599. package/resources/local/ecc/docs/fixes/INSTALL-HOOK-WRAPPER-FIX-20260422.md +66 -0
  600. package/resources/local/ecc/docs/fixes/PATCH-SETTINGS-SIMPLE-FIX-20260422.md +78 -0
  601. package/resources/local/ecc/docs/fixes/apply-hook-fix.sh +60 -0
  602. package/resources/local/ecc/docs/fixes/install_hook_wrapper.ps1 +167 -0
  603. package/resources/local/ecc/docs/fixes/patch_settings_cl_v2_simple.ps1 +187 -0
  604. package/resources/local/ecc/docs/hook-bug-workarounds.md +74 -0
  605. package/resources/local/ecc/docs/ja-JP/AGENTS.md +170 -0
  606. package/resources/local/ecc/docs/ja-JP/CHANGELOG.md +203 -0
  607. package/resources/local/ecc/docs/ja-JP/CLAUDE.md +81 -0
  608. package/resources/local/ecc/docs/ja-JP/CODE_OF_CONDUCT.md +82 -0
  609. package/resources/local/ecc/docs/ja-JP/COMMANDS-QUICK-REF.md +159 -0
  610. package/resources/local/ecc/docs/ja-JP/CONTRIBUTING.md +430 -0
  611. package/resources/local/ecc/docs/ja-JP/EVALUATION.md +122 -0
  612. package/resources/local/ecc/docs/ja-JP/GLOSSARY.md +53 -0
  613. package/resources/local/ecc/docs/ja-JP/README.md +799 -0
  614. package/resources/local/ecc/docs/ja-JP/RULES.md +38 -0
  615. package/resources/local/ecc/docs/ja-JP/SECURITY.md +101 -0
  616. package/resources/local/ecc/docs/ja-JP/SOUL.md +17 -0
  617. package/resources/local/ecc/docs/ja-JP/SPONSORING.md +43 -0
  618. package/resources/local/ecc/docs/ja-JP/SPONSORS.md +59 -0
  619. package/resources/local/ecc/docs/ja-JP/TROUBLESHOOTING.md +433 -0
  620. package/resources/local/ecc/docs/ja-JP/agents/a11y-architect.md +149 -0
  621. package/resources/local/ecc/docs/ja-JP/agents/architect.md +211 -0
  622. package/resources/local/ecc/docs/ja-JP/agents/build-error-resolver.md +534 -0
  623. package/resources/local/ecc/docs/ja-JP/agents/chief-of-staff.md +160 -0
  624. package/resources/local/ecc/docs/ja-JP/agents/code-architect.md +80 -0
  625. package/resources/local/ecc/docs/ja-JP/agents/code-explorer.md +78 -0
  626. package/resources/local/ecc/docs/ja-JP/agents/code-reviewer.md +104 -0
  627. package/resources/local/ecc/docs/ja-JP/agents/code-simplifier.md +56 -0
  628. package/resources/local/ecc/docs/ja-JP/agents/comment-analyzer.md +54 -0
  629. package/resources/local/ecc/docs/ja-JP/agents/conversation-analyzer.md +61 -0
  630. package/resources/local/ecc/docs/ja-JP/agents/cpp-build-resolver.md +99 -0
  631. package/resources/local/ecc/docs/ja-JP/agents/cpp-reviewer.md +81 -0
  632. package/resources/local/ecc/docs/ja-JP/agents/csharp-reviewer.md +110 -0
  633. package/resources/local/ecc/docs/ja-JP/agents/dart-build-resolver.md +210 -0
  634. package/resources/local/ecc/docs/ja-JP/agents/database-reviewer.md +654 -0
  635. package/resources/local/ecc/docs/ja-JP/agents/django-build-resolver.md +252 -0
  636. package/resources/local/ecc/docs/ja-JP/agents/django-reviewer.md +169 -0
  637. package/resources/local/ecc/docs/ja-JP/agents/doc-updater.md +452 -0
  638. package/resources/local/ecc/docs/ja-JP/agents/docs-lookup.md +77 -0
  639. package/resources/local/ecc/docs/ja-JP/agents/e2e-runner.md +636 -0
  640. package/resources/local/ecc/docs/ja-JP/agents/fastapi-reviewer.md +79 -0
  641. package/resources/local/ecc/docs/ja-JP/agents/flutter-reviewer.md +143 -0
  642. package/resources/local/ecc/docs/ja-JP/agents/fsharp-reviewer.md +100 -0
  643. package/resources/local/ecc/docs/ja-JP/agents/gan-evaluator.md +149 -0
  644. package/resources/local/ecc/docs/ja-JP/agents/gan-generator.md +93 -0
  645. package/resources/local/ecc/docs/ja-JP/agents/gan-planner.md +108 -0
  646. package/resources/local/ecc/docs/ja-JP/agents/go-build-resolver.md +368 -0
  647. package/resources/local/ecc/docs/ja-JP/agents/go-reviewer.md +269 -0
  648. package/resources/local/ecc/docs/ja-JP/agents/harmonyos-app-resolver.md +85 -0
  649. package/resources/local/ecc/docs/ja-JP/agents/harness-optimizer.md +44 -0
  650. package/resources/local/ecc/docs/ja-JP/agents/healthcare-reviewer.md +92 -0
  651. package/resources/local/ecc/docs/ja-JP/agents/homelab-architect.md +73 -0
  652. package/resources/local/ecc/docs/ja-JP/agents/java-build-resolver.md +87 -0
  653. package/resources/local/ecc/docs/ja-JP/agents/java-reviewer.md +73 -0
  654. package/resources/local/ecc/docs/ja-JP/agents/kotlin-build-resolver.md +70 -0
  655. package/resources/local/ecc/docs/ja-JP/agents/kotlin-reviewer.md +85 -0
  656. package/resources/local/ecc/docs/ja-JP/agents/loop-operator.md +45 -0
  657. package/resources/local/ecc/docs/ja-JP/agents/mle-reviewer.md +162 -0
  658. package/resources/local/ecc/docs/ja-JP/agents/network-architect.md +90 -0
  659. package/resources/local/ecc/docs/ja-JP/agents/network-config-reviewer.md +95 -0
  660. package/resources/local/ecc/docs/ja-JP/agents/network-troubleshooter.md +120 -0
  661. package/resources/local/ecc/docs/ja-JP/agents/opensource-forker.md +207 -0
  662. package/resources/local/ecc/docs/ja-JP/agents/opensource-packager.md +258 -0
  663. package/resources/local/ecc/docs/ja-JP/agents/opensource-sanitizer.md +197 -0
  664. package/resources/local/ecc/docs/ja-JP/agents/performance-optimizer.md +455 -0
  665. package/resources/local/ecc/docs/ja-JP/agents/planner.md +119 -0
  666. package/resources/local/ecc/docs/ja-JP/agents/pr-test-analyzer.md +54 -0
  667. package/resources/local/ecc/docs/ja-JP/agents/python-reviewer.md +469 -0
  668. package/resources/local/ecc/docs/ja-JP/agents/pytorch-build-resolver.md +125 -0
  669. package/resources/local/ecc/docs/ja-JP/agents/refactor-cleaner.md +306 -0
  670. package/resources/local/ecc/docs/ja-JP/agents/rust-build-resolver.md +157 -0
  671. package/resources/local/ecc/docs/ja-JP/agents/rust-reviewer.md +103 -0
  672. package/resources/local/ecc/docs/ja-JP/agents/security-reviewer.md +545 -0
  673. package/resources/local/ecc/docs/ja-JP/agents/seo-specialist.md +71 -0
  674. package/resources/local/ecc/docs/ja-JP/agents/silent-failure-hunter.md +59 -0
  675. package/resources/local/ecc/docs/ja-JP/agents/swift-build-resolver.md +170 -0
  676. package/resources/local/ecc/docs/ja-JP/agents/swift-reviewer.md +116 -0
  677. package/resources/local/ecc/docs/ja-JP/agents/tdd-guide.md +280 -0
  678. package/resources/local/ecc/docs/ja-JP/agents/type-design-analyzer.md +50 -0
  679. package/resources/local/ecc/docs/ja-JP/agents/typescript-reviewer.md +121 -0
  680. package/resources/local/ecc/docs/ja-JP/commands/README.md +113 -0
  681. package/resources/local/ecc/docs/ja-JP/commands/aside.md +166 -0
  682. package/resources/local/ecc/docs/ja-JP/commands/auto-update.md +28 -0
  683. package/resources/local/ecc/docs/ja-JP/commands/build-fix.md +29 -0
  684. package/resources/local/ecc/docs/ja-JP/commands/checkpoint.md +78 -0
  685. package/resources/local/ecc/docs/ja-JP/commands/claw.md +51 -0
  686. package/resources/local/ecc/docs/ja-JP/commands/code-review.md +43 -0
  687. package/resources/local/ecc/docs/ja-JP/commands/context-budget.md +29 -0
  688. package/resources/local/ecc/docs/ja-JP/commands/cost-report.md +99 -0
  689. package/resources/local/ecc/docs/ja-JP/commands/cpp-build.md +78 -0
  690. package/resources/local/ecc/docs/ja-JP/commands/cpp-review.md +82 -0
  691. package/resources/local/ecc/docs/ja-JP/commands/cpp-test.md +128 -0
  692. package/resources/local/ecc/docs/ja-JP/commands/devfleet.md +93 -0
  693. package/resources/local/ecc/docs/ja-JP/commands/docs.md +32 -0
  694. package/resources/local/ecc/docs/ja-JP/commands/e2e.md +370 -0
  695. package/resources/local/ecc/docs/ja-JP/commands/ecc-guide.md +93 -0
  696. package/resources/local/ecc/docs/ja-JP/commands/eval.md +120 -0
  697. package/resources/local/ecc/docs/ja-JP/commands/evolve.md +193 -0
  698. package/resources/local/ecc/docs/ja-JP/commands/fastapi-review.md +39 -0
  699. package/resources/local/ecc/docs/ja-JP/commands/feature-dev.md +49 -0
  700. package/resources/local/ecc/docs/ja-JP/commands/flutter-build.md +79 -0
  701. package/resources/local/ecc/docs/ja-JP/commands/flutter-review.md +116 -0
  702. package/resources/local/ecc/docs/ja-JP/commands/flutter-test.md +144 -0
  703. package/resources/local/ecc/docs/ja-JP/commands/gan-build.md +103 -0
  704. package/resources/local/ecc/docs/ja-JP/commands/gan-design.md +39 -0
  705. package/resources/local/ecc/docs/ja-JP/commands/go-build.md +183 -0
  706. package/resources/local/ecc/docs/ja-JP/commands/go-review.md +148 -0
  707. package/resources/local/ecc/docs/ja-JP/commands/go-test.md +268 -0
  708. package/resources/local/ecc/docs/ja-JP/commands/gradle-build.md +70 -0
  709. package/resources/local/ecc/docs/ja-JP/commands/harness-audit.md +77 -0
  710. package/resources/local/ecc/docs/ja-JP/commands/hookify-configure.md +14 -0
  711. package/resources/local/ecc/docs/ja-JP/commands/hookify-help.md +46 -0
  712. package/resources/local/ecc/docs/ja-JP/commands/hookify-list.md +21 -0
  713. package/resources/local/ecc/docs/ja-JP/commands/hookify.md +50 -0
  714. package/resources/local/ecc/docs/ja-JP/commands/instinct-export.md +91 -0
  715. package/resources/local/ecc/docs/ja-JP/commands/instinct-import.md +142 -0
  716. package/resources/local/ecc/docs/ja-JP/commands/instinct-status.md +86 -0
  717. package/resources/local/ecc/docs/ja-JP/commands/jira.md +106 -0
  718. package/resources/local/ecc/docs/ja-JP/commands/kotlin-build.md +174 -0
  719. package/resources/local/ecc/docs/ja-JP/commands/kotlin-review.md +140 -0
  720. package/resources/local/ecc/docs/ja-JP/commands/kotlin-test.md +312 -0
  721. package/resources/local/ecc/docs/ja-JP/commands/learn-eval.md +116 -0
  722. package/resources/local/ecc/docs/ja-JP/commands/learn.md +70 -0
  723. package/resources/local/ecc/docs/ja-JP/commands/loop-start.md +36 -0
  724. package/resources/local/ecc/docs/ja-JP/commands/loop-status.md +58 -0
  725. package/resources/local/ecc/docs/ja-JP/commands/model-route.md +30 -0
  726. package/resources/local/ecc/docs/ja-JP/commands/multi-backend.md +158 -0
  727. package/resources/local/ecc/docs/ja-JP/commands/multi-execute.md +315 -0
  728. package/resources/local/ecc/docs/ja-JP/commands/multi-frontend.md +158 -0
  729. package/resources/local/ecc/docs/ja-JP/commands/multi-plan.md +268 -0
  730. package/resources/local/ecc/docs/ja-JP/commands/multi-workflow.md +183 -0
  731. package/resources/local/ecc/docs/ja-JP/commands/orchestrate.md +172 -0
  732. package/resources/local/ecc/docs/ja-JP/commands/plan-prd.md +160 -0
  733. package/resources/local/ecc/docs/ja-JP/commands/plan.md +200 -0
  734. package/resources/local/ecc/docs/ja-JP/commands/pm2.md +272 -0
  735. package/resources/local/ecc/docs/ja-JP/commands/pr.md +184 -0
  736. package/resources/local/ecc/docs/ja-JP/commands/project-init.md +86 -0
  737. package/resources/local/ecc/docs/ja-JP/commands/projects.md +39 -0
  738. package/resources/local/ecc/docs/ja-JP/commands/promote.md +41 -0
  739. package/resources/local/ecc/docs/ja-JP/commands/prompt-optimize.md +37 -0
  740. package/resources/local/ecc/docs/ja-JP/commands/prp-commit.md +112 -0
  741. package/resources/local/ecc/docs/ja-JP/commands/prp-implement.md +385 -0
  742. package/resources/local/ecc/docs/ja-JP/commands/prp-plan.md +502 -0
  743. package/resources/local/ecc/docs/ja-JP/commands/prp-pr.md +184 -0
  744. package/resources/local/ecc/docs/ja-JP/commands/prp-prd.md +447 -0
  745. package/resources/local/ecc/docs/ja-JP/commands/prune.md +31 -0
  746. package/resources/local/ecc/docs/ja-JP/commands/python-review.md +297 -0
  747. package/resources/local/ecc/docs/ja-JP/commands/quality-gate.md +33 -0
  748. package/resources/local/ecc/docs/ja-JP/commands/refactor-clean.md +28 -0
  749. package/resources/local/ecc/docs/ja-JP/commands/resume-session.md +156 -0
  750. package/resources/local/ecc/docs/ja-JP/commands/review-pr.md +37 -0
  751. package/resources/local/ecc/docs/ja-JP/commands/rules-distill.md +11 -0
  752. package/resources/local/ecc/docs/ja-JP/commands/rust-build.md +187 -0
  753. package/resources/local/ecc/docs/ja-JP/commands/rust-review.md +142 -0
  754. package/resources/local/ecc/docs/ja-JP/commands/rust-test.md +308 -0
  755. package/resources/local/ecc/docs/ja-JP/commands/santa-loop.md +175 -0
  756. package/resources/local/ecc/docs/ja-JP/commands/save-session.md +276 -0
  757. package/resources/local/ecc/docs/ja-JP/commands/security-scan.md +92 -0
  758. package/resources/local/ecc/docs/ja-JP/commands/sessions.md +305 -0
  759. package/resources/local/ecc/docs/ja-JP/commands/setup-pm.md +80 -0
  760. package/resources/local/ecc/docs/ja-JP/commands/skill-create.md +174 -0
  761. package/resources/local/ecc/docs/ja-JP/commands/skill-health.md +54 -0
  762. package/resources/local/ecc/docs/ja-JP/commands/tdd.md +326 -0
  763. package/resources/local/ecc/docs/ja-JP/commands/test-coverage.md +27 -0
  764. package/resources/local/ecc/docs/ja-JP/commands/update-codemaps.md +17 -0
  765. package/resources/local/ecc/docs/ja-JP/commands/update-docs.md +31 -0
  766. package/resources/local/ecc/docs/ja-JP/commands/verify.md +59 -0
  767. package/resources/local/ecc/docs/ja-JP/contexts/dev.md +20 -0
  768. package/resources/local/ecc/docs/ja-JP/contexts/research.md +26 -0
  769. package/resources/local/ecc/docs/ja-JP/contexts/review.md +22 -0
  770. package/resources/local/ecc/docs/ja-JP/examples/CLAUDE.md +109 -0
  771. package/resources/local/ecc/docs/ja-JP/examples/django-api-CLAUDE.md +308 -0
  772. package/resources/local/ecc/docs/ja-JP/examples/go-microservice-CLAUDE.md +267 -0
  773. package/resources/local/ecc/docs/ja-JP/examples/harmonyos-app-CLAUDE.md +88 -0
  774. package/resources/local/ecc/docs/ja-JP/examples/laravel-api-CLAUDE.md +311 -0
  775. package/resources/local/ecc/docs/ja-JP/examples/rust-api-CLAUDE.md +285 -0
  776. package/resources/local/ecc/docs/ja-JP/examples/saas-nextjs-CLAUDE.md +166 -0
  777. package/resources/local/ecc/docs/ja-JP/examples/user-CLAUDE.md +109 -0
  778. package/resources/local/ecc/docs/ja-JP/hooks/README.md +249 -0
  779. package/resources/local/ecc/docs/ja-JP/plugins/README.md +87 -0
  780. package/resources/local/ecc/docs/ja-JP/rules/README.md +81 -0
  781. package/resources/local/ecc/docs/ja-JP/rules/angular/coding-style.md +182 -0
  782. package/resources/local/ecc/docs/ja-JP/rules/angular/hooks.md +25 -0
  783. package/resources/local/ecc/docs/ja-JP/rules/angular/patterns.md +249 -0
  784. package/resources/local/ecc/docs/ja-JP/rules/angular/security.md +87 -0
  785. package/resources/local/ecc/docs/ja-JP/rules/angular/testing.md +164 -0
  786. package/resources/local/ecc/docs/ja-JP/rules/arkts/coding-style.md +153 -0
  787. package/resources/local/ecc/docs/ja-JP/rules/arkts/hooks.md +135 -0
  788. package/resources/local/ecc/docs/ja-JP/rules/arkts/patterns.md +236 -0
  789. package/resources/local/ecc/docs/ja-JP/rules/arkts/security.md +141 -0
  790. package/resources/local/ecc/docs/ja-JP/rules/arkts/testing.md +126 -0
  791. package/resources/local/ecc/docs/ja-JP/rules/common/agents.md +49 -0
  792. package/resources/local/ecc/docs/ja-JP/rules/common/code-review.md +124 -0
  793. package/resources/local/ecc/docs/ja-JP/rules/common/coding-style.md +48 -0
  794. package/resources/local/ecc/docs/ja-JP/rules/common/development-workflow.md +44 -0
  795. package/resources/local/ecc/docs/ja-JP/rules/common/git-workflow.md +45 -0
  796. package/resources/local/ecc/docs/ja-JP/rules/common/hooks.md +30 -0
  797. package/resources/local/ecc/docs/ja-JP/rules/common/patterns.md +31 -0
  798. package/resources/local/ecc/docs/ja-JP/rules/common/performance.md +55 -0
  799. package/resources/local/ecc/docs/ja-JP/rules/common/security.md +29 -0
  800. package/resources/local/ecc/docs/ja-JP/rules/common/testing.md +29 -0
  801. package/resources/local/ecc/docs/ja-JP/rules/cpp/coding-style.md +44 -0
  802. package/resources/local/ecc/docs/ja-JP/rules/cpp/hooks.md +39 -0
  803. package/resources/local/ecc/docs/ja-JP/rules/cpp/patterns.md +51 -0
  804. package/resources/local/ecc/docs/ja-JP/rules/cpp/security.md +51 -0
  805. package/resources/local/ecc/docs/ja-JP/rules/cpp/testing.md +44 -0
  806. package/resources/local/ecc/docs/ja-JP/rules/csharp/coding-style.md +72 -0
  807. package/resources/local/ecc/docs/ja-JP/rules/csharp/hooks.md +25 -0
  808. package/resources/local/ecc/docs/ja-JP/rules/csharp/patterns.md +50 -0
  809. package/resources/local/ecc/docs/ja-JP/rules/csharp/security.md +58 -0
  810. package/resources/local/ecc/docs/ja-JP/rules/csharp/testing.md +46 -0
  811. package/resources/local/ecc/docs/ja-JP/rules/dart/coding-style.md +159 -0
  812. package/resources/local/ecc/docs/ja-JP/rules/dart/hooks.md +66 -0
  813. package/resources/local/ecc/docs/ja-JP/rules/dart/patterns.md +261 -0
  814. package/resources/local/ecc/docs/ja-JP/rules/dart/security.md +135 -0
  815. package/resources/local/ecc/docs/ja-JP/rules/dart/testing.md +215 -0
  816. package/resources/local/ecc/docs/ja-JP/rules/fsharp/coding-style.md +112 -0
  817. package/resources/local/ecc/docs/ja-JP/rules/fsharp/hooks.md +26 -0
  818. package/resources/local/ecc/docs/ja-JP/rules/fsharp/patterns.md +111 -0
  819. package/resources/local/ecc/docs/ja-JP/rules/fsharp/security.md +76 -0
  820. package/resources/local/ecc/docs/ja-JP/rules/fsharp/testing.md +62 -0
  821. package/resources/local/ecc/docs/ja-JP/rules/golang/coding-style.md +32 -0
  822. package/resources/local/ecc/docs/ja-JP/rules/golang/hooks.md +17 -0
  823. package/resources/local/ecc/docs/ja-JP/rules/golang/patterns.md +45 -0
  824. package/resources/local/ecc/docs/ja-JP/rules/golang/security.md +34 -0
  825. package/resources/local/ecc/docs/ja-JP/rules/golang/testing.md +31 -0
  826. package/resources/local/ecc/docs/ja-JP/rules/java/coding-style.md +114 -0
  827. package/resources/local/ecc/docs/ja-JP/rules/java/hooks.md +18 -0
  828. package/resources/local/ecc/docs/ja-JP/rules/java/patterns.md +147 -0
  829. package/resources/local/ecc/docs/ja-JP/rules/java/security.md +101 -0
  830. package/resources/local/ecc/docs/ja-JP/rules/java/testing.md +133 -0
  831. package/resources/local/ecc/docs/ja-JP/rules/kotlin/coding-style.md +86 -0
  832. package/resources/local/ecc/docs/ja-JP/rules/kotlin/hooks.md +17 -0
  833. package/resources/local/ecc/docs/ja-JP/rules/kotlin/patterns.md +146 -0
  834. package/resources/local/ecc/docs/ja-JP/rules/kotlin/security.md +82 -0
  835. package/resources/local/ecc/docs/ja-JP/rules/kotlin/testing.md +128 -0
  836. package/resources/local/ecc/docs/ja-JP/rules/perl/coding-style.md +46 -0
  837. package/resources/local/ecc/docs/ja-JP/rules/perl/hooks.md +22 -0
  838. package/resources/local/ecc/docs/ja-JP/rules/perl/patterns.md +76 -0
  839. package/resources/local/ecc/docs/ja-JP/rules/perl/security.md +69 -0
  840. package/resources/local/ecc/docs/ja-JP/rules/perl/testing.md +54 -0
  841. package/resources/local/ecc/docs/ja-JP/rules/php/coding-style.md +40 -0
  842. package/resources/local/ecc/docs/ja-JP/rules/php/hooks.md +24 -0
  843. package/resources/local/ecc/docs/ja-JP/rules/php/patterns.md +33 -0
  844. package/resources/local/ecc/docs/ja-JP/rules/php/security.md +37 -0
  845. package/resources/local/ecc/docs/ja-JP/rules/php/testing.md +39 -0
  846. package/resources/local/ecc/docs/ja-JP/rules/python/coding-style.md +42 -0
  847. package/resources/local/ecc/docs/ja-JP/rules/python/fastapi.md +58 -0
  848. package/resources/local/ecc/docs/ja-JP/rules/python/hooks.md +19 -0
  849. package/resources/local/ecc/docs/ja-JP/rules/python/patterns.md +39 -0
  850. package/resources/local/ecc/docs/ja-JP/rules/python/security.md +30 -0
  851. package/resources/local/ecc/docs/ja-JP/rules/python/testing.md +38 -0
  852. package/resources/local/ecc/docs/ja-JP/rules/ruby/coding-style.md +46 -0
  853. package/resources/local/ecc/docs/ja-JP/rules/ruby/hooks.md +37 -0
  854. package/resources/local/ecc/docs/ja-JP/rules/ruby/patterns.md +44 -0
  855. package/resources/local/ecc/docs/ja-JP/rules/ruby/security.md +51 -0
  856. package/resources/local/ecc/docs/ja-JP/rules/ruby/testing.md +51 -0
  857. package/resources/local/ecc/docs/ja-JP/rules/rust/coding-style.md +151 -0
  858. package/resources/local/ecc/docs/ja-JP/rules/rust/hooks.md +16 -0
  859. package/resources/local/ecc/docs/ja-JP/rules/rust/patterns.md +168 -0
  860. package/resources/local/ecc/docs/ja-JP/rules/rust/security.md +141 -0
  861. package/resources/local/ecc/docs/ja-JP/rules/rust/testing.md +154 -0
  862. package/resources/local/ecc/docs/ja-JP/rules/swift/coding-style.md +47 -0
  863. package/resources/local/ecc/docs/ja-JP/rules/swift/hooks.md +20 -0
  864. package/resources/local/ecc/docs/ja-JP/rules/swift/patterns.md +66 -0
  865. package/resources/local/ecc/docs/ja-JP/rules/swift/security.md +33 -0
  866. package/resources/local/ecc/docs/ja-JP/rules/swift/testing.md +45 -0
  867. package/resources/local/ecc/docs/ja-JP/rules/typescript/coding-style.md +199 -0
  868. package/resources/local/ecc/docs/ja-JP/rules/typescript/hooks.md +22 -0
  869. package/resources/local/ecc/docs/ja-JP/rules/typescript/patterns.md +52 -0
  870. package/resources/local/ecc/docs/ja-JP/rules/typescript/security.md +28 -0
  871. package/resources/local/ecc/docs/ja-JP/rules/typescript/testing.md +18 -0
  872. package/resources/local/ecc/docs/ja-JP/rules/web/coding-style.md +96 -0
  873. package/resources/local/ecc/docs/ja-JP/rules/web/design-quality.md +63 -0
  874. package/resources/local/ecc/docs/ja-JP/rules/web/hooks.md +129 -0
  875. package/resources/local/ecc/docs/ja-JP/rules/web/patterns.md +79 -0
  876. package/resources/local/ecc/docs/ja-JP/rules/web/performance.md +64 -0
  877. package/resources/local/ecc/docs/ja-JP/rules/web/security.md +57 -0
  878. package/resources/local/ecc/docs/ja-JP/rules/web/testing.md +55 -0
  879. package/resources/local/ecc/docs/ja-JP/skills/README.md +109 -0
  880. package/resources/local/ecc/docs/ja-JP/skills/accessibility/SKILL.md +145 -0
  881. package/resources/local/ecc/docs/ja-JP/skills/agent-architecture-audit/SKILL.md +256 -0
  882. package/resources/local/ecc/docs/ja-JP/skills/agent-eval/SKILL.md +145 -0
  883. package/resources/local/ecc/docs/ja-JP/skills/agent-harness-construction/SKILL.md +73 -0
  884. package/resources/local/ecc/docs/ja-JP/skills/agent-introspection-debugging/SKILL.md +153 -0
  885. package/resources/local/ecc/docs/ja-JP/skills/agent-payment-x402/SKILL.md +224 -0
  886. package/resources/local/ecc/docs/ja-JP/skills/agent-sort/SKILL.md +215 -0
  887. package/resources/local/ecc/docs/ja-JP/skills/agentic-engineering/SKILL.md +63 -0
  888. package/resources/local/ecc/docs/ja-JP/skills/agentic-os/SKILL.md +387 -0
  889. package/resources/local/ecc/docs/ja-JP/skills/ai-first-engineering/SKILL.md +51 -0
  890. package/resources/local/ecc/docs/ja-JP/skills/ai-regression-testing/SKILL.md +385 -0
  891. package/resources/local/ecc/docs/ja-JP/skills/android-clean-architecture/SKILL.md +339 -0
  892. package/resources/local/ecc/docs/ja-JP/skills/angular-developer/SKILL.md +154 -0
  893. package/resources/local/ecc/docs/ja-JP/skills/api-connector-builder/SKILL.md +120 -0
  894. package/resources/local/ecc/docs/ja-JP/skills/api-design/SKILL.md +457 -0
  895. package/resources/local/ecc/docs/ja-JP/skills/architecture-decision-records/SKILL.md +179 -0
  896. package/resources/local/ecc/docs/ja-JP/skills/article-writing/SKILL.md +79 -0
  897. package/resources/local/ecc/docs/ja-JP/skills/automation-audit-ops/SKILL.md +142 -0
  898. package/resources/local/ecc/docs/ja-JP/skills/autonomous-agent-harness/SKILL.md +103 -0
  899. package/resources/local/ecc/docs/ja-JP/skills/autonomous-loops/SKILL.md +77 -0
  900. package/resources/local/ecc/docs/ja-JP/skills/backend-patterns/SKILL.md +587 -0
  901. package/resources/local/ecc/docs/ja-JP/skills/benchmark/SKILL.md +93 -0
  902. package/resources/local/ecc/docs/ja-JP/skills/blueprint/SKILL.md +61 -0
  903. package/resources/local/ecc/docs/ja-JP/skills/brand-voice/SKILL.md +79 -0
  904. package/resources/local/ecc/docs/ja-JP/skills/browser-qa/SKILL.md +84 -0
  905. package/resources/local/ecc/docs/ja-JP/skills/bun-runtime/SKILL.md +70 -0
  906. package/resources/local/ecc/docs/ja-JP/skills/canary-watch/SKILL.md +96 -0
  907. package/resources/local/ecc/docs/ja-JP/skills/carrier-relationship-management/SKILL.md +60 -0
  908. package/resources/local/ecc/docs/ja-JP/skills/cisco-ios-patterns/SKILL.md +92 -0
  909. package/resources/local/ecc/docs/ja-JP/skills/ck/SKILL.md +99 -0
  910. package/resources/local/ecc/docs/ja-JP/skills/claude-devfleet/SKILL.md +69 -0
  911. package/resources/local/ecc/docs/ja-JP/skills/click-path-audit/SKILL.md +85 -0
  912. package/resources/local/ecc/docs/ja-JP/skills/clickhouse-io/SKILL.md +429 -0
  913. package/resources/local/ecc/docs/ja-JP/skills/code-tour/SKILL.md +57 -0
  914. package/resources/local/ecc/docs/ja-JP/skills/codebase-onboarding/SKILL.md +58 -0
  915. package/resources/local/ecc/docs/ja-JP/skills/coding-standards/SKILL.md +527 -0
  916. package/resources/local/ecc/docs/ja-JP/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  917. package/resources/local/ecc/docs/ja-JP/skills/configure-ecc/SKILL.md +313 -0
  918. package/resources/local/ecc/docs/ja-JP/skills/connections-optimizer/SKILL.md +189 -0
  919. package/resources/local/ecc/docs/ja-JP/skills/content-engine/SKILL.md +131 -0
  920. package/resources/local/ecc/docs/ja-JP/skills/content-hash-cache-pattern/SKILL.md +161 -0
  921. package/resources/local/ecc/docs/ja-JP/skills/context-budget/SKILL.md +135 -0
  922. package/resources/local/ecc/docs/ja-JP/skills/continuous-agent-loop/SKILL.md +45 -0
  923. package/resources/local/ecc/docs/ja-JP/skills/continuous-learning/SKILL.md +110 -0
  924. package/resources/local/ecc/docs/ja-JP/skills/continuous-learning-v2/SKILL.md +268 -0
  925. package/resources/local/ecc/docs/ja-JP/skills/continuous-learning-v2/agents/observer.md +137 -0
  926. package/resources/local/ecc/docs/ja-JP/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  927. package/resources/local/ecc/docs/ja-JP/skills/cost-tracking/SKILL.md +137 -0
  928. package/resources/local/ecc/docs/ja-JP/skills/council/SKILL.md +203 -0
  929. package/resources/local/ecc/docs/ja-JP/skills/cpp-coding-standards/SKILL.md +49 -0
  930. package/resources/local/ecc/docs/ja-JP/skills/cpp-testing/SKILL.md +322 -0
  931. package/resources/local/ecc/docs/ja-JP/skills/crosspost/SKILL.md +111 -0
  932. package/resources/local/ecc/docs/ja-JP/skills/csharp-testing/SKILL.md +321 -0
  933. package/resources/local/ecc/docs/ja-JP/skills/customer-billing-ops/SKILL.md +140 -0
  934. package/resources/local/ecc/docs/ja-JP/skills/customs-trade-compliance/SKILL.md +46 -0
  935. package/resources/local/ecc/docs/ja-JP/skills/dart-flutter-patterns/SKILL.md +53 -0
  936. package/resources/local/ecc/docs/ja-JP/skills/dashboard-builder/SKILL.md +58 -0
  937. package/resources/local/ecc/docs/ja-JP/skills/data-scraper-agent/SKILL.md +57 -0
  938. package/resources/local/ecc/docs/ja-JP/skills/database-migrations/SKILL.md +54 -0
  939. package/resources/local/ecc/docs/ja-JP/skills/deep-research/SKILL.md +33 -0
  940. package/resources/local/ecc/docs/ja-JP/skills/defi-amm-security/SKILL.md +46 -0
  941. package/resources/local/ecc/docs/ja-JP/skills/deployment-patterns/SKILL.md +50 -0
  942. package/resources/local/ecc/docs/ja-JP/skills/design-system/SKILL.md +53 -0
  943. package/resources/local/ecc/docs/ja-JP/skills/django-celery/SKILL.md +72 -0
  944. package/resources/local/ecc/docs/ja-JP/skills/django-patterns/SKILL.md +733 -0
  945. package/resources/local/ecc/docs/ja-JP/skills/django-security/SKILL.md +592 -0
  946. package/resources/local/ecc/docs/ja-JP/skills/django-tdd/SKILL.md +728 -0
  947. package/resources/local/ecc/docs/ja-JP/skills/django-verification/SKILL.md +460 -0
  948. package/resources/local/ecc/docs/ja-JP/skills/dmux-workflows/SKILL.md +68 -0
  949. package/resources/local/ecc/docs/ja-JP/skills/docker-patterns/SKILL.md +93 -0
  950. package/resources/local/ecc/docs/ja-JP/skills/documentation-lookup/SKILL.md +77 -0
  951. package/resources/local/ecc/docs/ja-JP/skills/dotnet-patterns/SKILL.md +321 -0
  952. package/resources/local/ecc/docs/ja-JP/skills/e2e-testing/SKILL.md +326 -0
  953. package/resources/local/ecc/docs/ja-JP/skills/ecc-guide/SKILL.md +189 -0
  954. package/resources/local/ecc/docs/ja-JP/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  955. package/resources/local/ecc/docs/ja-JP/skills/email-ops/SKILL.md +121 -0
  956. package/resources/local/ecc/docs/ja-JP/skills/energy-procurement/SKILL.md +228 -0
  957. package/resources/local/ecc/docs/ja-JP/skills/enterprise-agent-ops/SKILL.md +50 -0
  958. package/resources/local/ecc/docs/ja-JP/skills/error-handling/SKILL.md +376 -0
  959. package/resources/local/ecc/docs/ja-JP/skills/eval-harness/SKILL.md +227 -0
  960. package/resources/local/ecc/docs/ja-JP/skills/evm-token-decimals/SKILL.md +130 -0
  961. package/resources/local/ecc/docs/ja-JP/skills/exa-search/SKILL.md +105 -0
  962. package/resources/local/ecc/docs/ja-JP/skills/fal-ai-media/SKILL.md +286 -0
  963. package/resources/local/ecc/docs/ja-JP/skills/fastapi-patterns/SKILL.md +327 -0
  964. package/resources/local/ecc/docs/ja-JP/skills/finance-billing-ops/SKILL.md +127 -0
  965. package/resources/local/ecc/docs/ja-JP/skills/flox-environments/SKILL.md +496 -0
  966. package/resources/local/ecc/docs/ja-JP/skills/flutter-dart-code-review/SKILL.md +435 -0
  967. package/resources/local/ecc/docs/ja-JP/skills/foundation-models-on-device/SKILL.md +243 -0
  968. package/resources/local/ecc/docs/ja-JP/skills/frontend-design-direction/SKILL.md +92 -0
  969. package/resources/local/ecc/docs/ja-JP/skills/frontend-patterns/SKILL.md +631 -0
  970. package/resources/local/ecc/docs/ja-JP/skills/frontend-slides/SKILL.md +184 -0
  971. package/resources/local/ecc/docs/ja-JP/skills/frontend-slides/STYLE_PRESETS.md +333 -0
  972. package/resources/local/ecc/docs/ja-JP/skills/fsharp-testing/SKILL.md +280 -0
  973. package/resources/local/ecc/docs/ja-JP/skills/gan-style-harness/SKILL.md +278 -0
  974. package/resources/local/ecc/docs/ja-JP/skills/gateguard/SKILL.md +125 -0
  975. package/resources/local/ecc/docs/ja-JP/skills/git-workflow/SKILL.md +715 -0
  976. package/resources/local/ecc/docs/ja-JP/skills/github-ops/SKILL.md +144 -0
  977. package/resources/local/ecc/docs/ja-JP/skills/golang-patterns/SKILL.md +673 -0
  978. package/resources/local/ecc/docs/ja-JP/skills/golang-testing/SKILL.md +959 -0
  979. package/resources/local/ecc/docs/ja-JP/skills/google-workspace-ops/SKILL.md +95 -0
  980. package/resources/local/ecc/docs/ja-JP/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  981. package/resources/local/ecc/docs/ja-JP/skills/healthcare-emr-patterns/SKILL.md +159 -0
  982. package/resources/local/ecc/docs/ja-JP/skills/healthcare-eval-harness/SKILL.md +207 -0
  983. package/resources/local/ecc/docs/ja-JP/skills/healthcare-phi-compliance/SKILL.md +145 -0
  984. package/resources/local/ecc/docs/ja-JP/skills/hermes-imports/SKILL.md +88 -0
  985. package/resources/local/ecc/docs/ja-JP/skills/hexagonal-architecture/SKILL.md +276 -0
  986. package/resources/local/ecc/docs/ja-JP/skills/hipaa-compliance/SKILL.md +78 -0
  987. package/resources/local/ecc/docs/ja-JP/skills/homelab-network-readiness/SKILL.md +169 -0
  988. package/resources/local/ecc/docs/ja-JP/skills/homelab-network-setup/SKILL.md +129 -0
  989. package/resources/local/ecc/docs/ja-JP/skills/homelab-pihole-dns/SKILL.md +274 -0
  990. package/resources/local/ecc/docs/ja-JP/skills/homelab-vlan-segmentation/SKILL.md +311 -0
  991. package/resources/local/ecc/docs/ja-JP/skills/homelab-wireguard-vpn/SKILL.md +305 -0
  992. package/resources/local/ecc/docs/ja-JP/skills/hookify-rules/SKILL.md +128 -0
  993. package/resources/local/ecc/docs/ja-JP/skills/inventory-demand-planning/SKILL.md +247 -0
  994. package/resources/local/ecc/docs/ja-JP/skills/investor-materials/SKILL.md +96 -0
  995. package/resources/local/ecc/docs/ja-JP/skills/investor-outreach/SKILL.md +91 -0
  996. package/resources/local/ecc/docs/ja-JP/skills/ios-icon-gen/SKILL.md +157 -0
  997. package/resources/local/ecc/docs/ja-JP/skills/iterative-retrieval/SKILL.md +202 -0
  998. package/resources/local/ecc/docs/ja-JP/skills/java-coding-standards/SKILL.md +138 -0
  999. package/resources/local/ecc/docs/ja-JP/skills/jira-integration/SKILL.md +293 -0
  1000. package/resources/local/ecc/docs/ja-JP/skills/jpa-patterns/SKILL.md +141 -0
  1001. package/resources/local/ecc/docs/ja-JP/skills/knowledge-ops/SKILL.md +154 -0
  1002. package/resources/local/ecc/docs/ja-JP/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  1003. package/resources/local/ecc/docs/ja-JP/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  1004. package/resources/local/ecc/docs/ja-JP/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  1005. package/resources/local/ecc/docs/ja-JP/skills/kotlin-patterns/SKILL.md +711 -0
  1006. package/resources/local/ecc/docs/ja-JP/skills/kotlin-testing/SKILL.md +824 -0
  1007. package/resources/local/ecc/docs/ja-JP/skills/laravel-patterns/SKILL.md +415 -0
  1008. package/resources/local/ecc/docs/ja-JP/skills/laravel-plugin-discovery/SKILL.md +229 -0
  1009. package/resources/local/ecc/docs/ja-JP/skills/laravel-security/SKILL.md +285 -0
  1010. package/resources/local/ecc/docs/ja-JP/skills/laravel-tdd/SKILL.md +283 -0
  1011. package/resources/local/ecc/docs/ja-JP/skills/laravel-verification/SKILL.md +11 -0
  1012. package/resources/local/ecc/docs/ja-JP/skills/lead-intelligence/SKILL.md +11 -0
  1013. package/resources/local/ecc/docs/ja-JP/skills/liquid-glass-design/SKILL.md +11 -0
  1014. package/resources/local/ecc/docs/ja-JP/skills/llm-trading-agent-security/SKILL.md +11 -0
  1015. package/resources/local/ecc/docs/ja-JP/skills/logistics-exception-management/SKILL.md +11 -0
  1016. package/resources/local/ecc/docs/ja-JP/skills/make-interfaces-feel-better/SKILL.md +11 -0
  1017. package/resources/local/ecc/docs/ja-JP/skills/manim-video/SKILL.md +11 -0
  1018. package/resources/local/ecc/docs/ja-JP/skills/market-research/SKILL.md +11 -0
  1019. package/resources/local/ecc/docs/ja-JP/skills/mcp-server-patterns/SKILL.md +11 -0
  1020. package/resources/local/ecc/docs/ja-JP/skills/messages-ops/SKILL.md +11 -0
  1021. package/resources/local/ecc/docs/ja-JP/skills/mle-workflow/SKILL.md +11 -0
  1022. package/resources/local/ecc/docs/ja-JP/skills/motion-advanced/SKILL.md +11 -0
  1023. package/resources/local/ecc/docs/ja-JP/skills/motion-foundations/SKILL.md +11 -0
  1024. package/resources/local/ecc/docs/ja-JP/skills/motion-patterns/SKILL.md +11 -0
  1025. package/resources/local/ecc/docs/ja-JP/skills/motion-ui/SKILL.md +11 -0
  1026. package/resources/local/ecc/docs/ja-JP/skills/mysql-patterns/SKILL.md +11 -0
  1027. package/resources/local/ecc/docs/ja-JP/skills/nanoclaw-repl/SKILL.md +11 -0
  1028. package/resources/local/ecc/docs/ja-JP/skills/nestjs-patterns/SKILL.md +11 -0
  1029. package/resources/local/ecc/docs/ja-JP/skills/netmiko-ssh-automation/SKILL.md +11 -0
  1030. package/resources/local/ecc/docs/ja-JP/skills/network-bgp-diagnostics/SKILL.md +11 -0
  1031. package/resources/local/ecc/docs/ja-JP/skills/network-config-validation/SKILL.md +11 -0
  1032. package/resources/local/ecc/docs/ja-JP/skills/network-interface-health/SKILL.md +143 -0
  1033. package/resources/local/ecc/docs/ja-JP/skills/nextjs-turbopack/SKILL.md +44 -0
  1034. package/resources/local/ecc/docs/ja-JP/skills/nodejs-keccak256/SKILL.md +102 -0
  1035. package/resources/local/ecc/docs/ja-JP/skills/nutrient-document-processing/SKILL.md +164 -0
  1036. package/resources/local/ecc/docs/ja-JP/skills/nuxt4-patterns/SKILL.md +100 -0
  1037. package/resources/local/ecc/docs/ja-JP/skills/openclaw-persona-forge/SKILL.md +288 -0
  1038. package/resources/local/ecc/docs/ja-JP/skills/opensource-pipeline/SKILL.md +255 -0
  1039. package/resources/local/ecc/docs/ja-JP/skills/perl-patterns/SKILL.md +504 -0
  1040. package/resources/local/ecc/docs/ja-JP/skills/perl-security/SKILL.md +503 -0
  1041. package/resources/local/ecc/docs/ja-JP/skills/perl-testing/SKILL.md +11 -0
  1042. package/resources/local/ecc/docs/ja-JP/skills/plan-orchestrate/SKILL.md +11 -0
  1043. package/resources/local/ecc/docs/ja-JP/skills/plankton-code-quality/SKILL.md +11 -0
  1044. package/resources/local/ecc/docs/ja-JP/skills/postgres-patterns/SKILL.md +146 -0
  1045. package/resources/local/ecc/docs/ja-JP/skills/product-capability/SKILL.md +11 -0
  1046. package/resources/local/ecc/docs/ja-JP/skills/product-lens/SKILL.md +11 -0
  1047. package/resources/local/ecc/docs/ja-JP/skills/production-audit/SKILL.md +11 -0
  1048. package/resources/local/ecc/docs/ja-JP/skills/production-scheduling/SKILL.md +11 -0
  1049. package/resources/local/ecc/docs/ja-JP/skills/project-flow-ops/SKILL.md +11 -0
  1050. package/resources/local/ecc/docs/ja-JP/skills/project-guidelines-example/SKILL.md +345 -0
  1051. package/resources/local/ecc/docs/ja-JP/skills/prompt-optimizer/SKILL.md +11 -0
  1052. package/resources/local/ecc/docs/ja-JP/skills/python-patterns/SKILL.md +749 -0
  1053. package/resources/local/ecc/docs/ja-JP/skills/python-testing/SKILL.md +815 -0
  1054. package/resources/local/ecc/docs/ja-JP/skills/pytorch-patterns/SKILL.md +11 -0
  1055. package/resources/local/ecc/docs/ja-JP/skills/quality-nonconformance/SKILL.md +11 -0
  1056. package/resources/local/ecc/docs/ja-JP/skills/quarkus-patterns/SKILL.md +11 -0
  1057. package/resources/local/ecc/docs/ja-JP/skills/quarkus-security/SKILL.md +466 -0
  1058. package/resources/local/ecc/docs/ja-JP/skills/quarkus-tdd/SKILL.md +811 -0
  1059. package/resources/local/ecc/docs/ja-JP/skills/quarkus-verification/SKILL.md +479 -0
  1060. package/resources/local/ecc/docs/ja-JP/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  1061. package/resources/local/ecc/docs/ja-JP/skills/redis-patterns/SKILL.md +403 -0
  1062. package/resources/local/ecc/docs/ja-JP/skills/regex-vs-llm-structured-text/SKILL.md +217 -0
  1063. package/resources/local/ecc/docs/ja-JP/skills/remotion-video-creation/SKILL.md +43 -0
  1064. package/resources/local/ecc/docs/ja-JP/skills/repo-scan/SKILL.md +79 -0
  1065. package/resources/local/ecc/docs/ja-JP/skills/research-ops/SKILL.md +112 -0
  1066. package/resources/local/ecc/docs/ja-JP/skills/returns-reverse-logistics/SKILL.md +225 -0
  1067. package/resources/local/ecc/docs/ja-JP/skills/rules-distill/SKILL.md +264 -0
  1068. package/resources/local/ecc/docs/ja-JP/skills/rust-patterns/SKILL.md +499 -0
  1069. package/resources/local/ecc/docs/ja-JP/skills/rust-testing/SKILL.md +502 -0
  1070. package/resources/local/ecc/docs/ja-JP/skills/safety-guard/SKILL.md +75 -0
  1071. package/resources/local/ecc/docs/ja-JP/skills/santa-method/SKILL.md +306 -0
  1072. package/resources/local/ecc/docs/ja-JP/skills/scientific-db-pubmed-database/SKILL.md +168 -0
  1073. package/resources/local/ecc/docs/ja-JP/skills/scientific-db-uspto-database/SKILL.md +158 -0
  1074. package/resources/local/ecc/docs/ja-JP/skills/scientific-pkg-gget/SKILL.md +154 -0
  1075. package/resources/local/ecc/docs/ja-JP/skills/scientific-thinking-literature-review/SKILL.md +184 -0
  1076. package/resources/local/ecc/docs/ja-JP/skills/scientific-thinking-scholar-evaluation/SKILL.md +159 -0
  1077. package/resources/local/ecc/docs/ja-JP/skills/search-first/SKILL.md +181 -0
  1078. package/resources/local/ecc/docs/ja-JP/skills/security-bounty-hunter/SKILL.md +99 -0
  1079. package/resources/local/ecc/docs/ja-JP/skills/security-review/SKILL.md +494 -0
  1080. package/resources/local/ecc/docs/ja-JP/skills/security-review/cloud-infrastructure-security.md +361 -0
  1081. package/resources/local/ecc/docs/ja-JP/skills/security-scan/SKILL.md +164 -0
  1082. package/resources/local/ecc/docs/ja-JP/skills/seo/SKILL.md +154 -0
  1083. package/resources/local/ecc/docs/ja-JP/skills/skill-comply/SKILL.md +60 -0
  1084. package/resources/local/ecc/docs/ja-JP/skills/skill-scout/SKILL.md +131 -0
  1085. package/resources/local/ecc/docs/ja-JP/skills/skill-stocktake/SKILL.md +194 -0
  1086. package/resources/local/ecc/docs/ja-JP/skills/social-graph-ranker/SKILL.md +154 -0
  1087. package/resources/local/ecc/docs/ja-JP/skills/springboot-patterns/SKILL.md +304 -0
  1088. package/resources/local/ecc/docs/ja-JP/skills/springboot-security/SKILL.md +119 -0
  1089. package/resources/local/ecc/docs/ja-JP/skills/springboot-tdd/SKILL.md +157 -0
  1090. package/resources/local/ecc/docs/ja-JP/skills/springboot-verification/SKILL.md +100 -0
  1091. package/resources/local/ecc/docs/ja-JP/skills/strategic-compact/SKILL.md +66 -0
  1092. package/resources/local/ecc/docs/ja-JP/skills/swift-actor-persistence/SKILL.md +157 -0
  1093. package/resources/local/ecc/docs/ja-JP/skills/swift-concurrency-6-2/SKILL.md +217 -0
  1094. package/resources/local/ecc/docs/ja-JP/skills/swift-protocol-di-testing/SKILL.md +190 -0
  1095. package/resources/local/ecc/docs/ja-JP/skills/swiftui-patterns/SKILL.md +259 -0
  1096. package/resources/local/ecc/docs/ja-JP/skills/tdd-workflow/SKILL.md +409 -0
  1097. package/resources/local/ecc/docs/ja-JP/skills/team-builder/SKILL.md +165 -0
  1098. package/resources/local/ecc/docs/ja-JP/skills/terminal-ops/SKILL.md +109 -0
  1099. package/resources/local/ecc/docs/ja-JP/skills/tinystruct-patterns/SKILL.md +104 -0
  1100. package/resources/local/ecc/docs/ja-JP/skills/token-budget-advisor/SKILL.md +121 -0
  1101. package/resources/local/ecc/docs/ja-JP/skills/ui-demo/SKILL.md +465 -0
  1102. package/resources/local/ecc/docs/ja-JP/skills/ui-to-vue/SKILL.md +86 -0
  1103. package/resources/local/ecc/docs/ja-JP/skills/unified-notifications-ops/SKILL.md +197 -0
  1104. package/resources/local/ecc/docs/ja-JP/skills/verification-loop/SKILL.md +120 -0
  1105. package/resources/local/ecc/docs/ja-JP/skills/video-editing/SKILL.md +317 -0
  1106. package/resources/local/ecc/docs/ja-JP/skills/videodb/SKILL.md +386 -0
  1107. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/api-reference.md +550 -0
  1108. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/capture-reference.md +416 -0
  1109. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/capture.md +104 -0
  1110. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/editor.md +443 -0
  1111. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/generative.md +331 -0
  1112. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/rtstream-reference.md +567 -0
  1113. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/rtstream.md +59 -0
  1114. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/search.md +230 -0
  1115. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/streaming.md +406 -0
  1116. package/resources/local/ecc/docs/ja-JP/skills/videodb/reference/use-cases.md +142 -0
  1117. package/resources/local/ecc/docs/ja-JP/skills/visa-doc-translate/README.md +91 -0
  1118. package/resources/local/ecc/docs/ja-JP/skills/visa-doc-translate/SKILL.md +119 -0
  1119. package/resources/local/ecc/docs/ja-JP/skills/vite-patterns/SKILL.md +449 -0
  1120. package/resources/local/ecc/docs/ja-JP/skills/windows-desktop-e2e/SKILL.md +784 -0
  1121. package/resources/local/ecc/docs/ja-JP/skills/workspace-surface-audit/SKILL.md +125 -0
  1122. package/resources/local/ecc/docs/ja-JP/skills/x-api/SKILL.md +210 -0
  1123. package/resources/local/ecc/docs/ja-JP/the-longform-guide.md +354 -0
  1124. package/resources/local/ecc/docs/ja-JP/the-openclaw-guide.md +471 -0
  1125. package/resources/local/ecc/docs/ja-JP/the-security-guide.md +257 -0
  1126. package/resources/local/ecc/docs/ja-JP/the-shortform-guide.md +429 -0
  1127. package/resources/local/ecc/docs/ko-KR/CONTRIBUTING.md +453 -0
  1128. package/resources/local/ecc/docs/ko-KR/README.md +731 -0
  1129. package/resources/local/ecc/docs/ko-KR/TERMINOLOGY.md +104 -0
  1130. package/resources/local/ecc/docs/ko-KR/agents/architect.md +211 -0
  1131. package/resources/local/ecc/docs/ko-KR/agents/build-error-resolver.md +114 -0
  1132. package/resources/local/ecc/docs/ko-KR/agents/code-reviewer.md +237 -0
  1133. package/resources/local/ecc/docs/ko-KR/agents/database-reviewer.md +87 -0
  1134. package/resources/local/ecc/docs/ko-KR/agents/doc-updater.md +107 -0
  1135. package/resources/local/ecc/docs/ko-KR/agents/e2e-runner.md +103 -0
  1136. package/resources/local/ecc/docs/ko-KR/agents/go-build-resolver.md +92 -0
  1137. package/resources/local/ecc/docs/ko-KR/agents/go-reviewer.md +74 -0
  1138. package/resources/local/ecc/docs/ko-KR/agents/planner.md +209 -0
  1139. package/resources/local/ecc/docs/ko-KR/agents/refactor-cleaner.md +85 -0
  1140. package/resources/local/ecc/docs/ko-KR/agents/security-reviewer.md +104 -0
  1141. package/resources/local/ecc/docs/ko-KR/agents/tdd-guide.md +101 -0
  1142. package/resources/local/ecc/docs/ko-KR/commands/build-fix.md +68 -0
  1143. package/resources/local/ecc/docs/ko-KR/commands/checkpoint.md +79 -0
  1144. package/resources/local/ecc/docs/ko-KR/commands/code-review.md +40 -0
  1145. package/resources/local/ecc/docs/ko-KR/commands/e2e.md +334 -0
  1146. package/resources/local/ecc/docs/ko-KR/commands/eval.md +120 -0
  1147. package/resources/local/ecc/docs/ko-KR/commands/go-build.md +183 -0
  1148. package/resources/local/ecc/docs/ko-KR/commands/go-review.md +148 -0
  1149. package/resources/local/ecc/docs/ko-KR/commands/go-test.md +268 -0
  1150. package/resources/local/ecc/docs/ko-KR/commands/learn.md +70 -0
  1151. package/resources/local/ecc/docs/ko-KR/commands/orchestrate.md +172 -0
  1152. package/resources/local/ecc/docs/ko-KR/commands/plan.md +113 -0
  1153. package/resources/local/ecc/docs/ko-KR/commands/refactor-clean.md +80 -0
  1154. package/resources/local/ecc/docs/ko-KR/commands/setup-pm.md +80 -0
  1155. package/resources/local/ecc/docs/ko-KR/commands/tdd.md +326 -0
  1156. package/resources/local/ecc/docs/ko-KR/commands/test-coverage.md +74 -0
  1157. package/resources/local/ecc/docs/ko-KR/commands/update-codemaps.md +79 -0
  1158. package/resources/local/ecc/docs/ko-KR/commands/update-docs.md +89 -0
  1159. package/resources/local/ecc/docs/ko-KR/commands/verify.md +63 -0
  1160. package/resources/local/ecc/docs/ko-KR/examples/CLAUDE.md +109 -0
  1161. package/resources/local/ecc/docs/ko-KR/examples/django-api-CLAUDE.md +308 -0
  1162. package/resources/local/ecc/docs/ko-KR/examples/go-microservice-CLAUDE.md +267 -0
  1163. package/resources/local/ecc/docs/ko-KR/examples/rust-api-CLAUDE.md +291 -0
  1164. package/resources/local/ecc/docs/ko-KR/examples/saas-nextjs-CLAUDE.md +166 -0
  1165. package/resources/local/ecc/docs/ko-KR/examples/statusline.json +19 -0
  1166. package/resources/local/ecc/docs/ko-KR/examples/user-CLAUDE.md +109 -0
  1167. package/resources/local/ecc/docs/ko-KR/rules/agents.md +52 -0
  1168. package/resources/local/ecc/docs/ko-KR/rules/coding-style.md +48 -0
  1169. package/resources/local/ecc/docs/ko-KR/rules/git-workflow.md +24 -0
  1170. package/resources/local/ecc/docs/ko-KR/rules/hooks.md +30 -0
  1171. package/resources/local/ecc/docs/ko-KR/rules/patterns.md +31 -0
  1172. package/resources/local/ecc/docs/ko-KR/rules/performance.md +55 -0
  1173. package/resources/local/ecc/docs/ko-KR/rules/security.md +29 -0
  1174. package/resources/local/ecc/docs/ko-KR/rules/testing.md +29 -0
  1175. package/resources/local/ecc/docs/ko-KR/skills/backend-patterns/SKILL.md +599 -0
  1176. package/resources/local/ecc/docs/ko-KR/skills/clickhouse-io/SKILL.md +447 -0
  1177. package/resources/local/ecc/docs/ko-KR/skills/coding-standards/SKILL.md +530 -0
  1178. package/resources/local/ecc/docs/ko-KR/skills/continuous-learning/SKILL.md +148 -0
  1179. package/resources/local/ecc/docs/ko-KR/skills/continuous-learning-v2/SKILL.md +346 -0
  1180. package/resources/local/ecc/docs/ko-KR/skills/eval-harness/SKILL.md +270 -0
  1181. package/resources/local/ecc/docs/ko-KR/skills/frontend-patterns/SKILL.md +652 -0
  1182. package/resources/local/ecc/docs/ko-KR/skills/golang-patterns/SKILL.md +675 -0
  1183. package/resources/local/ecc/docs/ko-KR/skills/golang-testing/SKILL.md +720 -0
  1184. package/resources/local/ecc/docs/ko-KR/skills/iterative-retrieval/SKILL.md +211 -0
  1185. package/resources/local/ecc/docs/ko-KR/skills/postgres-patterns/SKILL.md +147 -0
  1186. package/resources/local/ecc/docs/ko-KR/skills/security-review/SKILL.md +504 -0
  1187. package/resources/local/ecc/docs/ko-KR/skills/security-review/cloud-infrastructure-security.md +361 -0
  1188. package/resources/local/ecc/docs/ko-KR/skills/strategic-compact/SKILL.md +105 -0
  1189. package/resources/local/ecc/docs/ko-KR/skills/tdd-workflow/SKILL.md +408 -0
  1190. package/resources/local/ecc/docs/ko-KR/skills/verification-loop/SKILL.md +127 -0
  1191. package/resources/local/ecc/docs/legacy-artifact-inventory.md +112 -0
  1192. package/resources/local/ecc/docs/pt-BR/CONTRIBUTING.md +426 -0
  1193. package/resources/local/ecc/docs/pt-BR/README.md +518 -0
  1194. package/resources/local/ecc/docs/pt-BR/TERMINOLOGY.md +102 -0
  1195. package/resources/local/ecc/docs/pt-BR/agents/architect.md +80 -0
  1196. package/resources/local/ecc/docs/pt-BR/agents/build-error-resolver.md +80 -0
  1197. package/resources/local/ecc/docs/pt-BR/agents/code-reviewer.md +86 -0
  1198. package/resources/local/ecc/docs/pt-BR/agents/database-reviewer.md +91 -0
  1199. package/resources/local/ecc/docs/pt-BR/agents/doc-updater.md +99 -0
  1200. package/resources/local/ecc/docs/pt-BR/agents/e2e-runner.md +99 -0
  1201. package/resources/local/ecc/docs/pt-BR/agents/go-build-resolver.md +80 -0
  1202. package/resources/local/ecc/docs/pt-BR/agents/go-reviewer.md +76 -0
  1203. package/resources/local/ecc/docs/pt-BR/agents/planner.md +81 -0
  1204. package/resources/local/ecc/docs/pt-BR/agents/refactor-cleaner.md +85 -0
  1205. package/resources/local/ecc/docs/pt-BR/agents/security-reviewer.md +108 -0
  1206. package/resources/local/ecc/docs/pt-BR/agents/tdd-guide.md +80 -0
  1207. package/resources/local/ecc/docs/pt-BR/commands/build-fix.md +62 -0
  1208. package/resources/local/ecc/docs/pt-BR/commands/checkpoint.md +74 -0
  1209. package/resources/local/ecc/docs/pt-BR/commands/code-review.md +40 -0
  1210. package/resources/local/ecc/docs/pt-BR/commands/e2e.md +365 -0
  1211. package/resources/local/ecc/docs/pt-BR/commands/eval.md +120 -0
  1212. package/resources/local/ecc/docs/pt-BR/commands/go-build.md +183 -0
  1213. package/resources/local/ecc/docs/pt-BR/commands/go-review.md +147 -0
  1214. package/resources/local/ecc/docs/pt-BR/commands/go-test.md +268 -0
  1215. package/resources/local/ecc/docs/pt-BR/commands/learn.md +70 -0
  1216. package/resources/local/ecc/docs/pt-BR/commands/orchestrate.md +230 -0
  1217. package/resources/local/ecc/docs/pt-BR/commands/plan.md +113 -0
  1218. package/resources/local/ecc/docs/pt-BR/commands/refactor-clean.md +80 -0
  1219. package/resources/local/ecc/docs/pt-BR/commands/setup-pm.md +80 -0
  1220. package/resources/local/ecc/docs/pt-BR/commands/tdd.md +328 -0
  1221. package/resources/local/ecc/docs/pt-BR/commands/test-coverage.md +69 -0
  1222. package/resources/local/ecc/docs/pt-BR/commands/update-codemaps.md +72 -0
  1223. package/resources/local/ecc/docs/pt-BR/commands/update-docs.md +84 -0
  1224. package/resources/local/ecc/docs/pt-BR/commands/verify.md +59 -0
  1225. package/resources/local/ecc/docs/pt-BR/examples/CLAUDE.md +109 -0
  1226. package/resources/local/ecc/docs/pt-BR/examples/django-api-CLAUDE.md +308 -0
  1227. package/resources/local/ecc/docs/pt-BR/examples/go-microservice-CLAUDE.md +267 -0
  1228. package/resources/local/ecc/docs/pt-BR/examples/rust-api-CLAUDE.md +285 -0
  1229. package/resources/local/ecc/docs/pt-BR/examples/saas-nextjs-CLAUDE.md +166 -0
  1230. package/resources/local/ecc/docs/pt-BR/examples/user-CLAUDE.md +109 -0
  1231. package/resources/local/ecc/docs/pt-BR/rules/agents.md +50 -0
  1232. package/resources/local/ecc/docs/pt-BR/rules/coding-style.md +48 -0
  1233. package/resources/local/ecc/docs/pt-BR/rules/git-workflow.md +24 -0
  1234. package/resources/local/ecc/docs/pt-BR/rules/hooks.md +30 -0
  1235. package/resources/local/ecc/docs/pt-BR/rules/patterns.md +31 -0
  1236. package/resources/local/ecc/docs/pt-BR/rules/performance.md +55 -0
  1237. package/resources/local/ecc/docs/pt-BR/rules/security.md +29 -0
  1238. package/resources/local/ecc/docs/pt-BR/rules/testing.md +29 -0
  1239. package/resources/local/ecc/docs/releases/1.10.0/discussion-announcement.md +55 -0
  1240. package/resources/local/ecc/docs/releases/1.10.0/release-notes.md +70 -0
  1241. package/resources/local/ecc/docs/releases/1.10.0/x-thread.md +45 -0
  1242. package/resources/local/ecc/docs/releases/1.8.0/linkedin-post.md +13 -0
  1243. package/resources/local/ecc/docs/releases/1.8.0/reference-attribution.md +16 -0
  1244. package/resources/local/ecc/docs/releases/1.8.0/release-notes.md +20 -0
  1245. package/resources/local/ecc/docs/releases/1.8.0/x-quote-eval-skills.md +5 -0
  1246. package/resources/local/ecc/docs/releases/1.8.0/x-quote-plankton-deslop.md +5 -0
  1247. package/resources/local/ecc/docs/releases/1.8.0/x-thread.md +11 -0
  1248. package/resources/local/ecc/docs/releases/2.0.0-rc.1/article-outline.md +78 -0
  1249. package/resources/local/ecc/docs/releases/2.0.0-rc.1/demo-prompts.md +42 -0
  1250. package/resources/local/ecc/docs/releases/2.0.0-rc.1/launch-checklist.md +56 -0
  1251. package/resources/local/ecc/docs/releases/2.0.0-rc.1/linkedin-post.md +42 -0
  1252. package/resources/local/ecc/docs/releases/2.0.0-rc.1/naming-and-publication-matrix.md +159 -0
  1253. package/resources/local/ecc/docs/releases/2.0.0-rc.1/operator-readiness-dashboard-2026-05-15.md +55 -0
  1254. package/resources/local/ecc/docs/releases/2.0.0-rc.1/operator-readiness-dashboard-2026-05-17.md +51 -0
  1255. package/resources/local/ecc/docs/releases/2.0.0-rc.1/operator-readiness-dashboard-2026-05-18.md +51 -0
  1256. package/resources/local/ecc/docs/releases/2.0.0-rc.1/owner-queue-cleanup-2026-05-18.md +65 -0
  1257. package/resources/local/ecc/docs/releases/2.0.0-rc.1/preview-pack-manifest.md +110 -0
  1258. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-12.md +103 -0
  1259. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-13-post-hardening.md +98 -0
  1260. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-13.md +60 -0
  1261. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-15.md +187 -0
  1262. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-16.md +86 -0
  1263. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-17.md +113 -0
  1264. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-evidence-2026-05-18.md +150 -0
  1265. package/resources/local/ecc/docs/releases/2.0.0-rc.1/publication-readiness.md +138 -0
  1266. package/resources/local/ecc/docs/releases/2.0.0-rc.1/quickstart.md +70 -0
  1267. package/resources/local/ecc/docs/releases/2.0.0-rc.1/release-name-plugin-publication-checklist-2026-05-18.md +116 -0
  1268. package/resources/local/ecc/docs/releases/2.0.0-rc.1/release-notes.md +106 -0
  1269. package/resources/local/ecc/docs/releases/2.0.0-rc.1/release-url-ledger-2026-05-18.md +55 -0
  1270. package/resources/local/ecc/docs/releases/2.0.0-rc.1/telegram-handoff.md +30 -0
  1271. package/resources/local/ecc/docs/releases/2.0.0-rc.1/x-thread.md +83 -0
  1272. package/resources/local/ecc/docs/ru/README.md +1613 -0
  1273. package/resources/local/ecc/docs/security/supply-chain-incident-response.md +188 -0
  1274. package/resources/local/ecc/docs/skill-adaptation-policy.md +73 -0
  1275. package/resources/local/ecc/docs/stale-pr-salvage-ledger.md +173 -0
  1276. package/resources/local/ecc/docs/th/README.md +263 -0
  1277. package/resources/local/ecc/docs/token-optimization.md +156 -0
  1278. package/resources/local/ecc/docs/tr/AGENTS.md +160 -0
  1279. package/resources/local/ecc/docs/tr/CHANGELOG.md +189 -0
  1280. package/resources/local/ecc/docs/tr/CLAUDE.md +69 -0
  1281. package/resources/local/ecc/docs/tr/CODE_OF_CONDUCT.md +104 -0
  1282. package/resources/local/ecc/docs/tr/CONTRIBUTING.md +461 -0
  1283. package/resources/local/ecc/docs/tr/README.md +466 -0
  1284. package/resources/local/ecc/docs/tr/SECURITY.md +53 -0
  1285. package/resources/local/ecc/docs/tr/SPONSORING.md +43 -0
  1286. package/resources/local/ecc/docs/tr/SPONSORS.md +59 -0
  1287. package/resources/local/ecc/docs/tr/TERMINOLOGY.md +184 -0
  1288. package/resources/local/ecc/docs/tr/TROUBLESHOOTING.md +422 -0
  1289. package/resources/local/ecc/docs/tr/agents/architect.md +211 -0
  1290. package/resources/local/ecc/docs/tr/agents/build-error-resolver.md +114 -0
  1291. package/resources/local/ecc/docs/tr/agents/chief-of-staff.md +151 -0
  1292. package/resources/local/ecc/docs/tr/agents/code-reviewer.md +237 -0
  1293. package/resources/local/ecc/docs/tr/agents/cpp-build-resolver.md +90 -0
  1294. package/resources/local/ecc/docs/tr/agents/cpp-reviewer.md +72 -0
  1295. package/resources/local/ecc/docs/tr/agents/database-reviewer.md +91 -0
  1296. package/resources/local/ecc/docs/tr/agents/doc-updater.md +107 -0
  1297. package/resources/local/ecc/docs/tr/agents/docs-lookup.md +68 -0
  1298. package/resources/local/ecc/docs/tr/agents/e2e-runner.md +107 -0
  1299. package/resources/local/ecc/docs/tr/agents/flutter-reviewer.md +243 -0
  1300. package/resources/local/ecc/docs/tr/agents/go-build-resolver.md +94 -0
  1301. package/resources/local/ecc/docs/tr/agents/go-reviewer.md +76 -0
  1302. package/resources/local/ecc/docs/tr/agents/harness-optimizer.md +35 -0
  1303. package/resources/local/ecc/docs/tr/agents/java-build-resolver.md +155 -0
  1304. package/resources/local/ecc/docs/tr/agents/java-reviewer.md +94 -0
  1305. package/resources/local/ecc/docs/tr/agents/kotlin-build-resolver.md +118 -0
  1306. package/resources/local/ecc/docs/tr/agents/kotlin-reviewer.md +159 -0
  1307. package/resources/local/ecc/docs/tr/agents/loop-operator.md +36 -0
  1308. package/resources/local/ecc/docs/tr/agents/planner.md +212 -0
  1309. package/resources/local/ecc/docs/tr/agents/python-reviewer.md +98 -0
  1310. package/resources/local/ecc/docs/tr/agents/pytorch-build-resolver.md +120 -0
  1311. package/resources/local/ecc/docs/tr/agents/refactor-cleaner.md +85 -0
  1312. package/resources/local/ecc/docs/tr/agents/rust-build-resolver.md +148 -0
  1313. package/resources/local/ecc/docs/tr/agents/rust-reviewer.md +94 -0
  1314. package/resources/local/ecc/docs/tr/agents/security-reviewer.md +108 -0
  1315. package/resources/local/ecc/docs/tr/agents/tdd-guide.md +91 -0
  1316. package/resources/local/ecc/docs/tr/agents/typescript-reviewer.md +112 -0
  1317. package/resources/local/ecc/docs/tr/commands/build-fix.md +62 -0
  1318. package/resources/local/ecc/docs/tr/commands/checkpoint.md +74 -0
  1319. package/resources/local/ecc/docs/tr/commands/code-review.md +40 -0
  1320. package/resources/local/ecc/docs/tr/commands/e2e.md +365 -0
  1321. package/resources/local/ecc/docs/tr/commands/eval.md +120 -0
  1322. package/resources/local/ecc/docs/tr/commands/evolve.md +178 -0
  1323. package/resources/local/ecc/docs/tr/commands/go-build.md +183 -0
  1324. package/resources/local/ecc/docs/tr/commands/go-review.md +148 -0
  1325. package/resources/local/ecc/docs/tr/commands/go-test.md +268 -0
  1326. package/resources/local/ecc/docs/tr/commands/instinct-export.md +66 -0
  1327. package/resources/local/ecc/docs/tr/commands/instinct-import.md +114 -0
  1328. package/resources/local/ecc/docs/tr/commands/instinct-status.md +59 -0
  1329. package/resources/local/ecc/docs/tr/commands/learn-eval.md +116 -0
  1330. package/resources/local/ecc/docs/tr/commands/learn.md +70 -0
  1331. package/resources/local/ecc/docs/tr/commands/multi-backend.md +158 -0
  1332. package/resources/local/ecc/docs/tr/commands/multi-execute.md +315 -0
  1333. package/resources/local/ecc/docs/tr/commands/multi-frontend.md +158 -0
  1334. package/resources/local/ecc/docs/tr/commands/multi-plan.md +268 -0
  1335. package/resources/local/ecc/docs/tr/commands/multi-workflow.md +191 -0
  1336. package/resources/local/ecc/docs/tr/commands/orchestrate.md +231 -0
  1337. package/resources/local/ecc/docs/tr/commands/plan.md +115 -0
  1338. package/resources/local/ecc/docs/tr/commands/pm2.md +272 -0
  1339. package/resources/local/ecc/docs/tr/commands/refactor-clean.md +80 -0
  1340. package/resources/local/ecc/docs/tr/commands/sessions.md +293 -0
  1341. package/resources/local/ecc/docs/tr/commands/setup-pm.md +80 -0
  1342. package/resources/local/ecc/docs/tr/commands/skill-create.md +174 -0
  1343. package/resources/local/ecc/docs/tr/commands/tdd.md +328 -0
  1344. package/resources/local/ecc/docs/tr/commands/test-coverage.md +69 -0
  1345. package/resources/local/ecc/docs/tr/commands/update-docs.md +84 -0
  1346. package/resources/local/ecc/docs/tr/commands/verify.md +59 -0
  1347. package/resources/local/ecc/docs/tr/contexts/dev.md +20 -0
  1348. package/resources/local/ecc/docs/tr/contexts/research.md +26 -0
  1349. package/resources/local/ecc/docs/tr/contexts/review.md +22 -0
  1350. package/resources/local/ecc/docs/tr/examples/CLAUDE.md +109 -0
  1351. package/resources/local/ecc/docs/tr/examples/README.md +80 -0
  1352. package/resources/local/ecc/docs/tr/examples/statusline.json +19 -0
  1353. package/resources/local/ecc/docs/tr/examples/user-CLAUDE.md +109 -0
  1354. package/resources/local/ecc/docs/tr/rules/README.md +61 -0
  1355. package/resources/local/ecc/docs/tr/rules/common/agents.md +50 -0
  1356. package/resources/local/ecc/docs/tr/rules/common/coding-style.md +48 -0
  1357. package/resources/local/ecc/docs/tr/rules/common/development-workflow.md +38 -0
  1358. package/resources/local/ecc/docs/tr/rules/common/git-workflow.md +24 -0
  1359. package/resources/local/ecc/docs/tr/rules/common/hooks.md +30 -0
  1360. package/resources/local/ecc/docs/tr/rules/common/patterns.md +31 -0
  1361. package/resources/local/ecc/docs/tr/rules/common/performance.md +55 -0
  1362. package/resources/local/ecc/docs/tr/rules/common/security.md +29 -0
  1363. package/resources/local/ecc/docs/tr/rules/common/testing.md +29 -0
  1364. package/resources/local/ecc/docs/tr/rules/golang/coding-style.md +32 -0
  1365. package/resources/local/ecc/docs/tr/rules/golang/hooks.md +17 -0
  1366. package/resources/local/ecc/docs/tr/rules/golang/patterns.md +45 -0
  1367. package/resources/local/ecc/docs/tr/rules/golang/security.md +34 -0
  1368. package/resources/local/ecc/docs/tr/rules/golang/testing.md +31 -0
  1369. package/resources/local/ecc/docs/tr/rules/python/coding-style.md +42 -0
  1370. package/resources/local/ecc/docs/tr/rules/python/hooks.md +19 -0
  1371. package/resources/local/ecc/docs/tr/rules/python/patterns.md +39 -0
  1372. package/resources/local/ecc/docs/tr/rules/python/security.md +30 -0
  1373. package/resources/local/ecc/docs/tr/rules/python/testing.md +38 -0
  1374. package/resources/local/ecc/docs/tr/rules/typescript/coding-style.md +199 -0
  1375. package/resources/local/ecc/docs/tr/rules/typescript/hooks.md +22 -0
  1376. package/resources/local/ecc/docs/tr/rules/typescript/patterns.md +52 -0
  1377. package/resources/local/ecc/docs/tr/rules/typescript/security.md +28 -0
  1378. package/resources/local/ecc/docs/tr/rules/typescript/testing.md +18 -0
  1379. package/resources/local/ecc/docs/tr/skills/api-design/SKILL.md +523 -0
  1380. package/resources/local/ecc/docs/tr/skills/backend-patterns/SKILL.md +598 -0
  1381. package/resources/local/ecc/docs/tr/skills/coding-standards/SKILL.md +530 -0
  1382. package/resources/local/ecc/docs/tr/skills/continuous-learning/SKILL.md +119 -0
  1383. package/resources/local/ecc/docs/tr/skills/continuous-learning-v2/SKILL.md +347 -0
  1384. package/resources/local/ecc/docs/tr/skills/database-migrations/SKILL.md +319 -0
  1385. package/resources/local/ecc/docs/tr/skills/deployment-patterns/SKILL.md +427 -0
  1386. package/resources/local/ecc/docs/tr/skills/django-patterns/SKILL.md +734 -0
  1387. package/resources/local/ecc/docs/tr/skills/docker-patterns/SKILL.md +364 -0
  1388. package/resources/local/ecc/docs/tr/skills/e2e-testing/SKILL.md +326 -0
  1389. package/resources/local/ecc/docs/tr/skills/eval-harness/SKILL.md +270 -0
  1390. package/resources/local/ecc/docs/tr/skills/frontend-patterns/SKILL.md +642 -0
  1391. package/resources/local/ecc/docs/tr/skills/golang-patterns/SKILL.md +674 -0
  1392. package/resources/local/ecc/docs/tr/skills/golang-testing/SKILL.md +720 -0
  1393. package/resources/local/ecc/docs/tr/skills/jpa-patterns/SKILL.md +151 -0
  1394. package/resources/local/ecc/docs/tr/skills/kotlin-patterns/SKILL.md +535 -0
  1395. package/resources/local/ecc/docs/tr/skills/kotlin-testing/SKILL.md +578 -0
  1396. package/resources/local/ecc/docs/tr/skills/laravel-patterns/SKILL.md +415 -0
  1397. package/resources/local/ecc/docs/tr/skills/laravel-security/SKILL.md +285 -0
  1398. package/resources/local/ecc/docs/tr/skills/laravel-tdd/SKILL.md +283 -0
  1399. package/resources/local/ecc/docs/tr/skills/laravel-verification/SKILL.md +179 -0
  1400. package/resources/local/ecc/docs/tr/skills/nextjs-turbopack/SKILL.md +44 -0
  1401. package/resources/local/ecc/docs/tr/skills/postgres-patterns/SKILL.md +147 -0
  1402. package/resources/local/ecc/docs/tr/skills/python-patterns/SKILL.md +750 -0
  1403. package/resources/local/ecc/docs/tr/skills/python-testing/SKILL.md +816 -0
  1404. package/resources/local/ecc/docs/tr/skills/quarkus-patterns/SKILL.md +778 -0
  1405. package/resources/local/ecc/docs/tr/skills/quarkus-security/SKILL.md +474 -0
  1406. package/resources/local/ecc/docs/tr/skills/quarkus-tdd/SKILL.md +916 -0
  1407. package/resources/local/ecc/docs/tr/skills/quarkus-verification/SKILL.md +479 -0
  1408. package/resources/local/ecc/docs/tr/skills/rust-patterns/SKILL.md +499 -0
  1409. package/resources/local/ecc/docs/tr/skills/rust-testing/SKILL.md +500 -0
  1410. package/resources/local/ecc/docs/tr/skills/security-review/SKILL.md +495 -0
  1411. package/resources/local/ecc/docs/tr/skills/springboot-patterns/SKILL.md +312 -0
  1412. package/resources/local/ecc/docs/tr/skills/springboot-security/SKILL.md +272 -0
  1413. package/resources/local/ecc/docs/tr/skills/springboot-tdd/SKILL.md +158 -0
  1414. package/resources/local/ecc/docs/tr/skills/springboot-verification/SKILL.md +231 -0
  1415. package/resources/local/ecc/docs/tr/skills/tdd-workflow/SKILL.md +410 -0
  1416. package/resources/local/ecc/docs/tr/skills/verification-loop/SKILL.md +126 -0
  1417. package/resources/local/ecc/docs/tr/the-longform-guide.md +354 -0
  1418. package/resources/local/ecc/docs/tr/the-security-guide.md +455 -0
  1419. package/resources/local/ecc/docs/tr/the-shortform-guide.md +431 -0
  1420. package/resources/local/ecc/docs/vi-VN/README.md +179 -0
  1421. package/resources/local/ecc/docs/zh-CN/AGENTS.md +165 -0
  1422. package/resources/local/ecc/docs/zh-CN/CHANGELOG.md +189 -0
  1423. package/resources/local/ecc/docs/zh-CN/CLAUDE.md +70 -0
  1424. package/resources/local/ecc/docs/zh-CN/CODE_OF_CONDUCT.md +83 -0
  1425. package/resources/local/ecc/docs/zh-CN/CONTRIBUTING.md +465 -0
  1426. package/resources/local/ecc/docs/zh-CN/README.md +1415 -0
  1427. package/resources/local/ecc/docs/zh-CN/SECURITY.md +53 -0
  1428. package/resources/local/ecc/docs/zh-CN/SPONSORING.md +43 -0
  1429. package/resources/local/ecc/docs/zh-CN/SPONSORS.md +59 -0
  1430. package/resources/local/ecc/docs/zh-CN/TROUBLESHOOTING.md +446 -0
  1431. package/resources/local/ecc/docs/zh-CN/agents/architect.md +232 -0
  1432. package/resources/local/ecc/docs/zh-CN/agents/build-error-resolver.md +119 -0
  1433. package/resources/local/ecc/docs/zh-CN/agents/chief-of-staff.md +155 -0
  1434. package/resources/local/ecc/docs/zh-CN/agents/code-architect.md +71 -0
  1435. package/resources/local/ecc/docs/zh-CN/agents/code-explorer.md +69 -0
  1436. package/resources/local/ecc/docs/zh-CN/agents/code-reviewer.md +238 -0
  1437. package/resources/local/ecc/docs/zh-CN/agents/code-simplifier.md +47 -0
  1438. package/resources/local/ecc/docs/zh-CN/agents/comment-analyzer.md +45 -0
  1439. package/resources/local/ecc/docs/zh-CN/agents/conversation-analyzer.md +56 -0
  1440. package/resources/local/ecc/docs/zh-CN/agents/cpp-build-resolver.md +91 -0
  1441. package/resources/local/ecc/docs/zh-CN/agents/cpp-reviewer.md +79 -0
  1442. package/resources/local/ecc/docs/zh-CN/agents/csharp-reviewer.md +109 -0
  1443. package/resources/local/ecc/docs/zh-CN/agents/dart-build-resolver.md +202 -0
  1444. package/resources/local/ecc/docs/zh-CN/agents/database-reviewer.md +94 -0
  1445. package/resources/local/ecc/docs/zh-CN/agents/doc-updater.md +110 -0
  1446. package/resources/local/ecc/docs/zh-CN/agents/docs-lookup.md +68 -0
  1447. package/resources/local/ecc/docs/zh-CN/agents/e2e-runner.md +110 -0
  1448. package/resources/local/ecc/docs/zh-CN/agents/flutter-reviewer.md +250 -0
  1449. package/resources/local/ecc/docs/zh-CN/agents/gan-evaluator.md +223 -0
  1450. package/resources/local/ecc/docs/zh-CN/agents/gan-generator.md +139 -0
  1451. package/resources/local/ecc/docs/zh-CN/agents/gan-planner.md +99 -0
  1452. package/resources/local/ecc/docs/zh-CN/agents/go-build-resolver.md +95 -0
  1453. package/resources/local/ecc/docs/zh-CN/agents/go-reviewer.md +83 -0
  1454. package/resources/local/ecc/docs/zh-CN/agents/harness-optimizer.md +35 -0
  1455. package/resources/local/ecc/docs/zh-CN/agents/healthcare-reviewer.md +83 -0
  1456. package/resources/local/ecc/docs/zh-CN/agents/java-build-resolver.md +156 -0
  1457. package/resources/local/ecc/docs/zh-CN/agents/java-reviewer.md +107 -0
  1458. package/resources/local/ecc/docs/zh-CN/agents/kotlin-build-resolver.md +119 -0
  1459. package/resources/local/ecc/docs/zh-CN/agents/kotlin-reviewer.md +161 -0
  1460. package/resources/local/ecc/docs/zh-CN/agents/loop-operator.md +37 -0
  1461. package/resources/local/ecc/docs/zh-CN/agents/opensource-forker.md +203 -0
  1462. package/resources/local/ecc/docs/zh-CN/agents/opensource-packager.md +255 -0
  1463. package/resources/local/ecc/docs/zh-CN/agents/opensource-sanitizer.md +191 -0
  1464. package/resources/local/ecc/docs/zh-CN/agents/performance-optimizer.md +446 -0
  1465. package/resources/local/ecc/docs/zh-CN/agents/planner.md +215 -0
  1466. package/resources/local/ecc/docs/zh-CN/agents/pr-test-analyzer.md +45 -0
  1467. package/resources/local/ecc/docs/zh-CN/agents/python-reviewer.md +106 -0
  1468. package/resources/local/ecc/docs/zh-CN/agents/pytorch-build-resolver.md +122 -0
  1469. package/resources/local/ecc/docs/zh-CN/agents/refactor-cleaner.md +92 -0
  1470. package/resources/local/ecc/docs/zh-CN/agents/rust-build-resolver.md +149 -0
  1471. package/resources/local/ecc/docs/zh-CN/agents/rust-reviewer.md +95 -0
  1472. package/resources/local/ecc/docs/zh-CN/agents/security-reviewer.md +112 -0
  1473. package/resources/local/ecc/docs/zh-CN/agents/seo-specialist.md +63 -0
  1474. package/resources/local/ecc/docs/zh-CN/agents/silent-failure-hunter.md +50 -0
  1475. package/resources/local/ecc/docs/zh-CN/agents/tdd-guide.md +96 -0
  1476. package/resources/local/ecc/docs/zh-CN/agents/type-design-analyzer.md +41 -0
  1477. package/resources/local/ecc/docs/zh-CN/agents/typescript-reviewer.md +122 -0
  1478. package/resources/local/ecc/docs/zh-CN/commands/aside.md +173 -0
  1479. package/resources/local/ecc/docs/zh-CN/commands/auto-update.md +28 -0
  1480. package/resources/local/ecc/docs/zh-CN/commands/build-fix.md +64 -0
  1481. package/resources/local/ecc/docs/zh-CN/commands/checkpoint.md +78 -0
  1482. package/resources/local/ecc/docs/zh-CN/commands/claw.md +51 -0
  1483. package/resources/local/ecc/docs/zh-CN/commands/code-review.md +43 -0
  1484. package/resources/local/ecc/docs/zh-CN/commands/context-budget.md +29 -0
  1485. package/resources/local/ecc/docs/zh-CN/commands/cpp-build.md +173 -0
  1486. package/resources/local/ecc/docs/zh-CN/commands/cpp-review.md +140 -0
  1487. package/resources/local/ecc/docs/zh-CN/commands/cpp-test.md +257 -0
  1488. package/resources/local/ecc/docs/zh-CN/commands/devfleet.md +93 -0
  1489. package/resources/local/ecc/docs/zh-CN/commands/docs.md +32 -0
  1490. package/resources/local/ecc/docs/zh-CN/commands/e2e.md +374 -0
  1491. package/resources/local/ecc/docs/zh-CN/commands/eval.md +122 -0
  1492. package/resources/local/ecc/docs/zh-CN/commands/evolve.md +194 -0
  1493. package/resources/local/ecc/docs/zh-CN/commands/feature-dev.md +49 -0
  1494. package/resources/local/ecc/docs/zh-CN/commands/flutter-build.md +166 -0
  1495. package/resources/local/ecc/docs/zh-CN/commands/flutter-review.md +118 -0
  1496. package/resources/local/ecc/docs/zh-CN/commands/flutter-test.md +145 -0
  1497. package/resources/local/ecc/docs/zh-CN/commands/gan-build.md +109 -0
  1498. package/resources/local/ecc/docs/zh-CN/commands/gan-design.md +45 -0
  1499. package/resources/local/ecc/docs/zh-CN/commands/go-build.md +183 -0
  1500. package/resources/local/ecc/docs/zh-CN/commands/go-review.md +156 -0
  1501. package/resources/local/ecc/docs/zh-CN/commands/go-test.md +274 -0
  1502. package/resources/local/ecc/docs/zh-CN/commands/gradle-build.md +72 -0
  1503. package/resources/local/ecc/docs/zh-CN/commands/harness-audit.md +72 -0
  1504. package/resources/local/ecc/docs/zh-CN/commands/hookify-configure.md +14 -0
  1505. package/resources/local/ecc/docs/zh-CN/commands/hookify-help.md +46 -0
  1506. package/resources/local/ecc/docs/zh-CN/commands/hookify-list.md +21 -0
  1507. package/resources/local/ecc/docs/zh-CN/commands/hookify.md +50 -0
  1508. package/resources/local/ecc/docs/zh-CN/commands/instinct-export.md +67 -0
  1509. package/resources/local/ecc/docs/zh-CN/commands/instinct-import.md +117 -0
  1510. package/resources/local/ecc/docs/zh-CN/commands/instinct-status.md +59 -0
  1511. package/resources/local/ecc/docs/zh-CN/commands/jira.md +108 -0
  1512. package/resources/local/ecc/docs/zh-CN/commands/kotlin-build.md +176 -0
  1513. package/resources/local/ecc/docs/zh-CN/commands/kotlin-review.md +144 -0
  1514. package/resources/local/ecc/docs/zh-CN/commands/kotlin-test.md +315 -0
  1515. package/resources/local/ecc/docs/zh-CN/commands/learn-eval.md +117 -0
  1516. package/resources/local/ecc/docs/zh-CN/commands/learn.md +70 -0
  1517. package/resources/local/ecc/docs/zh-CN/commands/loop-start.md +33 -0
  1518. package/resources/local/ecc/docs/zh-CN/commands/loop-status.md +25 -0
  1519. package/resources/local/ecc/docs/zh-CN/commands/model-route.md +27 -0
  1520. package/resources/local/ecc/docs/zh-CN/commands/multi-backend.md +162 -0
  1521. package/resources/local/ecc/docs/zh-CN/commands/multi-execute.md +321 -0
  1522. package/resources/local/ecc/docs/zh-CN/commands/multi-frontend.md +162 -0
  1523. package/resources/local/ecc/docs/zh-CN/commands/multi-plan.md +278 -0
  1524. package/resources/local/ecc/docs/zh-CN/commands/multi-workflow.md +197 -0
  1525. package/resources/local/ecc/docs/zh-CN/commands/orchestrate.md +242 -0
  1526. package/resources/local/ecc/docs/zh-CN/commands/plan.md +118 -0
  1527. package/resources/local/ecc/docs/zh-CN/commands/pm2.md +283 -0
  1528. package/resources/local/ecc/docs/zh-CN/commands/projects.md +39 -0
  1529. package/resources/local/ecc/docs/zh-CN/commands/promote.md +41 -0
  1530. package/resources/local/ecc/docs/zh-CN/commands/prompt-optimize.md +37 -0
  1531. package/resources/local/ecc/docs/zh-CN/commands/prp-commit.md +115 -0
  1532. package/resources/local/ecc/docs/zh-CN/commands/prp-implement.md +394 -0
  1533. package/resources/local/ecc/docs/zh-CN/commands/prp-plan.md +506 -0
  1534. package/resources/local/ecc/docs/zh-CN/commands/prp-pr.md +188 -0
  1535. package/resources/local/ecc/docs/zh-CN/commands/prp-prd.md +453 -0
  1536. package/resources/local/ecc/docs/zh-CN/commands/prune.md +31 -0
  1537. package/resources/local/ecc/docs/zh-CN/commands/python-review.md +319 -0
  1538. package/resources/local/ecc/docs/zh-CN/commands/quality-gate.md +30 -0
  1539. package/resources/local/ecc/docs/zh-CN/commands/refactor-clean.md +83 -0
  1540. package/resources/local/ecc/docs/zh-CN/commands/resume-session.md +154 -0
  1541. package/resources/local/ecc/docs/zh-CN/commands/review-pr.md +37 -0
  1542. package/resources/local/ecc/docs/zh-CN/commands/rules-distill.md +11 -0
  1543. package/resources/local/ecc/docs/zh-CN/commands/rust-build.md +189 -0
  1544. package/resources/local/ecc/docs/zh-CN/commands/rust-review.md +146 -0
  1545. package/resources/local/ecc/docs/zh-CN/commands/rust-test.md +311 -0
  1546. package/resources/local/ecc/docs/zh-CN/commands/santa-loop.md +180 -0
  1547. package/resources/local/ecc/docs/zh-CN/commands/save-session.md +252 -0
  1548. package/resources/local/ecc/docs/zh-CN/commands/sessions.md +340 -0
  1549. package/resources/local/ecc/docs/zh-CN/commands/setup-pm.md +83 -0
  1550. package/resources/local/ecc/docs/zh-CN/commands/skill-create.md +176 -0
  1551. package/resources/local/ecc/docs/zh-CN/commands/skill-health.md +54 -0
  1552. package/resources/local/ecc/docs/zh-CN/commands/tdd.md +330 -0
  1553. package/resources/local/ecc/docs/zh-CN/commands/test-coverage.md +69 -0
  1554. package/resources/local/ecc/docs/zh-CN/commands/update-codemaps.md +73 -0
  1555. package/resources/local/ecc/docs/zh-CN/commands/update-docs.md +86 -0
  1556. package/resources/local/ecc/docs/zh-CN/commands/verify.md +60 -0
  1557. package/resources/local/ecc/docs/zh-CN/contexts/dev.md +23 -0
  1558. package/resources/local/ecc/docs/zh-CN/contexts/research.md +30 -0
  1559. package/resources/local/ecc/docs/zh-CN/contexts/review.md +25 -0
  1560. package/resources/local/ecc/docs/zh-CN/examples/CLAUDE.md +109 -0
  1561. package/resources/local/ecc/docs/zh-CN/examples/django-api-CLAUDE.md +308 -0
  1562. package/resources/local/ecc/docs/zh-CN/examples/go-microservice-CLAUDE.md +267 -0
  1563. package/resources/local/ecc/docs/zh-CN/examples/laravel-api-CLAUDE.md +311 -0
  1564. package/resources/local/ecc/docs/zh-CN/examples/rust-api-CLAUDE.md +285 -0
  1565. package/resources/local/ecc/docs/zh-CN/examples/saas-nextjs-CLAUDE.md +166 -0
  1566. package/resources/local/ecc/docs/zh-CN/examples/user-CLAUDE.md +118 -0
  1567. package/resources/local/ecc/docs/zh-CN/hooks/README.md +220 -0
  1568. package/resources/local/ecc/docs/zh-CN/plugins/README.md +89 -0
  1569. package/resources/local/ecc/docs/zh-CN/rules/README.md +105 -0
  1570. package/resources/local/ecc/docs/zh-CN/rules/common/agents.md +53 -0
  1571. package/resources/local/ecc/docs/zh-CN/rules/common/coding-style.md +52 -0
  1572. package/resources/local/ecc/docs/zh-CN/rules/common/development-workflow.md +38 -0
  1573. package/resources/local/ecc/docs/zh-CN/rules/common/git-workflow.md +26 -0
  1574. package/resources/local/ecc/docs/zh-CN/rules/common/hooks.md +33 -0
  1575. package/resources/local/ecc/docs/zh-CN/rules/common/patterns.md +34 -0
  1576. package/resources/local/ecc/docs/zh-CN/rules/common/performance.md +63 -0
  1577. package/resources/local/ecc/docs/zh-CN/rules/common/security.md +31 -0
  1578. package/resources/local/ecc/docs/zh-CN/rules/common/testing.md +31 -0
  1579. package/resources/local/ecc/docs/zh-CN/rules/cpp/coding-style.md +45 -0
  1580. package/resources/local/ecc/docs/zh-CN/rules/cpp/hooks.md +40 -0
  1581. package/resources/local/ecc/docs/zh-CN/rules/cpp/patterns.md +52 -0
  1582. package/resources/local/ecc/docs/zh-CN/rules/cpp/security.md +52 -0
  1583. package/resources/local/ecc/docs/zh-CN/rules/cpp/testing.md +45 -0
  1584. package/resources/local/ecc/docs/zh-CN/rules/csharp/coding-style.md +73 -0
  1585. package/resources/local/ecc/docs/zh-CN/rules/csharp/hooks.md +26 -0
  1586. package/resources/local/ecc/docs/zh-CN/rules/csharp/patterns.md +51 -0
  1587. package/resources/local/ecc/docs/zh-CN/rules/csharp/security.md +59 -0
  1588. package/resources/local/ecc/docs/zh-CN/rules/csharp/testing.md +47 -0
  1589. package/resources/local/ecc/docs/zh-CN/rules/golang/coding-style.md +33 -0
  1590. package/resources/local/ecc/docs/zh-CN/rules/golang/hooks.md +18 -0
  1591. package/resources/local/ecc/docs/zh-CN/rules/golang/patterns.md +46 -0
  1592. package/resources/local/ecc/docs/zh-CN/rules/golang/security.md +35 -0
  1593. package/resources/local/ecc/docs/zh-CN/rules/golang/testing.md +32 -0
  1594. package/resources/local/ecc/docs/zh-CN/rules/java/coding-style.md +117 -0
  1595. package/resources/local/ecc/docs/zh-CN/rules/java/hooks.md +19 -0
  1596. package/resources/local/ecc/docs/zh-CN/rules/java/patterns.md +148 -0
  1597. package/resources/local/ecc/docs/zh-CN/rules/java/security.md +102 -0
  1598. package/resources/local/ecc/docs/zh-CN/rules/java/testing.md +135 -0
  1599. package/resources/local/ecc/docs/zh-CN/rules/kotlin/coding-style.md +90 -0
  1600. package/resources/local/ecc/docs/zh-CN/rules/kotlin/hooks.md +18 -0
  1601. package/resources/local/ecc/docs/zh-CN/rules/kotlin/patterns.md +147 -0
  1602. package/resources/local/ecc/docs/zh-CN/rules/kotlin/security.md +83 -0
  1603. package/resources/local/ecc/docs/zh-CN/rules/kotlin/testing.md +129 -0
  1604. package/resources/local/ecc/docs/zh-CN/rules/perl/coding-style.md +47 -0
  1605. package/resources/local/ecc/docs/zh-CN/rules/perl/hooks.md +23 -0
  1606. package/resources/local/ecc/docs/zh-CN/rules/perl/patterns.md +77 -0
  1607. package/resources/local/ecc/docs/zh-CN/rules/perl/security.md +70 -0
  1608. package/resources/local/ecc/docs/zh-CN/rules/perl/testing.md +55 -0
  1609. package/resources/local/ecc/docs/zh-CN/rules/php/coding-style.md +41 -0
  1610. package/resources/local/ecc/docs/zh-CN/rules/php/hooks.md +25 -0
  1611. package/resources/local/ecc/docs/zh-CN/rules/php/patterns.md +34 -0
  1612. package/resources/local/ecc/docs/zh-CN/rules/php/security.md +38 -0
  1613. package/resources/local/ecc/docs/zh-CN/rules/php/testing.md +40 -0
  1614. package/resources/local/ecc/docs/zh-CN/rules/python/coding-style.md +43 -0
  1615. package/resources/local/ecc/docs/zh-CN/rules/python/hooks.md +20 -0
  1616. package/resources/local/ecc/docs/zh-CN/rules/python/patterns.md +40 -0
  1617. package/resources/local/ecc/docs/zh-CN/rules/python/security.md +31 -0
  1618. package/resources/local/ecc/docs/zh-CN/rules/python/testing.md +39 -0
  1619. package/resources/local/ecc/docs/zh-CN/rules/rust/coding-style.md +153 -0
  1620. package/resources/local/ecc/docs/zh-CN/rules/rust/hooks.md +17 -0
  1621. package/resources/local/ecc/docs/zh-CN/rules/rust/patterns.md +169 -0
  1622. package/resources/local/ecc/docs/zh-CN/rules/rust/security.md +142 -0
  1623. package/resources/local/ecc/docs/zh-CN/rules/rust/testing.md +156 -0
  1624. package/resources/local/ecc/docs/zh-CN/rules/swift/coding-style.md +48 -0
  1625. package/resources/local/ecc/docs/zh-CN/rules/swift/hooks.md +21 -0
  1626. package/resources/local/ecc/docs/zh-CN/rules/swift/patterns.md +67 -0
  1627. package/resources/local/ecc/docs/zh-CN/rules/swift/security.md +34 -0
  1628. package/resources/local/ecc/docs/zh-CN/rules/swift/testing.md +46 -0
  1629. package/resources/local/ecc/docs/zh-CN/rules/typescript/coding-style.md +200 -0
  1630. package/resources/local/ecc/docs/zh-CN/rules/typescript/hooks.md +23 -0
  1631. package/resources/local/ecc/docs/zh-CN/rules/typescript/patterns.md +53 -0
  1632. package/resources/local/ecc/docs/zh-CN/rules/typescript/security.md +29 -0
  1633. package/resources/local/ecc/docs/zh-CN/rules/typescript/testing.md +19 -0
  1634. package/resources/local/ecc/docs/zh-CN/skills/accessibility/SKILL.md +145 -0
  1635. package/resources/local/ecc/docs/zh-CN/skills/agent-eval/SKILL.md +149 -0
  1636. package/resources/local/ecc/docs/zh-CN/skills/agent-harness-construction/SKILL.md +77 -0
  1637. package/resources/local/ecc/docs/zh-CN/skills/agent-introspection-debugging/SKILL.md +161 -0
  1638. package/resources/local/ecc/docs/zh-CN/skills/agent-payment-x402/SKILL.md +182 -0
  1639. package/resources/local/ecc/docs/zh-CN/skills/agent-sort/SKILL.md +215 -0
  1640. package/resources/local/ecc/docs/zh-CN/skills/agentic-engineering/SKILL.md +66 -0
  1641. package/resources/local/ecc/docs/zh-CN/skills/ai-first-engineering/SKILL.md +55 -0
  1642. package/resources/local/ecc/docs/zh-CN/skills/ai-regression-testing/SKILL.md +387 -0
  1643. package/resources/local/ecc/docs/zh-CN/skills/android-clean-architecture/SKILL.md +339 -0
  1644. package/resources/local/ecc/docs/zh-CN/skills/api-connector-builder/SKILL.md +120 -0
  1645. package/resources/local/ecc/docs/zh-CN/skills/api-design/SKILL.md +523 -0
  1646. package/resources/local/ecc/docs/zh-CN/skills/architecture-decision-records/SKILL.md +183 -0
  1647. package/resources/local/ecc/docs/zh-CN/skills/article-writing/SKILL.md +92 -0
  1648. package/resources/local/ecc/docs/zh-CN/skills/automation-audit-ops/SKILL.md +142 -0
  1649. package/resources/local/ecc/docs/zh-CN/skills/autonomous-agent-harness/SKILL.md +279 -0
  1650. package/resources/local/ecc/docs/zh-CN/skills/autonomous-loops/SKILL.md +619 -0
  1651. package/resources/local/ecc/docs/zh-CN/skills/backend-patterns/SKILL.md +598 -0
  1652. package/resources/local/ecc/docs/zh-CN/skills/benchmark/SKILL.md +94 -0
  1653. package/resources/local/ecc/docs/zh-CN/skills/blueprint/SKILL.md +96 -0
  1654. package/resources/local/ecc/docs/zh-CN/skills/brand-voice/SKILL.md +97 -0
  1655. package/resources/local/ecc/docs/zh-CN/skills/browser-qa/SKILL.md +81 -0
  1656. package/resources/local/ecc/docs/zh-CN/skills/bun-runtime/SKILL.md +84 -0
  1657. package/resources/local/ecc/docs/zh-CN/skills/canary-watch/SKILL.md +104 -0
  1658. package/resources/local/ecc/docs/zh-CN/skills/carrier-relationship-management/SKILL.md +199 -0
  1659. package/resources/local/ecc/docs/zh-CN/skills/ck/SKILL.md +171 -0
  1660. package/resources/local/ecc/docs/zh-CN/skills/claude-devfleet/SKILL.md +104 -0
  1661. package/resources/local/ecc/docs/zh-CN/skills/click-path-audit/SKILL.md +257 -0
  1662. package/resources/local/ecc/docs/zh-CN/skills/clickhouse-io/SKILL.md +445 -0
  1663. package/resources/local/ecc/docs/zh-CN/skills/code-tour/SKILL.md +244 -0
  1664. package/resources/local/ecc/docs/zh-CN/skills/codebase-onboarding/SKILL.md +243 -0
  1665. package/resources/local/ecc/docs/zh-CN/skills/coding-standards/SKILL.md +537 -0
  1666. package/resources/local/ecc/docs/zh-CN/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  1667. package/resources/local/ecc/docs/zh-CN/skills/configure-ecc/SKILL.md +400 -0
  1668. package/resources/local/ecc/docs/zh-CN/skills/connections-optimizer/SKILL.md +189 -0
  1669. package/resources/local/ecc/docs/zh-CN/skills/content-engine/SKILL.md +97 -0
  1670. package/resources/local/ecc/docs/zh-CN/skills/content-hash-cache-pattern/SKILL.md +161 -0
  1671. package/resources/local/ecc/docs/zh-CN/skills/context-budget/SKILL.md +143 -0
  1672. package/resources/local/ecc/docs/zh-CN/skills/continuous-agent-loop/SKILL.md +46 -0
  1673. package/resources/local/ecc/docs/zh-CN/skills/continuous-learning/SKILL.md +120 -0
  1674. package/resources/local/ecc/docs/zh-CN/skills/continuous-learning-v2/SKILL.md +355 -0
  1675. package/resources/local/ecc/docs/zh-CN/skills/continuous-learning-v2/agents/observer.md +214 -0
  1676. package/resources/local/ecc/docs/zh-CN/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  1677. package/resources/local/ecc/docs/zh-CN/skills/council/SKILL.md +216 -0
  1678. package/resources/local/ecc/docs/zh-CN/skills/cpp-coding-standards/SKILL.md +723 -0
  1679. package/resources/local/ecc/docs/zh-CN/skills/cpp-testing/SKILL.md +324 -0
  1680. package/resources/local/ecc/docs/zh-CN/skills/crosspost/SKILL.md +207 -0
  1681. package/resources/local/ecc/docs/zh-CN/skills/csharp-testing/SKILL.md +321 -0
  1682. package/resources/local/ecc/docs/zh-CN/skills/customer-billing-ops/SKILL.md +140 -0
  1683. package/resources/local/ecc/docs/zh-CN/skills/customs-trade-compliance/SKILL.md +256 -0
  1684. package/resources/local/ecc/docs/zh-CN/skills/dart-flutter-patterns/SKILL.md +565 -0
  1685. package/resources/local/ecc/docs/zh-CN/skills/dashboard-builder/SKILL.md +108 -0
  1686. package/resources/local/ecc/docs/zh-CN/skills/data-scraper-agent/SKILL.md +772 -0
  1687. package/resources/local/ecc/docs/zh-CN/skills/database-migrations/SKILL.md +335 -0
  1688. package/resources/local/ecc/docs/zh-CN/skills/deep-research/SKILL.md +163 -0
  1689. package/resources/local/ecc/docs/zh-CN/skills/defi-amm-security/SKILL.md +166 -0
  1690. package/resources/local/ecc/docs/zh-CN/skills/deployment-patterns/SKILL.md +432 -0
  1691. package/resources/local/ecc/docs/zh-CN/skills/design-system/SKILL.md +85 -0
  1692. package/resources/local/ecc/docs/zh-CN/skills/django-patterns/SKILL.md +734 -0
  1693. package/resources/local/ecc/docs/zh-CN/skills/django-security/SKILL.md +593 -0
  1694. package/resources/local/ecc/docs/zh-CN/skills/django-tdd/SKILL.md +729 -0
  1695. package/resources/local/ecc/docs/zh-CN/skills/django-verification/SKILL.md +475 -0
  1696. package/resources/local/ecc/docs/zh-CN/skills/dmux-workflows/SKILL.md +193 -0
  1697. package/resources/local/ecc/docs/zh-CN/skills/docker-patterns/SKILL.md +365 -0
  1698. package/resources/local/ecc/docs/zh-CN/skills/documentation-lookup/SKILL.md +90 -0
  1699. package/resources/local/ecc/docs/zh-CN/skills/dotnet-patterns/SKILL.md +321 -0
  1700. package/resources/local/ecc/docs/zh-CN/skills/e2e-testing/SKILL.md +329 -0
  1701. package/resources/local/ecc/docs/zh-CN/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  1702. package/resources/local/ecc/docs/zh-CN/skills/email-ops/SKILL.md +121 -0
  1703. package/resources/local/ecc/docs/zh-CN/skills/energy-procurement/SKILL.md +220 -0
  1704. package/resources/local/ecc/docs/zh-CN/skills/enterprise-agent-ops/SKILL.md +52 -0
  1705. package/resources/local/ecc/docs/zh-CN/skills/eval-harness/SKILL.md +304 -0
  1706. package/resources/local/ecc/docs/zh-CN/skills/evm-token-decimals/SKILL.md +130 -0
  1707. package/resources/local/ecc/docs/zh-CN/skills/exa-search/SKILL.md +109 -0
  1708. package/resources/local/ecc/docs/zh-CN/skills/fal-ai-media/SKILL.md +296 -0
  1709. package/resources/local/ecc/docs/zh-CN/skills/finance-billing-ops/SKILL.md +127 -0
  1710. package/resources/local/ecc/docs/zh-CN/skills/flutter-dart-code-review/SKILL.md +480 -0
  1711. package/resources/local/ecc/docs/zh-CN/skills/foundation-models-on-device/SKILL.md +244 -0
  1712. package/resources/local/ecc/docs/zh-CN/skills/frontend-patterns/SKILL.md +642 -0
  1713. package/resources/local/ecc/docs/zh-CN/skills/frontend-slides/SKILL.md +195 -0
  1714. package/resources/local/ecc/docs/zh-CN/skills/frontend-slides/STYLE_PRESETS.md +333 -0
  1715. package/resources/local/ecc/docs/zh-CN/skills/gan-style-harness/SKILL.md +284 -0
  1716. package/resources/local/ecc/docs/zh-CN/skills/gateguard/SKILL.md +123 -0
  1717. package/resources/local/ecc/docs/zh-CN/skills/git-workflow/SKILL.md +720 -0
  1718. package/resources/local/ecc/docs/zh-CN/skills/github-ops/SKILL.md +145 -0
  1719. package/resources/local/ecc/docs/zh-CN/skills/golang-patterns/SKILL.md +674 -0
  1720. package/resources/local/ecc/docs/zh-CN/skills/golang-testing/SKILL.md +722 -0
  1721. package/resources/local/ecc/docs/zh-CN/skills/google-workspace-ops/SKILL.md +95 -0
  1722. package/resources/local/ecc/docs/zh-CN/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  1723. package/resources/local/ecc/docs/zh-CN/skills/healthcare-emr-patterns/SKILL.md +161 -0
  1724. package/resources/local/ecc/docs/zh-CN/skills/healthcare-eval-harness/SKILL.md +207 -0
  1725. package/resources/local/ecc/docs/zh-CN/skills/healthcare-phi-compliance/SKILL.md +146 -0
  1726. package/resources/local/ecc/docs/zh-CN/skills/hermes-imports/SKILL.md +88 -0
  1727. package/resources/local/ecc/docs/zh-CN/skills/hexagonal-architecture/SKILL.md +276 -0
  1728. package/resources/local/ecc/docs/zh-CN/skills/hipaa-compliance/SKILL.md +78 -0
  1729. package/resources/local/ecc/docs/zh-CN/skills/hookify-rules/SKILL.md +139 -0
  1730. package/resources/local/ecc/docs/zh-CN/skills/inventory-demand-planning/SKILL.md +233 -0
  1731. package/resources/local/ecc/docs/zh-CN/skills/investor-materials/SKILL.md +104 -0
  1732. package/resources/local/ecc/docs/zh-CN/skills/investor-outreach/SKILL.md +81 -0
  1733. package/resources/local/ecc/docs/zh-CN/skills/iterative-retrieval/SKILL.md +215 -0
  1734. package/resources/local/ecc/docs/zh-CN/skills/java-coding-standards/SKILL.md +147 -0
  1735. package/resources/local/ecc/docs/zh-CN/skills/jira-integration/SKILL.md +302 -0
  1736. package/resources/local/ecc/docs/zh-CN/skills/jpa-patterns/SKILL.md +155 -0
  1737. package/resources/local/ecc/docs/zh-CN/skills/knowledge-ops/SKILL.md +177 -0
  1738. package/resources/local/ecc/docs/zh-CN/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  1739. package/resources/local/ecc/docs/zh-CN/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  1740. package/resources/local/ecc/docs/zh-CN/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  1741. package/resources/local/ecc/docs/zh-CN/skills/kotlin-patterns/SKILL.md +714 -0
  1742. package/resources/local/ecc/docs/zh-CN/skills/kotlin-testing/SKILL.md +826 -0
  1743. package/resources/local/ecc/docs/zh-CN/skills/laravel-patterns/SKILL.md +415 -0
  1744. package/resources/local/ecc/docs/zh-CN/skills/laravel-plugin-discovery/SKILL.md +235 -0
  1745. package/resources/local/ecc/docs/zh-CN/skills/laravel-security/SKILL.md +285 -0
  1746. package/resources/local/ecc/docs/zh-CN/skills/laravel-tdd/SKILL.md +283 -0
  1747. package/resources/local/ecc/docs/zh-CN/skills/laravel-verification/SKILL.md +179 -0
  1748. package/resources/local/ecc/docs/zh-CN/skills/lead-intelligence/SKILL.md +323 -0
  1749. package/resources/local/ecc/docs/zh-CN/skills/liquid-glass-design/SKILL.md +280 -0
  1750. package/resources/local/ecc/docs/zh-CN/skills/llm-trading-agent-security/SKILL.md +146 -0
  1751. package/resources/local/ecc/docs/zh-CN/skills/logistics-exception-management/SKILL.md +218 -0
  1752. package/resources/local/ecc/docs/zh-CN/skills/manim-video/SKILL.md +89 -0
  1753. package/resources/local/ecc/docs/zh-CN/skills/market-research/SKILL.md +85 -0
  1754. package/resources/local/ecc/docs/zh-CN/skills/mcp-server-patterns/SKILL.md +67 -0
  1755. package/resources/local/ecc/docs/zh-CN/skills/messages-ops/SKILL.md +104 -0
  1756. package/resources/local/ecc/docs/zh-CN/skills/nanoclaw-repl/SKILL.md +33 -0
  1757. package/resources/local/ecc/docs/zh-CN/skills/nestjs-patterns/SKILL.md +230 -0
  1758. package/resources/local/ecc/docs/zh-CN/skills/nextjs-turbopack/SKILL.md +44 -0
  1759. package/resources/local/ecc/docs/zh-CN/skills/nodejs-keccak256/SKILL.md +102 -0
  1760. package/resources/local/ecc/docs/zh-CN/skills/nutrient-document-processing/SKILL.md +165 -0
  1761. package/resources/local/ecc/docs/zh-CN/skills/nuxt4-patterns/SKILL.md +100 -0
  1762. package/resources/local/ecc/docs/zh-CN/skills/opensource-pipeline/SKILL.md +258 -0
  1763. package/resources/local/ecc/docs/zh-CN/skills/perl-patterns/SKILL.md +504 -0
  1764. package/resources/local/ecc/docs/zh-CN/skills/perl-security/SKILL.md +503 -0
  1765. package/resources/local/ecc/docs/zh-CN/skills/perl-testing/SKILL.md +475 -0
  1766. package/resources/local/ecc/docs/zh-CN/skills/plankton-code-quality/SKILL.md +243 -0
  1767. package/resources/local/ecc/docs/zh-CN/skills/postgres-patterns/SKILL.md +154 -0
  1768. package/resources/local/ecc/docs/zh-CN/skills/product-capability/SKILL.md +141 -0
  1769. package/resources/local/ecc/docs/zh-CN/skills/product-lens/SKILL.md +93 -0
  1770. package/resources/local/ecc/docs/zh-CN/skills/production-scheduling/SKILL.md +230 -0
  1771. package/resources/local/ecc/docs/zh-CN/skills/project-flow-ops/SKILL.md +111 -0
  1772. package/resources/local/ecc/docs/zh-CN/skills/prompt-optimizer/SKILL.md +380 -0
  1773. package/resources/local/ecc/docs/zh-CN/skills/python-patterns/SKILL.md +750 -0
  1774. package/resources/local/ecc/docs/zh-CN/skills/python-testing/SKILL.md +816 -0
  1775. package/resources/local/ecc/docs/zh-CN/skills/pytorch-patterns/SKILL.md +396 -0
  1776. package/resources/local/ecc/docs/zh-CN/skills/quality-nonconformance/SKILL.md +252 -0
  1777. package/resources/local/ecc/docs/zh-CN/skills/ralphinho-rfc-pipeline/SKILL.md +69 -0
  1778. package/resources/local/ecc/docs/zh-CN/skills/regex-vs-llm-structured-text/SKILL.md +217 -0
  1779. package/resources/local/ecc/docs/zh-CN/skills/remotion-video-creation/SKILL.md +43 -0
  1780. package/resources/local/ecc/docs/zh-CN/skills/repo-scan/SKILL.md +79 -0
  1781. package/resources/local/ecc/docs/zh-CN/skills/research-ops/SKILL.md +112 -0
  1782. package/resources/local/ecc/docs/zh-CN/skills/returns-reverse-logistics/SKILL.md +225 -0
  1783. package/resources/local/ecc/docs/zh-CN/skills/rules-distill/SKILL.md +264 -0
  1784. package/resources/local/ecc/docs/zh-CN/skills/rust-patterns/SKILL.md +499 -0
  1785. package/resources/local/ecc/docs/zh-CN/skills/rust-testing/SKILL.md +502 -0
  1786. package/resources/local/ecc/docs/zh-CN/skills/safety-guard/SKILL.md +75 -0
  1787. package/resources/local/ecc/docs/zh-CN/skills/santa-method/SKILL.md +310 -0
  1788. package/resources/local/ecc/docs/zh-CN/skills/search-first/SKILL.md +175 -0
  1789. package/resources/local/ecc/docs/zh-CN/skills/security-bounty-hunter/SKILL.md +99 -0
  1790. package/resources/local/ecc/docs/zh-CN/skills/security-review/SKILL.md +527 -0
  1791. package/resources/local/ecc/docs/zh-CN/skills/security-review/cloud-infrastructure-security.md +361 -0
  1792. package/resources/local/ecc/docs/zh-CN/skills/security-scan/SKILL.md +172 -0
  1793. package/resources/local/ecc/docs/zh-CN/skills/seo/SKILL.md +155 -0
  1794. package/resources/local/ecc/docs/zh-CN/skills/skill-comply/SKILL.md +60 -0
  1795. package/resources/local/ecc/docs/zh-CN/skills/skill-stocktake/SKILL.md +194 -0
  1796. package/resources/local/ecc/docs/zh-CN/skills/social-graph-ranker/SKILL.md +154 -0
  1797. package/resources/local/ecc/docs/zh-CN/skills/springboot-patterns/SKILL.md +313 -0
  1798. package/resources/local/ecc/docs/zh-CN/skills/springboot-security/SKILL.md +272 -0
  1799. package/resources/local/ecc/docs/zh-CN/skills/springboot-tdd/SKILL.md +160 -0
  1800. package/resources/local/ecc/docs/zh-CN/skills/springboot-verification/SKILL.md +235 -0
  1801. package/resources/local/ecc/docs/zh-CN/skills/strategic-compact/SKILL.md +140 -0
  1802. package/resources/local/ecc/docs/zh-CN/skills/swift-actor-persistence/SKILL.md +143 -0
  1803. package/resources/local/ecc/docs/zh-CN/skills/swift-concurrency-6-2/SKILL.md +217 -0
  1804. package/resources/local/ecc/docs/zh-CN/skills/swift-protocol-di-testing/SKILL.md +190 -0
  1805. package/resources/local/ecc/docs/zh-CN/skills/swiftui-patterns/SKILL.md +259 -0
  1806. package/resources/local/ecc/docs/zh-CN/skills/tdd-workflow/SKILL.md +440 -0
  1807. package/resources/local/ecc/docs/zh-CN/skills/team-builder/SKILL.md +165 -0
  1808. package/resources/local/ecc/docs/zh-CN/skills/terminal-ops/SKILL.md +109 -0
  1809. package/resources/local/ecc/docs/zh-CN/skills/token-budget-advisor/SKILL.md +121 -0
  1810. package/resources/local/ecc/docs/zh-CN/skills/ui-demo/SKILL.md +465 -0
  1811. package/resources/local/ecc/docs/zh-CN/skills/unified-notifications-ops/SKILL.md +197 -0
  1812. package/resources/local/ecc/docs/zh-CN/skills/verification-loop/SKILL.md +136 -0
  1813. package/resources/local/ecc/docs/zh-CN/skills/video-editing/SKILL.md +316 -0
  1814. package/resources/local/ecc/docs/zh-CN/skills/videodb/SKILL.md +386 -0
  1815. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/api-reference.md +550 -0
  1816. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/capture-reference.md +416 -0
  1817. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/capture.md +104 -0
  1818. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/editor.md +443 -0
  1819. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/generative.md +331 -0
  1820. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/rtstream-reference.md +567 -0
  1821. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/rtstream.md +59 -0
  1822. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/search.md +230 -0
  1823. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/streaming.md +406 -0
  1824. package/resources/local/ecc/docs/zh-CN/skills/videodb/reference/use-cases.md +142 -0
  1825. package/resources/local/ecc/docs/zh-CN/skills/visa-doc-translate/README.md +91 -0
  1826. package/resources/local/ecc/docs/zh-CN/skills/visa-doc-translate/SKILL.md +119 -0
  1827. package/resources/local/ecc/docs/zh-CN/skills/workspace-surface-audit/SKILL.md +125 -0
  1828. package/resources/local/ecc/docs/zh-CN/skills/x-api/SKILL.md +210 -0
  1829. package/resources/local/ecc/docs/zh-CN/the-longform-guide.md +358 -0
  1830. package/resources/local/ecc/docs/zh-CN/the-openclaw-guide.md +471 -0
  1831. package/resources/local/ecc/docs/zh-CN/the-security-guide.md +206 -0
  1832. package/resources/local/ecc/docs/zh-CN/the-shortform-guide.md +432 -0
  1833. package/resources/local/ecc/docs/zh-TW/CONTRIBUTING.md +191 -0
  1834. package/resources/local/ecc/docs/zh-TW/README.md +482 -0
  1835. package/resources/local/ecc/docs/zh-TW/TERMINOLOGY.md +104 -0
  1836. package/resources/local/ecc/docs/zh-TW/agents/architect.md +211 -0
  1837. package/resources/local/ecc/docs/zh-TW/agents/build-error-resolver.md +300 -0
  1838. package/resources/local/ecc/docs/zh-TW/agents/code-reviewer.md +104 -0
  1839. package/resources/local/ecc/docs/zh-TW/agents/database-reviewer.md +378 -0
  1840. package/resources/local/ecc/docs/zh-TW/agents/doc-updater.md +310 -0
  1841. package/resources/local/ecc/docs/zh-TW/agents/e2e-runner.md +303 -0
  1842. package/resources/local/ecc/docs/zh-TW/agents/go-build-resolver.md +368 -0
  1843. package/resources/local/ecc/docs/zh-TW/agents/go-reviewer.md +267 -0
  1844. package/resources/local/ecc/docs/zh-TW/agents/planner.md +119 -0
  1845. package/resources/local/ecc/docs/zh-TW/agents/refactor-cleaner.md +273 -0
  1846. package/resources/local/ecc/docs/zh-TW/agents/security-reviewer.md +378 -0
  1847. package/resources/local/ecc/docs/zh-TW/agents/tdd-guide.md +280 -0
  1848. package/resources/local/ecc/docs/zh-TW/commands/build-fix.md +29 -0
  1849. package/resources/local/ecc/docs/zh-TW/commands/checkpoint.md +74 -0
  1850. package/resources/local/ecc/docs/zh-TW/commands/code-review.md +40 -0
  1851. package/resources/local/ecc/docs/zh-TW/commands/e2e.md +115 -0
  1852. package/resources/local/ecc/docs/zh-TW/commands/eval.md +120 -0
  1853. package/resources/local/ecc/docs/zh-TW/commands/go-build.md +81 -0
  1854. package/resources/local/ecc/docs/zh-TW/commands/go-review.md +87 -0
  1855. package/resources/local/ecc/docs/zh-TW/commands/go-test.md +132 -0
  1856. package/resources/local/ecc/docs/zh-TW/commands/learn.md +70 -0
  1857. package/resources/local/ecc/docs/zh-TW/commands/orchestrate.md +140 -0
  1858. package/resources/local/ecc/docs/zh-TW/commands/plan.md +113 -0
  1859. package/resources/local/ecc/docs/zh-TW/commands/refactor-clean.md +28 -0
  1860. package/resources/local/ecc/docs/zh-TW/commands/setup-pm.md +80 -0
  1861. package/resources/local/ecc/docs/zh-TW/commands/tdd.md +100 -0
  1862. package/resources/local/ecc/docs/zh-TW/commands/test-coverage.md +27 -0
  1863. package/resources/local/ecc/docs/zh-TW/commands/update-codemaps.md +17 -0
  1864. package/resources/local/ecc/docs/zh-TW/commands/update-docs.md +31 -0
  1865. package/resources/local/ecc/docs/zh-TW/commands/verify.md +59 -0
  1866. package/resources/local/ecc/docs/zh-TW/rules/agents.md +49 -0
  1867. package/resources/local/ecc/docs/zh-TW/rules/coding-style.md +70 -0
  1868. package/resources/local/ecc/docs/zh-TW/rules/git-workflow.md +45 -0
  1869. package/resources/local/ecc/docs/zh-TW/rules/hooks.md +46 -0
  1870. package/resources/local/ecc/docs/zh-TW/rules/patterns.md +55 -0
  1871. package/resources/local/ecc/docs/zh-TW/rules/performance.md +47 -0
  1872. package/resources/local/ecc/docs/zh-TW/rules/security.md +36 -0
  1873. package/resources/local/ecc/docs/zh-TW/rules/testing.md +30 -0
  1874. package/resources/local/ecc/docs/zh-TW/skills/backend-patterns/SKILL.md +587 -0
  1875. package/resources/local/ecc/docs/zh-TW/skills/clickhouse-io/SKILL.md +429 -0
  1876. package/resources/local/ecc/docs/zh-TW/skills/coding-standards/SKILL.md +520 -0
  1877. package/resources/local/ecc/docs/zh-TW/skills/continuous-learning/SKILL.md +110 -0
  1878. package/resources/local/ecc/docs/zh-TW/skills/continuous-learning-v2/SKILL.md +263 -0
  1879. package/resources/local/ecc/docs/zh-TW/skills/eval-harness/SKILL.md +227 -0
  1880. package/resources/local/ecc/docs/zh-TW/skills/frontend-patterns/SKILL.md +631 -0
  1881. package/resources/local/ecc/docs/zh-TW/skills/golang-patterns/SKILL.md +673 -0
  1882. package/resources/local/ecc/docs/zh-TW/skills/golang-testing/SKILL.md +710 -0
  1883. package/resources/local/ecc/docs/zh-TW/skills/iterative-retrieval/SKILL.md +202 -0
  1884. package/resources/local/ecc/docs/zh-TW/skills/postgres-patterns/SKILL.md +146 -0
  1885. package/resources/local/ecc/docs/zh-TW/skills/project-guidelines-example/SKILL.md +345 -0
  1886. package/resources/local/ecc/docs/zh-TW/skills/security-review/SKILL.md +494 -0
  1887. package/resources/local/ecc/docs/zh-TW/skills/security-review/cloud-infrastructure-security.md +361 -0
  1888. package/resources/local/ecc/docs/zh-TW/skills/strategic-compact/SKILL.md +66 -0
  1889. package/resources/local/ecc/docs/zh-TW/skills/tdd-workflow/SKILL.md +409 -0
  1890. package/resources/local/ecc/docs/zh-TW/skills/verification-loop/SKILL.md +120 -0
  1891. package/resources/local/ecc/ecc2/Cargo.lock +2992 -0
  1892. package/resources/local/ecc/ecc2/Cargo.toml +61 -0
  1893. package/resources/local/ecc/ecc2/README.md +99 -0
  1894. package/resources/local/ecc/ecc2/src/comms/mod.rs +156 -0
  1895. package/resources/local/ecc/ecc2/src/config/mod.rs +1806 -0
  1896. package/resources/local/ecc/ecc2/src/main.rs +12595 -0
  1897. package/resources/local/ecc/ecc2/src/notifications.rs +635 -0
  1898. package/resources/local/ecc/ecc2/src/observability/mod.rs +423 -0
  1899. package/resources/local/ecc/ecc2/src/session/daemon.rs +1322 -0
  1900. package/resources/local/ecc/ecc2/src/session/manager.rs +8190 -0
  1901. package/resources/local/ecc/ecc2/src/session/mod.rs +984 -0
  1902. package/resources/local/ecc/ecc2/src/session/output.rs +172 -0
  1903. package/resources/local/ecc/ecc2/src/session/runtime.rs +379 -0
  1904. package/resources/local/ecc/ecc2/src/session/store.rs +7109 -0
  1905. package/resources/local/ecc/ecc2/src/tui/app.rs +151 -0
  1906. package/resources/local/ecc/ecc2/src/tui/dashboard.rs +15162 -0
  1907. package/resources/local/ecc/ecc2/src/tui/mod.rs +3 -0
  1908. package/resources/local/ecc/ecc2/src/tui/widgets.rs +382 -0
  1909. package/resources/local/ecc/ecc2/src/worktree/mod.rs +2672 -0
  1910. package/resources/local/ecc/ecc_dashboard.py +932 -0
  1911. package/resources/local/ecc/eslint.config.js +34 -0
  1912. package/resources/local/ecc/examples/CLAUDE.md +109 -0
  1913. package/resources/local/ecc/examples/django-api-CLAUDE.md +308 -0
  1914. package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/candidate-playbook.md +49 -0
  1915. package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/report.json +35 -0
  1916. package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/scenario.json +62 -0
  1917. package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/trace.json +45 -0
  1918. package/resources/local/ecc/examples/evaluator-rag-prototype/agentshield-policy-exception/verifier-result.json +35 -0
  1919. package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/candidate-playbook.md +41 -0
  1920. package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/report.json +35 -0
  1921. package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/scenario.json +55 -0
  1922. package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/trace.json +45 -0
  1923. package/resources/local/ecc/examples/evaluator-rag-prototype/billing-marketplace-readiness/verifier-result.json +35 -0
  1924. package/resources/local/ecc/examples/evaluator-rag-prototype/candidate-playbook.md +41 -0
  1925. package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/candidate-playbook.md +46 -0
  1926. package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/report.json +35 -0
  1927. package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/scenario.json +57 -0
  1928. package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/trace.json +45 -0
  1929. package/resources/local/ecc/examples/evaluator-rag-prototype/ci-failure-diagnosis/verifier-result.json +35 -0
  1930. package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/candidate-playbook.md +60 -0
  1931. package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/report.json +35 -0
  1932. package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/scenario.json +57 -0
  1933. package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/trace.json +45 -0
  1934. package/resources/local/ecc/examples/evaluator-rag-prototype/deep-analyzer-evidence/verifier-result.json +35 -0
  1935. package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/candidate-playbook.md +49 -0
  1936. package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/report.json +35 -0
  1937. package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/scenario.json +57 -0
  1938. package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/trace.json +45 -0
  1939. package/resources/local/ecc/examples/evaluator-rag-prototype/harness-config-quality/verifier-result.json +35 -0
  1940. package/resources/local/ecc/examples/evaluator-rag-prototype/report.json +35 -0
  1941. package/resources/local/ecc/examples/evaluator-rag-prototype/scenario.json +56 -0
  1942. package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/candidate-playbook.md +57 -0
  1943. package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/report.json +35 -0
  1944. package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/scenario.json +57 -0
  1945. package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/trace.json +46 -0
  1946. package/resources/local/ecc/examples/evaluator-rag-prototype/skill-quality-evidence/verifier-result.json +35 -0
  1947. package/resources/local/ecc/examples/evaluator-rag-prototype/trace.json +46 -0
  1948. package/resources/local/ecc/examples/evaluator-rag-prototype/verifier-result.json +35 -0
  1949. package/resources/local/ecc/examples/gan-harness/README.md +126 -0
  1950. package/resources/local/ecc/examples/go-microservice-CLAUDE.md +267 -0
  1951. package/resources/local/ecc/examples/harmonyos-app-CLAUDE.md +88 -0
  1952. package/resources/local/ecc/examples/hud-status-contract.json +117 -0
  1953. package/resources/local/ecc/examples/laravel-api-CLAUDE.md +311 -0
  1954. package/resources/local/ecc/examples/rust-api-CLAUDE.md +285 -0
  1955. package/resources/local/ecc/examples/saas-nextjs-CLAUDE.md +166 -0
  1956. package/resources/local/ecc/examples/statusline.json +20 -0
  1957. package/resources/local/ecc/examples/user-CLAUDE.md +109 -0
  1958. package/resources/local/ecc/hooks/README.md +258 -0
  1959. package/resources/local/ecc/hooks/hooks.json +354 -0
  1960. package/resources/local/ecc/hooks/memory-persistence/README.md +44 -0
  1961. package/resources/local/ecc/hooks/memory-persistence/hooks.json +47 -0
  1962. package/resources/local/ecc/install.ps1 +53 -0
  1963. package/resources/local/ecc/install.sh +32 -0
  1964. package/resources/local/ecc/legacy-command-shims/README.md +7 -0
  1965. package/resources/local/ecc/legacy-command-shims/commands/agent-sort.md +23 -0
  1966. package/resources/local/ecc/legacy-command-shims/commands/claw.md +23 -0
  1967. package/resources/local/ecc/legacy-command-shims/commands/context-budget.md +23 -0
  1968. package/resources/local/ecc/legacy-command-shims/commands/devfleet.md +23 -0
  1969. package/resources/local/ecc/legacy-command-shims/commands/docs.md +23 -0
  1970. package/resources/local/ecc/legacy-command-shims/commands/e2e.md +268 -0
  1971. package/resources/local/ecc/legacy-command-shims/commands/eval.md +23 -0
  1972. package/resources/local/ecc/legacy-command-shims/commands/orchestrate.md +135 -0
  1973. package/resources/local/ecc/legacy-command-shims/commands/prompt-optimize.md +23 -0
  1974. package/resources/local/ecc/legacy-command-shims/commands/rules-distill.md +20 -0
  1975. package/resources/local/ecc/legacy-command-shims/commands/tdd.md +231 -0
  1976. package/resources/local/ecc/legacy-command-shims/commands/verify.md +23 -0
  1977. package/resources/local/ecc/manifests/install-components.json +594 -0
  1978. package/resources/local/ecc/manifests/install-modules.json +819 -0
  1979. package/resources/local/ecc/manifests/install-profiles.json +92 -0
  1980. package/resources/local/ecc/mcp-configs/mcp-servers.json +181 -0
  1981. package/resources/local/ecc/nul +2 -0
  1982. package/resources/local/ecc/package-lock.json +2906 -0
  1983. package/resources/local/ecc/package.json +347 -0
  1984. package/resources/local/ecc/plugins/README.md +85 -0
  1985. package/resources/local/ecc/pyproject.toml +78 -0
  1986. package/resources/local/ecc/research/ecc2-codebase-analysis.md +172 -0
  1987. package/resources/local/ecc/rules/README.md +135 -0
  1988. package/resources/local/ecc/rules/angular/coding-style.md +182 -0
  1989. package/resources/local/ecc/rules/angular/hooks.md +25 -0
  1990. package/resources/local/ecc/rules/angular/patterns.md +249 -0
  1991. package/resources/local/ecc/rules/angular/security.md +87 -0
  1992. package/resources/local/ecc/rules/angular/testing.md +164 -0
  1993. package/resources/local/ecc/rules/arkts/coding-style.md +153 -0
  1994. package/resources/local/ecc/rules/arkts/hooks.md +135 -0
  1995. package/resources/local/ecc/rules/arkts/patterns.md +236 -0
  1996. package/resources/local/ecc/rules/arkts/security.md +141 -0
  1997. package/resources/local/ecc/rules/arkts/testing.md +126 -0
  1998. package/resources/local/ecc/rules/common/agents.md +51 -0
  1999. package/resources/local/ecc/rules/common/code-review.md +124 -0
  2000. package/resources/local/ecc/rules/common/coding-style.md +90 -0
  2001. package/resources/local/ecc/rules/common/development-workflow.md +44 -0
  2002. package/resources/local/ecc/rules/common/git-workflow.md +24 -0
  2003. package/resources/local/ecc/rules/common/hooks.md +30 -0
  2004. package/resources/local/ecc/rules/common/patterns.md +31 -0
  2005. package/resources/local/ecc/rules/common/performance.md +55 -0
  2006. package/resources/local/ecc/rules/common/security.md +29 -0
  2007. package/resources/local/ecc/rules/common/testing.md +57 -0
  2008. package/resources/local/ecc/rules/cpp/coding-style.md +44 -0
  2009. package/resources/local/ecc/rules/cpp/hooks.md +39 -0
  2010. package/resources/local/ecc/rules/cpp/patterns.md +51 -0
  2011. package/resources/local/ecc/rules/cpp/security.md +51 -0
  2012. package/resources/local/ecc/rules/cpp/testing.md +44 -0
  2013. package/resources/local/ecc/rules/csharp/coding-style.md +72 -0
  2014. package/resources/local/ecc/rules/csharp/hooks.md +25 -0
  2015. package/resources/local/ecc/rules/csharp/patterns.md +50 -0
  2016. package/resources/local/ecc/rules/csharp/security.md +58 -0
  2017. package/resources/local/ecc/rules/csharp/testing.md +46 -0
  2018. package/resources/local/ecc/rules/dart/coding-style.md +159 -0
  2019. package/resources/local/ecc/rules/dart/hooks.md +66 -0
  2020. package/resources/local/ecc/rules/dart/patterns.md +261 -0
  2021. package/resources/local/ecc/rules/dart/security.md +135 -0
  2022. package/resources/local/ecc/rules/dart/testing.md +215 -0
  2023. package/resources/local/ecc/rules/fsharp/coding-style.md +112 -0
  2024. package/resources/local/ecc/rules/fsharp/hooks.md +26 -0
  2025. package/resources/local/ecc/rules/fsharp/patterns.md +111 -0
  2026. package/resources/local/ecc/rules/fsharp/security.md +76 -0
  2027. package/resources/local/ecc/rules/fsharp/testing.md +62 -0
  2028. package/resources/local/ecc/rules/golang/coding-style.md +32 -0
  2029. package/resources/local/ecc/rules/golang/hooks.md +17 -0
  2030. package/resources/local/ecc/rules/golang/patterns.md +45 -0
  2031. package/resources/local/ecc/rules/golang/security.md +34 -0
  2032. package/resources/local/ecc/rules/golang/testing.md +31 -0
  2033. package/resources/local/ecc/rules/java/coding-style.md +114 -0
  2034. package/resources/local/ecc/rules/java/hooks.md +18 -0
  2035. package/resources/local/ecc/rules/java/patterns.md +147 -0
  2036. package/resources/local/ecc/rules/java/security.md +101 -0
  2037. package/resources/local/ecc/rules/java/testing.md +133 -0
  2038. package/resources/local/ecc/rules/kotlin/coding-style.md +86 -0
  2039. package/resources/local/ecc/rules/kotlin/hooks.md +17 -0
  2040. package/resources/local/ecc/rules/kotlin/patterns.md +146 -0
  2041. package/resources/local/ecc/rules/kotlin/security.md +82 -0
  2042. package/resources/local/ecc/rules/kotlin/testing.md +128 -0
  2043. package/resources/local/ecc/rules/perl/coding-style.md +46 -0
  2044. package/resources/local/ecc/rules/perl/hooks.md +22 -0
  2045. package/resources/local/ecc/rules/perl/patterns.md +76 -0
  2046. package/resources/local/ecc/rules/perl/security.md +69 -0
  2047. package/resources/local/ecc/rules/perl/testing.md +54 -0
  2048. package/resources/local/ecc/rules/php/coding-style.md +40 -0
  2049. package/resources/local/ecc/rules/php/hooks.md +24 -0
  2050. package/resources/local/ecc/rules/php/patterns.md +33 -0
  2051. package/resources/local/ecc/rules/php/security.md +37 -0
  2052. package/resources/local/ecc/rules/php/testing.md +39 -0
  2053. package/resources/local/ecc/rules/python/coding-style.md +42 -0
  2054. package/resources/local/ecc/rules/python/fastapi.md +58 -0
  2055. package/resources/local/ecc/rules/python/hooks.md +19 -0
  2056. package/resources/local/ecc/rules/python/patterns.md +39 -0
  2057. package/resources/local/ecc/rules/python/security.md +30 -0
  2058. package/resources/local/ecc/rules/python/testing.md +38 -0
  2059. package/resources/local/ecc/rules/ruby/coding-style.md +46 -0
  2060. package/resources/local/ecc/rules/ruby/hooks.md +37 -0
  2061. package/resources/local/ecc/rules/ruby/patterns.md +44 -0
  2062. package/resources/local/ecc/rules/ruby/security.md +51 -0
  2063. package/resources/local/ecc/rules/ruby/testing.md +51 -0
  2064. package/resources/local/ecc/rules/rust/coding-style.md +151 -0
  2065. package/resources/local/ecc/rules/rust/hooks.md +16 -0
  2066. package/resources/local/ecc/rules/rust/patterns.md +168 -0
  2067. package/resources/local/ecc/rules/rust/security.md +141 -0
  2068. package/resources/local/ecc/rules/rust/testing.md +154 -0
  2069. package/resources/local/ecc/rules/swift/coding-style.md +47 -0
  2070. package/resources/local/ecc/rules/swift/hooks.md +20 -0
  2071. package/resources/local/ecc/rules/swift/patterns.md +66 -0
  2072. package/resources/local/ecc/rules/swift/security.md +33 -0
  2073. package/resources/local/ecc/rules/swift/testing.md +45 -0
  2074. package/resources/local/ecc/rules/typescript/coding-style.md +199 -0
  2075. package/resources/local/ecc/rules/typescript/hooks.md +22 -0
  2076. package/resources/local/ecc/rules/typescript/patterns.md +52 -0
  2077. package/resources/local/ecc/rules/typescript/security.md +28 -0
  2078. package/resources/local/ecc/rules/typescript/testing.md +18 -0
  2079. package/resources/local/ecc/rules/web/coding-style.md +96 -0
  2080. package/resources/local/ecc/rules/web/design-quality.md +63 -0
  2081. package/resources/local/ecc/rules/web/hooks.md +129 -0
  2082. package/resources/local/ecc/rules/web/patterns.md +79 -0
  2083. package/resources/local/ecc/rules/web/performance.md +64 -0
  2084. package/resources/local/ecc/rules/web/security.md +57 -0
  2085. package/resources/local/ecc/rules/web/testing.md +55 -0
  2086. package/resources/local/ecc/rules/zh/README.md +108 -0
  2087. package/resources/local/ecc/rules/zh/agents.md +50 -0
  2088. package/resources/local/ecc/rules/zh/code-review.md +124 -0
  2089. package/resources/local/ecc/rules/zh/coding-style.md +48 -0
  2090. package/resources/local/ecc/rules/zh/development-workflow.md +44 -0
  2091. package/resources/local/ecc/rules/zh/git-workflow.md +24 -0
  2092. package/resources/local/ecc/rules/zh/hooks.md +30 -0
  2093. package/resources/local/ecc/rules/zh/patterns.md +31 -0
  2094. package/resources/local/ecc/rules/zh/performance.md +55 -0
  2095. package/resources/local/ecc/rules/zh/security.md +29 -0
  2096. package/resources/local/ecc/rules/zh/testing.md +29 -0
  2097. package/resources/local/ecc/schemas/ecc-install-config.schema.json +63 -0
  2098. package/resources/local/ecc/schemas/hooks.schema.json +197 -0
  2099. package/resources/local/ecc/schemas/install-components.schema.json +59 -0
  2100. package/resources/local/ecc/schemas/install-modules.schema.json +111 -0
  2101. package/resources/local/ecc/schemas/install-profiles.schema.json +45 -0
  2102. package/resources/local/ecc/schemas/install-state.schema.json +210 -0
  2103. package/resources/local/ecc/schemas/package-manager.schema.json +23 -0
  2104. package/resources/local/ecc/schemas/plugin.schema.json +70 -0
  2105. package/resources/local/ecc/schemas/provenance.schema.json +31 -0
  2106. package/resources/local/ecc/schemas/state-store.schema.json +382 -0
  2107. package/resources/local/ecc/scripts/auto-update.js +361 -0
  2108. package/resources/local/ecc/scripts/build-opencode.js +26 -0
  2109. package/resources/local/ecc/scripts/catalog.js +186 -0
  2110. package/resources/local/ecc/scripts/ci/catalog.js +828 -0
  2111. package/resources/local/ecc/scripts/ci/check-unicode-safety.js +272 -0
  2112. package/resources/local/ecc/scripts/ci/generate-command-registry.js +318 -0
  2113. package/resources/local/ecc/scripts/ci/scan-supply-chain-iocs.js +847 -0
  2114. package/resources/local/ecc/scripts/ci/supply-chain-advisory-sources.js +469 -0
  2115. package/resources/local/ecc/scripts/ci/validate-agents.js +96 -0
  2116. package/resources/local/ecc/scripts/ci/validate-commands.js +188 -0
  2117. package/resources/local/ecc/scripts/ci/validate-hooks.js +239 -0
  2118. package/resources/local/ecc/scripts/ci/validate-install-manifests.js +218 -0
  2119. package/resources/local/ecc/scripts/ci/validate-no-personal-paths.js +107 -0
  2120. package/resources/local/ecc/scripts/ci/validate-rules.js +81 -0
  2121. package/resources/local/ecc/scripts/ci/validate-skills.js +210 -0
  2122. package/resources/local/ecc/scripts/ci/validate-workflow-security.js +278 -0
  2123. package/resources/local/ecc/scripts/claw.js +473 -0
  2124. package/resources/local/ecc/scripts/codemaps/generate.ts +330 -0
  2125. package/resources/local/ecc/scripts/codex/check-codex-global-state.sh +250 -0
  2126. package/resources/local/ecc/scripts/codex/install-global-git-hooks.sh +65 -0
  2127. package/resources/local/ecc/scripts/codex/merge-codex-config.js +317 -0
  2128. package/resources/local/ecc/scripts/codex/merge-mcp-config.js +335 -0
  2129. package/resources/local/ecc/scripts/codex-git-hooks/pre-commit +77 -0
  2130. package/resources/local/ecc/scripts/codex-git-hooks/pre-push +124 -0
  2131. package/resources/local/ecc/scripts/consult.js +497 -0
  2132. package/resources/local/ecc/scripts/discussion-audit.js +350 -0
  2133. package/resources/local/ecc/scripts/doctor.js +111 -0
  2134. package/resources/local/ecc/scripts/ecc.js +255 -0
  2135. package/resources/local/ecc/scripts/gan-harness.sh +299 -0
  2136. package/resources/local/ecc/scripts/gemini-adapt-agents.js +189 -0
  2137. package/resources/local/ecc/scripts/harness-adapter-compliance.js +149 -0
  2138. package/resources/local/ecc/scripts/harness-audit.js +869 -0
  2139. package/resources/local/ecc/scripts/hooks/auto-tmux-dev.js +107 -0
  2140. package/resources/local/ecc/scripts/hooks/bash-hook-dispatcher.js +177 -0
  2141. package/resources/local/ecc/scripts/hooks/block-no-verify.js +546 -0
  2142. package/resources/local/ecc/scripts/hooks/check-console-log.js +71 -0
  2143. package/resources/local/ecc/scripts/hooks/check-hook-enabled.js +12 -0
  2144. package/resources/local/ecc/scripts/hooks/config-protection.js +169 -0
  2145. package/resources/local/ecc/scripts/hooks/cost-tracker.js +157 -0
  2146. package/resources/local/ecc/scripts/hooks/design-quality-check.js +131 -0
  2147. package/resources/local/ecc/scripts/hooks/desktop-notify.js +245 -0
  2148. package/resources/local/ecc/scripts/hooks/doc-file-warning.js +90 -0
  2149. package/resources/local/ecc/scripts/hooks/ecc-context-monitor.js +258 -0
  2150. package/resources/local/ecc/scripts/hooks/ecc-metrics-bridge.js +263 -0
  2151. package/resources/local/ecc/scripts/hooks/ecc-statusline.js +168 -0
  2152. package/resources/local/ecc/scripts/hooks/evaluate-session.js +100 -0
  2153. package/resources/local/ecc/scripts/hooks/gateguard-fact-force.js +832 -0
  2154. package/resources/local/ecc/scripts/hooks/governance-capture.js +334 -0
  2155. package/resources/local/ecc/scripts/hooks/insaits-security-monitor.py +269 -0
  2156. package/resources/local/ecc/scripts/hooks/insaits-security-wrapper.js +119 -0
  2157. package/resources/local/ecc/scripts/hooks/mcp-health-check.js +720 -0
  2158. package/resources/local/ecc/scripts/hooks/observe-runner.js +196 -0
  2159. package/resources/local/ecc/scripts/hooks/plugin-hook-bootstrap.js +153 -0
  2160. package/resources/local/ecc/scripts/hooks/post-bash-build-complete.js +49 -0
  2161. package/resources/local/ecc/scripts/hooks/post-bash-command-log.js +80 -0
  2162. package/resources/local/ecc/scripts/hooks/post-bash-dispatcher.js +24 -0
  2163. package/resources/local/ecc/scripts/hooks/post-bash-pr-created.js +60 -0
  2164. package/resources/local/ecc/scripts/hooks/post-edit-accumulator.js +78 -0
  2165. package/resources/local/ecc/scripts/hooks/post-edit-console-warn.js +54 -0
  2166. package/resources/local/ecc/scripts/hooks/post-edit-format.js +109 -0
  2167. package/resources/local/ecc/scripts/hooks/post-edit-typecheck.js +96 -0
  2168. package/resources/local/ecc/scripts/hooks/pre-bash-commit-quality.js +447 -0
  2169. package/resources/local/ecc/scripts/hooks/pre-bash-dev-server-block.js +225 -0
  2170. package/resources/local/ecc/scripts/hooks/pre-bash-dispatcher.js +24 -0
  2171. package/resources/local/ecc/scripts/hooks/pre-bash-git-push-reminder.js +52 -0
  2172. package/resources/local/ecc/scripts/hooks/pre-bash-tmux-reminder.js +57 -0
  2173. package/resources/local/ecc/scripts/hooks/pre-compact.js +48 -0
  2174. package/resources/local/ecc/scripts/hooks/pre-write-doc-warn.js +9 -0
  2175. package/resources/local/ecc/scripts/hooks/quality-gate.js +168 -0
  2176. package/resources/local/ecc/scripts/hooks/run-with-flags-shell.sh +36 -0
  2177. package/resources/local/ecc/scripts/hooks/run-with-flags.js +190 -0
  2178. package/resources/local/ecc/scripts/hooks/session-activity-tracker.js +639 -0
  2179. package/resources/local/ecc/scripts/hooks/session-end-marker.js +67 -0
  2180. package/resources/local/ecc/scripts/hooks/session-end.js +328 -0
  2181. package/resources/local/ecc/scripts/hooks/session-start-bootstrap.js +161 -0
  2182. package/resources/local/ecc/scripts/hooks/session-start.js +706 -0
  2183. package/resources/local/ecc/scripts/hooks/stop-format-typecheck.js +209 -0
  2184. package/resources/local/ecc/scripts/hooks/suggest-compact.js +108 -0
  2185. package/resources/local/ecc/scripts/install-apply.js +167 -0
  2186. package/resources/local/ecc/scripts/install-plan.js +276 -0
  2187. package/resources/local/ecc/scripts/lib/agent-compress.js +244 -0
  2188. package/resources/local/ecc/scripts/lib/cost-estimate.js +32 -0
  2189. package/resources/local/ecc/scripts/lib/cursor-agent-names.js +26 -0
  2190. package/resources/local/ecc/scripts/lib/ecc_dashboard_runtime.py +70 -0
  2191. package/resources/local/ecc/scripts/lib/github-discussions.js +159 -0
  2192. package/resources/local/ecc/scripts/lib/harness-adapter-compliance.js +453 -0
  2193. package/resources/local/ecc/scripts/lib/hook-flags.js +74 -0
  2194. package/resources/local/ecc/scripts/lib/inspection.js +212 -0
  2195. package/resources/local/ecc/scripts/lib/install/apply.js +174 -0
  2196. package/resources/local/ecc/scripts/lib/install/config.js +89 -0
  2197. package/resources/local/ecc/scripts/lib/install/request.js +157 -0
  2198. package/resources/local/ecc/scripts/lib/install/runtime.js +56 -0
  2199. package/resources/local/ecc/scripts/lib/install-executor.js +738 -0
  2200. package/resources/local/ecc/scripts/lib/install-lifecycle.js +1226 -0
  2201. package/resources/local/ecc/scripts/lib/install-manifests.js +644 -0
  2202. package/resources/local/ecc/scripts/lib/install-state.js +313 -0
  2203. package/resources/local/ecc/scripts/lib/install-targets/antigravity-project.js +85 -0
  2204. package/resources/local/ecc/scripts/lib/install-targets/claude-home.js +91 -0
  2205. package/resources/local/ecc/scripts/lib/install-targets/codebuddy-project.js +50 -0
  2206. package/resources/local/ecc/scripts/lib/install-targets/codex-home.js +10 -0
  2207. package/resources/local/ecc/scripts/lib/install-targets/cursor-project.js +210 -0
  2208. package/resources/local/ecc/scripts/lib/install-targets/gemini-project.js +10 -0
  2209. package/resources/local/ecc/scripts/lib/install-targets/helpers.js +368 -0
  2210. package/resources/local/ecc/scripts/lib/install-targets/joycode-project.js +50 -0
  2211. package/resources/local/ecc/scripts/lib/install-targets/opencode-home.js +10 -0
  2212. package/resources/local/ecc/scripts/lib/install-targets/qwen-home.js +10 -0
  2213. package/resources/local/ecc/scripts/lib/install-targets/registry.js +76 -0
  2214. package/resources/local/ecc/scripts/lib/install-targets/zed-project.js +50 -0
  2215. package/resources/local/ecc/scripts/lib/mcp-config.js +56 -0
  2216. package/resources/local/ecc/scripts/lib/observer-sessions.js +212 -0
  2217. package/resources/local/ecc/scripts/lib/orchestration-session.js +299 -0
  2218. package/resources/local/ecc/scripts/lib/package-manager.d.ts +119 -0
  2219. package/resources/local/ecc/scripts/lib/package-manager.js +431 -0
  2220. package/resources/local/ecc/scripts/lib/project-detect.js +438 -0
  2221. package/resources/local/ecc/scripts/lib/resolve-ecc-root.js +118 -0
  2222. package/resources/local/ecc/scripts/lib/resolve-formatter.js +185 -0
  2223. package/resources/local/ecc/scripts/lib/session-adapters/canonical-session.js +531 -0
  2224. package/resources/local/ecc/scripts/lib/session-adapters/claude-history.js +160 -0
  2225. package/resources/local/ecc/scripts/lib/session-adapters/dmux-tmux.js +90 -0
  2226. package/resources/local/ecc/scripts/lib/session-adapters/registry.js +127 -0
  2227. package/resources/local/ecc/scripts/lib/session-aliases.d.ts +136 -0
  2228. package/resources/local/ecc/scripts/lib/session-aliases.js +481 -0
  2229. package/resources/local/ecc/scripts/lib/session-bridge.js +81 -0
  2230. package/resources/local/ecc/scripts/lib/session-manager.d.ts +132 -0
  2231. package/resources/local/ecc/scripts/lib/session-manager.js +533 -0
  2232. package/resources/local/ecc/scripts/lib/shell-split.js +86 -0
  2233. package/resources/local/ecc/scripts/lib/shell-substitution.js +494 -0
  2234. package/resources/local/ecc/scripts/lib/skill-evolution/dashboard.js +401 -0
  2235. package/resources/local/ecc/scripts/lib/skill-evolution/health.js +263 -0
  2236. package/resources/local/ecc/scripts/lib/skill-evolution/index.js +20 -0
  2237. package/resources/local/ecc/scripts/lib/skill-evolution/provenance.js +187 -0
  2238. package/resources/local/ecc/scripts/lib/skill-evolution/tracker.js +146 -0
  2239. package/resources/local/ecc/scripts/lib/skill-evolution/versioning.js +237 -0
  2240. package/resources/local/ecc/scripts/lib/skill-improvement/amendify.js +89 -0
  2241. package/resources/local/ecc/scripts/lib/skill-improvement/evaluate.js +59 -0
  2242. package/resources/local/ecc/scripts/lib/skill-improvement/health.js +118 -0
  2243. package/resources/local/ecc/scripts/lib/skill-improvement/observations.js +108 -0
  2244. package/resources/local/ecc/scripts/lib/state-store/index.js +191 -0
  2245. package/resources/local/ecc/scripts/lib/state-store/migrations.js +209 -0
  2246. package/resources/local/ecc/scripts/lib/state-store/queries.js +906 -0
  2247. package/resources/local/ecc/scripts/lib/state-store/schema.js +93 -0
  2248. package/resources/local/ecc/scripts/lib/tmux-worktree-orchestrator.js +598 -0
  2249. package/resources/local/ecc/scripts/lib/utils.d.ts +196 -0
  2250. package/resources/local/ecc/scripts/lib/utils.js +629 -0
  2251. package/resources/local/ecc/scripts/list-installed.js +91 -0
  2252. package/resources/local/ecc/scripts/loop-status.js +820 -0
  2253. package/resources/local/ecc/scripts/observability-readiness.js +462 -0
  2254. package/resources/local/ecc/scripts/operator-readiness-dashboard.js +979 -0
  2255. package/resources/local/ecc/scripts/orchestrate-codex-worker.sh +107 -0
  2256. package/resources/local/ecc/scripts/orchestrate-worktrees.js +108 -0
  2257. package/resources/local/ecc/scripts/orchestration-status.js +62 -0
  2258. package/resources/local/ecc/scripts/platform-audit.js +749 -0
  2259. package/resources/local/ecc/scripts/preview-pack-smoke.js +353 -0
  2260. package/resources/local/ecc/scripts/repair.js +98 -0
  2261. package/resources/local/ecc/scripts/session-inspect.js +150 -0
  2262. package/resources/local/ecc/scripts/sessions-cli.js +178 -0
  2263. package/resources/local/ecc/scripts/setup-package-manager.js +204 -0
  2264. package/resources/local/ecc/scripts/skill-create-output.js +244 -0
  2265. package/resources/local/ecc/scripts/skills-health.js +132 -0
  2266. package/resources/local/ecc/scripts/status.js +394 -0
  2267. package/resources/local/ecc/scripts/sync-ecc-to-codex.sh +534 -0
  2268. package/resources/local/ecc/scripts/uninstall.js +97 -0
  2269. package/resources/local/ecc/scripts/work-items.js +510 -0
  2270. package/resources/local/ecc/skills/accessibility/SKILL.md +146 -0
  2271. package/resources/local/ecc/skills/agent-architecture-audit/SKILL.md +256 -0
  2272. package/resources/local/ecc/skills/agent-eval/SKILL.md +145 -0
  2273. package/resources/local/ecc/skills/agent-harness-construction/SKILL.md +73 -0
  2274. package/resources/local/ecc/skills/agent-introspection-debugging/SKILL.md +153 -0
  2275. package/resources/local/ecc/skills/agent-payment-x402/SKILL.md +224 -0
  2276. package/resources/local/ecc/skills/agent-sort/SKILL.md +215 -0
  2277. package/resources/local/ecc/skills/agentic-engineering/SKILL.md +63 -0
  2278. package/resources/local/ecc/skills/agentic-os/SKILL.md +387 -0
  2279. package/resources/local/ecc/skills/ai-first-engineering/SKILL.md +51 -0
  2280. package/resources/local/ecc/skills/ai-regression-testing/SKILL.md +385 -0
  2281. package/resources/local/ecc/skills/android-clean-architecture/SKILL.md +339 -0
  2282. package/resources/local/ecc/skills/angular-developer/SKILL.md +154 -0
  2283. package/resources/local/ecc/skills/angular-developer/references/angular-animations.md +160 -0
  2284. package/resources/local/ecc/skills/angular-developer/references/angular-aria.md +410 -0
  2285. package/resources/local/ecc/skills/angular-developer/references/cli.md +86 -0
  2286. package/resources/local/ecc/skills/angular-developer/references/component-harnesses.md +59 -0
  2287. package/resources/local/ecc/skills/angular-developer/references/component-styling.md +91 -0
  2288. package/resources/local/ecc/skills/angular-developer/references/components.md +117 -0
  2289. package/resources/local/ecc/skills/angular-developer/references/creating-services.md +97 -0
  2290. package/resources/local/ecc/skills/angular-developer/references/data-resolvers.md +69 -0
  2291. package/resources/local/ecc/skills/angular-developer/references/define-routes.md +67 -0
  2292. package/resources/local/ecc/skills/angular-developer/references/defining-providers.md +72 -0
  2293. package/resources/local/ecc/skills/angular-developer/references/di-fundamentals.md +120 -0
  2294. package/resources/local/ecc/skills/angular-developer/references/e2e-testing.md +56 -0
  2295. package/resources/local/ecc/skills/angular-developer/references/effects.md +83 -0
  2296. package/resources/local/ecc/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  2297. package/resources/local/ecc/skills/angular-developer/references/host-elements.md +80 -0
  2298. package/resources/local/ecc/skills/angular-developer/references/injection-context.md +63 -0
  2299. package/resources/local/ecc/skills/angular-developer/references/inputs.md +101 -0
  2300. package/resources/local/ecc/skills/angular-developer/references/linked-signal.md +59 -0
  2301. package/resources/local/ecc/skills/angular-developer/references/loading-strategies.md +61 -0
  2302. package/resources/local/ecc/skills/angular-developer/references/mcp.md +108 -0
  2303. package/resources/local/ecc/skills/angular-developer/references/navigate-to-routes.md +69 -0
  2304. package/resources/local/ecc/skills/angular-developer/references/outputs.md +86 -0
  2305. package/resources/local/ecc/skills/angular-developer/references/reactive-forms.md +122 -0
  2306. package/resources/local/ecc/skills/angular-developer/references/rendering-strategies.md +44 -0
  2307. package/resources/local/ecc/skills/angular-developer/references/resource.md +77 -0
  2308. package/resources/local/ecc/skills/angular-developer/references/route-animations.md +56 -0
  2309. package/resources/local/ecc/skills/angular-developer/references/route-guards.md +52 -0
  2310. package/resources/local/ecc/skills/angular-developer/references/router-lifecycle.md +45 -0
  2311. package/resources/local/ecc/skills/angular-developer/references/router-testing.md +87 -0
  2312. package/resources/local/ecc/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  2313. package/resources/local/ecc/skills/angular-developer/references/signal-forms.md +795 -0
  2314. package/resources/local/ecc/skills/angular-developer/references/signals-overview.md +94 -0
  2315. package/resources/local/ecc/skills/angular-developer/references/tailwind-css.md +69 -0
  2316. package/resources/local/ecc/skills/angular-developer/references/template-driven-forms.md +114 -0
  2317. package/resources/local/ecc/skills/angular-developer/references/testing-fundamentals.md +65 -0
  2318. package/resources/local/ecc/skills/api-connector-builder/SKILL.md +120 -0
  2319. package/resources/local/ecc/skills/api-design/SKILL.md +523 -0
  2320. package/resources/local/ecc/skills/architecture-decision-records/SKILL.md +179 -0
  2321. package/resources/local/ecc/skills/article-writing/SKILL.md +79 -0
  2322. package/resources/local/ecc/skills/automation-audit-ops/SKILL.md +142 -0
  2323. package/resources/local/ecc/skills/autonomous-agent-harness/SKILL.md +273 -0
  2324. package/resources/local/ecc/skills/autonomous-loops/SKILL.md +610 -0
  2325. package/resources/local/ecc/skills/backend-patterns/SKILL.md +561 -0
  2326. package/resources/local/ecc/skills/benchmark/SKILL.md +93 -0
  2327. package/resources/local/ecc/skills/blender-motion-state-inspection/SKILL.md +164 -0
  2328. package/resources/local/ecc/skills/blueprint/SKILL.md +105 -0
  2329. package/resources/local/ecc/skills/brand-voice/SKILL.md +97 -0
  2330. package/resources/local/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  2331. package/resources/local/ecc/skills/browser-qa/SKILL.md +87 -0
  2332. package/resources/local/ecc/skills/bun-runtime/SKILL.md +84 -0
  2333. package/resources/local/ecc/skills/canary-watch/SKILL.md +107 -0
  2334. package/resources/local/ecc/skills/carrier-relationship-management/SKILL.md +212 -0
  2335. package/resources/local/ecc/skills/cisco-ios-patterns/SKILL.md +163 -0
  2336. package/resources/local/ecc/skills/ck/SKILL.md +147 -0
  2337. package/resources/local/ecc/skills/ck/commands/forget.mjs +44 -0
  2338. package/resources/local/ecc/skills/ck/commands/info.mjs +24 -0
  2339. package/resources/local/ecc/skills/ck/commands/init.mjs +143 -0
  2340. package/resources/local/ecc/skills/ck/commands/list.mjs +40 -0
  2341. package/resources/local/ecc/skills/ck/commands/migrate.mjs +202 -0
  2342. package/resources/local/ecc/skills/ck/commands/resume.mjs +36 -0
  2343. package/resources/local/ecc/skills/ck/commands/save.mjs +210 -0
  2344. package/resources/local/ecc/skills/ck/commands/shared.mjs +387 -0
  2345. package/resources/local/ecc/skills/ck/hooks/session-start.mjs +224 -0
  2346. package/resources/local/ecc/skills/claude-devfleet/SKILL.md +103 -0
  2347. package/resources/local/ecc/skills/click-path-audit/SKILL.md +244 -0
  2348. package/resources/local/ecc/skills/clickhouse-io/SKILL.md +439 -0
  2349. package/resources/local/ecc/skills/code-tour/SKILL.md +236 -0
  2350. package/resources/local/ecc/skills/codebase-onboarding/SKILL.md +233 -0
  2351. package/resources/local/ecc/skills/coding-standards/SKILL.md +549 -0
  2352. package/resources/local/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  2353. package/resources/local/ecc/skills/configure-ecc/SKILL.md +384 -0
  2354. package/resources/local/ecc/skills/connections-optimizer/SKILL.md +189 -0
  2355. package/resources/local/ecc/skills/content-engine/SKILL.md +131 -0
  2356. package/resources/local/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -0
  2357. package/resources/local/ecc/skills/context-budget/SKILL.md +135 -0
  2358. package/resources/local/ecc/skills/continuous-agent-loop/SKILL.md +45 -0
  2359. package/resources/local/ecc/skills/continuous-learning/SKILL.md +131 -0
  2360. package/resources/local/ecc/skills/continuous-learning/config.json +18 -0
  2361. package/resources/local/ecc/skills/continuous-learning/evaluate-session.sh +69 -0
  2362. package/resources/local/ecc/skills/continuous-learning-v2/SKILL.md +360 -0
  2363. package/resources/local/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
  2364. package/resources/local/ecc/skills/continuous-learning-v2/agents/observer.md +198 -0
  2365. package/resources/local/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  2366. package/resources/local/ecc/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
  2367. package/resources/local/ecc/skills/continuous-learning-v2/config.json +8 -0
  2368. package/resources/local/ecc/skills/continuous-learning-v2/hooks/observe.sh +492 -0
  2369. package/resources/local/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
  2370. package/resources/local/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
  2371. package/resources/local/ecc/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  2372. package/resources/local/ecc/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
  2373. package/resources/local/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
  2374. package/resources/local/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  2375. package/resources/local/ecc/skills/cost-tracking/SKILL.md +147 -0
  2376. package/resources/local/ecc/skills/council/SKILL.md +203 -0
  2377. package/resources/local/ecc/skills/cpp-coding-standards/SKILL.md +723 -0
  2378. package/resources/local/ecc/skills/cpp-testing/SKILL.md +324 -0
  2379. package/resources/local/ecc/skills/crosspost/SKILL.md +111 -0
  2380. package/resources/local/ecc/skills/csharp-testing/SKILL.md +321 -0
  2381. package/resources/local/ecc/skills/customer-billing-ops/SKILL.md +140 -0
  2382. package/resources/local/ecc/skills/customs-trade-compliance/SKILL.md +263 -0
  2383. package/resources/local/ecc/skills/dart-flutter-patterns/SKILL.md +563 -0
  2384. package/resources/local/ecc/skills/dashboard-builder/SKILL.md +108 -0
  2385. package/resources/local/ecc/skills/data-scraper-agent/SKILL.md +764 -0
  2386. package/resources/local/ecc/skills/database-migrations/SKILL.md +429 -0
  2387. package/resources/local/ecc/skills/deep-research/SKILL.md +159 -0
  2388. package/resources/local/ecc/skills/defi-amm-security/SKILL.md +166 -0
  2389. package/resources/local/ecc/skills/deployment-patterns/SKILL.md +427 -0
  2390. package/resources/local/ecc/skills/design-system/SKILL.md +82 -0
  2391. package/resources/local/ecc/skills/django-celery/SKILL.md +457 -0
  2392. package/resources/local/ecc/skills/django-patterns/SKILL.md +734 -0
  2393. package/resources/local/ecc/skills/django-security/SKILL.md +593 -0
  2394. package/resources/local/ecc/skills/django-tdd/SKILL.md +729 -0
  2395. package/resources/local/ecc/skills/django-verification/SKILL.md +469 -0
  2396. package/resources/local/ecc/skills/dmux-workflows/SKILL.md +191 -0
  2397. package/resources/local/ecc/skills/docker-patterns/SKILL.md +364 -0
  2398. package/resources/local/ecc/skills/documentation-lookup/SKILL.md +90 -0
  2399. package/resources/local/ecc/skills/dotnet-patterns/SKILL.md +321 -0
  2400. package/resources/local/ecc/skills/e2e-testing/SKILL.md +326 -0
  2401. package/resources/local/ecc/skills/ecc-guide/SKILL.md +189 -0
  2402. package/resources/local/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  2403. package/resources/local/ecc/skills/email-ops/SKILL.md +121 -0
  2404. package/resources/local/ecc/skills/energy-procurement/SKILL.md +228 -0
  2405. package/resources/local/ecc/skills/enterprise-agent-ops/SKILL.md +50 -0
  2406. package/resources/local/ecc/skills/error-handling/SKILL.md +376 -0
  2407. package/resources/local/ecc/skills/eval-harness/SKILL.md +270 -0
  2408. package/resources/local/ecc/skills/evm-token-decimals/SKILL.md +130 -0
  2409. package/resources/local/ecc/skills/exa-search/SKILL.md +107 -0
  2410. package/resources/local/ecc/skills/fal-ai-media/SKILL.md +288 -0
  2411. package/resources/local/ecc/skills/fastapi-patterns/SKILL.md +327 -0
  2412. package/resources/local/ecc/skills/finance-billing-ops/SKILL.md +127 -0
  2413. package/resources/local/ecc/skills/flox-environments/SKILL.md +496 -0
  2414. package/resources/local/ecc/skills/flutter-dart-code-review/SKILL.md +435 -0
  2415. package/resources/local/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
  2416. package/resources/local/ecc/skills/frontend-design-direction/SKILL.md +92 -0
  2417. package/resources/local/ecc/skills/frontend-patterns/SKILL.md +642 -0
  2418. package/resources/local/ecc/skills/frontend-slides/SKILL.md +184 -0
  2419. package/resources/local/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  2420. package/resources/local/ecc/skills/frontend-slides/animation-patterns.md +122 -0
  2421. package/resources/local/ecc/skills/frontend-slides/html-template.md +419 -0
  2422. package/resources/local/ecc/skills/frontend-slides/scripts/export-pdf.sh +418 -0
  2423. package/resources/local/ecc/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  2424. package/resources/local/ecc/skills/frontend-slides/viewport-base.css +153 -0
  2425. package/resources/local/ecc/skills/fsharp-testing/SKILL.md +280 -0
  2426. package/resources/local/ecc/skills/gan-style-harness/SKILL.md +278 -0
  2427. package/resources/local/ecc/skills/gateguard/SKILL.md +125 -0
  2428. package/resources/local/ecc/skills/git-workflow/SKILL.md +715 -0
  2429. package/resources/local/ecc/skills/github-ops/SKILL.md +144 -0
  2430. package/resources/local/ecc/skills/golang-patterns/SKILL.md +674 -0
  2431. package/resources/local/ecc/skills/golang-testing/SKILL.md +720 -0
  2432. package/resources/local/ecc/skills/google-workspace-ops/SKILL.md +95 -0
  2433. package/resources/local/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  2434. package/resources/local/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -0
  2435. package/resources/local/ecc/skills/healthcare-eval-harness/SKILL.md +207 -0
  2436. package/resources/local/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -0
  2437. package/resources/local/ecc/skills/hermes-imports/SKILL.md +88 -0
  2438. package/resources/local/ecc/skills/hexagonal-architecture/SKILL.md +276 -0
  2439. package/resources/local/ecc/skills/hipaa-compliance/SKILL.md +78 -0
  2440. package/resources/local/ecc/skills/homelab-network-readiness/SKILL.md +169 -0
  2441. package/resources/local/ecc/skills/homelab-network-setup/SKILL.md +129 -0
  2442. package/resources/local/ecc/skills/homelab-pihole-dns/SKILL.md +274 -0
  2443. package/resources/local/ecc/skills/homelab-vlan-segmentation/SKILL.md +311 -0
  2444. package/resources/local/ecc/skills/homelab-wireguard-vpn/SKILL.md +305 -0
  2445. package/resources/local/ecc/skills/hookify-rules/SKILL.md +128 -0
  2446. package/resources/local/ecc/skills/inventory-demand-planning/SKILL.md +247 -0
  2447. package/resources/local/ecc/skills/investor-materials/SKILL.md +96 -0
  2448. package/resources/local/ecc/skills/investor-outreach/SKILL.md +91 -0
  2449. package/resources/local/ecc/skills/ios-icon-gen/SKILL.md +157 -0
  2450. package/resources/local/ecc/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
  2451. package/resources/local/ecc/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  2452. package/resources/local/ecc/skills/iterative-retrieval/SKILL.md +211 -0
  2453. package/resources/local/ecc/skills/java-coding-standards/SKILL.md +383 -0
  2454. package/resources/local/ecc/skills/jira-integration/SKILL.md +293 -0
  2455. package/resources/local/ecc/skills/jpa-patterns/SKILL.md +151 -0
  2456. package/resources/local/ecc/skills/knowledge-ops/SKILL.md +154 -0
  2457. package/resources/local/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  2458. package/resources/local/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  2459. package/resources/local/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  2460. package/resources/local/ecc/skills/kotlin-patterns/SKILL.md +711 -0
  2461. package/resources/local/ecc/skills/kotlin-testing/SKILL.md +824 -0
  2462. package/resources/local/ecc/skills/laravel-patterns/SKILL.md +415 -0
  2463. package/resources/local/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -0
  2464. package/resources/local/ecc/skills/laravel-security/SKILL.md +285 -0
  2465. package/resources/local/ecc/skills/laravel-tdd/SKILL.md +283 -0
  2466. package/resources/local/ecc/skills/laravel-verification/SKILL.md +179 -0
  2467. package/resources/local/ecc/skills/lead-intelligence/SKILL.md +321 -0
  2468. package/resources/local/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  2469. package/resources/local/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  2470. package/resources/local/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  2471. package/resources/local/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  2472. package/resources/local/ecc/skills/liquid-glass-design/SKILL.md +279 -0
  2473. package/resources/local/ecc/skills/llm-trading-agent-security/SKILL.md +146 -0
  2474. package/resources/local/ecc/skills/logistics-exception-management/SKILL.md +222 -0
  2475. package/resources/local/ecc/skills/make-interfaces-feel-better/SKILL.md +151 -0
  2476. package/resources/local/ecc/skills/manim-video/SKILL.md +89 -0
  2477. package/resources/local/ecc/skills/manim-video/assets/network_graph_scene.py +52 -0
  2478. package/resources/local/ecc/skills/market-research/SKILL.md +75 -0
  2479. package/resources/local/ecc/skills/mcp-server-patterns/SKILL.md +69 -0
  2480. package/resources/local/ecc/skills/messages-ops/SKILL.md +104 -0
  2481. package/resources/local/ecc/skills/mle-workflow/SKILL.md +346 -0
  2482. package/resources/local/ecc/skills/motion-advanced/SKILL.md +596 -0
  2483. package/resources/local/ecc/skills/motion-foundations/SKILL.md +299 -0
  2484. package/resources/local/ecc/skills/motion-patterns/SKILL.md +435 -0
  2485. package/resources/local/ecc/skills/motion-ui/SKILL.md +575 -0
  2486. package/resources/local/ecc/skills/mysql-patterns/SKILL.md +412 -0
  2487. package/resources/local/ecc/skills/nanoclaw-repl/SKILL.md +33 -0
  2488. package/resources/local/ecc/skills/nestjs-patterns/SKILL.md +230 -0
  2489. package/resources/local/ecc/skills/netmiko-ssh-automation/SKILL.md +173 -0
  2490. package/resources/local/ecc/skills/network-bgp-diagnostics/SKILL.md +167 -0
  2491. package/resources/local/ecc/skills/network-config-validation/SKILL.md +210 -0
  2492. package/resources/local/ecc/skills/network-interface-health/SKILL.md +152 -0
  2493. package/resources/local/ecc/skills/nextjs-turbopack/SKILL.md +44 -0
  2494. package/resources/local/ecc/skills/nodejs-keccak256/SKILL.md +102 -0
  2495. package/resources/local/ecc/skills/nutrient-document-processing/SKILL.md +167 -0
  2496. package/resources/local/ecc/skills/nuxt4-patterns/SKILL.md +100 -0
  2497. package/resources/local/ecc/skills/openclaw-persona-forge/SKILL.md +288 -0
  2498. package/resources/local/ecc/skills/openclaw-persona-forge/gacha.py +224 -0
  2499. package/resources/local/ecc/skills/openclaw-persona-forge/gacha.sh +5 -0
  2500. package/resources/local/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  2501. package/resources/local/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  2502. package/resources/local/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  2503. package/resources/local/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  2504. package/resources/local/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  2505. package/resources/local/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -0
  2506. package/resources/local/ecc/skills/opensource-pipeline/SKILL.md +255 -0
  2507. package/resources/local/ecc/skills/perl-patterns/SKILL.md +504 -0
  2508. package/resources/local/ecc/skills/perl-security/SKILL.md +503 -0
  2509. package/resources/local/ecc/skills/perl-testing/SKILL.md +475 -0
  2510. package/resources/local/ecc/skills/plan-orchestrate/SKILL.md +262 -0
  2511. package/resources/local/ecc/skills/plankton-code-quality/SKILL.md +236 -0
  2512. package/resources/local/ecc/skills/postgres-patterns/SKILL.md +147 -0
  2513. package/resources/local/ecc/skills/prisma-patterns/SKILL.md +371 -0
  2514. package/resources/local/ecc/skills/product-capability/SKILL.md +141 -0
  2515. package/resources/local/ecc/skills/product-lens/SKILL.md +92 -0
  2516. package/resources/local/ecc/skills/production-audit/SKILL.md +206 -0
  2517. package/resources/local/ecc/skills/production-scheduling/SKILL.md +238 -0
  2518. package/resources/local/ecc/skills/project-flow-ops/SKILL.md +111 -0
  2519. package/resources/local/ecc/skills/prompt-optimizer/SKILL.md +398 -0
  2520. package/resources/local/ecc/skills/python-patterns/SKILL.md +750 -0
  2521. package/resources/local/ecc/skills/python-testing/SKILL.md +816 -0
  2522. package/resources/local/ecc/skills/pytorch-patterns/SKILL.md +396 -0
  2523. package/resources/local/ecc/skills/quality-nonconformance/SKILL.md +260 -0
  2524. package/resources/local/ecc/skills/quarkus-patterns/SKILL.md +722 -0
  2525. package/resources/local/ecc/skills/quarkus-security/SKILL.md +467 -0
  2526. package/resources/local/ecc/skills/quarkus-tdd/SKILL.md +811 -0
  2527. package/resources/local/ecc/skills/quarkus-verification/SKILL.md +479 -0
  2528. package/resources/local/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  2529. package/resources/local/ecc/skills/recsys-pipeline-architect/SKILL.md +114 -0
  2530. package/resources/local/ecc/skills/redis-patterns/SKILL.md +403 -0
  2531. package/resources/local/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  2532. package/resources/local/ecc/skills/remotion-video-creation/SKILL.md +43 -0
  2533. package/resources/local/ecc/skills/remotion-video-creation/rules/3d.md +86 -0
  2534. package/resources/local/ecc/skills/remotion-video-creation/rules/animations.md +29 -0
  2535. package/resources/local/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  2536. package/resources/local/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  2537. package/resources/local/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  2538. package/resources/local/ecc/skills/remotion-video-creation/rules/assets.md +78 -0
  2539. package/resources/local/ecc/skills/remotion-video-creation/rules/audio.md +172 -0
  2540. package/resources/local/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  2541. package/resources/local/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -0
  2542. package/resources/local/ecc/skills/remotion-video-creation/rules/charts.md +58 -0
  2543. package/resources/local/ecc/skills/remotion-video-creation/rules/compositions.md +146 -0
  2544. package/resources/local/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -0
  2545. package/resources/local/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  2546. package/resources/local/ecc/skills/remotion-video-creation/rules/fonts.md +152 -0
  2547. package/resources/local/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  2548. package/resources/local/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  2549. package/resources/local/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  2550. package/resources/local/ecc/skills/remotion-video-creation/rules/gifs.md +138 -0
  2551. package/resources/local/ecc/skills/remotion-video-creation/rules/images.md +130 -0
  2552. package/resources/local/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  2553. package/resources/local/ecc/skills/remotion-video-creation/rules/lottie.md +67 -0
  2554. package/resources/local/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  2555. package/resources/local/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  2556. package/resources/local/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -0
  2557. package/resources/local/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -0
  2558. package/resources/local/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -0
  2559. package/resources/local/ecc/skills/remotion-video-creation/rules/timing.md +179 -0
  2560. package/resources/local/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  2561. package/resources/local/ecc/skills/remotion-video-creation/rules/transitions.md +122 -0
  2562. package/resources/local/ecc/skills/remotion-video-creation/rules/trimming.md +52 -0
  2563. package/resources/local/ecc/skills/remotion-video-creation/rules/videos.md +171 -0
  2564. package/resources/local/ecc/skills/repo-scan/SKILL.md +78 -0
  2565. package/resources/local/ecc/skills/research-ops/SKILL.md +112 -0
  2566. package/resources/local/ecc/skills/returns-reverse-logistics/SKILL.md +240 -0
  2567. package/resources/local/ecc/skills/rules-distill/SKILL.md +264 -0
  2568. package/resources/local/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -0
  2569. package/resources/local/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -0
  2570. package/resources/local/ecc/skills/rust-patterns/SKILL.md +499 -0
  2571. package/resources/local/ecc/skills/rust-testing/SKILL.md +500 -0
  2572. package/resources/local/ecc/skills/safety-guard/SKILL.md +75 -0
  2573. package/resources/local/ecc/skills/santa-method/SKILL.md +306 -0
  2574. package/resources/local/ecc/skills/scientific-db-pubmed-database/SKILL.md +175 -0
  2575. package/resources/local/ecc/skills/scientific-db-uspto-database/SKILL.md +177 -0
  2576. package/resources/local/ecc/skills/scientific-pkg-gget/SKILL.md +166 -0
  2577. package/resources/local/ecc/skills/scientific-thinking-literature-review/SKILL.md +192 -0
  2578. package/resources/local/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
  2579. package/resources/local/ecc/skills/search-first/SKILL.md +182 -0
  2580. package/resources/local/ecc/skills/security-bounty-hunter/SKILL.md +99 -0
  2581. package/resources/local/ecc/skills/security-review/SKILL.md +503 -0
  2582. package/resources/local/ecc/skills/security-review/cloud-infrastructure-security.md +361 -0
  2583. package/resources/local/ecc/skills/security-scan/SKILL.md +165 -0
  2584. package/resources/local/ecc/skills/seo/SKILL.md +154 -0
  2585. package/resources/local/ecc/skills/skill-comply/SKILL.md +58 -0
  2586. package/resources/local/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  2587. package/resources/local/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  2588. package/resources/local/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  2589. package/resources/local/ecc/skills/skill-comply/prompts/classifier.md +24 -0
  2590. package/resources/local/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -0
  2591. package/resources/local/ecc/skills/skill-comply/prompts/spec_generator.md +42 -0
  2592. package/resources/local/ecc/skills/skill-comply/pyproject.toml +15 -0
  2593. package/resources/local/ecc/skills/skill-comply/scripts/__init__.py +0 -0
  2594. package/resources/local/ecc/skills/skill-comply/scripts/classifier.py +85 -0
  2595. package/resources/local/ecc/skills/skill-comply/scripts/grader.py +124 -0
  2596. package/resources/local/ecc/skills/skill-comply/scripts/parser.py +107 -0
  2597. package/resources/local/ecc/skills/skill-comply/scripts/report.py +170 -0
  2598. package/resources/local/ecc/skills/skill-comply/scripts/run.py +127 -0
  2599. package/resources/local/ecc/skills/skill-comply/scripts/runner.py +186 -0
  2600. package/resources/local/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -0
  2601. package/resources/local/ecc/skills/skill-comply/scripts/spec_generator.py +72 -0
  2602. package/resources/local/ecc/skills/skill-comply/scripts/utils.py +13 -0
  2603. package/resources/local/ecc/skills/skill-comply/tests/test_grader.py +197 -0
  2604. package/resources/local/ecc/skills/skill-comply/tests/test_parser.py +90 -0
  2605. package/resources/local/ecc/skills/skill-comply/tests/test_runner.py +172 -0
  2606. package/resources/local/ecc/skills/skill-scout/SKILL.md +140 -0
  2607. package/resources/local/ecc/skills/skill-stocktake/SKILL.md +194 -0
  2608. package/resources/local/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  2609. package/resources/local/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
  2610. package/resources/local/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
  2611. package/resources/local/ecc/skills/social-graph-ranker/SKILL.md +154 -0
  2612. package/resources/local/ecc/skills/springboot-patterns/SKILL.md +314 -0
  2613. package/resources/local/ecc/skills/springboot-security/SKILL.md +272 -0
  2614. package/resources/local/ecc/skills/springboot-tdd/SKILL.md +158 -0
  2615. package/resources/local/ecc/skills/springboot-verification/SKILL.md +231 -0
  2616. package/resources/local/ecc/skills/strategic-compact/SKILL.md +131 -0
  2617. package/resources/local/ecc/skills/swift-actor-persistence/SKILL.md +143 -0
  2618. package/resources/local/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
  2619. package/resources/local/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -0
  2620. package/resources/local/ecc/skills/swiftui-patterns/SKILL.md +259 -0
  2621. package/resources/local/ecc/skills/tdd-workflow/SKILL.md +463 -0
  2622. package/resources/local/ecc/skills/team-builder/SKILL.md +168 -0
  2623. package/resources/local/ecc/skills/terminal-ops/SKILL.md +109 -0
  2624. package/resources/local/ecc/skills/tinystruct-patterns/SKILL.md +203 -0
  2625. package/resources/local/ecc/skills/tinystruct-patterns/references/architecture.md +90 -0
  2626. package/resources/local/ecc/skills/tinystruct-patterns/references/data-handling.md +60 -0
  2627. package/resources/local/ecc/skills/tinystruct-patterns/references/database.md +99 -0
  2628. package/resources/local/ecc/skills/tinystruct-patterns/references/routing.md +64 -0
  2629. package/resources/local/ecc/skills/tinystruct-patterns/references/system-usage.md +97 -0
  2630. package/resources/local/ecc/skills/tinystruct-patterns/references/testing.md +72 -0
  2631. package/resources/local/ecc/skills/token-budget-advisor/SKILL.md +133 -0
  2632. package/resources/local/ecc/skills/ui-demo/SKILL.md +465 -0
  2633. package/resources/local/ecc/skills/ui-to-vue/SKILL.md +134 -0
  2634. package/resources/local/ecc/skills/uncloud/SKILL.md +343 -0
  2635. package/resources/local/ecc/skills/unified-notifications-ops/SKILL.md +187 -0
  2636. package/resources/local/ecc/skills/verification-loop/SKILL.md +126 -0
  2637. package/resources/local/ecc/skills/video-editing/SKILL.md +310 -0
  2638. package/resources/local/ecc/skills/videodb/SKILL.md +374 -0
  2639. package/resources/local/ecc/skills/videodb/reference/api-reference.md +550 -0
  2640. package/resources/local/ecc/skills/videodb/reference/capture-reference.md +407 -0
  2641. package/resources/local/ecc/skills/videodb/reference/capture.md +101 -0
  2642. package/resources/local/ecc/skills/videodb/reference/editor.md +443 -0
  2643. package/resources/local/ecc/skills/videodb/reference/generative.md +331 -0
  2644. package/resources/local/ecc/skills/videodb/reference/rtstream-reference.md +564 -0
  2645. package/resources/local/ecc/skills/videodb/reference/rtstream.md +65 -0
  2646. package/resources/local/ecc/skills/videodb/reference/search.md +230 -0
  2647. package/resources/local/ecc/skills/videodb/reference/streaming.md +406 -0
  2648. package/resources/local/ecc/skills/videodb/reference/use-cases.md +118 -0
  2649. package/resources/local/ecc/skills/videodb/scripts/ws_listener.py +282 -0
  2650. package/resources/local/ecc/skills/visa-doc-translate/README.md +86 -0
  2651. package/resources/local/ecc/skills/visa-doc-translate/SKILL.md +117 -0
  2652. package/resources/local/ecc/skills/vite-patterns/SKILL.md +449 -0
  2653. package/resources/local/ecc/skills/windows-desktop-e2e/SKILL.md +887 -0
  2654. package/resources/local/ecc/skills/workspace-surface-audit/SKILL.md +125 -0
  2655. package/resources/local/ecc/skills/x-api/SKILL.md +234 -0
  2656. package/resources/local/ecc/src/llm/__init__.py +33 -0
  2657. package/resources/local/ecc/src/llm/__main__.py +7 -0
  2658. package/resources/local/ecc/src/llm/cli/__init__.py +0 -0
  2659. package/resources/local/ecc/src/llm/cli/selector.py +154 -0
  2660. package/resources/local/ecc/src/llm/core/__init__.py +1 -0
  2661. package/resources/local/ecc/src/llm/core/interface.py +60 -0
  2662. package/resources/local/ecc/src/llm/core/types.py +166 -0
  2663. package/resources/local/ecc/src/llm/prompt/__init__.py +23 -0
  2664. package/resources/local/ecc/src/llm/prompt/builder.py +125 -0
  2665. package/resources/local/ecc/src/llm/prompt/templates/__init__.py +41 -0
  2666. package/resources/local/ecc/src/llm/providers/__init__.py +17 -0
  2667. package/resources/local/ecc/src/llm/providers/astraflow.py +151 -0
  2668. package/resources/local/ecc/src/llm/providers/claude.py +117 -0
  2669. package/resources/local/ecc/src/llm/providers/constants.py +3 -0
  2670. package/resources/local/ecc/src/llm/providers/ollama.py +112 -0
  2671. package/resources/local/ecc/src/llm/providers/openai.py +125 -0
  2672. package/resources/local/ecc/src/llm/providers/resolver.py +78 -0
  2673. package/resources/local/ecc/src/llm/tools/__init__.py +9 -0
  2674. package/resources/local/ecc/src/llm/tools/executor.py +116 -0
  2675. package/resources/local/ecc/tests/__init__.py +0 -0
  2676. package/resources/local/ecc/tests/ci/agent-instruction-safety.test.js +98 -0
  2677. package/resources/local/ecc/tests/ci/agent-yaml-surface.test.js +131 -0
  2678. package/resources/local/ecc/tests/ci/catalog.test.js +294 -0
  2679. package/resources/local/ecc/tests/ci/code-reviewer-false-positive-guard.test.js +82 -0
  2680. package/resources/local/ecc/tests/ci/codex-skill-surface.test.js +125 -0
  2681. package/resources/local/ecc/tests/ci/command-registry.test.js +176 -0
  2682. package/resources/local/ecc/tests/ci/mle-workflow-coverage.test.js +223 -0
  2683. package/resources/local/ecc/tests/ci/no-personal-paths.test.js +211 -0
  2684. package/resources/local/ecc/tests/ci/scan-supply-chain-iocs.test.js +447 -0
  2685. package/resources/local/ecc/tests/ci/supply-chain-advisory-sources.test.js +290 -0
  2686. package/resources/local/ecc/tests/ci/supply-chain-watch-workflow.test.js +77 -0
  2687. package/resources/local/ecc/tests/ci/validate-workflow-security.test.js +289 -0
  2688. package/resources/local/ecc/tests/ci/validators.test.js +3139 -0
  2689. package/resources/local/ecc/tests/codex-config.test.js +117 -0
  2690. package/resources/local/ecc/tests/commands/command-frontmatter.test.js +61 -0
  2691. package/resources/local/ecc/tests/commands/plan-command.test.js +76 -0
  2692. package/resources/local/ecc/tests/conftest.py +10 -0
  2693. package/resources/local/ecc/tests/docs/canary-watch.test.js +45 -0
  2694. package/resources/local/ecc/tests/docs/configure-ecc-install-paths.test.js +69 -0
  2695. package/resources/local/ecc/tests/docs/continuous-learning-v2-docs.test.js +64 -0
  2696. package/resources/local/ecc/tests/docs/copilot-support.test.js +110 -0
  2697. package/resources/local/ecc/tests/docs/ecc2-release-surface.test.js +374 -0
  2698. package/resources/local/ecc/tests/docs/evaluator-rag-prototype.test.js +417 -0
  2699. package/resources/local/ecc/tests/docs/harness-adapter-compliance.test.js +154 -0
  2700. package/resources/local/ecc/tests/docs/install-identifiers.test.js +104 -0
  2701. package/resources/local/ecc/tests/docs/legacy-artifact-inventory.test.js +155 -0
  2702. package/resources/local/ecc/tests/docs/mcp-management-docs.test.js +77 -0
  2703. package/resources/local/ecc/tests/docs/stale-pr-salvage-ledger.test.js +158 -0
  2704. package/resources/local/ecc/tests/hooks/auto-tmux-dev.test.js +145 -0
  2705. package/resources/local/ecc/tests/hooks/bash-hook-dispatcher.test.js +114 -0
  2706. package/resources/local/ecc/tests/hooks/block-no-verify.test.js +203 -0
  2707. package/resources/local/ecc/tests/hooks/check-hook-enabled.test.js +108 -0
  2708. package/resources/local/ecc/tests/hooks/config-protection.test.js +322 -0
  2709. package/resources/local/ecc/tests/hooks/continuous-learning-observe-runner.test.js +194 -0
  2710. package/resources/local/ecc/tests/hooks/cost-tracker.test.js +222 -0
  2711. package/resources/local/ecc/tests/hooks/design-quality-check.test.js +82 -0
  2712. package/resources/local/ecc/tests/hooks/detect-project-worktree.test.js +260 -0
  2713. package/resources/local/ecc/tests/hooks/doc-file-warning.test.js +215 -0
  2714. package/resources/local/ecc/tests/hooks/ecc-context-monitor.test.js +301 -0
  2715. package/resources/local/ecc/tests/hooks/ecc-metrics-bridge.test.js +430 -0
  2716. package/resources/local/ecc/tests/hooks/ecc-statusline.test.js +213 -0
  2717. package/resources/local/ecc/tests/hooks/evaluate-session.test.js +419 -0
  2718. package/resources/local/ecc/tests/hooks/gateguard-fact-force.test.js +1407 -0
  2719. package/resources/local/ecc/tests/hooks/governance-capture.test.js +360 -0
  2720. package/resources/local/ecc/tests/hooks/hook-flags.test.js +397 -0
  2721. package/resources/local/ecc/tests/hooks/hooks.test.js +6041 -0
  2722. package/resources/local/ecc/tests/hooks/insaits-security-monitor.test.js +219 -0
  2723. package/resources/local/ecc/tests/hooks/insaits-security-wrapper.test.js +199 -0
  2724. package/resources/local/ecc/tests/hooks/mcp-health-check.test.js +1131 -0
  2725. package/resources/local/ecc/tests/hooks/observe-subdirectory-detection.test.js +279 -0
  2726. package/resources/local/ecc/tests/hooks/observer-memory.test.js +475 -0
  2727. package/resources/local/ecc/tests/hooks/plugin-hook-bootstrap.test.js +254 -0
  2728. package/resources/local/ecc/tests/hooks/post-bash-hooks.test.js +207 -0
  2729. package/resources/local/ecc/tests/hooks/pre-bash-commit-quality.test.js +293 -0
  2730. package/resources/local/ecc/tests/hooks/pre-bash-dev-server-block.test.js +225 -0
  2731. package/resources/local/ecc/tests/hooks/pre-bash-reminders.test.js +104 -0
  2732. package/resources/local/ecc/tests/hooks/quality-gate.test.js +159 -0
  2733. package/resources/local/ecc/tests/hooks/session-activity-tracker.test.js +668 -0
  2734. package/resources/local/ecc/tests/hooks/stop-format-typecheck.test.js +248 -0
  2735. package/resources/local/ecc/tests/hooks/suggest-compact.test.js +460 -0
  2736. package/resources/local/ecc/tests/hooks/test_insaits_security_monitor.py +272 -0
  2737. package/resources/local/ecc/tests/integration/hooks.test.js +1018 -0
  2738. package/resources/local/ecc/tests/lib/agent-compress.test.js +271 -0
  2739. package/resources/local/ecc/tests/lib/changed-files-store.test.js +163 -0
  2740. package/resources/local/ecc/tests/lib/command-plugin-root.test.js +48 -0
  2741. package/resources/local/ecc/tests/lib/cost-estimate.test.js +114 -0
  2742. package/resources/local/ecc/tests/lib/inspection.test.js +232 -0
  2743. package/resources/local/ecc/tests/lib/install-config.test.js +144 -0
  2744. package/resources/local/ecc/tests/lib/install-executor.test.js +435 -0
  2745. package/resources/local/ecc/tests/lib/install-lifecycle.test.js +1608 -0
  2746. package/resources/local/ecc/tests/lib/install-manifests.test.js +882 -0
  2747. package/resources/local/ecc/tests/lib/install-request.test.js +249 -0
  2748. package/resources/local/ecc/tests/lib/install-state.test.js +234 -0
  2749. package/resources/local/ecc/tests/lib/install-targets.test.js +872 -0
  2750. package/resources/local/ecc/tests/lib/locale-install.test.js +172 -0
  2751. package/resources/local/ecc/tests/lib/mcp-config.test.js +62 -0
  2752. package/resources/local/ecc/tests/lib/observer-sessions.test.js +134 -0
  2753. package/resources/local/ecc/tests/lib/orchestration-session.test.js +225 -0
  2754. package/resources/local/ecc/tests/lib/package-manager.test.js +1698 -0
  2755. package/resources/local/ecc/tests/lib/project-detect.test.js +447 -0
  2756. package/resources/local/ecc/tests/lib/resolve-ecc-root.test.js +351 -0
  2757. package/resources/local/ecc/tests/lib/resolve-formatter.test.js +277 -0
  2758. package/resources/local/ecc/tests/lib/selective-install.test.js +836 -0
  2759. package/resources/local/ecc/tests/lib/session-adapters.test.js +970 -0
  2760. package/resources/local/ecc/tests/lib/session-aliases.test.js +1830 -0
  2761. package/resources/local/ecc/tests/lib/session-bridge.test.js +174 -0
  2762. package/resources/local/ecc/tests/lib/session-manager.test.js +2650 -0
  2763. package/resources/local/ecc/tests/lib/shell-split.test.js +114 -0
  2764. package/resources/local/ecc/tests/lib/skill-dashboard.test.js +574 -0
  2765. package/resources/local/ecc/tests/lib/skill-evolution.test.js +656 -0
  2766. package/resources/local/ecc/tests/lib/skill-improvement.test.js +186 -0
  2767. package/resources/local/ecc/tests/lib/state-store.test.js +1002 -0
  2768. package/resources/local/ecc/tests/lib/tmux-worktree-orchestrator.test.js +423 -0
  2769. package/resources/local/ecc/tests/lib/utils.test.js +2648 -0
  2770. package/resources/local/ecc/tests/opencode-config.test.js +103 -0
  2771. package/resources/local/ecc/tests/opencode-plugin-hooks.test.js +183 -0
  2772. package/resources/local/ecc/tests/plugin-manifest.test.js +545 -0
  2773. package/resources/local/ecc/tests/run-all.js +118 -0
  2774. package/resources/local/ecc/tests/scripts/auto-update.test.js +395 -0
  2775. package/resources/local/ecc/tests/scripts/build-opencode.test.js +123 -0
  2776. package/resources/local/ecc/tests/scripts/catalog.test.js +104 -0
  2777. package/resources/local/ecc/tests/scripts/check-unicode-safety.test.js +203 -0
  2778. package/resources/local/ecc/tests/scripts/claw.test.js +325 -0
  2779. package/resources/local/ecc/tests/scripts/codex-hooks.test.js +508 -0
  2780. package/resources/local/ecc/tests/scripts/consult.test.js +194 -0
  2781. package/resources/local/ecc/tests/scripts/discussion-audit.test.js +302 -0
  2782. package/resources/local/ecc/tests/scripts/doctor.test.js +190 -0
  2783. package/resources/local/ecc/tests/scripts/ecc-dashboard.test.js +142 -0
  2784. package/resources/local/ecc/tests/scripts/ecc.test.js +258 -0
  2785. package/resources/local/ecc/tests/scripts/gemini-adapt-agents.test.js +136 -0
  2786. package/resources/local/ecc/tests/scripts/harness-audit.test.js +477 -0
  2787. package/resources/local/ecc/tests/scripts/install-apply.test.js +904 -0
  2788. package/resources/local/ecc/tests/scripts/install-plan.test.js +194 -0
  2789. package/resources/local/ecc/tests/scripts/install-ps1.test.js +128 -0
  2790. package/resources/local/ecc/tests/scripts/install-readme-clarity.test.js +170 -0
  2791. package/resources/local/ecc/tests/scripts/install-sh.test.js +102 -0
  2792. package/resources/local/ecc/tests/scripts/list-installed.test.js +139 -0
  2793. package/resources/local/ecc/tests/scripts/loop-status.test.js +749 -0
  2794. package/resources/local/ecc/tests/scripts/manual-hook-install-docs.test.js +71 -0
  2795. package/resources/local/ecc/tests/scripts/npm-publish-surface.test.js +188 -0
  2796. package/resources/local/ecc/tests/scripts/observability-readiness.test.js +331 -0
  2797. package/resources/local/ecc/tests/scripts/openclaw-persona-forge-gacha.test.js +92 -0
  2798. package/resources/local/ecc/tests/scripts/operator-readiness-dashboard.test.js +640 -0
  2799. package/resources/local/ecc/tests/scripts/orchestrate-codex-worker.test.js +63 -0
  2800. package/resources/local/ecc/tests/scripts/orchestration-status.test.js +76 -0
  2801. package/resources/local/ecc/tests/scripts/platform-audit.test.js +432 -0
  2802. package/resources/local/ecc/tests/scripts/post-bash-command-log.test.js +105 -0
  2803. package/resources/local/ecc/tests/scripts/preview-pack-smoke.test.js +260 -0
  2804. package/resources/local/ecc/tests/scripts/release-publish.test.js +79 -0
  2805. package/resources/local/ecc/tests/scripts/release.test.js +150 -0
  2806. package/resources/local/ecc/tests/scripts/repair.test.js +326 -0
  2807. package/resources/local/ecc/tests/scripts/session-inspect.test.js +300 -0
  2808. package/resources/local/ecc/tests/scripts/setup-package-manager.test.js +397 -0
  2809. package/resources/local/ecc/tests/scripts/skill-create-output.test.js +533 -0
  2810. package/resources/local/ecc/tests/scripts/sync-ecc-to-codex.test.js +90 -0
  2811. package/resources/local/ecc/tests/scripts/trae-install.test.js +179 -0
  2812. package/resources/local/ecc/tests/scripts/uninstall.test.js +287 -0
  2813. package/resources/local/ecc/tests/test_astraflow_provider.py +141 -0
  2814. package/resources/local/ecc/tests/test_builder.py +84 -0
  2815. package/resources/local/ecc/tests/test_claude_provider.py +111 -0
  2816. package/resources/local/ecc/tests/test_executor.py +86 -0
  2817. package/resources/local/ecc/tests/test_provider_tools.py +130 -0
  2818. package/resources/local/ecc/tests/test_resolver.py +88 -0
  2819. package/resources/local/ecc/tests/test_templates.py +71 -0
  2820. package/resources/local/ecc/tests/test_types.py +150 -0
  2821. package/resources/local/ecc/the-longform-guide.md +354 -0
  2822. package/resources/local/ecc/the-security-guide.md +455 -0
  2823. package/resources/local/ecc/the-shortform-guide.md +431 -0
  2824. package/resources/local/ecc/yarn.lock +2259 -0
  2825. package/resources/local/manifest.json +12 -0
  2826. package/resources/local/page-agent/.agents/skills/git-cleanup/SKILL.md +64 -0
  2827. package/resources/local/page-agent/.agents/skills/pre-impl-discussion/SKILL.md +104 -0
  2828. package/resources/local/page-agent/.agents/skills/submit-pr-from-current-changes/SKILL.md +102 -0
  2829. package/resources/local/page-agent/.agents/skills/update-changelog/SKILL.md +109 -0
  2830. package/resources/local/page-agent/.github/ISSUE_TEMPLATE/bug_report.yml +59 -0
  2831. package/resources/local/page-agent/.github/ISSUE_TEMPLATE/config.yml +8 -0
  2832. package/resources/local/page-agent/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  2833. package/resources/local/page-agent/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  2834. package/resources/local/page-agent/.github/dependabot.yml +39 -0
  2835. package/resources/local/page-agent/.github/workflows/ci.yml +33 -0
  2836. package/resources/local/page-agent/.github/workflows/deploy-demo.yml +40 -0
  2837. package/resources/local/page-agent/.github/workflows/release.yml +43 -0
  2838. package/resources/local/page-agent/.prettierignore +8 -0
  2839. package/resources/local/page-agent/.vscode/extensions.json +3 -0
  2840. package/resources/local/page-agent/.vscode/settings.json +43 -0
  2841. package/resources/local/page-agent/AGENTS.md +135 -0
  2842. package/resources/local/page-agent/CLAUDE.md +1 -0
  2843. package/resources/local/page-agent/CONTRIBUTING.md +47 -0
  2844. package/resources/local/page-agent/LICENSE +22 -0
  2845. package/resources/local/page-agent/README.md +121 -0
  2846. package/resources/local/page-agent/WINTER.md +101 -0
  2847. package/resources/local/page-agent/docs/CHANGELOG.md +250 -0
  2848. package/resources/local/page-agent/docs/CODE_OF_CONDUCT.md +127 -0
  2849. package/resources/local/page-agent/docs/README-zh.md +110 -0
  2850. package/resources/local/page-agent/docs/SECURITY.md +50 -0
  2851. package/resources/local/page-agent/docs/developer-guide.md +105 -0
  2852. package/resources/local/page-agent/docs/terms-and-privacy.md +85 -0
  2853. package/resources/local/page-agent/eslint.config.js +62 -0
  2854. package/resources/local/page-agent/package-lock.json +11184 -0
  2855. package/resources/local/page-agent/package.json +129 -0
  2856. package/resources/local/page-agent/packages/core/package.json +66 -0
  2857. package/resources/local/page-agent/packages/core/src/PageAgentCore.ts +641 -0
  2858. package/resources/local/page-agent/packages/core/src/env.d.ts +6 -0
  2859. package/resources/local/page-agent/packages/core/src/prompts/system_prompt.md +153 -0
  2860. package/resources/local/page-agent/packages/core/src/tools/index.ts +190 -0
  2861. package/resources/local/page-agent/packages/core/src/types.ts +289 -0
  2862. package/resources/local/page-agent/packages/core/src/utils/autoFixer.ts +216 -0
  2863. package/resources/local/page-agent/packages/core/src/utils/index.ts +111 -0
  2864. package/resources/local/page-agent/packages/core/tsconfig.json +8 -0
  2865. package/resources/local/page-agent/packages/core/vite.config.js +50 -0
  2866. package/resources/local/page-agent/packages/extension/PRIVACY.md +5 -0
  2867. package/resources/local/page-agent/packages/extension/components.json +24 -0
  2868. package/resources/local/page-agent/packages/extension/docs/extension_api.md +224 -0
  2869. package/resources/local/page-agent/packages/extension/package.json +51 -0
  2870. package/resources/local/page-agent/packages/extension/public/_locales/en/messages.json +11 -0
  2871. package/resources/local/page-agent/packages/extension/public/_locales/zh_CN/messages.json +11 -0
  2872. package/resources/local/page-agent/packages/extension/public/assets/page-agent-256.webp +0 -0
  2873. package/resources/local/page-agent/packages/extension/public/assets/page-agent-64.png +0 -0
  2874. package/resources/local/page-agent/packages/extension/src/agent/MultiPageAgent.ts +102 -0
  2875. package/resources/local/page-agent/packages/extension/src/agent/RemotePageController.background.ts +42 -0
  2876. package/resources/local/page-agent/packages/extension/src/agent/RemotePageController.content.ts +135 -0
  2877. package/resources/local/page-agent/packages/extension/src/agent/RemotePageController.ts +194 -0
  2878. package/resources/local/page-agent/packages/extension/src/agent/TabsController.background.ts +169 -0
  2879. package/resources/local/page-agent/packages/extension/src/agent/TabsController.ts +421 -0
  2880. package/resources/local/page-agent/packages/extension/src/agent/constants.ts +30 -0
  2881. package/resources/local/page-agent/packages/extension/src/agent/system_prompt.md +145 -0
  2882. package/resources/local/page-agent/packages/extension/src/agent/tabTools.ts +74 -0
  2883. package/resources/local/page-agent/packages/extension/src/agent/useAgent.ts +161 -0
  2884. package/resources/local/page-agent/packages/extension/src/assets/index.css +158 -0
  2885. package/resources/local/page-agent/packages/extension/src/assets/page-agent-64.png +0 -0
  2886. package/resources/local/page-agent/packages/extension/src/components/ConfigPanel.tsx +402 -0
  2887. package/resources/local/page-agent/packages/extension/src/components/ErrorBoundary.tsx +60 -0
  2888. package/resources/local/page-agent/packages/extension/src/components/HistoryDetail.tsx +79 -0
  2889. package/resources/local/page-agent/packages/extension/src/components/HistoryList.tsx +181 -0
  2890. package/resources/local/page-agent/packages/extension/src/components/cards.tsx +387 -0
  2891. package/resources/local/page-agent/packages/extension/src/components/misc.tsx +153 -0
  2892. package/resources/local/page-agent/packages/extension/src/components/ui/button.tsx +60 -0
  2893. package/resources/local/page-agent/packages/extension/src/components/ui/card.tsx +75 -0
  2894. package/resources/local/page-agent/packages/extension/src/components/ui/field.tsx +232 -0
  2895. package/resources/local/page-agent/packages/extension/src/components/ui/hover-card.tsx +36 -0
  2896. package/resources/local/page-agent/packages/extension/src/components/ui/input-group.tsx +157 -0
  2897. package/resources/local/page-agent/packages/extension/src/components/ui/input.tsx +21 -0
  2898. package/resources/local/page-agent/packages/extension/src/components/ui/item.tsx +172 -0
  2899. package/resources/local/page-agent/packages/extension/src/components/ui/label.tsx +19 -0
  2900. package/resources/local/page-agent/packages/extension/src/components/ui/separator.tsx +26 -0
  2901. package/resources/local/page-agent/packages/extension/src/components/ui/sonner.tsx +38 -0
  2902. package/resources/local/page-agent/packages/extension/src/components/ui/spinner.tsx +16 -0
  2903. package/resources/local/page-agent/packages/extension/src/components/ui/switch.tsx +26 -0
  2904. package/resources/local/page-agent/packages/extension/src/components/ui/textarea.tsx +18 -0
  2905. package/resources/local/page-agent/packages/extension/src/components/ui/typing-animation.tsx +164 -0
  2906. package/resources/local/page-agent/packages/extension/src/entrypoints/background.ts +63 -0
  2907. package/resources/local/page-agent/packages/extension/src/entrypoints/content.ts +164 -0
  2908. package/resources/local/page-agent/packages/extension/src/entrypoints/hub/App.tsx +250 -0
  2909. package/resources/local/page-agent/packages/extension/src/entrypoints/hub/hub-ws.ts +243 -0
  2910. package/resources/local/page-agent/packages/extension/src/entrypoints/hub/index.html +13 -0
  2911. package/resources/local/page-agent/packages/extension/src/entrypoints/hub/main.tsx +25 -0
  2912. package/resources/local/page-agent/packages/extension/src/entrypoints/main-world.ts +131 -0
  2913. package/resources/local/page-agent/packages/extension/src/entrypoints/sidepanel/App.tsx +235 -0
  2914. package/resources/local/page-agent/packages/extension/src/entrypoints/sidepanel/index.html +13 -0
  2915. package/resources/local/page-agent/packages/extension/src/entrypoints/sidepanel/main.tsx +26 -0
  2916. package/resources/local/page-agent/packages/extension/src/lib/db.ts +70 -0
  2917. package/resources/local/page-agent/packages/extension/src/lib/history-export.ts +60 -0
  2918. package/resources/local/page-agent/packages/extension/src/lib/utils.ts +6 -0
  2919. package/resources/local/page-agent/packages/extension/src/types/assets.d.ts +25 -0
  2920. package/resources/local/page-agent/packages/extension/src/types/globals.d.ts +1 -0
  2921. package/resources/local/page-agent/packages/extension/src/types/markdown.d.ts +4 -0
  2922. package/resources/local/page-agent/packages/extension/tsconfig.json +13 -0
  2923. package/resources/local/page-agent/packages/extension/wxt.config.js +69 -0
  2924. package/resources/local/page-agent/packages/llms/package.json +58 -0
  2925. package/resources/local/page-agent/packages/llms/src/OpenAIClient.ts +242 -0
  2926. package/resources/local/page-agent/packages/llms/src/constants.ts +3 -0
  2927. package/resources/local/page-agent/packages/llms/src/errors.ts +58 -0
  2928. package/resources/local/page-agent/packages/llms/src/index.ts +114 -0
  2929. package/resources/local/page-agent/packages/llms/src/types.ts +120 -0
  2930. package/resources/local/page-agent/packages/llms/src/utils.ts +152 -0
  2931. package/resources/local/page-agent/packages/llms/tsconfig.json +8 -0
  2932. package/resources/local/page-agent/packages/llms/vite.config.js +43 -0
  2933. package/resources/local/page-agent/packages/mcp/README.md +93 -0
  2934. package/resources/local/page-agent/packages/mcp/package.json +35 -0
  2935. package/resources/local/page-agent/packages/mcp/src/hub-bridge.js +139 -0
  2936. package/resources/local/page-agent/packages/mcp/src/index.js +100 -0
  2937. package/resources/local/page-agent/packages/mcp/src/launcher.html +245 -0
  2938. package/resources/local/page-agent/packages/page-agent/package.json +69 -0
  2939. package/resources/local/page-agent/packages/page-agent/src/PageAgent.ts +29 -0
  2940. package/resources/local/page-agent/packages/page-agent/src/demo.ts +55 -0
  2941. package/resources/local/page-agent/packages/page-agent/src/env.d.ts +9 -0
  2942. package/resources/local/page-agent/packages/page-agent/tsconfig.json +8 -0
  2943. package/resources/local/page-agent/packages/page-agent/vite.config.js +50 -0
  2944. package/resources/local/page-agent/packages/page-agent/vite.iife.config.js +49 -0
  2945. package/resources/local/page-agent/packages/page-controller/package.json +51 -0
  2946. package/resources/local/page-agent/packages/page-controller/src/PageController.ts +433 -0
  2947. package/resources/local/page-agent/packages/page-controller/src/actions.ts +552 -0
  2948. package/resources/local/page-agent/packages/page-controller/src/dom/dom_tree/index.d.ts +16 -0
  2949. package/resources/local/page-agent/packages/page-controller/src/dom/dom_tree/index.js +1753 -0
  2950. package/resources/local/page-agent/packages/page-controller/src/dom/dom_tree/type.ts +51 -0
  2951. package/resources/local/page-agent/packages/page-controller/src/dom/getPageInfo.ts +42 -0
  2952. package/resources/local/page-agent/packages/page-controller/src/dom/index.ts +569 -0
  2953. package/resources/local/page-agent/packages/page-controller/src/env.d.ts +6 -0
  2954. package/resources/local/page-agent/packages/page-controller/src/mask/SimulatorMask.module.css +13 -0
  2955. package/resources/local/page-agent/packages/page-controller/src/mask/SimulatorMask.ts +217 -0
  2956. package/resources/local/page-agent/packages/page-controller/src/mask/checkDarkMode.ts +115 -0
  2957. package/resources/local/page-agent/packages/page-controller/src/mask/cursor-border.svg +3 -0
  2958. package/resources/local/page-agent/packages/page-controller/src/mask/cursor-fill.svg +5 -0
  2959. package/resources/local/page-agent/packages/page-controller/src/mask/cursor.module.css +70 -0
  2960. package/resources/local/page-agent/packages/page-controller/src/patches/antd.ts +20 -0
  2961. package/resources/local/page-agent/packages/page-controller/src/patches/react.ts +16 -0
  2962. package/resources/local/page-agent/packages/page-controller/src/utils/index.ts +80 -0
  2963. package/resources/local/page-agent/packages/page-controller/tsconfig.json +8 -0
  2964. package/resources/local/page-agent/packages/page-controller/vite.config.js +50 -0
  2965. package/resources/local/page-agent/packages/ui/package.json +48 -0
  2966. package/resources/local/page-agent/packages/ui/src/env.d.ts +6 -0
  2967. package/resources/local/page-agent/packages/ui/src/i18n/index.ts +50 -0
  2968. package/resources/local/page-agent/packages/ui/src/i18n/locales.ts +122 -0
  2969. package/resources/local/page-agent/packages/ui/src/index.ts +2 -0
  2970. package/resources/local/page-agent/packages/ui/src/motion-css/createMotion.ts +64 -0
  2971. package/resources/local/page-agent/packages/ui/src/motion-css/motion.module.css +397 -0
  2972. package/resources/local/page-agent/packages/ui/src/motion-css/readme +5 -0
  2973. package/resources/local/page-agent/packages/ui/src/panel/Panel.module.css +601 -0
  2974. package/resources/local/page-agent/packages/ui/src/panel/Panel.ts +669 -0
  2975. package/resources/local/page-agent/packages/ui/src/panel/cards.ts +52 -0
  2976. package/resources/local/page-agent/packages/ui/src/panel/types.ts +76 -0
  2977. package/resources/local/page-agent/packages/ui/src/utils.ts +18 -0
  2978. package/resources/local/page-agent/packages/ui/tsconfig.json +8 -0
  2979. package/resources/local/page-agent/packages/ui/vite.config.js +46 -0
  2980. package/resources/local/page-agent/packages/website/AGENTS.md +127 -0
  2981. package/resources/local/page-agent/packages/website/components.json +24 -0
  2982. package/resources/local/page-agent/packages/website/index.html +95 -0
  2983. package/resources/local/page-agent/packages/website/package.json +34 -0
  2984. package/resources/local/page-agent/packages/website/public/robots.txt +4 -0
  2985. package/resources/local/page-agent/packages/website/src/components/APIReference.tsx +175 -0
  2986. package/resources/local/page-agent/packages/website/src/components/BetaNotice.tsx +25 -0
  2987. package/resources/local/page-agent/packages/website/src/components/CodeEditor.tsx +129 -0
  2988. package/resources/local/page-agent/packages/website/src/components/Footer.tsx +77 -0
  2989. package/resources/local/page-agent/packages/website/src/components/Header.tsx +188 -0
  2990. package/resources/local/page-agent/packages/website/src/components/Heading.tsx +46 -0
  2991. package/resources/local/page-agent/packages/website/src/components/HighlightSyntax.module.css +128 -0
  2992. package/resources/local/page-agent/packages/website/src/components/HighlightSyntax.tsx +175 -0
  2993. package/resources/local/page-agent/packages/website/src/components/JSConsole.module.css +164 -0
  2994. package/resources/local/page-agent/packages/website/src/components/JSConsole.tsx +371 -0
  2995. package/resources/local/page-agent/packages/website/src/components/LanguageSwitcher.tsx +114 -0
  2996. package/resources/local/page-agent/packages/website/src/components/ThemeSwitcher.tsx +134 -0
  2997. package/resources/local/page-agent/packages/website/src/components/ui/alert.tsx +60 -0
  2998. package/resources/local/page-agent/packages/website/src/components/ui/animated-gradient-text.tsx +37 -0
  2999. package/resources/local/page-agent/packages/website/src/components/ui/animated-shiny-text.tsx +38 -0
  3000. package/resources/local/page-agent/packages/website/src/components/ui/aurora-text.tsx +39 -0
  3001. package/resources/local/page-agent/packages/website/src/components/ui/badge.tsx +37 -0
  3002. package/resources/local/page-agent/packages/website/src/components/ui/bento-grid.tsx +91 -0
  3003. package/resources/local/page-agent/packages/website/src/components/ui/blur-fade.tsx +79 -0
  3004. package/resources/local/page-agent/packages/website/src/components/ui/button.tsx +60 -0
  3005. package/resources/local/page-agent/packages/website/src/components/ui/highlighter.tsx +92 -0
  3006. package/resources/local/page-agent/packages/website/src/components/ui/hyper-text.tsx +140 -0
  3007. package/resources/local/page-agent/packages/website/src/components/ui/kbd.tsx +28 -0
  3008. package/resources/local/page-agent/packages/website/src/components/ui/magic-card.tsx +101 -0
  3009. package/resources/local/page-agent/packages/website/src/components/ui/marquee.tsx +74 -0
  3010. package/resources/local/page-agent/packages/website/src/components/ui/neon-gradient-card.tsx +136 -0
  3011. package/resources/local/page-agent/packages/website/src/components/ui/particles.tsx +297 -0
  3012. package/resources/local/page-agent/packages/website/src/components/ui/separator.tsx +26 -0
  3013. package/resources/local/page-agent/packages/website/src/components/ui/sonner.tsx +38 -0
  3014. package/resources/local/page-agent/packages/website/src/components/ui/sparkles-text.tsx +150 -0
  3015. package/resources/local/page-agent/packages/website/src/components/ui/spinner.tsx +16 -0
  3016. package/resources/local/page-agent/packages/website/src/components/ui/switch.tsx +26 -0
  3017. package/resources/local/page-agent/packages/website/src/components/ui/text-animate.tsx +417 -0
  3018. package/resources/local/page-agent/packages/website/src/components/ui/tooltip.tsx +55 -0
  3019. package/resources/local/page-agent/packages/website/src/components/ui/typing-animation.tsx +164 -0
  3020. package/resources/local/page-agent/packages/website/src/constants.ts +10 -0
  3021. package/resources/local/page-agent/packages/website/src/env.d.ts +10 -0
  3022. package/resources/local/page-agent/packages/website/src/hooks/useGitHubStars.ts +27 -0
  3023. package/resources/local/page-agent/packages/website/src/i18n/context.tsx +34 -0
  3024. package/resources/local/page-agent/packages/website/src/index.css +471 -0
  3025. package/resources/local/page-agent/packages/website/src/lib/useDocumentTitle.ts +9 -0
  3026. package/resources/local/page-agent/packages/website/src/lib/utils.ts +6 -0
  3027. package/resources/local/page-agent/packages/website/src/main.tsx +22 -0
  3028. package/resources/local/page-agent/packages/website/src/pages/docs/Layout.tsx +140 -0
  3029. package/resources/local/page-agent/packages/website/src/pages/docs/advanced/custom-ui/page.tsx +271 -0
  3030. package/resources/local/page-agent/packages/website/src/pages/docs/advanced/page-agent/page.tsx +224 -0
  3031. package/resources/local/page-agent/packages/website/src/pages/docs/advanced/page-agent-core/page.tsx +492 -0
  3032. package/resources/local/page-agent/packages/website/src/pages/docs/advanced/page-controller/page.tsx +294 -0
  3033. package/resources/local/page-agent/packages/website/src/pages/docs/advanced/security-permissions/page.tsx +89 -0
  3034. package/resources/local/page-agent/packages/website/src/pages/docs/features/chrome-extension/page.tsx +314 -0
  3035. package/resources/local/page-agent/packages/website/src/pages/docs/features/custom-instructions/page.tsx +136 -0
  3036. package/resources/local/page-agent/packages/website/src/pages/docs/features/custom-tools/page.tsx +112 -0
  3037. package/resources/local/page-agent/packages/website/src/pages/docs/features/data-masking/page.tsx +74 -0
  3038. package/resources/local/page-agent/packages/website/src/pages/docs/features/mcp-server/page.tsx +70 -0
  3039. package/resources/local/page-agent/packages/website/src/pages/docs/features/models/page.tsx +457 -0
  3040. package/resources/local/page-agent/packages/website/src/pages/docs/features/third-party-agent/page.tsx +99 -0
  3041. package/resources/local/page-agent/packages/website/src/pages/docs/index.tsx +130 -0
  3042. package/resources/local/page-agent/packages/website/src/pages/docs/introduction/limitations/page.tsx +158 -0
  3043. package/resources/local/page-agent/packages/website/src/pages/docs/introduction/overview/page.tsx +233 -0
  3044. package/resources/local/page-agent/packages/website/src/pages/docs/introduction/quick-start/page.tsx +134 -0
  3045. package/resources/local/page-agent/packages/website/src/pages/docs/introduction/troubleshooting/page.tsx +430 -0
  3046. package/resources/local/page-agent/packages/website/src/pages/home/FeaturesSection.tsx +233 -0
  3047. package/resources/local/page-agent/packages/website/src/pages/home/HeroSection.tsx +417 -0
  3048. package/resources/local/page-agent/packages/website/src/pages/home/OneMoreThingSection.tsx +114 -0
  3049. package/resources/local/page-agent/packages/website/src/pages/home/ScenariosSection.tsx +165 -0
  3050. package/resources/local/page-agent/packages/website/src/pages/home/index.tsx +31 -0
  3051. package/resources/local/page-agent/packages/website/src/router.tsx +72 -0
  3052. package/resources/local/page-agent/packages/website/tailwind.config.js +3 -0
  3053. package/resources/local/page-agent/packages/website/tsconfig.json +11 -0
  3054. package/resources/local/page-agent/packages/website/vite.config.js +106 -0
  3055. package/resources/local/page-agent/scripts/build-libs.js +25 -0
  3056. package/resources/local/page-agent/scripts/build.js +45 -0
  3057. package/resources/local/page-agent/scripts/ci.js +55 -0
  3058. package/resources/local/page-agent/scripts/parallel-task.js +115 -0
  3059. package/resources/local/page-agent/scripts/post-publish.js +30 -0
  3060. package/resources/local/page-agent/scripts/pre-publish.js +42 -0
  3061. package/resources/local/page-agent/scripts/sync-version.js +144 -0
  3062. package/resources/local/page-agent/tsconfig.base.json +30 -0
  3063. package/resources/local/page-agent/tsconfig.typecheck.json +25 -0
  3064. package/scripts/audit-pack.js +47 -0
  3065. package/src/agent/agent-definitions.js +154 -0
  3066. package/src/agent/runtime.js +243 -0
  3067. package/src/ai/capability-scorecard.js +241 -0
  3068. package/src/ai/model-capabilities.js +2 -1
  3069. package/src/ai/orchestrator.js +478 -0
  3070. package/src/ai/profile-blueprints.js +135 -0
  3071. package/src/ai/prompts/system-prompt.js +15 -46
  3072. package/src/ai/providers.js +120 -7
  3073. package/src/ai/small-model-amplifier.js +25 -0
  3074. package/src/ai/workflow-selector.js +154 -0
  3075. package/src/cli/at-context.js +269 -0
  3076. package/src/cli/commands.js +813 -0
  3077. package/src/cli/composer.js +361 -0
  3078. package/src/cli/config.js +12 -1
  3079. package/src/cli/context-loader.js +20 -3
  3080. package/src/cli/conversation-format.js +11 -210
  3081. package/src/cli/diagnostics.js +101 -0
  3082. package/src/cli/diff-view.js +341 -0
  3083. package/src/cli/ecc.js +274 -0
  3084. package/src/cli/input-controller.js +263 -0
  3085. package/src/cli/project-docs.js +2 -0
  3086. package/src/cli/prompt-builder.js +58 -13
  3087. package/src/cli/repl-commands.js +358 -10
  3088. package/src/cli/repl.js +1071 -331
  3089. package/src/cli/slash-commands.js +22 -1
  3090. package/src/cli/snowflake-logo.js +20 -10
  3091. package/src/cli/terminal-ui.js +92 -40
  3092. package/src/cli/tool-call-adapter.js +327 -0
  3093. package/src/cli/tool-runtime.js +115 -0
  3094. package/src/codebase-index/codegraph-adapter.js +154 -0
  3095. package/src/codebase-index/indexer.js +402 -0
  3096. package/src/codebase-index/search.js +205 -0
  3097. package/src/codebase-index/watcher.js +117 -0
  3098. package/src/context/router.js +4 -41
  3099. package/src/context/token-juice.js +166 -0
  3100. package/src/context/wiki-memory.js +212 -0
  3101. package/src/integrations/htmlfx-manager.js +111 -0
  3102. package/src/mcp/inline-complete.js +226 -0
  3103. package/src/tools/executor.js +188 -1
@@ -0,0 +1,3139 @@
1
+ /**
2
+ * Tests for CI validator scripts
3
+ *
4
+ * Tests both success paths (against the real project) and error paths
5
+ * (against temporary fixture directories via wrapper scripts).
6
+ *
7
+ * Run with: node tests/ci/validators.test.js
8
+ */
9
+
10
+ const assert = require('assert');
11
+ const path = require('path');
12
+ const fs = require('fs');
13
+ const os = require('os');
14
+ const { execFileSync, spawnSync } = require('child_process');
15
+
16
+ const validatorsDir = path.join(__dirname, '..', '..', 'scripts', 'ci');
17
+ const repoRoot = path.join(__dirname, '..', '..');
18
+ const modulesSchemaPath = path.join(repoRoot, 'schemas', 'install-modules.schema.json');
19
+ const profilesSchemaPath = path.join(repoRoot, 'schemas', 'install-profiles.schema.json');
20
+ const componentsSchemaPath = path.join(repoRoot, 'schemas', 'install-components.schema.json');
21
+
22
+ // Test helpers
23
+ function test(name, fn) {
24
+ try {
25
+ fn();
26
+ console.log(` \u2713 ${name}`);
27
+ return true;
28
+ } catch (err) {
29
+ console.log(` \u2717 ${name}`);
30
+ console.log(` Error: ${err.message}`);
31
+ return false;
32
+ }
33
+ }
34
+
35
+ function createTestDir() {
36
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'ci-validator-test-'));
37
+ }
38
+
39
+ function cleanupTestDir(testDir) {
40
+ fs.rmSync(testDir, { recursive: true, force: true });
41
+ }
42
+
43
+ function writeJson(filePath, value) {
44
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
45
+ fs.writeFileSync(filePath, JSON.stringify(value, null, 2));
46
+ }
47
+
48
+ function writeInstallComponentsManifest(testDir, components) {
49
+ writeJson(path.join(testDir, 'manifests', 'install-components.json'), {
50
+ version: 1,
51
+ components,
52
+ });
53
+ }
54
+
55
+ function stripShebang(source) {
56
+ let s = source;
57
+ if (s.charCodeAt(0) === 0xFEFF) s = s.slice(1);
58
+ if (s.startsWith('#!')) {
59
+ const nl = s.indexOf('\n');
60
+ s = nl === -1 ? '' : s.slice(nl + 1);
61
+ }
62
+ return s;
63
+ }
64
+
65
+ /**
66
+ * Run modified source via a temp file (avoids Windows node -e shebang issues).
67
+ * The temp file is written inside the repo so require() can resolve node_modules.
68
+ * @param {string} source - JavaScript source to execute
69
+ * @returns {{code: number, stdout: string, stderr: string}}
70
+ */
71
+ function runSourceViaTempFile(source) {
72
+ const tmpFile = path.join(repoRoot, `.tmp-validator-${Date.now()}-${Math.random().toString(36).slice(2)}.js`);
73
+ try {
74
+ fs.writeFileSync(tmpFile, source, 'utf8');
75
+ const stdout = execFileSync('node', [tmpFile], {
76
+ encoding: 'utf8',
77
+ stdio: ['pipe', 'pipe', 'pipe'],
78
+ timeout: 10000,
79
+ cwd: repoRoot,
80
+ });
81
+ return { code: 0, stdout, stderr: '' };
82
+ } catch (err) {
83
+ return {
84
+ code: err.status || 1,
85
+ stdout: err.stdout || '',
86
+ stderr: err.stderr || '',
87
+ };
88
+ } finally {
89
+ try { fs.unlinkSync(tmpFile); } catch (_) { /* ignore cleanup errors */ }
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Run a validator script via a wrapper that overrides its directory constant.
95
+ * This allows testing error cases without modifying real project files.
96
+ *
97
+ * @param {string} validatorName - e.g., 'validate-agents'
98
+ * @param {string} dirConstant - the constant name to override (e.g., 'AGENTS_DIR')
99
+ * @param {string} overridePath - the temp directory to use
100
+ * @returns {{code: number, stdout: string, stderr: string}}
101
+ */
102
+ function runValidatorWithDir(validatorName, dirConstant, overridePath) {
103
+ const validatorPath = path.join(validatorsDir, `${validatorName}.js`);
104
+
105
+ // Read the validator source, replace the directory constant, and run as a wrapper
106
+ let source = fs.readFileSync(validatorPath, 'utf8');
107
+
108
+ // Remove the shebang line so wrappers also work against CRLF-checked-out files on Windows.
109
+ source = stripShebang(source);
110
+
111
+ // Replace the directory constant with our override path
112
+ const dirRegex = new RegExp(`const ${dirConstant} = .*?;`);
113
+ source = source.replace(dirRegex, `const ${dirConstant} = ${JSON.stringify(overridePath)};`);
114
+
115
+ return runSourceViaTempFile(source);
116
+ }
117
+
118
+ /**
119
+ * Run a validator script with multiple directory overrides.
120
+ * @param {string} validatorName
121
+ * @param {Record<string, string>} overrides - map of constant name to path
122
+ */
123
+ function runValidatorWithDirs(validatorName, overrides) {
124
+ const validatorPath = path.join(validatorsDir, `${validatorName}.js`);
125
+ let source = fs.readFileSync(validatorPath, 'utf8');
126
+ source = stripShebang(source);
127
+ for (const [constant, overridePath] of Object.entries(overrides)) {
128
+ const dirRegex = new RegExp(`const ${constant} = .*?;`);
129
+ source = source.replace(dirRegex, `const ${constant} = ${JSON.stringify(overridePath)};`);
130
+ }
131
+ return runSourceViaTempFile(source);
132
+ }
133
+
134
+ /**
135
+ * Run a validator script directly (tests real project)
136
+ */
137
+ function runValidator(validatorName) {
138
+ const validatorPath = path.join(validatorsDir, `${validatorName}.js`);
139
+ try {
140
+ const stdout = execFileSync('node', [validatorPath], {
141
+ encoding: 'utf8',
142
+ stdio: ['pipe', 'pipe', 'pipe'],
143
+ timeout: 15000,
144
+ });
145
+ return { code: 0, stdout, stderr: '' };
146
+ } catch (err) {
147
+ return {
148
+ code: err.status || 1,
149
+ stdout: err.stdout || '',
150
+ stderr: err.stderr || '',
151
+ };
152
+ }
153
+ }
154
+
155
+ function runCatalogValidator(overrides = {}) {
156
+ const validatorPath = path.join(validatorsDir, 'catalog.js');
157
+ let source = fs.readFileSync(validatorPath, 'utf8');
158
+ source = stripShebang(source);
159
+ const argv = Array.isArray(overrides.argv) && overrides.argv.length > 0
160
+ ? overrides.argv
161
+ : ['--text'];
162
+ const argvPreamble = argv.map(arg => `process.argv.push(${JSON.stringify(arg)});`).join('\n');
163
+ source = `${argvPreamble}\n${source}`;
164
+
165
+ const resolvedOverrides = {
166
+ ROOT: repoRoot,
167
+ README_PATH: path.join(repoRoot, 'README.md'),
168
+ AGENTS_PATH: path.join(repoRoot, 'AGENTS.md'),
169
+ README_ZH_CN_PATH: path.join(repoRoot, 'README.zh-CN.md'),
170
+ DOCS_ZH_CN_README_PATH: path.join(repoRoot, 'docs', 'zh-CN', 'README.md'),
171
+ DOCS_ZH_CN_AGENTS_PATH: path.join(repoRoot, 'docs', 'zh-CN', 'AGENTS.md'),
172
+ PLUGIN_JSON_PATH: path.join(repoRoot, '.claude-plugin', 'plugin.json'),
173
+ MARKETPLACE_JSON_PATH: path.join(repoRoot, '.claude-plugin', 'marketplace.json'),
174
+ ...overrides,
175
+ };
176
+
177
+ for (const [constant, overridePath] of Object.entries(resolvedOverrides)) {
178
+ const dirRegex = new RegExp(`const ${constant} = .*?;`);
179
+ source = source.replace(dirRegex, `const ${constant} = ${JSON.stringify(overridePath)};`);
180
+ }
181
+
182
+ return runSourceViaTempFile(source);
183
+ }
184
+
185
+ // Run validate-skills.js against a fixture dir, optionally passing
186
+ // extra argv (e.g. '--strict') and env overrides (e.g.
187
+ // CI_STRICT_SKILLS=1) so the frontmatter finding suite can exercise
188
+ // both warn and strict modes via argv and env code paths.
189
+ //
190
+ // Captures stderr on both success and failure (the shared
191
+ // runSourceViaTempFile helper only surfaces stderr when the child
192
+ // exits non-zero, which hides WARN lines in the default mode).
193
+ function runSkillsValidator(testDir, argv = [], envOverrides = {}) {
194
+ const validatorPath = path.join(validatorsDir, 'validate-skills.js');
195
+ let source = fs.readFileSync(validatorPath, 'utf8');
196
+ source = stripShebang(source);
197
+ source = source.replace(
198
+ /const SKILLS_DIR = .*?;/,
199
+ `const SKILLS_DIR = ${JSON.stringify(testDir)};`,
200
+ );
201
+ if (argv.length > 0) {
202
+ const argvPreamble = argv
203
+ .map(arg => `process.argv.push(${JSON.stringify(arg)});`)
204
+ .join('\n');
205
+ source = `${argvPreamble}\n${source}`;
206
+ }
207
+ const tmpFile = path.join(repoRoot,
208
+ `.tmp-validator-${Date.now()}-${Math.random().toString(36).slice(2)}.js`);
209
+ try {
210
+ fs.writeFileSync(tmpFile, source, 'utf8');
211
+ const r = spawnSync('node', [tmpFile], {
212
+ encoding: 'utf8',
213
+ timeout: 10000,
214
+ cwd: repoRoot,
215
+ env: { ...process.env, CI_STRICT_SKILLS: '', ...envOverrides },
216
+ });
217
+ return {
218
+ code: typeof r.status === 'number' ? r.status : 1,
219
+ stdout: r.stdout || '',
220
+ stderr: r.stderr || '',
221
+ };
222
+ } finally {
223
+ try { fs.unlinkSync(tmpFile); } catch (_) { /* ignore */ }
224
+ }
225
+ }
226
+
227
+ function writeCatalogFixture(testDir, options = {}) {
228
+ const {
229
+ readmeCounts = { agents: 1, skills: 1, commands: 1 },
230
+ readmeProjectTreeAgents = readmeCounts.agents,
231
+ readmeTableCounts = readmeCounts,
232
+ readmeParityCounts = readmeCounts,
233
+ readmeUnrelatedSkillsCount = 16,
234
+ summaryCounts = { agents: 1, skills: 1, commands: 1 },
235
+ structureLines = [
236
+ 'agents/ — 1 specialized subagents',
237
+ 'skills/ — 1 workflow skills and domain knowledge',
238
+ 'commands/ — 1 slash commands',
239
+ ],
240
+ zhRootReadmeCounts = { agents: 1, skills: 1, commands: 1 },
241
+ zhDocsReadmeCounts = { agents: 1, skills: 1, commands: 1 },
242
+ zhDocsTableCounts = zhDocsReadmeCounts,
243
+ zhDocsParityCounts = zhDocsReadmeCounts,
244
+ zhDocsUnrelatedSkillsCount = 16,
245
+ zhAgentsSummaryCounts = { agents: 1, skills: 1, commands: 1 },
246
+ zhAgentsStructureLines = [
247
+ 'agents/ — 1 个专业子代理',
248
+ 'skills/ — 1 个工作流技能和领域知识',
249
+ 'commands/ — 1 个斜杠命令',
250
+ ],
251
+ pluginCounts = { agents: 1, skills: 1, commands: 1 },
252
+ marketplaceCounts = { agents: 1, skills: 1, commands: 1 },
253
+ } = options;
254
+
255
+ const readmePath = path.join(testDir, 'README.md');
256
+ const agentsPath = path.join(testDir, 'AGENTS.md');
257
+ const zhRootReadmePath = path.join(testDir, 'README.zh-CN.md');
258
+ const zhDocsReadmePath = path.join(testDir, 'docs', 'zh-CN', 'README.md');
259
+ const zhAgentsPath = path.join(testDir, 'docs', 'zh-CN', 'AGENTS.md');
260
+ const pluginJsonPath = path.join(testDir, '.claude-plugin', 'plugin.json');
261
+ const marketplaceJsonPath = path.join(testDir, '.claude-plugin', 'marketplace.json');
262
+
263
+ fs.mkdirSync(path.join(testDir, 'agents'), { recursive: true });
264
+ fs.mkdirSync(path.join(testDir, 'commands'), { recursive: true });
265
+ fs.mkdirSync(path.join(testDir, 'skills', 'demo-skill'), { recursive: true });
266
+ fs.mkdirSync(path.join(testDir, 'docs', 'zh-CN'), { recursive: true });
267
+ fs.mkdirSync(path.join(testDir, '.claude-plugin'), { recursive: true });
268
+
269
+ fs.writeFileSync(path.join(testDir, 'agents', 'planner.md'), '---\nmodel: sonnet\ntools: Read\n---\n# Planner');
270
+ fs.writeFileSync(path.join(testDir, 'commands', 'plan.md'), '---\ndescription: Plan\n---\n# Plan');
271
+ fs.writeFileSync(path.join(testDir, 'skills', 'demo-skill', 'SKILL.md'), '---\nname: demo-skill\ndescription: Demo skill\norigin: ECC\n---\n# Demo Skill');
272
+
273
+ fs.writeFileSync(readmePath, `Access to ${readmeCounts.agents} agents, ${readmeCounts.skills} skills, and ${readmeCounts.commands} commands.\n- **Public surface synced to the live repo** - metadata, catalog counts, plugin manifests, and install-facing docs now match the actual OSS surface: ${readmeCounts.agents} agents, ${readmeCounts.skills} skills, and ${readmeCounts.commands} legacy command shims.\n|-- agents/ # ${readmeProjectTreeAgents} specialized subagents for delegation\n| Feature | Claude Code | Cursor IDE | Codex CLI | OpenCode |\n|---------|------------|------------|-----------|----------|\n| Agents | PASS: ${readmeTableCounts.agents} agents | Shared | Shared | 1 |\n| Commands | PASS: ${readmeTableCounts.commands} commands | Shared | Shared | 1 |\n| Skills | PASS: ${readmeTableCounts.skills} skills | Shared | Shared | 1 |\n\n| Feature | Count | Format |\n|-----------|-------|---------|\n| Skills | ${readmeUnrelatedSkillsCount} | .agents/skills/ |\n\n## Cross-Tool Feature Parity\n\n| Feature | Claude Code | Cursor IDE | Codex CLI | OpenCode |\n|---------|------------|------------|-----------|----------|\n| **Agents** | ${readmeParityCounts.agents} | Shared (AGENTS.md) | Shared (AGENTS.md) | 12 |\n| **Commands** | ${readmeParityCounts.commands} | Shared | Instruction-based | 31 |\n| **Skills** | ${readmeParityCounts.skills} | Shared | 10 (native format) | 37 |\n`);
274
+ fs.writeFileSync(agentsPath, `This is a **production-ready AI coding plugin** providing ${summaryCounts.agents} specialized agents, ${summaryCounts.skills} skills, ${summaryCounts.commands} commands, and automated hook workflows for software development.\n\n\`\`\`\n${structureLines.join('\n')}\n\`\`\`\n`);
275
+ fs.writeFileSync(zhRootReadmePath, `**完成!** 你现在可以使用 ${zhRootReadmeCounts.agents} 个代理、${zhRootReadmeCounts.skills} 个技能和 ${zhRootReadmeCounts.commands} 个命令。\n`);
276
+ fs.writeFileSync(zhDocsReadmePath, `**搞定!** 你现在可以使用 ${zhDocsReadmeCounts.agents} 个智能体、${zhDocsReadmeCounts.skills} 项技能和 ${zhDocsReadmeCounts.commands} 个命令了。\n| 功能特性 | Claude Code | OpenCode | 状态 |\n|---------|-------------|----------|--------|\n| 智能体 | \u2705 ${zhDocsTableCounts.agents} 个 | \u2705 12 个 | **Claude Code 领先** |\n| 命令 | \u2705 ${zhDocsTableCounts.commands} 个 | \u2705 31 个 | **Claude Code 领先** |\n| 技能 | \u2705 ${zhDocsTableCounts.skills} 项 | \u2705 37 项 | **Claude Code 领先** |\n\n| 功能特性 | 数量 | 格式 |\n|-----------|-------|---------|\n| 技能 | ${zhDocsUnrelatedSkillsCount} | .agents/skills/ |\n\n## 跨工具功能对等\n\n| 功能特性 | Claude Code | Cursor IDE | Codex CLI | OpenCode |\n|---------|------------|------------|-----------|----------|\n| **智能体** | ${zhDocsParityCounts.agents} | 共享 (AGENTS.md) | 共享 (AGENTS.md) | 12 |\n| **命令** | ${zhDocsParityCounts.commands} | 共享 | 基于指令 | 31 |\n| **技能** | ${zhDocsParityCounts.skills} | 共享 | 10 (原生格式) | 37 |\n`);
277
+ fs.writeFileSync(zhAgentsPath, `这是一个**生产就绪的 AI 编码插件**,提供 ${zhAgentsSummaryCounts.agents} 个专业代理、${zhAgentsSummaryCounts.skills} 项技能、${zhAgentsSummaryCounts.commands} 条命令以及自动化钩子工作流,用于软件开发。\n\n\`\`\`\n${zhAgentsStructureLines.join('\n')}\n\`\`\`\n`);
278
+ fs.writeFileSync(pluginJsonPath, JSON.stringify({
279
+ name: 'ecc',
280
+ description: `Battle-tested plugin — ${pluginCounts.agents} agents, ${pluginCounts.skills} skills, ${pluginCounts.commands} legacy command shims`,
281
+ }, null, 2));
282
+ fs.writeFileSync(marketplaceJsonPath, JSON.stringify({
283
+ plugins: [{
284
+ name: 'ecc',
285
+ description: `Marketplace plugin — ${marketplaceCounts.agents} agents, ${marketplaceCounts.skills} skills, ${marketplaceCounts.commands} legacy command shims`,
286
+ }],
287
+ }, null, 2));
288
+
289
+ return { readmePath, agentsPath, zhRootReadmePath, zhDocsReadmePath, zhAgentsPath, pluginJsonPath, marketplaceJsonPath };
290
+ }
291
+
292
+ function runTests() {
293
+ console.log('\n=== Testing CI Validators ===\n');
294
+
295
+ let passed = 0;
296
+ let failed = 0;
297
+
298
+ // ==========================================
299
+ // validate-agents.js
300
+ // ==========================================
301
+ console.log('validate-agents.js:');
302
+
303
+ if (test('strips CRLF shebangs before writing temp wrappers', () => {
304
+ const source = '#!/usr/bin/env node\r\nconsole.log("ok");';
305
+ assert.strictEqual(stripShebang(source), 'console.log("ok");');
306
+ })) passed++; else failed++;
307
+
308
+ if (test('passes on real project agents', () => {
309
+ const result = runValidator('validate-agents');
310
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
311
+ assert.ok(result.stdout.includes('Validated'), 'Should output validation count');
312
+ })) passed++; else failed++;
313
+
314
+ if (test('fails on agent without frontmatter', () => {
315
+ const testDir = createTestDir();
316
+ fs.writeFileSync(path.join(testDir, 'bad-agent.md'), '# No frontmatter here\nJust content.');
317
+
318
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
319
+ assert.strictEqual(result.code, 1, 'Should exit 1 for missing frontmatter');
320
+ assert.ok(result.stderr.includes('Missing frontmatter'), 'Should report missing frontmatter');
321
+ cleanupTestDir(testDir);
322
+ })) passed++; else failed++;
323
+
324
+ if (test('fails on agent missing required model field', () => {
325
+ const testDir = createTestDir();
326
+ fs.writeFileSync(path.join(testDir, 'no-model.md'), '---\ntools: Read, Write\n---\n# Agent');
327
+
328
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
329
+ assert.strictEqual(result.code, 1, 'Should exit 1 for missing model');
330
+ assert.ok(result.stderr.includes('model'), 'Should report missing model field');
331
+ cleanupTestDir(testDir);
332
+ })) passed++; else failed++;
333
+
334
+ if (test('fails on agent missing required tools field', () => {
335
+ const testDir = createTestDir();
336
+ fs.writeFileSync(path.join(testDir, 'no-tools.md'), '---\nmodel: sonnet\n---\n# Agent');
337
+
338
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
339
+ assert.strictEqual(result.code, 1, 'Should exit 1 for missing tools');
340
+ assert.ok(result.stderr.includes('tools'), 'Should report missing tools field');
341
+ cleanupTestDir(testDir);
342
+ })) passed++; else failed++;
343
+
344
+ if (test('passes on valid agent with all required fields', () => {
345
+ const testDir = createTestDir();
346
+ fs.writeFileSync(path.join(testDir, 'good-agent.md'), '---\nmodel: sonnet\ntools: Read, Write\n---\n# Agent');
347
+
348
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
349
+ assert.strictEqual(result.code, 0, 'Should pass for valid agent');
350
+ assert.ok(result.stdout.includes('Validated 1'), 'Should report 1 validated');
351
+ cleanupTestDir(testDir);
352
+ })) passed++; else failed++;
353
+
354
+ if (test('handles frontmatter with BOM and CRLF', () => {
355
+ const testDir = createTestDir();
356
+ const content = '\uFEFF---\r\nmodel: sonnet\r\ntools: Read, Write\r\n---\r\n# Agent';
357
+ fs.writeFileSync(path.join(testDir, 'bom-agent.md'), content);
358
+
359
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
360
+ assert.strictEqual(result.code, 0, 'Should handle BOM and CRLF');
361
+ cleanupTestDir(testDir);
362
+ })) passed++; else failed++;
363
+
364
+ if (test('handles frontmatter with colons in values', () => {
365
+ const testDir = createTestDir();
366
+ fs.writeFileSync(path.join(testDir, 'colon-agent.md'), '---\nmodel: sonnet\ntools: Read, Write, Bash\ndescription: Run this: always check: everything\n---\n# Agent');
367
+
368
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
369
+ assert.strictEqual(result.code, 0, 'Should handle colons in values');
370
+ cleanupTestDir(testDir);
371
+ })) passed++; else failed++;
372
+
373
+ if (test('skips non-md files', () => {
374
+ const testDir = createTestDir();
375
+ fs.writeFileSync(path.join(testDir, 'readme.txt'), 'Not an agent');
376
+ fs.writeFileSync(path.join(testDir, 'valid.md'), '---\nmodel: sonnet\ntools: Read\n---\n# Agent');
377
+
378
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
379
+ assert.strictEqual(result.code, 0, 'Should only validate .md files');
380
+ assert.ok(result.stdout.includes('Validated 1'), 'Should count only .md files');
381
+ cleanupTestDir(testDir);
382
+ })) passed++; else failed++;
383
+
384
+ if (test('exits 0 when directory does not exist', () => {
385
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', '/nonexistent/dir');
386
+ assert.strictEqual(result.code, 0, 'Should skip when no agents dir');
387
+ assert.ok(result.stdout.includes('skipping'), 'Should say skipping');
388
+ })) passed++; else failed++;
389
+
390
+ if (test('rejects agent with empty model value', () => {
391
+ const testDir = createTestDir();
392
+ fs.writeFileSync(path.join(testDir, 'empty.md'), '---\nmodel:\ntools: Read, Write\n---\n# Empty model');
393
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
394
+ assert.strictEqual(result.code, 1, 'Should reject empty model');
395
+ assert.ok(result.stderr.includes('model'), 'Should mention model field');
396
+ cleanupTestDir(testDir);
397
+ })) passed++; else failed++;
398
+
399
+ if (test('rejects agent with empty tools value', () => {
400
+ const testDir = createTestDir();
401
+ fs.writeFileSync(path.join(testDir, 'empty.md'), '---\nmodel: claude-sonnet-4-5-20250929\ntools:\n---\n# Empty tools');
402
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
403
+ assert.strictEqual(result.code, 1, 'Should reject empty tools');
404
+ assert.ok(result.stderr.includes('tools'), 'Should mention tools field');
405
+ cleanupTestDir(testDir);
406
+ })) passed++; else failed++;
407
+
408
+ // ==========================================
409
+ // validate-hooks.js
410
+ // ==========================================
411
+ console.log('\nvalidate-hooks.js:');
412
+
413
+ if (test('passes on real project hooks.json', () => {
414
+ const result = runValidator('validate-hooks');
415
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
416
+ assert.ok(result.stdout.includes('Validated'), 'Should output validation count');
417
+ })) passed++; else failed++;
418
+
419
+ // ==========================================
420
+ // catalog.js
421
+ // ==========================================
422
+ console.log('\ncatalog.js:');
423
+
424
+ if (test('passes on real project catalog counts', () => {
425
+ const result = runCatalogValidator();
426
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
427
+ assert.ok(result.stdout.includes('Documentation counts match the repository catalog.'), 'Should report matching counts');
428
+ })) passed++; else failed++;
429
+
430
+ if (test('fails when README and AGENTS catalog counts drift', () => {
431
+ const testDir = createTestDir();
432
+ const {
433
+ readmePath,
434
+ agentsPath,
435
+ zhRootReadmePath,
436
+ zhDocsReadmePath,
437
+ zhAgentsPath,
438
+ pluginJsonPath,
439
+ marketplaceJsonPath,
440
+ } = writeCatalogFixture(testDir, {
441
+ readmeCounts: { agents: 99, skills: 99, commands: 99 },
442
+ readmeTableCounts: { agents: 99, skills: 99, commands: 99 },
443
+ readmeParityCounts: { agents: 99, skills: 99, commands: 99 },
444
+ summaryCounts: { agents: 99, skills: 99, commands: 99 },
445
+ structureLines: [
446
+ 'agents/ — 99 specialized subagents',
447
+ 'skills/ — 99 workflow skills and domain knowledge',
448
+ 'commands/ — 99 slash commands',
449
+ ],
450
+ zhRootReadmeCounts: { agents: 99, skills: 99, commands: 99 },
451
+ zhDocsReadmeCounts: { agents: 99, skills: 99, commands: 99 },
452
+ zhDocsTableCounts: { agents: 99, skills: 99, commands: 99 },
453
+ zhDocsParityCounts: { agents: 99, skills: 99, commands: 99 },
454
+ zhAgentsSummaryCounts: { agents: 99, skills: 99, commands: 99 },
455
+ zhAgentsStructureLines: [
456
+ 'agents/ — 99 个专业子代理',
457
+ 'skills/ — 99 个工作流技能和领域知识',
458
+ 'commands/ — 99 个斜杠命令',
459
+ ],
460
+ });
461
+
462
+ const result = runCatalogValidator({
463
+ ROOT: testDir,
464
+ README_PATH: readmePath,
465
+ AGENTS_PATH: agentsPath,
466
+ README_ZH_CN_PATH: zhRootReadmePath,
467
+ DOCS_ZH_CN_README_PATH: zhDocsReadmePath,
468
+ DOCS_ZH_CN_AGENTS_PATH: zhAgentsPath,
469
+ PLUGIN_JSON_PATH: pluginJsonPath,
470
+ MARKETPLACE_JSON_PATH: marketplaceJsonPath,
471
+ });
472
+
473
+ assert.strictEqual(result.code, 1, 'Should fail when catalog counts drift');
474
+ assert.ok((result.stdout + result.stderr).includes('Documentation count mismatches found:'), 'Should report mismatches');
475
+ cleanupTestDir(testDir);
476
+ })) passed++; else failed++;
477
+
478
+ if (test('fails when README parity table counts drift', () => {
479
+ const testDir = createTestDir();
480
+ const {
481
+ readmePath,
482
+ agentsPath,
483
+ zhRootReadmePath,
484
+ zhDocsReadmePath,
485
+ zhAgentsPath,
486
+ pluginJsonPath,
487
+ marketplaceJsonPath,
488
+ } = writeCatalogFixture(testDir, {
489
+ readmeCounts: { agents: 1, skills: 1, commands: 1 },
490
+ readmeTableCounts: { agents: 1, skills: 1, commands: 1 },
491
+ readmeParityCounts: { agents: 9, skills: 8, commands: 7 },
492
+ summaryCounts: { agents: 1, skills: 1, commands: 1 },
493
+ });
494
+
495
+ const result = runCatalogValidator({
496
+ ROOT: testDir,
497
+ README_PATH: readmePath,
498
+ AGENTS_PATH: agentsPath,
499
+ README_ZH_CN_PATH: zhRootReadmePath,
500
+ DOCS_ZH_CN_README_PATH: zhDocsReadmePath,
501
+ DOCS_ZH_CN_AGENTS_PATH: zhAgentsPath,
502
+ PLUGIN_JSON_PATH: pluginJsonPath,
503
+ MARKETPLACE_JSON_PATH: marketplaceJsonPath,
504
+ });
505
+
506
+ assert.strictEqual(result.code, 1, 'Should fail when README parity table drifts');
507
+ assert.ok(
508
+ (result.stdout + result.stderr).includes('README.md parity table'),
509
+ 'Should mention the README parity table mismatch'
510
+ );
511
+ cleanupTestDir(testDir);
512
+ })) passed++; else failed++;
513
+
514
+ if (test('fails when a tracked catalog document is missing', () => {
515
+ const testDir = createTestDir();
516
+ const {
517
+ readmePath,
518
+ agentsPath,
519
+ zhRootReadmePath,
520
+ zhDocsReadmePath,
521
+ pluginJsonPath,
522
+ marketplaceJsonPath,
523
+ } = writeCatalogFixture(testDir);
524
+ const missingZhAgentsPath = path.join(testDir, 'docs', 'zh-CN', 'AGENTS.md');
525
+ fs.rmSync(missingZhAgentsPath);
526
+
527
+ const result = runCatalogValidator({
528
+ ROOT: testDir,
529
+ README_PATH: readmePath,
530
+ AGENTS_PATH: agentsPath,
531
+ README_ZH_CN_PATH: zhRootReadmePath,
532
+ DOCS_ZH_CN_README_PATH: zhDocsReadmePath,
533
+ DOCS_ZH_CN_AGENTS_PATH: missingZhAgentsPath,
534
+ PLUGIN_JSON_PATH: pluginJsonPath,
535
+ MARKETPLACE_JSON_PATH: marketplaceJsonPath,
536
+ });
537
+
538
+ assert.strictEqual(result.code, 1, 'Should fail when a tracked doc is missing');
539
+ assert.ok(
540
+ (result.stdout + result.stderr).includes('Failed to read AGENTS.md'),
541
+ 'Should mention the missing tracked document'
542
+ );
543
+ cleanupTestDir(testDir);
544
+ })) passed++; else failed++;
545
+
546
+ if (test('syncs tracked catalog docs in write mode without rewriting unrelated tables', () => {
547
+ const testDir = createTestDir();
548
+ const {
549
+ readmePath,
550
+ agentsPath,
551
+ zhRootReadmePath,
552
+ zhDocsReadmePath,
553
+ zhAgentsPath,
554
+ pluginJsonPath,
555
+ marketplaceJsonPath,
556
+ } = writeCatalogFixture(testDir, {
557
+ readmeCounts: { agents: 9, skills: 9, commands: 9 },
558
+ readmeTableCounts: { agents: 8, skills: 8, commands: 8 },
559
+ readmeParityCounts: { agents: 7, skills: 7, commands: 7 },
560
+ summaryCounts: { agents: 6, skills: 6, commands: 6 },
561
+ zhRootReadmeCounts: { agents: 10, skills: 10, commands: 10 },
562
+ zhDocsReadmeCounts: { agents: 11, skills: 11, commands: 11 },
563
+ zhDocsTableCounts: { agents: 12, skills: 12, commands: 12 },
564
+ zhDocsParityCounts: { agents: 13, skills: 13, commands: 13 },
565
+ zhAgentsSummaryCounts: { agents: 14, skills: 14, commands: 14 },
566
+ pluginCounts: { agents: 18, skills: 18, commands: 18 },
567
+ marketplaceCounts: { agents: 19, skills: 19, commands: 19 },
568
+ zhAgentsStructureLines: [
569
+ 'agents/ — 15 个专业子代理',
570
+ 'skills/ — 16 个工作流技能和领域知识',
571
+ 'commands/ — 17 个斜杠命令',
572
+ ],
573
+ });
574
+
575
+ const result = runCatalogValidator({
576
+ argv: ['--write', '--text'],
577
+ ROOT: testDir,
578
+ README_PATH: readmePath,
579
+ AGENTS_PATH: agentsPath,
580
+ README_ZH_CN_PATH: zhRootReadmePath,
581
+ DOCS_ZH_CN_README_PATH: zhDocsReadmePath,
582
+ DOCS_ZH_CN_AGENTS_PATH: zhAgentsPath,
583
+ PLUGIN_JSON_PATH: pluginJsonPath,
584
+ MARKETPLACE_JSON_PATH: marketplaceJsonPath,
585
+ });
586
+
587
+ assert.strictEqual(result.code, 0, `Should sync and pass, got stderr: ${result.stderr}`);
588
+
589
+ const readme = fs.readFileSync(readmePath, 'utf8');
590
+ const agentsDoc = fs.readFileSync(agentsPath, 'utf8');
591
+ const zhRootReadme = fs.readFileSync(zhRootReadmePath, 'utf8');
592
+ const zhDocsReadme = fs.readFileSync(zhDocsReadmePath, 'utf8');
593
+ const zhAgentsDoc = fs.readFileSync(zhAgentsPath, 'utf8');
594
+ const pluginJson = fs.readFileSync(pluginJsonPath, 'utf8');
595
+ const marketplaceJson = fs.readFileSync(marketplaceJsonPath, 'utf8');
596
+
597
+ assert.ok(readme.includes('Access to 1 agents, 1 skills, and 1 legacy command shims'), 'Should sync README quick-start summary');
598
+ assert.ok(readme.includes('actual OSS surface: 1 agents, 1 skills, and 1 legacy command shims'), 'Should sync README release-note summary');
599
+ assert.ok(readme.includes('|-- agents/ # 1 specialized subagents for delegation'), 'Should sync README project tree agents count');
600
+ assert.ok(readme.includes('| Agents | PASS: 1 agents |'), 'Should sync README comparison table');
601
+ assert.ok(readme.includes('| Skills | 16 | .agents/skills/ |'), 'Should not rewrite unrelated README tables');
602
+ assert.ok(readme.includes('| **Agents** | 1 | Shared (AGENTS.md) | Shared (AGENTS.md) | 12 |'), 'Should sync README parity table');
603
+ assert.ok(agentsDoc.includes('providing 1 specialized agents, 1 skills, 1 commands'), 'Should sync AGENTS summary');
604
+ assert.ok(agentsDoc.includes('skills/ — 1 workflow skills and domain knowledge'), 'Should sync AGENTS structure');
605
+ assert.ok(zhRootReadme.includes('你现在可以使用 1 个代理、1 个技能和 1 个命令'), 'Should sync README.zh-CN quick-start summary');
606
+ assert.ok(zhDocsReadme.includes('你现在可以使用 1 个智能体、1 项技能和 1 个命令了'), 'Should sync docs/zh-CN/README quick-start summary');
607
+ assert.ok(zhDocsReadme.includes('| 智能体 | \u2705 1 个 |'), 'Should sync docs/zh-CN/README comparison table');
608
+ assert.ok(zhDocsReadme.includes('| 技能 | 16 | .agents/skills/ |'), 'Should not rewrite unrelated docs/zh-CN/README tables');
609
+ assert.ok(zhDocsReadme.includes('| **智能体** | 1 | 共享 (AGENTS.md) | 共享 (AGENTS.md) | 12 |'), 'Should sync docs/zh-CN/README parity table');
610
+ assert.ok(zhAgentsDoc.includes('提供 1 个专业代理、1 项技能、1 条命令'), 'Should sync docs/zh-CN/AGENTS summary');
611
+ assert.ok(zhAgentsDoc.includes('commands/ — 1 个斜杠命令'), 'Should sync docs/zh-CN/AGENTS structure');
612
+ assert.ok(pluginJson.includes('1 agents, 1 skills, 1 legacy command shims'), 'Should sync plugin manifest catalog description');
613
+ assert.ok(marketplaceJson.includes('1 agents, 1 skills, 1 legacy command shims'), 'Should sync marketplace plugin catalog description');
614
+
615
+ cleanupTestDir(testDir);
616
+ })) passed++; else failed++;
617
+
618
+ if (test('accepts AGENTS project structure entries with varied spacing and dash styles', () => {
619
+ const testDir = createTestDir();
620
+ const {
621
+ readmePath,
622
+ agentsPath,
623
+ zhRootReadmePath,
624
+ zhDocsReadmePath,
625
+ zhAgentsPath,
626
+ pluginJsonPath,
627
+ marketplaceJsonPath,
628
+ } = writeCatalogFixture(testDir, {
629
+ structureLines: [
630
+ ' agents/ - 1 specialized subagents ',
631
+ '\tskills/\t–\t1+ workflow skills and domain knowledge\t',
632
+ ' commands/ — 1 slash commands ',
633
+ ],
634
+ zhAgentsStructureLines: [
635
+ ' agents/ - 1 个专业子代理 ',
636
+ '\tskills/\t–\t1+ 个工作流技能和领域知识\t',
637
+ ' commands/ — 1 个斜杠命令 ',
638
+ ],
639
+ });
640
+
641
+ const result = runCatalogValidator({
642
+ ROOT: testDir,
643
+ README_PATH: readmePath,
644
+ AGENTS_PATH: agentsPath,
645
+ README_ZH_CN_PATH: zhRootReadmePath,
646
+ DOCS_ZH_CN_README_PATH: zhDocsReadmePath,
647
+ DOCS_ZH_CN_AGENTS_PATH: zhAgentsPath,
648
+ PLUGIN_JSON_PATH: pluginJsonPath,
649
+ MARKETPLACE_JSON_PATH: marketplaceJsonPath,
650
+ });
651
+
652
+ assert.strictEqual(result.code, 0, `Should accept formatting variations, got stderr: ${result.stderr}`);
653
+ cleanupTestDir(testDir);
654
+ })) passed++; else failed++;
655
+
656
+ if (test('exits 0 when hooks.json does not exist', () => {
657
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', '/nonexistent/hooks.json');
658
+ assert.strictEqual(result.code, 0, 'Should skip when no hooks.json');
659
+ })) passed++; else failed++;
660
+
661
+ if (test('fails on invalid JSON', () => {
662
+ const testDir = createTestDir();
663
+ const hooksFile = path.join(testDir, 'hooks.json');
664
+ fs.writeFileSync(hooksFile, '{ not valid json }}}');
665
+
666
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
667
+ assert.strictEqual(result.code, 1, 'Should fail on invalid JSON');
668
+ assert.ok(result.stderr.includes('Invalid JSON'), 'Should report invalid JSON');
669
+ cleanupTestDir(testDir);
670
+ })) passed++; else failed++;
671
+
672
+ if (test('fails on invalid event type', () => {
673
+ const testDir = createTestDir();
674
+ const hooksFile = path.join(testDir, 'hooks.json');
675
+ fs.writeFileSync(hooksFile, JSON.stringify({
676
+ hooks: {
677
+ InvalidEventType: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo hi' }] }]
678
+ }
679
+ }));
680
+
681
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
682
+ assert.strictEqual(result.code, 1, 'Should fail on invalid event type');
683
+ assert.ok(result.stderr.includes('Invalid event type'), 'Should report invalid event type');
684
+ cleanupTestDir(testDir);
685
+ })) passed++; else failed++;
686
+
687
+ if (test('fails on hook entry missing type field', () => {
688
+ const testDir = createTestDir();
689
+ const hooksFile = path.join(testDir, 'hooks.json');
690
+ fs.writeFileSync(hooksFile, JSON.stringify({
691
+ hooks: {
692
+ PreToolUse: [{ matcher: 'test', hooks: [{ command: 'echo hi' }] }]
693
+ }
694
+ }));
695
+
696
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
697
+ assert.strictEqual(result.code, 1, 'Should fail on missing type');
698
+ assert.ok(result.stderr.includes('type'), 'Should report missing type');
699
+ cleanupTestDir(testDir);
700
+ })) passed++; else failed++;
701
+
702
+ if (test('fails on hook entry missing command field', () => {
703
+ const testDir = createTestDir();
704
+ const hooksFile = path.join(testDir, 'hooks.json');
705
+ fs.writeFileSync(hooksFile, JSON.stringify({
706
+ hooks: {
707
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command' }] }]
708
+ }
709
+ }));
710
+
711
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
712
+ assert.strictEqual(result.code, 1, 'Should fail on missing command');
713
+ assert.ok(result.stderr.includes('command'), 'Should report missing command');
714
+ cleanupTestDir(testDir);
715
+ })) passed++; else failed++;
716
+
717
+ if (test('fails on invalid async field type', () => {
718
+ const testDir = createTestDir();
719
+ const hooksFile = path.join(testDir, 'hooks.json');
720
+ fs.writeFileSync(hooksFile, JSON.stringify({
721
+ hooks: {
722
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo', async: 'yes' }] }]
723
+ }
724
+ }));
725
+
726
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
727
+ assert.strictEqual(result.code, 1, 'Should fail on non-boolean async');
728
+ assert.ok(result.stderr.includes('async'), 'Should report async type error');
729
+ cleanupTestDir(testDir);
730
+ })) passed++; else failed++;
731
+
732
+ if (test('fails on negative timeout', () => {
733
+ const testDir = createTestDir();
734
+ const hooksFile = path.join(testDir, 'hooks.json');
735
+ fs.writeFileSync(hooksFile, JSON.stringify({
736
+ hooks: {
737
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo', timeout: -5 }] }]
738
+ }
739
+ }));
740
+
741
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
742
+ assert.strictEqual(result.code, 1, 'Should fail on negative timeout');
743
+ assert.ok(result.stderr.includes('timeout'), 'Should report timeout error');
744
+ cleanupTestDir(testDir);
745
+ })) passed++; else failed++;
746
+
747
+ if (test('fails on invalid inline JS syntax', () => {
748
+ const testDir = createTestDir();
749
+ const hooksFile = path.join(testDir, 'hooks.json');
750
+ fs.writeFileSync(hooksFile, JSON.stringify({
751
+ hooks: {
752
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'node -e "function {"' }] }]
753
+ }
754
+ }));
755
+
756
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
757
+ assert.strictEqual(result.code, 1, 'Should fail on invalid inline JS');
758
+ assert.ok(result.stderr.includes('invalid inline JS'), 'Should report JS syntax error');
759
+ cleanupTestDir(testDir);
760
+ })) passed++; else failed++;
761
+
762
+ if (test('passes valid inline JS commands', () => {
763
+ const testDir = createTestDir();
764
+ const hooksFile = path.join(testDir, 'hooks.json');
765
+ fs.writeFileSync(hooksFile, JSON.stringify({
766
+ hooks: {
767
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'node -e "console.log(1+2)"' }] }]
768
+ }
769
+ }));
770
+
771
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
772
+ assert.strictEqual(result.code, 0, 'Should pass valid inline JS');
773
+ cleanupTestDir(testDir);
774
+ })) passed++; else failed++;
775
+
776
+ if (test('validates array command format', () => {
777
+ const testDir = createTestDir();
778
+ const hooksFile = path.join(testDir, 'hooks.json');
779
+ fs.writeFileSync(hooksFile, JSON.stringify({
780
+ hooks: {
781
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: ['node', '-e', 'console.log(1)'] }] }]
782
+ }
783
+ }));
784
+
785
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
786
+ assert.strictEqual(result.code, 0, 'Should accept array command format');
787
+ cleanupTestDir(testDir);
788
+ })) passed++; else failed++;
789
+
790
+ if (test('validates legacy array format', () => {
791
+ const testDir = createTestDir();
792
+ const hooksFile = path.join(testDir, 'hooks.json');
793
+ fs.writeFileSync(hooksFile, JSON.stringify([
794
+ { matcher: 'test', hooks: [{ type: 'command', command: 'echo ok' }] }
795
+ ]));
796
+
797
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
798
+ assert.strictEqual(result.code, 0, 'Should accept legacy array format');
799
+ cleanupTestDir(testDir);
800
+ })) passed++; else failed++;
801
+
802
+ if (test('fails on matcher missing hooks array', () => {
803
+ const testDir = createTestDir();
804
+ const hooksFile = path.join(testDir, 'hooks.json');
805
+ fs.writeFileSync(hooksFile, JSON.stringify({
806
+ hooks: {
807
+ PreToolUse: [{ matcher: 'test' }]
808
+ }
809
+ }));
810
+
811
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
812
+ assert.strictEqual(result.code, 1, 'Should fail on missing hooks array');
813
+ cleanupTestDir(testDir);
814
+ })) passed++; else failed++;
815
+
816
+ // ==========================================
817
+ // validate-skills.js
818
+ // ==========================================
819
+ console.log('\nvalidate-skills.js:');
820
+
821
+ if (test('passes on real project skills', () => {
822
+ const result = runValidator('validate-skills');
823
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
824
+ assert.ok(result.stdout.includes('Validated'), 'Should output validation count');
825
+ })) passed++; else failed++;
826
+
827
+ if (test('exits 0 when directory does not exist', () => {
828
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', '/nonexistent/dir');
829
+ assert.strictEqual(result.code, 0, 'Should skip when no skills dir');
830
+ })) passed++; else failed++;
831
+
832
+ if (test('fails on skill directory without SKILL.md', () => {
833
+ const testDir = createTestDir();
834
+ fs.mkdirSync(path.join(testDir, 'broken-skill'));
835
+ // No SKILL.md inside
836
+
837
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
838
+ assert.strictEqual(result.code, 1, 'Should fail on missing SKILL.md');
839
+ assert.ok(result.stderr.includes('Missing SKILL.md'), 'Should report missing SKILL.md');
840
+ cleanupTestDir(testDir);
841
+ })) passed++; else failed++;
842
+
843
+ if (test('fails on empty SKILL.md', () => {
844
+ const testDir = createTestDir();
845
+ const skillDir = path.join(testDir, 'empty-skill');
846
+ fs.mkdirSync(skillDir);
847
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), '');
848
+
849
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
850
+ assert.strictEqual(result.code, 1, 'Should fail on empty SKILL.md');
851
+ assert.ok(result.stderr.includes('Empty'), 'Should report empty file');
852
+ cleanupTestDir(testDir);
853
+ })) passed++; else failed++;
854
+
855
+ if (test('passes on valid skill directory', () => {
856
+ const testDir = createTestDir();
857
+ const skillDir = path.join(testDir, 'good-skill');
858
+ fs.mkdirSync(skillDir);
859
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), '# My Skill\nDescription here.');
860
+
861
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
862
+ assert.strictEqual(result.code, 0, 'Should pass for valid skill');
863
+ assert.ok(result.stdout.includes('Validated 1'), 'Should report 1 validated');
864
+ cleanupTestDir(testDir);
865
+ })) passed++; else failed++;
866
+
867
+ if (test('ignores non-directory entries', () => {
868
+ const testDir = createTestDir();
869
+ fs.writeFileSync(path.join(testDir, 'not-a-skill.md'), '# README');
870
+ const skillDir = path.join(testDir, 'real-skill');
871
+ fs.mkdirSync(skillDir);
872
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), '# Skill');
873
+
874
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
875
+ assert.strictEqual(result.code, 0, 'Should ignore non-directory entries');
876
+ assert.ok(result.stdout.includes('Validated 1'), 'Should count only directories');
877
+ cleanupTestDir(testDir);
878
+ })) passed++; else failed++;
879
+
880
+ if (test('fails on whitespace-only SKILL.md', () => {
881
+ const testDir = createTestDir();
882
+ const skillDir = path.join(testDir, 'blank-skill');
883
+ fs.mkdirSync(skillDir);
884
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), ' \n\t\n ');
885
+
886
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
887
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only SKILL.md');
888
+ assert.ok(result.stderr.includes('Empty file'), 'Should report empty file');
889
+ cleanupTestDir(testDir);
890
+ })) passed++; else failed++;
891
+
892
+ if (test('warns when frontmatter is missing name (default mode)', () => {
893
+ const testDir = createTestDir();
894
+ const skillDir = path.join(testDir, 'no-name-skill');
895
+ fs.mkdirSync(skillDir);
896
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
897
+ '---\ndescription: "X"\norigin: ECC\n---\n# Skill');
898
+
899
+ const result = runSkillsValidator(testDir);
900
+ assert.strictEqual(result.code, 0,
901
+ `Default mode must not fail CI; got stderr: ${result.stderr}`);
902
+ assert.ok(
903
+ result.stderr.includes('WARN') && result.stderr.includes('missing required field: name'),
904
+ `Should warn on missing name; got stderr: ${result.stderr}`);
905
+ cleanupTestDir(testDir);
906
+ })) passed++; else failed++;
907
+
908
+ if (test('errors when frontmatter is missing name (strict mode)', () => {
909
+ const testDir = createTestDir();
910
+ const skillDir = path.join(testDir, 'no-name-skill');
911
+ fs.mkdirSync(skillDir);
912
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
913
+ '---\ndescription: "X"\norigin: ECC\n---\n# Skill');
914
+
915
+ const result = runSkillsValidator(testDir, ['--strict']);
916
+ assert.strictEqual(result.code, 1, '--strict must fail CI on missing name');
917
+ assert.ok(result.stderr.includes('missing required field: name'),
918
+ 'Should report missing name');
919
+ cleanupTestDir(testDir);
920
+ })) passed++; else failed++;
921
+
922
+ if (test('warns on literal block-scalar description (|-)', () => {
923
+ const testDir = createTestDir();
924
+ const skillDir = path.join(testDir, 'block-desc-skill');
925
+ fs.mkdirSync(skillDir);
926
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
927
+ '---\nname: block-desc-skill\ndescription: |-\n line one\n line two\norigin: ECC\n---\n# Skill');
928
+
929
+ const result = runSkillsValidator(testDir);
930
+ assert.strictEqual(result.code, 0, 'Default mode should not fail CI');
931
+ assert.ok(
932
+ result.stderr.includes('WARN') && result.stderr.includes('literal block scalar'),
933
+ `Should warn on |- description; got stderr: ${result.stderr}`);
934
+ cleanupTestDir(testDir);
935
+ })) passed++; else failed++;
936
+
937
+ if (test('accepts folded (>) and inline descriptions', () => {
938
+ const testDir = createTestDir();
939
+ const folded = path.join(testDir, 'folded-skill');
940
+ fs.mkdirSync(folded);
941
+ fs.writeFileSync(path.join(folded, 'SKILL.md'),
942
+ '---\nname: folded-skill\ndescription: >\n joined\n on spaces\norigin: ECC\n---\n# Skill');
943
+ const inline = path.join(testDir, 'inline-skill');
944
+ fs.mkdirSync(inline);
945
+ fs.writeFileSync(path.join(inline, 'SKILL.md'),
946
+ '---\nname: inline-skill\ndescription: "single line"\norigin: ECC\n---\n# Skill');
947
+
948
+ const result = runSkillsValidator(testDir, ['--strict']);
949
+ assert.strictEqual(result.code, 0,
950
+ `Folded and inline should pass strict; got stderr: ${result.stderr}`);
951
+ assert.ok(result.stdout.includes('Validated 2'),
952
+ `Should count both skills; got stdout: ${result.stdout}`);
953
+ cleanupTestDir(testDir);
954
+ })) passed++; else failed++;
955
+
956
+ if (test('skips hidden directories under skills/', () => {
957
+ const testDir = createTestDir();
958
+ // A dot-prefixed directory (e.g. .DS_Store-adjacent junk or legacy
959
+ // cache) must not count as a skill and must not error.
960
+ fs.mkdirSync(path.join(testDir, '.cache'));
961
+ fs.writeFileSync(path.join(testDir, '.cache', 'SKILL.md'), '# ignored');
962
+ const real = path.join(testDir, 'real-skill');
963
+ fs.mkdirSync(real);
964
+ fs.writeFileSync(path.join(real, 'SKILL.md'),
965
+ '---\nname: real-skill\ndescription: "x"\norigin: ECC\n---\n# Skill');
966
+
967
+ const result = runSkillsValidator(testDir, ['--strict']);
968
+ assert.strictEqual(result.code, 0, 'Hidden dirs should be skipped');
969
+ assert.ok(result.stdout.includes('Validated 1'),
970
+ `Should only count the non-hidden skill; got stdout: ${result.stdout}`);
971
+ cleanupTestDir(testDir);
972
+ })) passed++; else failed++;
973
+
974
+ if (test('warns when name: value is empty or whitespace', () => {
975
+ const testDir = createTestDir();
976
+ const skillDir = path.join(testDir, 'empty-name-skill');
977
+ fs.mkdirSync(skillDir);
978
+ // `name:` key present but value is blank.
979
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
980
+ '---\nname: \ndescription: "X"\norigin: ECC\n---\n# Skill');
981
+
982
+ const result = runSkillsValidator(testDir);
983
+ assert.strictEqual(result.code, 0,
984
+ `Default mode must not fail CI; got stderr: ${result.stderr}`);
985
+ assert.ok(
986
+ result.stderr.includes('WARN') && result.stderr.includes("'name' is empty"),
987
+ `Should warn on empty name; got stderr: ${result.stderr}`);
988
+ cleanupTestDir(testDir);
989
+ })) passed++; else failed++;
990
+
991
+ if (test('warns on literal block-scalar description with |+ chomp', () => {
992
+ const testDir = createTestDir();
993
+ const skillDir = path.join(testDir, 'keep-desc-skill');
994
+ fs.mkdirSync(skillDir);
995
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
996
+ '---\nname: keep-desc-skill\ndescription: |+\n line one\n line two\norigin: ECC\n---\n# Skill');
997
+
998
+ const result = runSkillsValidator(testDir);
999
+ assert.strictEqual(result.code, 0, 'Default mode should not fail CI');
1000
+ assert.ok(result.stderr.includes('literal block scalar'),
1001
+ `Should warn on |+ description; got stderr: ${result.stderr}`);
1002
+ cleanupTestDir(testDir);
1003
+ })) passed++; else failed++;
1004
+
1005
+ if (test('warns on block-scalar description with indent indicator and trailing comment', () => {
1006
+ const testDir = createTestDir();
1007
+ const skillDir = path.join(testDir, 'indent-desc-skill');
1008
+ fs.mkdirSync(skillDir);
1009
+ // `|-2 # note` is still a literal block scalar in YAML 1.2.
1010
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
1011
+ '---\nname: indent-desc-skill\ndescription: |-2 # trimmed two-space indent\n line one\n line two\norigin: ECC\n---\n# Skill');
1012
+
1013
+ const result = runSkillsValidator(testDir);
1014
+ assert.strictEqual(result.code, 0, 'Default mode should not fail CI');
1015
+ assert.ok(result.stderr.includes('literal block scalar'),
1016
+ `Should warn on |-2 description; got stderr: ${result.stderr}`);
1017
+ cleanupTestDir(testDir);
1018
+ })) passed++; else failed++;
1019
+
1020
+ if (test('honors CI_STRICT_SKILLS=1 env flag', () => {
1021
+ const testDir = createTestDir();
1022
+ const skillDir = path.join(testDir, 'no-name-skill-env');
1023
+ fs.mkdirSync(skillDir);
1024
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
1025
+ '---\ndescription: "X"\norigin: ECC\n---\n# Skill');
1026
+
1027
+ const result = runSkillsValidator(testDir, [], { CI_STRICT_SKILLS: '1' });
1028
+ assert.strictEqual(result.code, 1, 'CI_STRICT_SKILLS=1 must fail CI on missing name');
1029
+ assert.ok(result.stderr.includes('missing required field: name'),
1030
+ 'Should report missing name');
1031
+ cleanupTestDir(testDir);
1032
+ })) passed++; else failed++;
1033
+
1034
+ if (test('flags comment-only name value as empty (strict)', () => {
1035
+ const testDir = createTestDir();
1036
+ const skillDir = path.join(testDir, 'comment-only-name');
1037
+ fs.mkdirSync(skillDir);
1038
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
1039
+ '---\nname: # todo\ndescription: "X"\norigin: ECC\n---\n# Skill');
1040
+
1041
+ const result = runSkillsValidator(testDir, ['--strict']);
1042
+ assert.strictEqual(result.code, 1, 'Strict mode must fail CI on empty name');
1043
+ assert.ok(result.stderr.includes("'name' is empty"),
1044
+ `Should report empty name; got stderr: ${result.stderr}`);
1045
+ cleanupTestDir(testDir);
1046
+ })) passed++; else failed++;
1047
+
1048
+ if (test('tolerates ---trailing text outside frontmatter block', () => {
1049
+ // A SKILL.md whose body contains a line starting with '---text'
1050
+ // must not be parsed as frontmatter. Regression guard for
1051
+ // closing-delimiter tightening: the old regex would greedily
1052
+ // match '---trailing'.
1053
+ const testDir = createTestDir();
1054
+ const skillDir = path.join(testDir, 'no-frontmatter-dashes');
1055
+ fs.mkdirSync(skillDir);
1056
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'),
1057
+ '# Skill\n\nSome body text.\n\n---trailing content\nmore body\n');
1058
+
1059
+ const result = runSkillsValidator(testDir, ['--strict']);
1060
+ assert.strictEqual(result.code, 0,
1061
+ `Should not flag frontmatter findings when no valid frontmatter exists; got stderr: ${result.stderr}`);
1062
+ assert.ok(!result.stderr.includes('missing required field: name'),
1063
+ 'Must not treat ---trailing as a frontmatter closer');
1064
+ cleanupTestDir(testDir);
1065
+ })) passed++; else failed++;
1066
+
1067
+ // ==========================================
1068
+ // validate-commands.js
1069
+ // ==========================================
1070
+ console.log('\nvalidate-commands.js:');
1071
+
1072
+ if (test('passes on real project commands', () => {
1073
+ const result = runValidator('validate-commands');
1074
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
1075
+ assert.ok(result.stdout.includes('Validated'), 'Should output validation count');
1076
+ })) passed++; else failed++;
1077
+
1078
+ if (test('exits 0 when directory does not exist', () => {
1079
+ const result = runValidatorWithDir('validate-commands', 'COMMANDS_DIR', '/nonexistent/dir');
1080
+ assert.strictEqual(result.code, 0, 'Should skip when no commands dir');
1081
+ })) passed++; else failed++;
1082
+
1083
+ if (test('fails on empty command file', () => {
1084
+ const testDir = createTestDir();
1085
+ fs.writeFileSync(path.join(testDir, 'empty.md'), '');
1086
+
1087
+ const result = runValidatorWithDir('validate-commands', 'COMMANDS_DIR', testDir);
1088
+ assert.strictEqual(result.code, 1, 'Should fail on empty file');
1089
+ assert.ok(result.stderr.includes('Empty'), 'Should report empty file');
1090
+ cleanupTestDir(testDir);
1091
+ })) passed++; else failed++;
1092
+
1093
+ if (test('passes on valid command files', () => {
1094
+ const testDir = createTestDir();
1095
+ fs.writeFileSync(path.join(testDir, 'deploy.md'), '# Deploy\nDeploy the application.');
1096
+ fs.writeFileSync(path.join(testDir, 'test.md'), '# Test\nRun all tests.');
1097
+
1098
+ const result = runValidatorWithDir('validate-commands', 'COMMANDS_DIR', testDir);
1099
+ assert.strictEqual(result.code, 0, 'Should pass for valid commands');
1100
+ assert.ok(result.stdout.includes('Validated 2'), 'Should report 2 validated');
1101
+ cleanupTestDir(testDir);
1102
+ })) passed++; else failed++;
1103
+
1104
+ if (test('ignores non-md files', () => {
1105
+ const testDir = createTestDir();
1106
+ fs.writeFileSync(path.join(testDir, 'script.js'), 'console.log(1)');
1107
+ fs.writeFileSync(path.join(testDir, 'valid.md'), '# Command');
1108
+
1109
+ const result = runValidatorWithDir('validate-commands', 'COMMANDS_DIR', testDir);
1110
+ assert.strictEqual(result.code, 0, 'Should ignore non-md files');
1111
+ assert.ok(result.stdout.includes('Validated 1'), 'Should count only .md files');
1112
+ cleanupTestDir(testDir);
1113
+ })) passed++; else failed++;
1114
+
1115
+ if (test('detects broken command cross-reference', () => {
1116
+ const testDir = createTestDir();
1117
+ const agentsDir = createTestDir();
1118
+ const skillsDir = createTestDir();
1119
+ fs.writeFileSync(path.join(testDir, 'my-cmd.md'), '# Command\nUse `/nonexistent-cmd` to do things.');
1120
+
1121
+ const result = runValidatorWithDirs('validate-commands', {
1122
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1123
+ });
1124
+ assert.strictEqual(result.code, 1, 'Should fail on broken command ref');
1125
+ assert.ok(result.stderr.includes('nonexistent-cmd'), 'Should report broken command');
1126
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1127
+ })) passed++; else failed++;
1128
+
1129
+ if (test('detects broken agent path reference', () => {
1130
+ const testDir = createTestDir();
1131
+ const agentsDir = createTestDir();
1132
+ const skillsDir = createTestDir();
1133
+ fs.writeFileSync(path.join(testDir, 'cmd.md'), '# Command\nAgent: `agents/fake-agent.md`');
1134
+
1135
+ const result = runValidatorWithDirs('validate-commands', {
1136
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1137
+ });
1138
+ assert.strictEqual(result.code, 1, 'Should fail on broken agent ref');
1139
+ assert.ok(result.stderr.includes('fake-agent'), 'Should report broken agent');
1140
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1141
+ })) passed++; else failed++;
1142
+
1143
+ if (test('skips references inside fenced code blocks', () => {
1144
+ const testDir = createTestDir();
1145
+ const agentsDir = createTestDir();
1146
+ const skillsDir = createTestDir();
1147
+ fs.writeFileSync(path.join(testDir, 'cmd.md'),
1148
+ '# Command\n\n```\nagents/example-agent.md\n`/example-cmd`\n```\n');
1149
+
1150
+ const result = runValidatorWithDirs('validate-commands', {
1151
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1152
+ });
1153
+ assert.strictEqual(result.code, 0, 'Should skip refs inside code blocks');
1154
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1155
+ })) passed++; else failed++;
1156
+
1157
+ if (test('detects broken workflow agent reference', () => {
1158
+ const testDir = createTestDir();
1159
+ const agentsDir = createTestDir();
1160
+ const skillsDir = createTestDir();
1161
+ fs.writeFileSync(path.join(agentsDir, 'planner.md'), '---\nmodel: sonnet\ntools: Read\n---\n# A');
1162
+ fs.writeFileSync(path.join(testDir, 'cmd.md'), '# Command\nWorkflow:\nplanner -> ghost-agent');
1163
+
1164
+ const result = runValidatorWithDirs('validate-commands', {
1165
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1166
+ });
1167
+ assert.strictEqual(result.code, 1, 'Should fail on broken workflow agent');
1168
+ assert.ok(result.stderr.includes('ghost-agent'), 'Should report broken workflow agent');
1169
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1170
+ })) passed++; else failed++;
1171
+
1172
+ if (test('skips command references on creates: lines', () => {
1173
+ const testDir = createTestDir();
1174
+ const agentsDir = createTestDir();
1175
+ const skillsDir = createTestDir();
1176
+ // "Creates: `/new-table`" should NOT flag /new-table as a broken ref
1177
+ fs.writeFileSync(path.join(testDir, 'gen.md'),
1178
+ '# Generator\n\n→ Creates: `/new-table`\nWould create: `/new-endpoint`');
1179
+
1180
+ const result = runValidatorWithDirs('validate-commands', {
1181
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1182
+ });
1183
+ assert.strictEqual(result.code, 0, 'Should skip creates: lines');
1184
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1185
+ })) passed++; else failed++;
1186
+
1187
+ if (test('accepts valid cross-reference between commands', () => {
1188
+ const testDir = createTestDir();
1189
+ const agentsDir = createTestDir();
1190
+ const skillsDir = createTestDir();
1191
+ fs.writeFileSync(path.join(testDir, 'build.md'), '# Build\nSee also `/deploy` for deployment.');
1192
+ fs.writeFileSync(path.join(testDir, 'deploy.md'), '# Deploy\nRun `/build` first.');
1193
+
1194
+ const result = runValidatorWithDirs('validate-commands', {
1195
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1196
+ });
1197
+ assert.strictEqual(result.code, 0, 'Should accept valid cross-refs');
1198
+ assert.ok(result.stdout.includes('Validated 2'), 'Should validate both');
1199
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1200
+ })) passed++; else failed++;
1201
+
1202
+ if (test('checks references in unclosed code blocks', () => {
1203
+ const testDir = createTestDir();
1204
+ const agentsDir = createTestDir();
1205
+ const skillsDir = createTestDir();
1206
+ // Unclosed code block: the ``` regex won't strip it, so refs inside are checked
1207
+ fs.writeFileSync(path.join(testDir, 'bad.md'),
1208
+ '# Command\n\n```\n`/phantom-cmd`\nno closing block');
1209
+
1210
+ const result = runValidatorWithDirs('validate-commands', {
1211
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1212
+ });
1213
+ // Unclosed code blocks are NOT stripped, so refs inside are validated
1214
+ assert.strictEqual(result.code, 1, 'Should check refs in unclosed code blocks');
1215
+ assert.ok(result.stderr.includes('phantom-cmd'), 'Should report broken ref from unclosed block');
1216
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1217
+ })) passed++; else failed++;
1218
+
1219
+ if (test('captures ALL command references on a single line (multi-ref)', () => {
1220
+ const testDir = createTestDir();
1221
+ const agentsDir = createTestDir();
1222
+ const skillsDir = createTestDir();
1223
+ // Line with two command references — both should be detected
1224
+ fs.writeFileSync(path.join(testDir, 'multi.md'),
1225
+ '# Multi\nUse `/ghost-a` and `/ghost-b` together.');
1226
+
1227
+ const result = runValidatorWithDirs('validate-commands', {
1228
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1229
+ });
1230
+ assert.strictEqual(result.code, 1, 'Should fail on broken refs');
1231
+ // BOTH ghost-a AND ghost-b must be reported (this was the greedy regex bug)
1232
+ assert.ok(result.stderr.includes('ghost-a'), 'Should report first ref /ghost-a');
1233
+ assert.ok(result.stderr.includes('ghost-b'), 'Should report second ref /ghost-b');
1234
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1235
+ })) passed++; else failed++;
1236
+
1237
+ if (test('captures three command refs on one line', () => {
1238
+ const testDir = createTestDir();
1239
+ const agentsDir = createTestDir();
1240
+ const skillsDir = createTestDir();
1241
+ fs.writeFileSync(path.join(testDir, 'triple.md'),
1242
+ '# Triple\nChain `/alpha`, `/beta`, and `/gamma` in order.');
1243
+
1244
+ const result = runValidatorWithDirs('validate-commands', {
1245
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1246
+ });
1247
+ assert.strictEqual(result.code, 1, 'Should fail on all three broken refs');
1248
+ assert.ok(result.stderr.includes('alpha'), 'Should report /alpha');
1249
+ assert.ok(result.stderr.includes('beta'), 'Should report /beta');
1250
+ assert.ok(result.stderr.includes('gamma'), 'Should report /gamma');
1251
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1252
+ })) passed++; else failed++;
1253
+
1254
+ if (test('multi-ref line with one valid and one invalid ref', () => {
1255
+ const testDir = createTestDir();
1256
+ const agentsDir = createTestDir();
1257
+ const skillsDir = createTestDir();
1258
+ // "real-cmd" exists, "fake-cmd" does not
1259
+ fs.writeFileSync(path.join(testDir, 'real-cmd.md'), '# Real\nA real command.');
1260
+ fs.writeFileSync(path.join(testDir, 'mixed.md'),
1261
+ '# Mixed\nRun `/real-cmd` then `/fake-cmd`.');
1262
+
1263
+ const result = runValidatorWithDirs('validate-commands', {
1264
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1265
+ });
1266
+ assert.strictEqual(result.code, 1, 'Should fail for the fake ref');
1267
+ assert.ok(result.stderr.includes('fake-cmd'), 'Should report /fake-cmd');
1268
+ // real-cmd should NOT appear in errors
1269
+ assert.ok(!result.stderr.includes('real-cmd'), 'Should not report valid /real-cmd');
1270
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1271
+ })) passed++; else failed++;
1272
+
1273
+ if (test('creates: line with multiple refs skips entire line', () => {
1274
+ const testDir = createTestDir();
1275
+ const agentsDir = createTestDir();
1276
+ const skillsDir = createTestDir();
1277
+ // Both refs on a "Creates:" line should be skipped entirely
1278
+ fs.writeFileSync(path.join(testDir, 'gen.md'),
1279
+ '# Generator\nCreates: `/new-a` and `/new-b`');
1280
+
1281
+ const result = runValidatorWithDirs('validate-commands', {
1282
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1283
+ });
1284
+ assert.strictEqual(result.code, 0, 'Should skip all refs on creates: line');
1285
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1286
+ })) passed++; else failed++;
1287
+
1288
+ if (test('validates valid workflow diagram with known agents', () => {
1289
+ const testDir = createTestDir();
1290
+ const agentsDir = createTestDir();
1291
+ const skillsDir = createTestDir();
1292
+ fs.writeFileSync(path.join(agentsDir, 'planner.md'), '---\nmodel: sonnet\ntools: Read\n---\n# P');
1293
+ fs.writeFileSync(path.join(agentsDir, 'reviewer.md'), '---\nmodel: sonnet\ntools: Read\n---\n# R');
1294
+ fs.writeFileSync(path.join(testDir, 'flow.md'), '# Workflow\n\nplanner -> reviewer');
1295
+
1296
+ const result = runValidatorWithDirs('validate-commands', {
1297
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1298
+ });
1299
+ assert.strictEqual(result.code, 0, 'Should pass on valid workflow');
1300
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1301
+ })) passed++; else failed++;
1302
+
1303
+ // ==========================================
1304
+ // validate-rules.js
1305
+ // ==========================================
1306
+ console.log('\nvalidate-rules.js:');
1307
+
1308
+ if (test('passes on real project rules', () => {
1309
+ const result = runValidator('validate-rules');
1310
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
1311
+ assert.ok(result.stdout.includes('Validated'), 'Should output validation count');
1312
+ })) passed++; else failed++;
1313
+
1314
+ if (test('exits 0 when directory does not exist', () => {
1315
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', '/nonexistent/dir');
1316
+ assert.strictEqual(result.code, 0, 'Should skip when no rules dir');
1317
+ })) passed++; else failed++;
1318
+
1319
+ if (test('fails on empty rule file', () => {
1320
+ const testDir = createTestDir();
1321
+ fs.writeFileSync(path.join(testDir, 'empty.md'), '');
1322
+
1323
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
1324
+ assert.strictEqual(result.code, 1, 'Should fail on empty rule file');
1325
+ assert.ok(result.stderr.includes('Empty'), 'Should report empty file');
1326
+ cleanupTestDir(testDir);
1327
+ })) passed++; else failed++;
1328
+
1329
+ if (test('passes on valid rule files', () => {
1330
+ const testDir = createTestDir();
1331
+ fs.writeFileSync(path.join(testDir, 'coding.md'), '# Coding Rules\nUse immutability.');
1332
+
1333
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
1334
+ assert.strictEqual(result.code, 0, 'Should pass for valid rules');
1335
+ assert.ok(result.stdout.includes('Validated 1'), 'Should report 1 validated');
1336
+ cleanupTestDir(testDir);
1337
+ })) passed++; else failed++;
1338
+
1339
+ if (test('fails on whitespace-only rule file', () => {
1340
+ const testDir = createTestDir();
1341
+ fs.writeFileSync(path.join(testDir, 'blank.md'), ' \n\t\n ');
1342
+
1343
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
1344
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only rule file');
1345
+ assert.ok(result.stderr.includes('Empty'), 'Should report empty file');
1346
+ cleanupTestDir(testDir);
1347
+ })) passed++; else failed++;
1348
+
1349
+ if (test('validates rules in subdirectories recursively', () => {
1350
+ const testDir = createTestDir();
1351
+ const subDir = path.join(testDir, 'sub');
1352
+ fs.mkdirSync(subDir);
1353
+ fs.writeFileSync(path.join(testDir, 'top.md'), '# Top Level Rule');
1354
+ fs.writeFileSync(path.join(subDir, 'nested.md'), '# Nested Rule');
1355
+
1356
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
1357
+ assert.strictEqual(result.code, 0, 'Should validate nested rules');
1358
+ assert.ok(result.stdout.includes('Validated 2'), 'Should find both rules');
1359
+ cleanupTestDir(testDir);
1360
+ })) passed++; else failed++;
1361
+
1362
+ // ==========================================
1363
+ // Round 19: Whitespace and edge-case tests
1364
+ // ==========================================
1365
+
1366
+ // --- validate-hooks.js whitespace/null edge cases ---
1367
+ console.log('\nvalidate-hooks.js (whitespace edge cases):');
1368
+
1369
+ if (test('rejects whitespace-only command string', () => {
1370
+ const testDir = createTestDir();
1371
+ const hooksFile = path.join(testDir, 'hooks.json');
1372
+ fs.writeFileSync(hooksFile, JSON.stringify({
1373
+ hooks: {
1374
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: ' \t ' }] }]
1375
+ }
1376
+ }));
1377
+
1378
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1379
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only command');
1380
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1381
+ cleanupTestDir(testDir);
1382
+ })) passed++; else failed++;
1383
+
1384
+ if (test('rejects null command value', () => {
1385
+ const testDir = createTestDir();
1386
+ const hooksFile = path.join(testDir, 'hooks.json');
1387
+ fs.writeFileSync(hooksFile, JSON.stringify({
1388
+ hooks: {
1389
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: null }] }]
1390
+ }
1391
+ }));
1392
+
1393
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1394
+ assert.strictEqual(result.code, 1, 'Should reject null command');
1395
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1396
+ cleanupTestDir(testDir);
1397
+ })) passed++; else failed++;
1398
+
1399
+ if (test('rejects numeric command value', () => {
1400
+ const testDir = createTestDir();
1401
+ const hooksFile = path.join(testDir, 'hooks.json');
1402
+ fs.writeFileSync(hooksFile, JSON.stringify({
1403
+ hooks: {
1404
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 42 }] }]
1405
+ }
1406
+ }));
1407
+
1408
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1409
+ assert.strictEqual(result.code, 1, 'Should reject numeric command');
1410
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1411
+ cleanupTestDir(testDir);
1412
+ })) passed++; else failed++;
1413
+
1414
+ // --- validate-agents.js whitespace edge cases ---
1415
+ console.log('\nvalidate-agents.js (whitespace edge cases):');
1416
+
1417
+ if (test('rejects agent with whitespace-only model value', () => {
1418
+ const testDir = createTestDir();
1419
+ fs.writeFileSync(path.join(testDir, 'ws-model.md'), '---\nmodel: \t \ntools: Read, Write\n---\n# Agent');
1420
+
1421
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
1422
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only model');
1423
+ assert.ok(result.stderr.includes('model'), 'Should report model field error');
1424
+ cleanupTestDir(testDir);
1425
+ })) passed++; else failed++;
1426
+
1427
+ if (test('rejects agent with whitespace-only tools value', () => {
1428
+ const testDir = createTestDir();
1429
+ fs.writeFileSync(path.join(testDir, 'ws-tools.md'), '---\nmodel: sonnet\ntools: \t \n---\n# Agent');
1430
+
1431
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
1432
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only tools');
1433
+ assert.ok(result.stderr.includes('tools'), 'Should report tools field error');
1434
+ cleanupTestDir(testDir);
1435
+ })) passed++; else failed++;
1436
+
1437
+ if (test('accepts agent with extra unknown frontmatter fields', () => {
1438
+ const testDir = createTestDir();
1439
+ fs.writeFileSync(path.join(testDir, 'extra.md'), '---\nmodel: sonnet\ntools: Read, Write\ncustom_field: some value\nauthor: test\n---\n# Agent');
1440
+
1441
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
1442
+ assert.strictEqual(result.code, 0, 'Should accept extra unknown fields');
1443
+ cleanupTestDir(testDir);
1444
+ })) passed++; else failed++;
1445
+
1446
+ if (test('rejects agent with invalid model value', () => {
1447
+ const testDir = createTestDir();
1448
+ fs.writeFileSync(path.join(testDir, 'bad-model.md'), '---\nmodel: gpt-4\ntools: Read\n---\n# Agent');
1449
+
1450
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
1451
+ assert.strictEqual(result.code, 1, 'Should reject invalid model');
1452
+ assert.ok(result.stderr.includes('Invalid model'), 'Should report invalid model');
1453
+ assert.ok(result.stderr.includes('gpt-4'), 'Should show the invalid value');
1454
+ cleanupTestDir(testDir);
1455
+ })) passed++; else failed++;
1456
+
1457
+ // --- validate-commands.js additional edge cases ---
1458
+ console.log('\nvalidate-commands.js (additional edge cases):');
1459
+
1460
+ if (test('reports all invalid agents in mixed agent references', () => {
1461
+ const testDir = createTestDir();
1462
+ const agentsDir = createTestDir();
1463
+ const skillsDir = createTestDir();
1464
+ fs.writeFileSync(path.join(agentsDir, 'real-agent.md'), '---\nmodel: sonnet\ntools: Read\n---\n# A');
1465
+ fs.writeFileSync(path.join(testDir, 'cmd.md'),
1466
+ '# Cmd\nSee agents/real-agent.md and agents/fake-one.md and agents/fake-two.md');
1467
+
1468
+ const result = runValidatorWithDirs('validate-commands', {
1469
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1470
+ });
1471
+ assert.strictEqual(result.code, 1, 'Should fail on invalid agent refs');
1472
+ assert.ok(result.stderr.includes('fake-one'), 'Should report first invalid agent');
1473
+ assert.ok(result.stderr.includes('fake-two'), 'Should report second invalid agent');
1474
+ assert.ok(!result.stderr.includes('real-agent'), 'Should NOT report valid agent');
1475
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1476
+ })) passed++; else failed++;
1477
+
1478
+ if (test('validates workflow with hyphenated agent names', () => {
1479
+ const testDir = createTestDir();
1480
+ const agentsDir = createTestDir();
1481
+ const skillsDir = createTestDir();
1482
+ fs.writeFileSync(path.join(agentsDir, 'tdd-guide.md'), '---\nmodel: sonnet\ntools: Read\n---\n# T');
1483
+ fs.writeFileSync(path.join(agentsDir, 'code-reviewer.md'), '---\nmodel: sonnet\ntools: Read\n---\n# C');
1484
+ fs.writeFileSync(path.join(testDir, 'flow.md'), '# Workflow\n\ntdd-guide -> code-reviewer');
1485
+
1486
+ const result = runValidatorWithDirs('validate-commands', {
1487
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1488
+ });
1489
+ assert.strictEqual(result.code, 0, 'Should pass on hyphenated agent names in workflow');
1490
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1491
+ })) passed++; else failed++;
1492
+
1493
+ if (test('detects skill directory reference warning', () => {
1494
+ const testDir = createTestDir();
1495
+ const agentsDir = createTestDir();
1496
+ const skillsDir = createTestDir();
1497
+ // Reference a non-existent skill directory
1498
+ fs.writeFileSync(path.join(testDir, 'cmd.md'),
1499
+ '# Command\nSee skills/nonexistent-skill/ for details.');
1500
+
1501
+ const result = runValidatorWithDirs('validate-commands', {
1502
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1503
+ });
1504
+ // Should pass (warnings don't cause exit 1) but stderr should have warning
1505
+ assert.strictEqual(result.code, 0, 'Skill warnings should not cause failure');
1506
+ assert.ok(result.stdout.includes('warning'), 'Should report warning count');
1507
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1508
+ })) passed++; else failed++;
1509
+
1510
+ // ==========================================
1511
+ // Round 22: Hook schema edge cases & empty directory paths
1512
+ // ==========================================
1513
+
1514
+ // --- validate-hooks.js: schema edge cases ---
1515
+ console.log('\nvalidate-hooks.js (schema edge cases):');
1516
+
1517
+ if (test('rejects event type value that is not an array', () => {
1518
+ const testDir = createTestDir();
1519
+ const hooksFile = path.join(testDir, 'hooks.json');
1520
+ fs.writeFileSync(hooksFile, JSON.stringify({
1521
+ hooks: { PreToolUse: 'not-an-array' }
1522
+ }));
1523
+
1524
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1525
+ assert.strictEqual(result.code, 1, 'Should fail on non-array event type value');
1526
+ assert.ok(result.stderr.includes('must be an array'), 'Should report must be an array');
1527
+ cleanupTestDir(testDir);
1528
+ })) passed++; else failed++;
1529
+
1530
+ if (test('rejects matcher entry that is null', () => {
1531
+ const testDir = createTestDir();
1532
+ const hooksFile = path.join(testDir, 'hooks.json');
1533
+ fs.writeFileSync(hooksFile, JSON.stringify({
1534
+ hooks: { PreToolUse: [null] }
1535
+ }));
1536
+
1537
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1538
+ assert.strictEqual(result.code, 1, 'Should fail on null matcher entry');
1539
+ assert.ok(result.stderr.includes('is not an object'), 'Should report not an object');
1540
+ cleanupTestDir(testDir);
1541
+ })) passed++; else failed++;
1542
+
1543
+ if (test('rejects matcher entry that is a string', () => {
1544
+ const testDir = createTestDir();
1545
+ const hooksFile = path.join(testDir, 'hooks.json');
1546
+ fs.writeFileSync(hooksFile, JSON.stringify({
1547
+ hooks: { PreToolUse: ['just-a-string'] }
1548
+ }));
1549
+
1550
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1551
+ assert.strictEqual(result.code, 1, 'Should fail on string matcher entry');
1552
+ assert.ok(result.stderr.includes('is not an object'), 'Should report not an object');
1553
+ cleanupTestDir(testDir);
1554
+ })) passed++; else failed++;
1555
+
1556
+ if (test('rejects top-level data that is a string', () => {
1557
+ const testDir = createTestDir();
1558
+ const hooksFile = path.join(testDir, 'hooks.json');
1559
+ fs.writeFileSync(hooksFile, '"just a string"');
1560
+
1561
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1562
+ assert.strictEqual(result.code, 1, 'Should fail on string data');
1563
+ assert.ok(result.stderr.includes('must be an object or array'), 'Should report must be object or array');
1564
+ cleanupTestDir(testDir);
1565
+ })) passed++; else failed++;
1566
+
1567
+ if (test('rejects top-level data that is a number', () => {
1568
+ const testDir = createTestDir();
1569
+ const hooksFile = path.join(testDir, 'hooks.json');
1570
+ fs.writeFileSync(hooksFile, '42');
1571
+
1572
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1573
+ assert.strictEqual(result.code, 1, 'Should fail on numeric data');
1574
+ assert.ok(result.stderr.includes('must be an object or array'), 'Should report must be object or array');
1575
+ cleanupTestDir(testDir);
1576
+ })) passed++; else failed++;
1577
+
1578
+ if (test('rejects empty string command', () => {
1579
+ const testDir = createTestDir();
1580
+ const hooksFile = path.join(testDir, 'hooks.json');
1581
+ fs.writeFileSync(hooksFile, JSON.stringify({
1582
+ hooks: {
1583
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: '' }] }]
1584
+ }
1585
+ }));
1586
+
1587
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1588
+ assert.strictEqual(result.code, 1, 'Should reject empty string command');
1589
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1590
+ cleanupTestDir(testDir);
1591
+ })) passed++; else failed++;
1592
+
1593
+ if (test('rejects empty array command', () => {
1594
+ const testDir = createTestDir();
1595
+ const hooksFile = path.join(testDir, 'hooks.json');
1596
+ fs.writeFileSync(hooksFile, JSON.stringify({
1597
+ hooks: {
1598
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: [] }] }]
1599
+ }
1600
+ }));
1601
+
1602
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1603
+ assert.strictEqual(result.code, 1, 'Should reject empty array command');
1604
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1605
+ cleanupTestDir(testDir);
1606
+ })) passed++; else failed++;
1607
+
1608
+ if (test('rejects array command with non-string elements', () => {
1609
+ const testDir = createTestDir();
1610
+ const hooksFile = path.join(testDir, 'hooks.json');
1611
+ fs.writeFileSync(hooksFile, JSON.stringify({
1612
+ hooks: {
1613
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: ['node', 123, null] }] }]
1614
+ }
1615
+ }));
1616
+
1617
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1618
+ assert.strictEqual(result.code, 1, 'Should reject non-string array elements');
1619
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1620
+ cleanupTestDir(testDir);
1621
+ })) passed++; else failed++;
1622
+
1623
+ if (test('rejects non-string type field', () => {
1624
+ const testDir = createTestDir();
1625
+ const hooksFile = path.join(testDir, 'hooks.json');
1626
+ fs.writeFileSync(hooksFile, JSON.stringify({
1627
+ hooks: {
1628
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 42, command: 'echo hi' }] }]
1629
+ }
1630
+ }));
1631
+
1632
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1633
+ assert.strictEqual(result.code, 1, 'Should reject non-string type');
1634
+ assert.ok(result.stderr.includes('type'), 'Should report type field error');
1635
+ cleanupTestDir(testDir);
1636
+ })) passed++; else failed++;
1637
+
1638
+ if (test('rejects non-number timeout type', () => {
1639
+ const testDir = createTestDir();
1640
+ const hooksFile = path.join(testDir, 'hooks.json');
1641
+ fs.writeFileSync(hooksFile, JSON.stringify({
1642
+ hooks: {
1643
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo', timeout: 'fast' }] }]
1644
+ }
1645
+ }));
1646
+
1647
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1648
+ assert.strictEqual(result.code, 1, 'Should reject string timeout');
1649
+ assert.ok(result.stderr.includes('timeout'), 'Should report timeout type error');
1650
+ cleanupTestDir(testDir);
1651
+ })) passed++; else failed++;
1652
+
1653
+ if (test('accepts timeout of exactly 0', () => {
1654
+ const testDir = createTestDir();
1655
+ const hooksFile = path.join(testDir, 'hooks.json');
1656
+ fs.writeFileSync(hooksFile, JSON.stringify({
1657
+ hooks: {
1658
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo', timeout: 0 }] }]
1659
+ }
1660
+ }));
1661
+
1662
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1663
+ assert.strictEqual(result.code, 0, 'Should accept timeout of 0');
1664
+ cleanupTestDir(testDir);
1665
+ })) passed++; else failed++;
1666
+
1667
+ if (test('validates object format without wrapping hooks key', () => {
1668
+ const testDir = createTestDir();
1669
+ const hooksFile = path.join(testDir, 'hooks.json');
1670
+ // data.hooks is undefined, so fallback to data itself
1671
+ fs.writeFileSync(hooksFile, JSON.stringify({
1672
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo ok' }] }]
1673
+ }));
1674
+
1675
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1676
+ assert.strictEqual(result.code, 0, 'Should accept object format without hooks wrapper');
1677
+ cleanupTestDir(testDir);
1678
+ })) passed++; else failed++;
1679
+
1680
+ // --- validate-hooks.js: legacy format error paths ---
1681
+ console.log('\nvalidate-hooks.js (legacy format errors):');
1682
+
1683
+ if (test('legacy format: rejects matcher missing matcher field', () => {
1684
+ const testDir = createTestDir();
1685
+ const hooksFile = path.join(testDir, 'hooks.json');
1686
+ fs.writeFileSync(hooksFile, JSON.stringify([
1687
+ { hooks: [{ type: 'command', command: 'echo ok' }] }
1688
+ ]));
1689
+
1690
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1691
+ assert.strictEqual(result.code, 1, 'Should fail on missing matcher in legacy format');
1692
+ assert.ok(result.stderr.includes('matcher'), 'Should report missing matcher');
1693
+ cleanupTestDir(testDir);
1694
+ })) passed++; else failed++;
1695
+
1696
+ if (test('legacy format: rejects matcher missing hooks array', () => {
1697
+ const testDir = createTestDir();
1698
+ const hooksFile = path.join(testDir, 'hooks.json');
1699
+ fs.writeFileSync(hooksFile, JSON.stringify([
1700
+ { matcher: 'test' }
1701
+ ]));
1702
+
1703
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1704
+ assert.strictEqual(result.code, 1, 'Should fail on missing hooks array in legacy format');
1705
+ assert.ok(result.stderr.includes('hooks'), 'Should report missing hooks');
1706
+ cleanupTestDir(testDir);
1707
+ })) passed++; else failed++;
1708
+
1709
+ // --- validate-agents.js: empty directory ---
1710
+ console.log('\nvalidate-agents.js (empty directory):');
1711
+
1712
+ if (test('passes on empty agents directory', () => {
1713
+ const testDir = createTestDir();
1714
+ // No .md files, just an empty dir
1715
+
1716
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
1717
+ assert.strictEqual(result.code, 0, 'Should pass on empty directory');
1718
+ assert.ok(result.stdout.includes('Validated 0'), 'Should report 0 validated');
1719
+ cleanupTestDir(testDir);
1720
+ })) passed++; else failed++;
1721
+
1722
+ // --- validate-commands.js: whitespace-only file ---
1723
+ console.log('\nvalidate-commands.js (whitespace edge cases):');
1724
+
1725
+ if (test('fails on whitespace-only command file', () => {
1726
+ const testDir = createTestDir();
1727
+ fs.writeFileSync(path.join(testDir, 'blank.md'), ' \n\t\n ');
1728
+
1729
+ const result = runValidatorWithDir('validate-commands', 'COMMANDS_DIR', testDir);
1730
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only command file');
1731
+ assert.ok(result.stderr.includes('Empty'), 'Should report empty file');
1732
+ cleanupTestDir(testDir);
1733
+ })) passed++; else failed++;
1734
+
1735
+ if (test('accepts valid skill directory reference', () => {
1736
+ const testDir = createTestDir();
1737
+ const agentsDir = createTestDir();
1738
+ const skillsDir = createTestDir();
1739
+ // Create a matching skill directory
1740
+ fs.mkdirSync(path.join(skillsDir, 'my-skill'));
1741
+ fs.writeFileSync(path.join(testDir, 'cmd.md'),
1742
+ '# Command\nSee skills/my-skill/ for details.');
1743
+
1744
+ const result = runValidatorWithDirs('validate-commands', {
1745
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1746
+ });
1747
+ assert.strictEqual(result.code, 0, 'Should pass on valid skill reference');
1748
+ assert.ok(!result.stdout.includes('warning'), 'Should have no warnings');
1749
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1750
+ })) passed++; else failed++;
1751
+
1752
+ // --- validate-rules.js: mixed valid/invalid ---
1753
+ console.log('\nvalidate-rules.js (mixed files):');
1754
+
1755
+ if (test('fails on mix of valid and empty rule files', () => {
1756
+ const testDir = createTestDir();
1757
+ fs.writeFileSync(path.join(testDir, 'good.md'), '# Good Rule\nContent here.');
1758
+ fs.writeFileSync(path.join(testDir, 'bad.md'), '');
1759
+
1760
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
1761
+ assert.strictEqual(result.code, 1, 'Should fail when any rule is empty');
1762
+ assert.ok(result.stderr.includes('bad.md'), 'Should report the bad file');
1763
+ cleanupTestDir(testDir);
1764
+ })) passed++; else failed++;
1765
+
1766
+ // ── Round 27: hook validation edge cases ──
1767
+ console.log('\nvalidate-hooks.js (Round 27 edge cases):');
1768
+
1769
+ if (test('rejects array command with empty string element', () => {
1770
+ const testDir = createTestDir();
1771
+ const hooksFile = path.join(testDir, 'hooks.json');
1772
+ fs.writeFileSync(hooksFile, JSON.stringify({
1773
+ hooks: {
1774
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: ['node', '', 'script.js'] }] }]
1775
+ }
1776
+ }));
1777
+
1778
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1779
+ assert.strictEqual(result.code, 1, 'Should reject array with empty string element');
1780
+ assert.ok(result.stderr.includes('command'), 'Should report command field error');
1781
+ cleanupTestDir(testDir);
1782
+ })) passed++; else failed++;
1783
+
1784
+ if (test('rejects negative timeout', () => {
1785
+ const testDir = createTestDir();
1786
+ const hooksFile = path.join(testDir, 'hooks.json');
1787
+ fs.writeFileSync(hooksFile, JSON.stringify({
1788
+ hooks: {
1789
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo hi', timeout: -5 }] }]
1790
+ }
1791
+ }));
1792
+
1793
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1794
+ assert.strictEqual(result.code, 1, 'Should reject negative timeout');
1795
+ assert.ok(result.stderr.includes('timeout'), 'Should report timeout error');
1796
+ cleanupTestDir(testDir);
1797
+ })) passed++; else failed++;
1798
+
1799
+ if (test('rejects non-boolean async field', () => {
1800
+ const testDir = createTestDir();
1801
+ const hooksFile = path.join(testDir, 'hooks.json');
1802
+ fs.writeFileSync(hooksFile, JSON.stringify({
1803
+ hooks: {
1804
+ PostToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo ok', async: 'yes' }] }]
1805
+ }
1806
+ }));
1807
+
1808
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1809
+ assert.strictEqual(result.code, 1, 'Should reject non-boolean async');
1810
+ assert.ok(result.stderr.includes('async'), 'Should report async type error');
1811
+ cleanupTestDir(testDir);
1812
+ })) passed++; else failed++;
1813
+
1814
+ if (test('reports correct index for error in deeply nested hook', () => {
1815
+ const testDir = createTestDir();
1816
+ const hooksFile = path.join(testDir, 'hooks.json');
1817
+ const manyHooks = [];
1818
+ for (let i = 0; i < 5; i++) {
1819
+ manyHooks.push({ type: 'command', command: 'echo ok' });
1820
+ }
1821
+ // Add an invalid hook at index 5
1822
+ manyHooks.push({ type: 'command', command: '' });
1823
+ fs.writeFileSync(hooksFile, JSON.stringify({
1824
+ hooks: {
1825
+ PreToolUse: [{ matcher: 'test', hooks: manyHooks }]
1826
+ }
1827
+ }));
1828
+
1829
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1830
+ assert.strictEqual(result.code, 1, 'Should fail on invalid hook at high index');
1831
+ assert.ok(result.stderr.includes('hooks[5]'), 'Should report correct hook index 5');
1832
+ cleanupTestDir(testDir);
1833
+ })) passed++; else failed++;
1834
+
1835
+ if (test('validates node -e with escaped quotes in inline JS', () => {
1836
+ const testDir = createTestDir();
1837
+ const hooksFile = path.join(testDir, 'hooks.json');
1838
+ fs.writeFileSync(hooksFile, JSON.stringify({
1839
+ hooks: {
1840
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'node -e "const x = 1 + 2; process.exit(0)"' }] }]
1841
+ }
1842
+ }));
1843
+
1844
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1845
+ assert.strictEqual(result.code, 0, 'Should pass valid multi-statement inline JS');
1846
+ cleanupTestDir(testDir);
1847
+ })) passed++; else failed++;
1848
+
1849
+ if (test('accepts multiple valid event types in single hooks file', () => {
1850
+ const testDir = createTestDir();
1851
+ const hooksFile = path.join(testDir, 'hooks.json');
1852
+ fs.writeFileSync(hooksFile, JSON.stringify({
1853
+ hooks: {
1854
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo pre' }] }],
1855
+ PostToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo post' }] }],
1856
+ Stop: [{ matcher: 'test', hooks: [{ type: 'command', command: 'echo stop' }] }]
1857
+ }
1858
+ }));
1859
+
1860
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
1861
+ assert.strictEqual(result.code, 0, 'Should accept multiple valid event types');
1862
+ assert.ok(result.stdout.includes('3'), 'Should report 3 matchers validated');
1863
+ cleanupTestDir(testDir);
1864
+ })) passed++; else failed++;
1865
+
1866
+ // ── Round 27: command validation edge cases ──
1867
+ console.log('\nvalidate-commands.js (Round 27 edge cases):');
1868
+
1869
+ if (test('validates multiple command refs on same non-creates line', () => {
1870
+ const testDir = createTestDir();
1871
+ const agentsDir = createTestDir();
1872
+ const skillsDir = createTestDir();
1873
+ // Create two valid commands
1874
+ fs.writeFileSync(path.join(testDir, 'cmd-a.md'), '# Command A\nBasic command.');
1875
+ fs.writeFileSync(path.join(testDir, 'cmd-b.md'), '# Command B\nBasic command.');
1876
+ // Create a third command that references both on one line
1877
+ fs.writeFileSync(path.join(testDir, 'cmd-c.md'),
1878
+ '# Command C\nUse `/cmd-a` and `/cmd-b` together.');
1879
+
1880
+ const result = runValidatorWithDirs('validate-commands', {
1881
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1882
+ });
1883
+ assert.strictEqual(result.code, 0, 'Should pass when multiple refs on same line are all valid');
1884
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1885
+ })) passed++; else failed++;
1886
+
1887
+ if (test('fails when one of multiple refs on same line is invalid', () => {
1888
+ const testDir = createTestDir();
1889
+ const agentsDir = createTestDir();
1890
+ const skillsDir = createTestDir();
1891
+ // Only cmd-a exists
1892
+ fs.writeFileSync(path.join(testDir, 'cmd-a.md'), '# Command A\nBasic command.');
1893
+ // cmd-c references cmd-a (valid) and cmd-z (invalid) on same line
1894
+ fs.writeFileSync(path.join(testDir, 'cmd-c.md'),
1895
+ '# Command C\nUse `/cmd-a` and `/cmd-z` together.');
1896
+
1897
+ const result = runValidatorWithDirs('validate-commands', {
1898
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1899
+ });
1900
+ assert.strictEqual(result.code, 1, 'Should fail when any ref is invalid');
1901
+ assert.ok(result.stderr.includes('cmd-z'), 'Should report the invalid reference');
1902
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1903
+ })) passed++; else failed++;
1904
+
1905
+ if (test('code blocks are stripped before checking references', () => {
1906
+ const testDir = createTestDir();
1907
+ const agentsDir = createTestDir();
1908
+ const skillsDir = createTestDir();
1909
+ // Reference inside a code block should not be validated
1910
+ fs.writeFileSync(path.join(testDir, 'cmd-x.md'),
1911
+ '# Command X\n```\n`/nonexistent-cmd` in code block\n```\nEnd.');
1912
+
1913
+ const result = runValidatorWithDirs('validate-commands', {
1914
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1915
+ });
1916
+ assert.strictEqual(result.code, 0, 'Should ignore command refs inside code blocks');
1917
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1918
+ })) passed++; else failed++;
1919
+
1920
+ // --- validate-skills.js: mixed valid/invalid ---
1921
+ console.log('\nvalidate-skills.js (mixed dirs):');
1922
+
1923
+ if (test('fails on mix of valid and invalid skill directories', () => {
1924
+ const testDir = createTestDir();
1925
+ // Valid skill
1926
+ const goodSkill = path.join(testDir, 'good-skill');
1927
+ fs.mkdirSync(goodSkill);
1928
+ fs.writeFileSync(path.join(goodSkill, 'SKILL.md'), '# Good Skill');
1929
+ // Missing SKILL.md
1930
+ const badSkill = path.join(testDir, 'bad-skill');
1931
+ fs.mkdirSync(badSkill);
1932
+ // Empty SKILL.md
1933
+ const emptySkill = path.join(testDir, 'empty-skill');
1934
+ fs.mkdirSync(emptySkill);
1935
+ fs.writeFileSync(path.join(emptySkill, 'SKILL.md'), '');
1936
+
1937
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
1938
+ assert.strictEqual(result.code, 1, 'Should fail when any skill is invalid');
1939
+ assert.ok(result.stderr.includes('bad-skill'), 'Should report missing SKILL.md');
1940
+ assert.ok(result.stderr.includes('empty-skill'), 'Should report empty SKILL.md');
1941
+ cleanupTestDir(testDir);
1942
+ })) passed++; else failed++;
1943
+
1944
+ // ── Round 30: validate-commands skill warnings and workflow edge cases ──
1945
+ console.log('\nRound 30: validate-commands (skill warnings):');
1946
+
1947
+ if (test('warns (not errors) when skill directory reference is not found', () => {
1948
+ const testDir = createTestDir();
1949
+ const agentsDir = createTestDir();
1950
+ const skillsDir = createTestDir();
1951
+ // Create a command that references a skill via path (skills/name/) format
1952
+ // but the skill doesn't exist — should warn, not error
1953
+ fs.writeFileSync(path.join(testDir, 'cmd-a.md'),
1954
+ '# Command A\nSee skills/nonexistent-skill/ for details.');
1955
+
1956
+ const result = runValidatorWithDirs('validate-commands', {
1957
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1958
+ });
1959
+ // Skill directory references produce warnings, not errors — exit 0
1960
+ assert.strictEqual(result.code, 0, 'Skill path references should warn, not error');
1961
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1962
+ })) passed++; else failed++;
1963
+
1964
+ if (test('passes when command has no slash references at all', () => {
1965
+ const testDir = createTestDir();
1966
+ const agentsDir = createTestDir();
1967
+ const skillsDir = createTestDir();
1968
+ fs.writeFileSync(path.join(testDir, 'cmd-simple.md'),
1969
+ '# Simple Command\nThis command has no references to other commands.');
1970
+
1971
+ const result = runValidatorWithDirs('validate-commands', {
1972
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
1973
+ });
1974
+ assert.strictEqual(result.code, 0, 'Should pass with no references');
1975
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
1976
+ })) passed++; else failed++;
1977
+
1978
+ console.log('\nRound 30: validate-agents (model validation):');
1979
+
1980
+ if (test('rejects agent with unrecognized model value', () => {
1981
+ const testDir = createTestDir();
1982
+ fs.writeFileSync(path.join(testDir, 'bad-model.md'),
1983
+ '---\nmodel: gpt-4\ntools: Read, Write\n---\n# Bad Model Agent');
1984
+
1985
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
1986
+ assert.strictEqual(result.code, 1, 'Should reject unrecognized model');
1987
+ assert.ok(result.stderr.includes('gpt-4'), 'Should mention the invalid model');
1988
+ cleanupTestDir(testDir);
1989
+ })) passed++; else failed++;
1990
+
1991
+ if (test('accepts all valid model values (haiku, sonnet, opus)', () => {
1992
+ const testDir = createTestDir();
1993
+ fs.writeFileSync(path.join(testDir, 'haiku.md'),
1994
+ '---\nmodel: haiku\ntools: Read\n---\n# Haiku Agent');
1995
+ fs.writeFileSync(path.join(testDir, 'sonnet.md'),
1996
+ '---\nmodel: sonnet\ntools: Read, Write\n---\n# Sonnet Agent');
1997
+ fs.writeFileSync(path.join(testDir, 'opus.md'),
1998
+ '---\nmodel: opus\ntools: Read, Write, Bash\n---\n# Opus Agent');
1999
+
2000
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2001
+ assert.strictEqual(result.code, 0, 'All valid models should pass');
2002
+ assert.ok(result.stdout.includes('3'), 'Should validate 3 agent files');
2003
+ cleanupTestDir(testDir);
2004
+ })) passed++; else failed++;
2005
+
2006
+ if (test('rejects agent with duplicate top-level frontmatter keys', () => {
2007
+ const testDir = createTestDir();
2008
+ fs.writeFileSync(path.join(testDir, 'dup-model.md'),
2009
+ '---\nname: dup\nmodel: sonnet\ntools: Read, Write\ndescription: test\nmodel: opus\n---\n# Agent');
2010
+
2011
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2012
+ assert.strictEqual(result.code, 1, 'Should reject duplicate top-level YAML keys');
2013
+ assert.ok(result.stderr.includes('Duplicate frontmatter keys'), 'Should report duplicate keys');
2014
+ assert.ok(result.stderr.includes('model'), 'Should name the duplicated key');
2015
+ cleanupTestDir(testDir);
2016
+ })) passed++; else failed++;
2017
+
2018
+ if (test('allows duplicate-looking nested frontmatter keys', () => {
2019
+ const testDir = createTestDir();
2020
+ fs.writeFileSync(path.join(testDir, 'nested.md'),
2021
+ '---\nmodel: sonnet\ntools: Read\nmetadata:\n model: display-only\n---\n# Agent');
2022
+
2023
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2024
+ assert.strictEqual(result.code, 0, 'Indented nested keys should not count as top-level duplicates');
2025
+ cleanupTestDir(testDir);
2026
+ })) passed++; else failed++;
2027
+
2028
+ // ── Round 32: empty frontmatter & edge cases ──
2029
+ console.log('\nRound 32: validate-agents (empty frontmatter):');
2030
+
2031
+ if (test('rejects agent with empty frontmatter block (no key-value pairs)', () => {
2032
+ const testDir = createTestDir();
2033
+ // Blank line between --- markers creates a valid but empty frontmatter block
2034
+ fs.writeFileSync(path.join(testDir, 'empty-fm.md'), '---\n\n---\n# Agent with empty frontmatter');
2035
+
2036
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2037
+ assert.strictEqual(result.code, 1, 'Should reject empty frontmatter');
2038
+ assert.ok(result.stderr.includes('model'), 'Should report missing model');
2039
+ assert.ok(result.stderr.includes('tools'), 'Should report missing tools');
2040
+ cleanupTestDir(testDir);
2041
+ })) passed++; else failed++;
2042
+
2043
+ if (test('rejects agent with no content between --- markers (Missing frontmatter)', () => {
2044
+ const testDir = createTestDir();
2045
+ // ---\n--- with no blank line → regex doesn't match → "Missing frontmatter"
2046
+ fs.writeFileSync(path.join(testDir, 'no-fm.md'), '---\n---\n# Agent');
2047
+
2048
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2049
+ assert.strictEqual(result.code, 1, 'Should reject missing frontmatter');
2050
+ assert.ok(result.stderr.includes('Missing frontmatter'), 'Should report missing frontmatter');
2051
+ cleanupTestDir(testDir);
2052
+ })) passed++; else failed++;
2053
+
2054
+ if (test('rejects agent with partial frontmatter (only model, no tools)', () => {
2055
+ const testDir = createTestDir();
2056
+ fs.writeFileSync(path.join(testDir, 'partial.md'), '---\nmodel: haiku\n---\n# Partial agent');
2057
+
2058
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2059
+ assert.strictEqual(result.code, 1, 'Should reject partial frontmatter');
2060
+ assert.ok(result.stderr.includes('tools'), 'Should report missing tools');
2061
+ assert.ok(!result.stderr.includes('model'), 'Should NOT report model (it is present)');
2062
+ cleanupTestDir(testDir);
2063
+ })) passed++; else failed++;
2064
+
2065
+ if (test('handles multiple agents where only one is invalid', () => {
2066
+ const testDir = createTestDir();
2067
+ fs.writeFileSync(path.join(testDir, 'good.md'), '---\nmodel: sonnet\ntools: Read\n---\n# Good');
2068
+ fs.writeFileSync(path.join(testDir, 'bad.md'), '---\nmodel: invalid-model\ntools: Read\n---\n# Bad');
2069
+
2070
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2071
+ assert.strictEqual(result.code, 1, 'Should fail when any agent is invalid');
2072
+ assert.ok(result.stderr.includes('bad.md'), 'Should identify the bad file');
2073
+ cleanupTestDir(testDir);
2074
+ })) passed++; else failed++;
2075
+
2076
+ console.log('\nRound 32: validate-rules (non-file entries):');
2077
+
2078
+ if (test('skips directory entries even if named with .md extension', () => {
2079
+ const testDir = createTestDir();
2080
+ // Create a directory named "tricky.md" — stat.isFile() should skip it
2081
+ fs.mkdirSync(path.join(testDir, 'tricky.md'));
2082
+ fs.writeFileSync(path.join(testDir, 'real.md'), '# A real rule');
2083
+
2084
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
2085
+ assert.strictEqual(result.code, 0, 'Should skip directory entries');
2086
+ assert.ok(result.stdout.includes('Validated 1'), 'Should count only the real file');
2087
+ cleanupTestDir(testDir);
2088
+ })) passed++; else failed++;
2089
+
2090
+ if (test('handles deeply nested rule in subdirectory', () => {
2091
+ const testDir = createTestDir();
2092
+ const deepDir = path.join(testDir, 'cat1', 'sub1');
2093
+ fs.mkdirSync(deepDir, { recursive: true });
2094
+ fs.writeFileSync(path.join(deepDir, 'deep-rule.md'), '# Deep nested rule');
2095
+
2096
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
2097
+ assert.strictEqual(result.code, 0, 'Should validate deeply nested rules');
2098
+ assert.ok(result.stdout.includes('Validated 1'), 'Should find the nested rule');
2099
+ cleanupTestDir(testDir);
2100
+ })) passed++; else failed++;
2101
+
2102
+ console.log('\nRound 32: validate-commands (agent reference with valid workflow):');
2103
+
2104
+ if (test('passes workflow with three chained agents', () => {
2105
+ const testDir = createTestDir();
2106
+ const agentsDir = createTestDir();
2107
+ const skillsDir = createTestDir();
2108
+ fs.writeFileSync(path.join(agentsDir, 'planner.md'), '---\nmodel: sonnet\ntools: Read\n---\n# P');
2109
+ fs.writeFileSync(path.join(agentsDir, 'tdd-guide.md'), '---\nmodel: sonnet\ntools: Read\n---\n# T');
2110
+ fs.writeFileSync(path.join(agentsDir, 'code-reviewer.md'), '---\nmodel: sonnet\ntools: Read\n---\n# C');
2111
+ fs.writeFileSync(path.join(testDir, 'flow.md'), '# Flow\n\nplanner -> tdd-guide -> code-reviewer');
2112
+
2113
+ const result = runValidatorWithDirs('validate-commands', {
2114
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2115
+ });
2116
+ assert.strictEqual(result.code, 0, 'Should pass on valid 3-agent workflow');
2117
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2118
+ })) passed++; else failed++;
2119
+
2120
+ if (test('detects broken agent in middle of workflow chain', () => {
2121
+ const testDir = createTestDir();
2122
+ const agentsDir = createTestDir();
2123
+ const skillsDir = createTestDir();
2124
+ fs.writeFileSync(path.join(agentsDir, 'planner.md'), '---\nmodel: sonnet\ntools: Read\n---\n# P');
2125
+ fs.writeFileSync(path.join(agentsDir, 'code-reviewer.md'), '---\nmodel: sonnet\ntools: Read\n---\n# C');
2126
+ // missing-agent is NOT created
2127
+ fs.writeFileSync(path.join(testDir, 'flow.md'), '# Flow\n\nplanner -> missing-agent -> code-reviewer');
2128
+
2129
+ const result = runValidatorWithDirs('validate-commands', {
2130
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2131
+ });
2132
+ assert.strictEqual(result.code, 1, 'Should detect broken agent in workflow chain');
2133
+ assert.ok(result.stderr.includes('missing-agent'), 'Should report the missing agent');
2134
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2135
+ })) passed++; else failed++;
2136
+
2137
+ // ── Round 42: case sensitivity, space-before-colon, missing dirs, empty matchers ──
2138
+ console.log('\nRound 42: validate-agents (case sensitivity):');
2139
+
2140
+ if (test('rejects uppercase model value (case-sensitive check)', () => {
2141
+ const testDir = createTestDir();
2142
+ fs.writeFileSync(path.join(testDir, 'upper.md'), '---\nmodel: Haiku\ntools: Read\n---\n# Uppercase model');
2143
+
2144
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2145
+ assert.strictEqual(result.code, 1, 'Should reject capitalized model');
2146
+ assert.ok(result.stderr.includes('Invalid model'), 'Should report invalid model');
2147
+ assert.ok(result.stderr.includes('Haiku'), 'Should show the rejected value');
2148
+ cleanupTestDir(testDir);
2149
+ })) passed++; else failed++;
2150
+
2151
+ if (test('handles space before colon in frontmatter key', () => {
2152
+ const testDir = createTestDir();
2153
+ // "model : sonnet" — space before colon. extractFrontmatter uses indexOf(':') + trim()
2154
+ fs.writeFileSync(path.join(testDir, 'space.md'), '---\nmodel : sonnet\ntools : Read, Write\n---\n# Agent with space-colon');
2155
+
2156
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2157
+ assert.strictEqual(result.code, 0, 'Should accept space before colon (trim handles it)');
2158
+ cleanupTestDir(testDir);
2159
+ })) passed++; else failed++;
2160
+
2161
+ console.log('\nRound 42: validate-commands (missing agents dir):');
2162
+
2163
+ if (test('flags agent path references when AGENTS_DIR does not exist', () => {
2164
+ const testDir = createTestDir();
2165
+ const skillsDir = createTestDir();
2166
+ // AGENTS_DIR points to non-existent path → validAgents set stays empty
2167
+ fs.writeFileSync(path.join(testDir, 'cmd.md'), '# Command\nSee agents/planner.md for details.');
2168
+
2169
+ const result = runValidatorWithDirs('validate-commands', {
2170
+ COMMANDS_DIR: testDir, AGENTS_DIR: '/nonexistent/agents-dir', SKILLS_DIR: skillsDir
2171
+ });
2172
+ assert.strictEqual(result.code, 1, 'Should fail when agents dir missing but agent referenced');
2173
+ assert.ok(result.stderr.includes('planner'), 'Should report the unresolvable agent reference');
2174
+ cleanupTestDir(testDir); cleanupTestDir(skillsDir);
2175
+ })) passed++; else failed++;
2176
+
2177
+ console.log('\nRound 42: validate-hooks (empty matchers array):');
2178
+
2179
+ if (test('accepts event type with empty matchers array', () => {
2180
+ const testDir = createTestDir();
2181
+ const hooksFile = path.join(testDir, 'hooks.json');
2182
+ fs.writeFileSync(hooksFile, JSON.stringify({
2183
+ hooks: {
2184
+ PreToolUse: []
2185
+ }
2186
+ }));
2187
+
2188
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2189
+ assert.strictEqual(result.code, 0, 'Should accept empty matchers array');
2190
+ assert.ok(result.stdout.includes('Validated 0'), 'Should report 0 matchers');
2191
+ cleanupTestDir(testDir);
2192
+ })) passed++; else failed++;
2193
+
2194
+ // ── Round 47: escape sequence and frontmatter edge cases ──
2195
+ console.log('\nRound 47: validate-hooks (inline JS escape sequences):');
2196
+
2197
+ if (test('validates inline JS with mixed escape sequences (newline + escaped quote)', () => {
2198
+ const testDir = createTestDir();
2199
+ const hooksFile = path.join(testDir, 'hooks.json');
2200
+ // Command value after JSON parse: node -e "var a = \"ok\"\nconsole.log(a)"
2201
+ // Regex captures: var a = \"ok\"\nconsole.log(a)
2202
+ // After unescape chain: var a = "ok"\nconsole.log(a) (real newline) — valid JS
2203
+ fs.writeFileSync(hooksFile, JSON.stringify({
2204
+ hooks: {
2205
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command',
2206
+ command: 'node -e "var a = \\"ok\\"\\nconsole.log(a)"' }] }]
2207
+ }
2208
+ }));
2209
+
2210
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2211
+ assert.strictEqual(result.code, 0, 'Should handle escaped quotes and newline separators');
2212
+ cleanupTestDir(testDir);
2213
+ })) passed++; else failed++;
2214
+
2215
+ if (test('rejects inline JS with syntax error after unescaping', () => {
2216
+ const testDir = createTestDir();
2217
+ const hooksFile = path.join(testDir, 'hooks.json');
2218
+ // After unescape this becomes: var x = { — missing closing brace
2219
+ fs.writeFileSync(hooksFile, JSON.stringify({
2220
+ hooks: {
2221
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command',
2222
+ command: 'node -e "var x = {"' }] }]
2223
+ }
2224
+ }));
2225
+
2226
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2227
+ assert.strictEqual(result.code, 1, 'Should reject JS syntax error after unescaping');
2228
+ assert.ok(result.stderr.includes('invalid inline JS'), 'Should report inline JS error');
2229
+ cleanupTestDir(testDir);
2230
+ })) passed++; else failed++;
2231
+
2232
+ console.log('\nRound 47: validate-agents (frontmatter lines without colon):');
2233
+
2234
+ if (test('silently ignores frontmatter line without colon', () => {
2235
+ const testDir = createTestDir();
2236
+ // Line "just some text" has no colon — should be skipped, not cause crash
2237
+ fs.writeFileSync(path.join(testDir, 'mixed.md'),
2238
+ '---\nmodel: sonnet\njust some text without colon\ntools: Read\n---\n# Agent');
2239
+
2240
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2241
+ assert.strictEqual(result.code, 0, 'Should ignore lines without colon in frontmatter');
2242
+ cleanupTestDir(testDir);
2243
+ })) passed++; else failed++;
2244
+
2245
+ // ── Round 52: command inline backtick refs, workflow whitespace, code-only rules ──
2246
+ console.log('\nRound 52: validate-commands (inline backtick refs):');
2247
+
2248
+ if (test('validates command refs inside inline backticks (not stripped by code block removal)', () => {
2249
+ const testDir = createTestDir();
2250
+ const agentsDir = createTestDir();
2251
+ const skillsDir = createTestDir();
2252
+ fs.writeFileSync(path.join(testDir, 'deploy.md'), '# Deploy\nDeploy the app.');
2253
+ // Inline backtick ref `/deploy` should be validated (only fenced blocks stripped)
2254
+ fs.writeFileSync(path.join(testDir, 'workflow.md'),
2255
+ '# Workflow\nFirst run `/deploy` to deploy the app.');
2256
+
2257
+ const result = runValidatorWithDirs('validate-commands', {
2258
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2259
+ });
2260
+ assert.strictEqual(result.code, 0, 'Inline backtick command refs should be validated');
2261
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2262
+ })) passed++; else failed++;
2263
+
2264
+ console.log('\nRound 52: validate-commands (workflow whitespace):');
2265
+
2266
+ if (test('validates workflow arrows with irregular whitespace', () => {
2267
+ const testDir = createTestDir();
2268
+ const agentsDir = createTestDir();
2269
+ const skillsDir = createTestDir();
2270
+ fs.writeFileSync(path.join(agentsDir, 'planner.md'), '# Planner');
2271
+ fs.writeFileSync(path.join(agentsDir, 'reviewer.md'), '# Reviewer');
2272
+ // Three workflow lines: no spaces, double spaces, tab-separated
2273
+ fs.writeFileSync(path.join(testDir, 'flow.md'),
2274
+ '# Workflow\n\nplanner->reviewer\nplanner -> reviewer');
2275
+
2276
+ const result = runValidatorWithDirs('validate-commands', {
2277
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2278
+ });
2279
+ assert.strictEqual(result.code, 0, 'Workflow arrows with irregular whitespace should be valid');
2280
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2281
+ })) passed++; else failed++;
2282
+
2283
+ console.log('\nRound 52: validate-rules (code-only content):');
2284
+
2285
+ if (test('passes rule file containing only a fenced code block', () => {
2286
+ const testDir = createTestDir();
2287
+ fs.writeFileSync(path.join(testDir, 'code-only.md'),
2288
+ '```javascript\nfunction example() {\n return true;\n}\n```');
2289
+
2290
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
2291
+ assert.strictEqual(result.code, 0, 'Rule with only code block should pass (non-empty)');
2292
+ assert.ok(result.stdout.includes('Validated 1'), 'Should count the code-only file');
2293
+ cleanupTestDir(testDir);
2294
+ })) passed++; else failed++;
2295
+
2296
+ // ── Round 57: readFileSync error path, statSync catch block, adjacent code blocks ──
2297
+ console.log('\nRound 57: validate-skills.js (SKILL.md is a directory — readFileSync error):');
2298
+
2299
+ if (test('fails gracefully when SKILL.md is a directory instead of a file', () => {
2300
+ const testDir = createTestDir();
2301
+ const skillDir = path.join(testDir, 'dir-skill');
2302
+ fs.mkdirSync(skillDir);
2303
+ // Create SKILL.md as a DIRECTORY, not a file — existsSync returns true
2304
+ // but readFileSync throws EISDIR, exercising the catch block (lines 33-37)
2305
+ fs.mkdirSync(path.join(skillDir, 'SKILL.md'));
2306
+
2307
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
2308
+ assert.strictEqual(result.code, 1, 'Should fail when SKILL.md is a directory');
2309
+ assert.ok(result.stderr.includes('dir-skill'), 'Should report the problematic skill');
2310
+ cleanupTestDir(testDir);
2311
+ })) passed++; else failed++;
2312
+
2313
+ console.log('\nRound 57: validate-rules.js (broken symlink — statSync catch block):');
2314
+
2315
+ if (test('reports error for broken symlink .md file in rules directory', () => {
2316
+ const testDir = createTestDir();
2317
+ // Create a valid rule first
2318
+ fs.writeFileSync(path.join(testDir, 'valid.md'), '# Valid Rule');
2319
+ // Create a broken symlink (dangling → target doesn't exist)
2320
+ // statSync follows symlinks and throws ENOENT, exercising catch (lines 35-38)
2321
+ try {
2322
+ fs.symlinkSync('/nonexistent/target.md', path.join(testDir, 'broken.md'));
2323
+ } catch {
2324
+ // Skip on systems that don't support symlinks
2325
+ console.log(' (skipped — symlinks not supported)');
2326
+ cleanupTestDir(testDir);
2327
+ return;
2328
+ }
2329
+
2330
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
2331
+ assert.strictEqual(result.code, 1, 'Should fail on broken symlink');
2332
+ assert.ok(result.stderr.includes('broken.md'), 'Should report the broken symlink file');
2333
+ cleanupTestDir(testDir);
2334
+ })) passed++; else failed++;
2335
+
2336
+ console.log('\nRound 57: validate-commands.js (adjacent code blocks both stripped):');
2337
+
2338
+ if (test('strips multiple adjacent code blocks before checking references', () => {
2339
+ const testDir = createTestDir();
2340
+ const agentsDir = createTestDir();
2341
+ const skillsDir = createTestDir();
2342
+ // Two adjacent code blocks, each with broken refs — BOTH must be stripped
2343
+ fs.writeFileSync(path.join(testDir, 'multi-blocks.md'),
2344
+ '# Multi Block\n\n' +
2345
+ '```\n`/phantom-a` in first block\n```\n\n' +
2346
+ 'Content between blocks\n\n' +
2347
+ '```\n`/phantom-b` in second block\nagents/ghost-agent.md\n```\n\n' +
2348
+ 'Final content');
2349
+
2350
+ const result = runValidatorWithDirs('validate-commands', {
2351
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2352
+ });
2353
+ assert.strictEqual(result.code, 0,
2354
+ 'Both code blocks should be stripped — no broken refs reported');
2355
+ assert.ok(!result.stderr.includes('phantom-a'), 'First block ref should be stripped');
2356
+ assert.ok(!result.stderr.includes('phantom-b'), 'Second block ref should be stripped');
2357
+ assert.ok(!result.stderr.includes('ghost-agent'), 'Agent ref in second block should be stripped');
2358
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2359
+ })) passed++; else failed++;
2360
+
2361
+ // ── Round 58: readFileSync catch block, colonIdx edge case, command-as-object ──
2362
+ console.log('\nRound 58: validate-agents.js (unreadable agent file — readFileSync catch):');
2363
+
2364
+ if (test('reports error when agent .md file is unreadable (chmod 000)', () => {
2365
+ // Skip on Windows or when running as root (permissions won't work)
2366
+ if (process.platform === 'win32' || (process.getuid && process.getuid() === 0)) {
2367
+ console.log(' (skipped — not supported on this platform)');
2368
+ return;
2369
+ }
2370
+ const testDir = createTestDir();
2371
+ const agentFile = path.join(testDir, 'locked.md');
2372
+ fs.writeFileSync(agentFile, '---\nmodel: sonnet\ntools: Read\n---\n# Agent');
2373
+ fs.chmodSync(agentFile, 0o000);
2374
+
2375
+ try {
2376
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2377
+ assert.strictEqual(result.code, 1, 'Should exit 1 on read error');
2378
+ assert.ok(result.stderr.includes('locked.md'), 'Should mention the unreadable file');
2379
+ } finally {
2380
+ fs.chmodSync(agentFile, 0o644);
2381
+ cleanupTestDir(testDir);
2382
+ }
2383
+ })) passed++; else failed++;
2384
+
2385
+ console.log('\nRound 58: validate-agents.js (frontmatter line with colon at position 0):');
2386
+
2387
+ if (test('rejects agent when required field key has colon at position 0 (no key name)', () => {
2388
+ const testDir = createTestDir();
2389
+ fs.writeFileSync(path.join(testDir, 'bad-colon.md'),
2390
+ '---\n:sonnet\ntools: Read\n---\n# Agent with leading colon');
2391
+
2392
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2393
+ assert.strictEqual(result.code, 1, 'Should fail — model field is missing (colon at idx 0 skipped)');
2394
+ assert.ok(result.stderr.includes('model'), 'Should report missing model field');
2395
+ cleanupTestDir(testDir);
2396
+ })) passed++; else failed++;
2397
+
2398
+ console.log('\nRound 58: validate-hooks.js (command is a plain object — not string or array):');
2399
+
2400
+ if (test('rejects hook entry where command is a plain object', () => {
2401
+ const testDir = createTestDir();
2402
+ const hooksFile = path.join(testDir, 'hooks.json');
2403
+ fs.writeFileSync(hooksFile, JSON.stringify({
2404
+ hooks: {
2405
+ PreToolUse: [{ matcher: 'test', hooks: [{ type: 'command', command: { run: 'echo hi' } }] }]
2406
+ }
2407
+ }));
2408
+
2409
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2410
+ assert.strictEqual(result.code, 1, 'Should reject object command (not string or array)');
2411
+ assert.ok(result.stderr.includes('command'), 'Should report invalid command field');
2412
+ cleanupTestDir(testDir);
2413
+ })) passed++; else failed++;
2414
+
2415
+ // ── Round 63: object-format missing matcher, unreadable command file, empty commands dir ──
2416
+ console.log('\nRound 63: validate-hooks.js (object-format matcher missing matcher field):');
2417
+
2418
+ if (test('rejects object-format matcher entry missing matcher field', () => {
2419
+ const testDir = createTestDir();
2420
+ const hooksFile = path.join(testDir, 'hooks.json');
2421
+ // Object format: matcher entry has hooks array but NO matcher field
2422
+ fs.writeFileSync(hooksFile, JSON.stringify({
2423
+ hooks: {
2424
+ PreToolUse: [{ hooks: [{ type: 'command', command: 'echo ok' }] }]
2425
+ }
2426
+ }));
2427
+
2428
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2429
+ assert.strictEqual(result.code, 1, 'Should fail on missing matcher field in object format');
2430
+ assert.ok(result.stderr.includes("missing 'matcher' field"), 'Should report missing matcher field');
2431
+ cleanupTestDir(testDir);
2432
+ })) passed++; else failed++;
2433
+
2434
+ console.log('\nRound 63: validate-commands.js (unreadable command file):');
2435
+
2436
+ if (test('reports error when command .md file is unreadable (chmod 000)', () => {
2437
+ if (process.platform === 'win32' || (process.getuid && process.getuid() === 0)) {
2438
+ console.log(' (skipped — not supported on this platform)');
2439
+ return;
2440
+ }
2441
+ const testDir = createTestDir();
2442
+ const cmdFile = path.join(testDir, 'locked.md');
2443
+ fs.writeFileSync(cmdFile, '# Locked Command');
2444
+ fs.chmodSync(cmdFile, 0o000);
2445
+
2446
+ try {
2447
+ const result = runValidatorWithDirs('validate-commands', {
2448
+ COMMANDS_DIR: testDir, AGENTS_DIR: '/nonexistent', SKILLS_DIR: '/nonexistent'
2449
+ });
2450
+ assert.strictEqual(result.code, 1, 'Should exit 1 on read error');
2451
+ assert.ok(result.stderr.includes('locked.md'), 'Should mention the unreadable file');
2452
+ } finally {
2453
+ fs.chmodSync(cmdFile, 0o644);
2454
+ cleanupTestDir(testDir);
2455
+ }
2456
+ })) passed++; else failed++;
2457
+
2458
+ console.log('\nRound 63: validate-commands.js (empty commands directory):');
2459
+
2460
+ if (test('passes on empty commands directory (no .md files)', () => {
2461
+ const testDir = createTestDir();
2462
+ // Only non-.md files — no .md files to validate
2463
+ fs.writeFileSync(path.join(testDir, 'readme.txt'), 'not a command');
2464
+
2465
+ const result = runValidatorWithDirs('validate-commands', {
2466
+ COMMANDS_DIR: testDir, AGENTS_DIR: '/nonexistent', SKILLS_DIR: '/nonexistent'
2467
+ });
2468
+ assert.strictEqual(result.code, 0, 'Should pass on empty commands directory');
2469
+ assert.ok(result.stdout.includes('Validated 0'), 'Should report 0 validated');
2470
+ cleanupTestDir(testDir);
2471
+ })) passed++; else failed++;
2472
+
2473
+ // ── Round 65: empty directories for rules and skills ──
2474
+ console.log('\nRound 65: validate-rules.js (empty directory — no .md files):');
2475
+
2476
+ if (test('passes on rules directory with no .md files (Validated 0)', () => {
2477
+ const testDir = createTestDir();
2478
+ // Only non-.md files — readdirSync filter yields empty array
2479
+ fs.writeFileSync(path.join(testDir, 'notes.txt'), 'not a rule');
2480
+ fs.writeFileSync(path.join(testDir, 'config.json'), '{}');
2481
+
2482
+ const result = runValidatorWithDir('validate-rules', 'RULES_DIR', testDir);
2483
+ assert.strictEqual(result.code, 0, 'Should pass on empty rules directory');
2484
+ assert.ok(result.stdout.includes('Validated 0'), 'Should report 0 validated rule files');
2485
+ cleanupTestDir(testDir);
2486
+ })) passed++; else failed++;
2487
+
2488
+ console.log('\nRound 65: validate-skills.js (empty directory — no subdirectories):');
2489
+
2490
+ if (test('passes on skills directory with only files, no subdirectories (Validated 0)', () => {
2491
+ const testDir = createTestDir();
2492
+ // Only files, no subdirectories — isDirectory filter yields empty array
2493
+ fs.writeFileSync(path.join(testDir, 'README.md'), '# Skills');
2494
+ fs.writeFileSync(path.join(testDir, '.gitkeep'), '');
2495
+
2496
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
2497
+ assert.strictEqual(result.code, 0, 'Should pass on skills directory with no subdirectories');
2498
+ assert.ok(result.stdout.includes('Validated 0'), 'Should report 0 validated skill directories');
2499
+ cleanupTestDir(testDir);
2500
+ })) passed++; else failed++;
2501
+
2502
+ // ── Round 70: validate-commands.js "would create:" line skip ──
2503
+ console.log('\nRound 70: validate-commands.js (would create: skip):');
2504
+
2505
+ if (test('skips command references on "would create:" lines', () => {
2506
+ const testDir = createTestDir();
2507
+ const agentsDir = createTestDir();
2508
+ const skillsDir = createTestDir();
2509
+ // "Would create:" is the alternate form checked by the regex at line 80:
2510
+ // if (/creates:|would create:/i.test(line)) continue;
2511
+ // Only "creates:" was previously tested (Round 20). "Would create:" exercises
2512
+ // the second alternation in the regex.
2513
+ fs.writeFileSync(path.join(testDir, 'gen-cmd.md'),
2514
+ '# Generator Command\n\nWould create: `/phantom-cmd` in your project.\n\nThis is safe.');
2515
+
2516
+ const result = runValidatorWithDirs('validate-commands', {
2517
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2518
+ });
2519
+ assert.strictEqual(result.code, 0, 'Should skip "would create:" lines');
2520
+ assert.ok(!result.stderr.includes('phantom-cmd'), 'Should not flag ref on "would create:" line');
2521
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2522
+ })) passed++; else failed++;
2523
+
2524
+ // ── Round 72: validate-hooks.js async/timeout type validation ──
2525
+ console.log('\nRound 72: validate-hooks.js (async and timeout type validation):');
2526
+
2527
+ if (test('rejects hook with non-boolean async field', () => {
2528
+ const testDir = createTestDir();
2529
+ const hooksFile = path.join(testDir, 'hooks.json');
2530
+ fs.writeFileSync(hooksFile, JSON.stringify({
2531
+ PreToolUse: [{
2532
+ matcher: 'Write',
2533
+ hooks: [{
2534
+ type: 'command',
2535
+ command: 'echo test',
2536
+ async: 'yes' // Should be boolean, not string
2537
+ }]
2538
+ }]
2539
+ }));
2540
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2541
+ assert.strictEqual(result.code, 1, 'Should fail on non-boolean async');
2542
+ assert.ok(result.stderr.includes('async'), 'Should mention async in error');
2543
+ assert.ok(result.stderr.includes('boolean'), 'Should mention boolean type');
2544
+ cleanupTestDir(testDir);
2545
+ })) passed++; else failed++;
2546
+
2547
+ if (test('rejects hook with negative timeout value', () => {
2548
+ const testDir = createTestDir();
2549
+ const hooksFile = path.join(testDir, 'hooks.json');
2550
+ fs.writeFileSync(hooksFile, JSON.stringify({
2551
+ PostToolUse: [{
2552
+ matcher: 'Edit',
2553
+ hooks: [{
2554
+ type: 'command',
2555
+ command: 'echo test',
2556
+ timeout: -5 // Must be non-negative
2557
+ }]
2558
+ }]
2559
+ }));
2560
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2561
+ assert.strictEqual(result.code, 1, 'Should fail on negative timeout');
2562
+ assert.ok(result.stderr.includes('timeout'), 'Should mention timeout in error');
2563
+ assert.ok(result.stderr.includes('non-negative'), 'Should mention non-negative');
2564
+ cleanupTestDir(testDir);
2565
+ })) passed++; else failed++;
2566
+
2567
+ // ── Round 73: validate-commands.js skill directory statSync catch ──
2568
+ console.log('\nRound 73: validate-commands.js (unreadable skill entry — statSync catch):');
2569
+
2570
+ if (test('skips unreadable skill directory entries without error (broken symlink)', () => {
2571
+ const testDir = createTestDir();
2572
+ const agentsDir = createTestDir();
2573
+ const skillsDir = createTestDir();
2574
+
2575
+ // Create one valid skill directory and one broken symlink
2576
+ const validSkill = path.join(skillsDir, 'valid-skill');
2577
+ fs.mkdirSync(validSkill, { recursive: true });
2578
+ // Broken symlink: target does not exist — statSync will throw ENOENT
2579
+ const brokenLink = path.join(skillsDir, 'broken-skill');
2580
+ fs.symlinkSync('/nonexistent/target/path', brokenLink);
2581
+
2582
+ // Command that references the valid skill (should resolve)
2583
+ fs.writeFileSync(path.join(testDir, 'cmd.md'),
2584
+ '# Command\nSee skills/valid-skill/ for details.');
2585
+
2586
+ const result = runValidatorWithDirs('validate-commands', {
2587
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2588
+ });
2589
+ assert.strictEqual(result.code, 0,
2590
+ 'Should pass — broken symlink in skills dir should be skipped silently');
2591
+ // The broken-skill should NOT be in validSkills, so referencing it would warn
2592
+ // but the valid-skill reference should resolve fine
2593
+ cleanupTestDir(testDir);
2594
+ cleanupTestDir(agentsDir);
2595
+ fs.rmSync(skillsDir, { recursive: true, force: true });
2596
+ })) passed++; else failed++;
2597
+
2598
+ // ── Round 76: validate-hooks.js invalid JSON in hooks.json ──
2599
+ console.log('\nRound 76: validate-hooks.js (invalid JSON in hooks.json):');
2600
+
2601
+ if (test('reports error for invalid JSON in hooks.json', () => {
2602
+ const testDir = createTestDir();
2603
+ const hooksFile = path.join(testDir, 'hooks.json');
2604
+ fs.writeFileSync(hooksFile, '{not valid json!!!');
2605
+
2606
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2607
+ assert.strictEqual(result.code, 1,
2608
+ `Expected exit 1 for invalid JSON, got ${result.code}`);
2609
+ assert.ok(result.stderr.includes('Invalid JSON'),
2610
+ `stderr should mention Invalid JSON, got: ${result.stderr}`);
2611
+ cleanupTestDir(testDir);
2612
+ })) passed++; else failed++;
2613
+
2614
+ // ── Round 78: validate-hooks.js wrapped { hooks: { ... } } format ──
2615
+ console.log('\nRound 78: validate-hooks.js (wrapped hooks format):');
2616
+
2617
+ if (test('validates wrapped format { hooks: { PreToolUse: [...] } }', () => {
2618
+ const testDir = createTestDir();
2619
+ const hooksFile = path.join(testDir, 'hooks.json');
2620
+ // The production hooks.json uses this wrapped format — { hooks: { ... } }
2621
+ // data.hooks is the object with event types, not data itself
2622
+ fs.writeFileSync(hooksFile, JSON.stringify({
2623
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
2624
+ hooks: {
2625
+ PreToolUse: [{ matcher: 'Write', hooks: [{ type: 'command', command: 'echo ok' }] }],
2626
+ PostToolUse: [{ matcher: 'Read', hooks: [{ type: 'command', command: 'echo done' }] }]
2627
+ }
2628
+ }));
2629
+
2630
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2631
+ assert.strictEqual(result.code, 0,
2632
+ `Should pass wrapped hooks format, got exit ${result.code}. stderr: ${result.stderr}`);
2633
+ assert.ok(result.stdout.includes('Validated 2'),
2634
+ `Should validate 2 matchers, got: ${result.stdout}`);
2635
+ cleanupTestDir(testDir);
2636
+ })) passed++; else failed++;
2637
+
2638
+ // ── Round 79: validate-commands.js warnings count suffix in output ──
2639
+ console.log('\nRound 79: validate-commands.js (warnings count in output):');
2640
+
2641
+ if (test('output includes (N warnings) suffix when skill references produce warnings', () => {
2642
+ const testDir = createTestDir();
2643
+ const agentsDir = createTestDir();
2644
+ const skillsDir = createTestDir();
2645
+ // Create a command that references 2 non-existent skill directories
2646
+ // Each triggers a WARN (not error) — warnCount should be 2
2647
+ fs.writeFileSync(path.join(testDir, 'cmd-warn.md'),
2648
+ '# Command\nSee skills/fake-skill-a/ and skills/fake-skill-b/ for details.');
2649
+
2650
+ const result = runValidatorWithDirs('validate-commands', {
2651
+ COMMANDS_DIR: testDir, AGENTS_DIR: agentsDir, SKILLS_DIR: skillsDir
2652
+ });
2653
+ assert.strictEqual(result.code, 0, 'Skill warnings should not cause error exit');
2654
+ // The validate-commands output appends "(N warnings)" when warnCount > 0
2655
+ assert.ok(result.stdout.includes('(2 warnings)'),
2656
+ `Output should include "(2 warnings)" suffix, got: ${result.stdout}`);
2657
+ cleanupTestDir(testDir); cleanupTestDir(agentsDir); cleanupTestDir(skillsDir);
2658
+ })) passed++; else failed++;
2659
+
2660
+ // ── Round 80: validate-hooks.js legacy array format (lines 115-135) ──
2661
+ console.log('\nRound 80: validate-hooks.js (legacy array format):');
2662
+
2663
+ if (test('validates hooks in legacy array format (hooks is an array, not object)', () => {
2664
+ const testDir = createTestDir();
2665
+ // The legacy array format wraps hooks as { hooks: [...] } where the array
2666
+ // contains matcher objects directly. This exercises lines 115-135 of
2667
+ // validate-hooks.js which use "Hook ${i}" error labels instead of "${eventType}[${i}]".
2668
+ const hooksJson = JSON.stringify({
2669
+ hooks: [
2670
+ {
2671
+ matcher: 'Edit',
2672
+ hooks: [{ type: 'command', command: 'echo legacy test' }]
2673
+ }
2674
+ ]
2675
+ });
2676
+ fs.writeFileSync(path.join(testDir, 'hooks.json'), hooksJson);
2677
+
2678
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', path.join(testDir, 'hooks.json'));
2679
+ assert.strictEqual(result.code, 0, 'Should pass on valid legacy array format');
2680
+ assert.ok(result.stdout.includes('Validated 1 hook'),
2681
+ `Should report 1 validated matcher, got: ${result.stdout}`);
2682
+ cleanupTestDir(testDir);
2683
+ })) passed++; else failed++;
2684
+
2685
+ // ── Round 82: Notification and SubagentStop event types ──
2686
+
2687
+ console.log('\nRound 82: validate-hooks (Notification and SubagentStop event types):');
2688
+
2689
+ if (test('accepts Notification and SubagentStop as valid event types', () => {
2690
+ const testDir = createTestDir();
2691
+ const hooksJson = JSON.stringify({
2692
+ hooks: [
2693
+ {
2694
+ matcher: { type: 'Notification' },
2695
+ hooks: [{ type: 'command', command: 'echo notification' }]
2696
+ },
2697
+ {
2698
+ matcher: { type: 'SubagentStop' },
2699
+ hooks: [{ type: 'command', command: 'echo subagent stopped' }]
2700
+ }
2701
+ ]
2702
+ });
2703
+ fs.writeFileSync(path.join(testDir, 'hooks.json'), hooksJson);
2704
+
2705
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', path.join(testDir, 'hooks.json'));
2706
+ assert.strictEqual(result.code, 0, 'Should pass with Notification and SubagentStop events');
2707
+ assert.ok(result.stdout.includes('Validated 2 hook'),
2708
+ `Should report 2 validated matchers, got: ${result.stdout}`);
2709
+ cleanupTestDir(testDir);
2710
+ })) passed++; else failed++;
2711
+
2712
+ console.log('\nRound 82b: validate-hooks (current official events and hook types):');
2713
+
2714
+ if (test('accepts UserPromptSubmit with omitted matcher and prompt/http/agent hooks', () => {
2715
+ const testDir = createTestDir();
2716
+ const hooksJson = JSON.stringify({
2717
+ hooks: {
2718
+ UserPromptSubmit: [
2719
+ {
2720
+ hooks: [
2721
+ { type: 'prompt', prompt: 'Summarize the request.' },
2722
+ { type: 'agent', prompt: 'Review for security issues.', model: 'gpt-5.4' },
2723
+ { type: 'http', url: 'https://example.com/hooks', headers: { Authorization: 'Bearer token' } }
2724
+ ]
2725
+ }
2726
+ ]
2727
+ }
2728
+ });
2729
+ const hooksFile = path.join(testDir, 'hooks.json');
2730
+ fs.writeFileSync(hooksFile, hooksJson);
2731
+
2732
+ const result = runValidatorWithDir('validate-hooks', 'HOOKS_FILE', hooksFile);
2733
+ assert.strictEqual(result.code, 0, 'Should accept current official hook event/type combinations');
2734
+ cleanupTestDir(testDir);
2735
+ })) passed++; else failed++;
2736
+
2737
+ // ── Round 83: validate-agents whitespace-only field, validate-skills empty SKILL.md ──
2738
+
2739
+ console.log('\nRound 83: validate-agents (whitespace-only frontmatter field value):');
2740
+
2741
+ if (test('rejects agent with whitespace-only model field (trim guard)', () => {
2742
+ const testDir = createTestDir();
2743
+ // model has only whitespace — extractFrontmatter produces { model: ' ', tools: 'Read' }
2744
+ // The condition: typeof frontmatter[field] === 'string' && !frontmatter[field].trim()
2745
+ // evaluates to true for model → "Missing required field: model"
2746
+ fs.writeFileSync(path.join(testDir, 'ws.md'), '---\nmodel: \ntools: Read\n---\n# Whitespace model');
2747
+
2748
+ const result = runValidatorWithDir('validate-agents', 'AGENTS_DIR', testDir);
2749
+ assert.strictEqual(result.code, 1, 'Should reject whitespace-only model');
2750
+ assert.ok(result.stderr.includes('model'), 'Should report missing model field');
2751
+ assert.ok(!result.stderr.includes('tools'), 'tools field is valid and should NOT be flagged');
2752
+ cleanupTestDir(testDir);
2753
+ })) passed++; else failed++;
2754
+
2755
+ console.log('\nRound 83: validate-skills (empty SKILL.md file):');
2756
+
2757
+ if (test('rejects skill directory with empty SKILL.md file', () => {
2758
+ const testDir = createTestDir();
2759
+ const skillDir = path.join(testDir, 'empty-skill');
2760
+ fs.mkdirSync(skillDir, { recursive: true });
2761
+ // Create SKILL.md with only whitespace (trim to zero length)
2762
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), ' \n \n');
2763
+
2764
+ const result = runValidatorWithDir('validate-skills', 'SKILLS_DIR', testDir);
2765
+ assert.strictEqual(result.code, 1, 'Should reject empty SKILL.md');
2766
+ assert.ok(result.stderr.includes('Empty file'),
2767
+ `Should report "Empty file", got: ${result.stderr}`);
2768
+ cleanupTestDir(testDir);
2769
+ })) passed++; else failed++;
2770
+
2771
+ // ==========================================
2772
+ // validate-install-manifests.js
2773
+ // ==========================================
2774
+ console.log('\nvalidate-install-manifests.js:');
2775
+
2776
+ if (test('passes on real project install manifests', () => {
2777
+ const result = runValidator('validate-install-manifests');
2778
+ assert.strictEqual(result.code, 0, `Should pass, got stderr: ${result.stderr}`);
2779
+ assert.ok(result.stdout.includes('Validated'), 'Should output validation count');
2780
+ })) passed++; else failed++;
2781
+
2782
+ if (test('exits 0 when install manifests do not exist', () => {
2783
+ const testDir = createTestDir();
2784
+ const result = runValidatorWithDirs('validate-install-manifests', {
2785
+ REPO_ROOT: testDir,
2786
+ MODULES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-modules.json'),
2787
+ PROFILES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-profiles.json')
2788
+ });
2789
+ assert.strictEqual(result.code, 0, 'Should skip when manifests are missing');
2790
+ assert.ok(result.stdout.includes('skipping'), 'Should say skipping');
2791
+ cleanupTestDir(testDir);
2792
+ })) passed++; else failed++;
2793
+
2794
+ if (test('fails on invalid install manifest JSON', () => {
2795
+ const testDir = createTestDir();
2796
+ const manifestsDir = path.join(testDir, 'manifests');
2797
+ fs.mkdirSync(manifestsDir, { recursive: true });
2798
+ fs.writeFileSync(path.join(manifestsDir, 'install-modules.json'), '{ invalid json');
2799
+ writeJson(path.join(manifestsDir, 'install-profiles.json'), {
2800
+ version: 1,
2801
+ profiles: {}
2802
+ });
2803
+
2804
+ const result = runValidatorWithDirs('validate-install-manifests', {
2805
+ REPO_ROOT: testDir,
2806
+ MODULES_MANIFEST_PATH: path.join(manifestsDir, 'install-modules.json'),
2807
+ PROFILES_MANIFEST_PATH: path.join(manifestsDir, 'install-profiles.json'),
2808
+ COMPONENTS_MANIFEST_PATH: path.join(manifestsDir, 'install-components.json'),
2809
+ MODULES_SCHEMA_PATH: modulesSchemaPath,
2810
+ PROFILES_SCHEMA_PATH: profilesSchemaPath,
2811
+ COMPONENTS_SCHEMA_PATH: componentsSchemaPath
2812
+ });
2813
+ assert.strictEqual(result.code, 1, 'Should fail on invalid JSON');
2814
+ assert.ok(result.stderr.includes('Invalid JSON'), 'Should report invalid JSON');
2815
+ cleanupTestDir(testDir);
2816
+ })) passed++; else failed++;
2817
+
2818
+ if (test('fails when install module references a missing path', () => {
2819
+ const testDir = createTestDir();
2820
+ writeJson(path.join(testDir, 'manifests', 'install-modules.json'), {
2821
+ version: 1,
2822
+ modules: [
2823
+ {
2824
+ id: 'rules-core',
2825
+ kind: 'rules',
2826
+ description: 'Rules',
2827
+ paths: ['rules'],
2828
+ targets: ['claude'],
2829
+ dependencies: [],
2830
+ defaultInstall: true,
2831
+ cost: 'light',
2832
+ stability: 'stable'
2833
+ },
2834
+ {
2835
+ id: 'security',
2836
+ kind: 'skills',
2837
+ description: 'Security',
2838
+ paths: ['skills/security-review'],
2839
+ targets: ['codex'],
2840
+ dependencies: [],
2841
+ defaultInstall: false,
2842
+ cost: 'medium',
2843
+ stability: 'stable'
2844
+ }
2845
+ ]
2846
+ });
2847
+ writeJson(path.join(testDir, 'manifests', 'install-profiles.json'), {
2848
+ version: 1,
2849
+ profiles: {
2850
+ core: { description: 'Core', modules: ['rules-core'] },
2851
+ developer: { description: 'Developer', modules: ['rules-core'] },
2852
+ security: { description: 'Security', modules: ['rules-core', 'security'] },
2853
+ research: { description: 'Research', modules: ['rules-core'] },
2854
+ full: { description: 'Full', modules: ['rules-core', 'security'] }
2855
+ }
2856
+ });
2857
+ writeInstallComponentsManifest(testDir, [
2858
+ {
2859
+ id: 'baseline:rules',
2860
+ family: 'baseline',
2861
+ description: 'Rules',
2862
+ modules: ['rules-core']
2863
+ },
2864
+ {
2865
+ id: 'capability:security',
2866
+ family: 'capability',
2867
+ description: 'Security',
2868
+ modules: ['security']
2869
+ }
2870
+ ]);
2871
+ fs.mkdirSync(path.join(testDir, 'rules'), { recursive: true });
2872
+
2873
+ const result = runValidatorWithDirs('validate-install-manifests', {
2874
+ REPO_ROOT: testDir,
2875
+ MODULES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-modules.json'),
2876
+ PROFILES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-profiles.json'),
2877
+ COMPONENTS_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-components.json'),
2878
+ MODULES_SCHEMA_PATH: modulesSchemaPath,
2879
+ PROFILES_SCHEMA_PATH: profilesSchemaPath,
2880
+ COMPONENTS_SCHEMA_PATH: componentsSchemaPath
2881
+ });
2882
+ assert.strictEqual(result.code, 1, 'Should fail when a referenced path is missing');
2883
+ assert.ok(result.stderr.includes('references missing path'), 'Should report missing path');
2884
+ cleanupTestDir(testDir);
2885
+ })) passed++; else failed++;
2886
+
2887
+ if (test('fails when two install modules claim the same path', () => {
2888
+ const testDir = createTestDir();
2889
+ writeJson(path.join(testDir, 'manifests', 'install-modules.json'), {
2890
+ version: 1,
2891
+ modules: [
2892
+ {
2893
+ id: 'agents-core',
2894
+ kind: 'agents',
2895
+ description: 'Agents',
2896
+ paths: ['agents'],
2897
+ targets: ['codex'],
2898
+ dependencies: [],
2899
+ defaultInstall: true,
2900
+ cost: 'light',
2901
+ stability: 'stable'
2902
+ },
2903
+ {
2904
+ id: 'commands-core',
2905
+ kind: 'commands',
2906
+ description: 'Commands',
2907
+ paths: ['agents'],
2908
+ targets: ['codex'],
2909
+ dependencies: [],
2910
+ defaultInstall: true,
2911
+ cost: 'light',
2912
+ stability: 'stable'
2913
+ }
2914
+ ]
2915
+ });
2916
+ writeJson(path.join(testDir, 'manifests', 'install-profiles.json'), {
2917
+ version: 1,
2918
+ profiles: {
2919
+ core: { description: 'Core', modules: ['agents-core', 'commands-core'] },
2920
+ developer: { description: 'Developer', modules: ['agents-core', 'commands-core'] },
2921
+ security: { description: 'Security', modules: ['agents-core', 'commands-core'] },
2922
+ research: { description: 'Research', modules: ['agents-core', 'commands-core'] },
2923
+ full: { description: 'Full', modules: ['agents-core', 'commands-core'] }
2924
+ }
2925
+ });
2926
+ writeInstallComponentsManifest(testDir, [
2927
+ {
2928
+ id: 'baseline:agents',
2929
+ family: 'baseline',
2930
+ description: 'Agents',
2931
+ modules: ['agents-core']
2932
+ },
2933
+ {
2934
+ id: 'baseline:commands',
2935
+ family: 'baseline',
2936
+ description: 'Commands',
2937
+ modules: ['commands-core']
2938
+ }
2939
+ ]);
2940
+ fs.mkdirSync(path.join(testDir, 'agents'), { recursive: true });
2941
+
2942
+ const result = runValidatorWithDirs('validate-install-manifests', {
2943
+ REPO_ROOT: testDir,
2944
+ MODULES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-modules.json'),
2945
+ PROFILES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-profiles.json'),
2946
+ COMPONENTS_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-components.json'),
2947
+ MODULES_SCHEMA_PATH: modulesSchemaPath,
2948
+ PROFILES_SCHEMA_PATH: profilesSchemaPath,
2949
+ COMPONENTS_SCHEMA_PATH: componentsSchemaPath
2950
+ });
2951
+ assert.strictEqual(result.code, 1, 'Should fail on duplicate claimed paths');
2952
+ assert.ok(result.stderr.includes('claimed by both'), 'Should report duplicate path claims');
2953
+ cleanupTestDir(testDir);
2954
+ })) passed++; else failed++;
2955
+
2956
+ if (test('fails when an install profile references an unknown module', () => {
2957
+ const testDir = createTestDir();
2958
+ writeJson(path.join(testDir, 'manifests', 'install-modules.json'), {
2959
+ version: 1,
2960
+ modules: [
2961
+ {
2962
+ id: 'rules-core',
2963
+ kind: 'rules',
2964
+ description: 'Rules',
2965
+ paths: ['rules'],
2966
+ targets: ['claude'],
2967
+ dependencies: [],
2968
+ defaultInstall: true,
2969
+ cost: 'light',
2970
+ stability: 'stable'
2971
+ }
2972
+ ]
2973
+ });
2974
+ writeJson(path.join(testDir, 'manifests', 'install-profiles.json'), {
2975
+ version: 1,
2976
+ profiles: {
2977
+ core: { description: 'Core', modules: ['rules-core'] },
2978
+ developer: { description: 'Developer', modules: ['rules-core'] },
2979
+ security: { description: 'Security', modules: ['rules-core'] },
2980
+ research: { description: 'Research', modules: ['rules-core'] },
2981
+ full: { description: 'Full', modules: ['rules-core', 'ghost-module'] }
2982
+ }
2983
+ });
2984
+ writeInstallComponentsManifest(testDir, [
2985
+ {
2986
+ id: 'baseline:rules',
2987
+ family: 'baseline',
2988
+ description: 'Rules',
2989
+ modules: ['rules-core']
2990
+ }
2991
+ ]);
2992
+ fs.mkdirSync(path.join(testDir, 'rules'), { recursive: true });
2993
+
2994
+ const result = runValidatorWithDirs('validate-install-manifests', {
2995
+ REPO_ROOT: testDir,
2996
+ MODULES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-modules.json'),
2997
+ PROFILES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-profiles.json'),
2998
+ COMPONENTS_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-components.json'),
2999
+ MODULES_SCHEMA_PATH: modulesSchemaPath,
3000
+ PROFILES_SCHEMA_PATH: profilesSchemaPath,
3001
+ COMPONENTS_SCHEMA_PATH: componentsSchemaPath
3002
+ });
3003
+ assert.strictEqual(result.code, 1, 'Should fail on unknown profile module');
3004
+ assert.ok(result.stderr.includes('references unknown module ghost-module'),
3005
+ 'Should report unknown module reference');
3006
+ cleanupTestDir(testDir);
3007
+ })) passed++; else failed++;
3008
+
3009
+ if (test('passes on a valid standalone install manifest fixture', () => {
3010
+ const testDir = createTestDir();
3011
+ writeJson(path.join(testDir, 'manifests', 'install-modules.json'), {
3012
+ version: 1,
3013
+ modules: [
3014
+ {
3015
+ id: 'rules-core',
3016
+ kind: 'rules',
3017
+ description: 'Rules',
3018
+ paths: ['rules'],
3019
+ targets: ['claude'],
3020
+ dependencies: [],
3021
+ defaultInstall: true,
3022
+ cost: 'light',
3023
+ stability: 'stable'
3024
+ },
3025
+ {
3026
+ id: 'orchestration',
3027
+ kind: 'orchestration',
3028
+ description: 'Orchestration',
3029
+ paths: ['scripts/orchestrate-worktrees.js'],
3030
+ targets: ['codex'],
3031
+ dependencies: ['rules-core'],
3032
+ defaultInstall: false,
3033
+ cost: 'medium',
3034
+ stability: 'beta'
3035
+ }
3036
+ ]
3037
+ });
3038
+ writeJson(path.join(testDir, 'manifests', 'install-profiles.json'), {
3039
+ version: 1,
3040
+ profiles: {
3041
+ core: { description: 'Core', modules: ['rules-core'] },
3042
+ developer: { description: 'Developer', modules: ['rules-core', 'orchestration'] },
3043
+ security: { description: 'Security', modules: ['rules-core'] },
3044
+ research: { description: 'Research', modules: ['rules-core'] },
3045
+ full: { description: 'Full', modules: ['rules-core', 'orchestration'] }
3046
+ }
3047
+ });
3048
+ writeInstallComponentsManifest(testDir, [
3049
+ {
3050
+ id: 'baseline:rules',
3051
+ family: 'baseline',
3052
+ description: 'Rules',
3053
+ modules: ['rules-core']
3054
+ },
3055
+ {
3056
+ id: 'capability:orchestration',
3057
+ family: 'capability',
3058
+ description: 'Orchestration',
3059
+ modules: ['orchestration']
3060
+ }
3061
+ ]);
3062
+ fs.mkdirSync(path.join(testDir, 'rules'), { recursive: true });
3063
+ fs.mkdirSync(path.join(testDir, 'scripts'), { recursive: true });
3064
+ fs.writeFileSync(path.join(testDir, 'scripts', 'orchestrate-worktrees.js'), '#!/usr/bin/env node\n');
3065
+
3066
+ const result = runValidatorWithDirs('validate-install-manifests', {
3067
+ REPO_ROOT: testDir,
3068
+ MODULES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-modules.json'),
3069
+ PROFILES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-profiles.json'),
3070
+ COMPONENTS_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-components.json'),
3071
+ MODULES_SCHEMA_PATH: modulesSchemaPath,
3072
+ PROFILES_SCHEMA_PATH: profilesSchemaPath,
3073
+ COMPONENTS_SCHEMA_PATH: componentsSchemaPath
3074
+ });
3075
+ assert.strictEqual(result.code, 0, `Should pass valid fixture, got stderr: ${result.stderr}`);
3076
+ assert.ok(result.stdout.includes('Validated 2 install modules, 2 install components, and 5 profiles'),
3077
+ 'Should report validated install manifest counts');
3078
+ cleanupTestDir(testDir);
3079
+ })) passed++; else failed++;
3080
+
3081
+ if (test('fails when an install component references an unknown module', () => {
3082
+ const testDir = createTestDir();
3083
+ writeJson(path.join(testDir, 'manifests', 'install-modules.json'), {
3084
+ version: 1,
3085
+ modules: [
3086
+ {
3087
+ id: 'rules-core',
3088
+ kind: 'rules',
3089
+ description: 'Rules',
3090
+ paths: ['rules'],
3091
+ targets: ['claude'],
3092
+ dependencies: [],
3093
+ defaultInstall: true,
3094
+ cost: 'light',
3095
+ stability: 'stable'
3096
+ }
3097
+ ]
3098
+ });
3099
+ writeJson(path.join(testDir, 'manifests', 'install-profiles.json'), {
3100
+ version: 1,
3101
+ profiles: {
3102
+ core: { description: 'Core', modules: ['rules-core'] },
3103
+ developer: { description: 'Developer', modules: ['rules-core'] },
3104
+ security: { description: 'Security', modules: ['rules-core'] },
3105
+ research: { description: 'Research', modules: ['rules-core'] },
3106
+ full: { description: 'Full', modules: ['rules-core'] }
3107
+ }
3108
+ });
3109
+ writeInstallComponentsManifest(testDir, [
3110
+ {
3111
+ id: 'capability:security',
3112
+ family: 'capability',
3113
+ description: 'Security',
3114
+ modules: ['ghost-module']
3115
+ }
3116
+ ]);
3117
+ fs.mkdirSync(path.join(testDir, 'rules'), { recursive: true });
3118
+
3119
+ const result = runValidatorWithDirs('validate-install-manifests', {
3120
+ REPO_ROOT: testDir,
3121
+ MODULES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-modules.json'),
3122
+ PROFILES_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-profiles.json'),
3123
+ COMPONENTS_MANIFEST_PATH: path.join(testDir, 'manifests', 'install-components.json'),
3124
+ MODULES_SCHEMA_PATH: modulesSchemaPath,
3125
+ PROFILES_SCHEMA_PATH: profilesSchemaPath,
3126
+ COMPONENTS_SCHEMA_PATH: componentsSchemaPath
3127
+ });
3128
+ assert.strictEqual(result.code, 1, 'Should fail on unknown component module');
3129
+ assert.ok(result.stderr.includes('references unknown module ghost-module'),
3130
+ 'Should report unknown component module');
3131
+ cleanupTestDir(testDir);
3132
+ })) passed++; else failed++;
3133
+
3134
+ // Summary
3135
+ console.log(`\nResults: Passed: ${passed}, Failed: ${failed}`);
3136
+ process.exit(failed > 0 ? 1 : 0);
3137
+ }
3138
+
3139
+ runTests();