winter-super-cli 2026.5.32 → 2026.6.5

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 (3100) hide show
  1. package/README.md +9 -5
  2. package/bin/winter.js +39 -4
  3. package/package.json +22 -3
  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 +240 -0
  3067. package/src/ai/capability-scorecard.js +241 -0
  3068. package/src/ai/orchestrator.js +478 -0
  3069. package/src/ai/profile-blueprints.js +135 -0
  3070. package/src/ai/prompts/system-prompt.js +14 -4
  3071. package/src/ai/providers.js +73 -0
  3072. package/src/ai/small-model-amplifier.js +37 -0
  3073. package/src/ai/workflow-selector.js +154 -0
  3074. package/src/cli/at-context.js +269 -0
  3075. package/src/cli/commands.js +663 -0
  3076. package/src/cli/composer.js +361 -0
  3077. package/src/cli/config.js +12 -1
  3078. package/src/cli/context-loader.js +20 -3
  3079. package/src/cli/conversation-format.js +11 -210
  3080. package/src/cli/diagnostics.js +101 -0
  3081. package/src/cli/diff-view.js +341 -0
  3082. package/src/cli/ecc.js +274 -0
  3083. package/src/cli/input-controller.js +263 -0
  3084. package/src/cli/project-docs.js +2 -0
  3085. package/src/cli/prompt-builder.js +58 -13
  3086. package/src/cli/repl-commands.js +358 -10
  3087. package/src/cli/repl.js +1120 -389
  3088. package/src/cli/slash-commands.js +22 -1
  3089. package/src/cli/snowflake-logo.js +20 -10
  3090. package/src/cli/terminal-ui.js +92 -40
  3091. package/src/cli/tool-call-adapter.js +327 -0
  3092. package/src/cli/tool-runtime.js +115 -0
  3093. package/src/codebase-index/indexer.js +402 -0
  3094. package/src/codebase-index/search.js +176 -0
  3095. package/src/codebase-index/watcher.js +117 -0
  3096. package/src/context/token-juice.js +166 -0
  3097. package/src/context/wiki-memory.js +212 -0
  3098. package/src/integrations/htmlfx-manager.js +111 -0
  3099. package/src/mcp/inline-complete.js +226 -0
  3100. package/src/tools/executor.js +188 -1
@@ -0,0 +1,2648 @@
1
+ /**
2
+ * Tests for scripts/lib/utils.js
3
+ *
4
+ * Run with: node tests/lib/utils.test.js
5
+ */
6
+
7
+ const assert = require('assert');
8
+ const path = require('path');
9
+ const fs = require('fs');
10
+ const { spawnSync } = require('child_process');
11
+
12
+ // Import the module
13
+ const utils = require('../../scripts/lib/utils');
14
+
15
+ // Test helper
16
+ function test(name, fn) {
17
+ try {
18
+ fn();
19
+ console.log(` ✓ ${name}`);
20
+ return true;
21
+ } catch (err) {
22
+ console.log(` ✗ ${name}`);
23
+ console.log(` Error: ${err.message}`);
24
+ return false;
25
+ }
26
+ }
27
+
28
+ // Test suite
29
+ function runTests() {
30
+ const rocketParty = String.fromCodePoint(0x1F680, 0x1F389);
31
+ const partyEmoji = String.fromCodePoint(0x1F389);
32
+ console.log('\n=== Testing utils.js ===\n');
33
+
34
+ let passed = 0;
35
+ let failed = 0;
36
+
37
+ // Platform detection tests
38
+ console.log('Platform Detection:');
39
+
40
+ if (test('isWindows/isMacOS/isLinux are booleans', () => {
41
+ assert.strictEqual(typeof utils.isWindows, 'boolean');
42
+ assert.strictEqual(typeof utils.isMacOS, 'boolean');
43
+ assert.strictEqual(typeof utils.isLinux, 'boolean');
44
+ })) passed++; else failed++;
45
+
46
+ if (test('exactly one platform should be true', () => {
47
+ const platforms = [utils.isWindows, utils.isMacOS, utils.isLinux];
48
+ const trueCount = platforms.filter(p => p).length;
49
+ // Note: Could be 0 on other platforms like FreeBSD
50
+ assert.ok(trueCount <= 1, 'More than one platform is true');
51
+ })) passed++; else failed++;
52
+
53
+ // Directory functions tests
54
+ console.log('\nDirectory Functions:');
55
+
56
+ if (test('getHomeDir returns valid path', () => {
57
+ const home = utils.getHomeDir();
58
+ assert.strictEqual(typeof home, 'string');
59
+ assert.ok(home.length > 0, 'Home dir should not be empty');
60
+ assert.ok(fs.existsSync(home), 'Home dir should exist');
61
+ })) passed++; else failed++;
62
+
63
+ if (test('getHomeDir prefers HOME override when set', () => {
64
+ const originalHome = process.env.HOME;
65
+ const originalUserProfile = process.env.USERPROFILE;
66
+ const fakeHome = path.join(process.cwd(), 'tmp-home-override');
67
+ try {
68
+ process.env.HOME = fakeHome;
69
+ process.env.USERPROFILE = '';
70
+ assert.strictEqual(utils.getHomeDir(), fakeHome);
71
+ } finally {
72
+ if (originalHome === undefined) {
73
+ delete process.env.HOME;
74
+ } else {
75
+ process.env.HOME = originalHome;
76
+ }
77
+ if (originalUserProfile === undefined) {
78
+ delete process.env.USERPROFILE;
79
+ } else {
80
+ process.env.USERPROFILE = originalUserProfile;
81
+ }
82
+ }
83
+ })) passed++; else failed++;
84
+
85
+ if (test('getHomeDir falls back to USERPROFILE when HOME is empty', () => {
86
+ const originalHome = process.env.HOME;
87
+ const originalUserProfile = process.env.USERPROFILE;
88
+ const fakeHome = path.join(process.cwd(), 'tmp-userprofile-override');
89
+ try {
90
+ process.env.HOME = '';
91
+ process.env.USERPROFILE = fakeHome;
92
+ assert.strictEqual(utils.getHomeDir(), fakeHome);
93
+ } finally {
94
+ if (originalHome === undefined) {
95
+ delete process.env.HOME;
96
+ } else {
97
+ process.env.HOME = originalHome;
98
+ }
99
+ if (originalUserProfile === undefined) {
100
+ delete process.env.USERPROFILE;
101
+ } else {
102
+ process.env.USERPROFILE = originalUserProfile;
103
+ }
104
+ }
105
+ })) passed++; else failed++;
106
+
107
+ if (test('getClaudeDir returns path under home', () => {
108
+ const claudeDir = utils.getClaudeDir();
109
+ const homeDir = utils.getHomeDir();
110
+ assert.ok(claudeDir.startsWith(homeDir), 'Claude dir should be under home');
111
+ assert.ok(claudeDir.includes('.claude'), 'Should contain .claude');
112
+ })) passed++; else failed++;
113
+
114
+ if (test('getSessionsDir returns path under Claude dir', () => {
115
+ const sessionsDir = utils.getSessionsDir();
116
+ const claudeDir = utils.getClaudeDir();
117
+ assert.ok(sessionsDir.startsWith(claudeDir), 'Sessions should be under Claude dir');
118
+ assert.ok(sessionsDir.endsWith(path.join('.claude', 'session-data')) || sessionsDir.endsWith('/.claude/session-data'), 'Should use canonical session-data directory');
119
+ })) passed++; else failed++;
120
+
121
+ if (test('getSessionSearchDirs includes canonical and legacy paths', () => {
122
+ const searchDirs = utils.getSessionSearchDirs();
123
+ assert.strictEqual(searchDirs[0], utils.getSessionsDir(), 'Canonical session dir should be searched first');
124
+ assert.strictEqual(searchDirs[1], utils.getLegacySessionsDir(), 'Legacy session dir should be searched second');
125
+ })) passed++; else failed++;
126
+
127
+ if (test('getTempDir returns valid temp directory', () => {
128
+ const tempDir = utils.getTempDir();
129
+ assert.strictEqual(typeof tempDir, 'string');
130
+ assert.ok(tempDir.length > 0, 'Temp dir should not be empty');
131
+ })) passed++; else failed++;
132
+
133
+ if (test('ensureDir creates directory', () => {
134
+ const testDir = path.join(utils.getTempDir(), `utils-test-${Date.now()}`);
135
+ try {
136
+ utils.ensureDir(testDir);
137
+ assert.ok(fs.existsSync(testDir), 'Directory should be created');
138
+ } finally {
139
+ fs.rmSync(testDir, { recursive: true, force: true });
140
+ }
141
+ })) passed++; else failed++;
142
+
143
+ // Date/Time functions tests
144
+ console.log('\nDate/Time Functions:');
145
+
146
+ if (test('getDateString returns YYYY-MM-DD format', () => {
147
+ const date = utils.getDateString();
148
+ assert.ok(/^\d{4}-\d{2}-\d{2}$/.test(date), `Expected YYYY-MM-DD, got ${date}`);
149
+ })) passed++; else failed++;
150
+
151
+ if (test('getTimeString returns HH:MM format', () => {
152
+ const time = utils.getTimeString();
153
+ assert.ok(/^\d{2}:\d{2}$/.test(time), `Expected HH:MM, got ${time}`);
154
+ })) passed++; else failed++;
155
+
156
+ if (test('getDateTimeString returns full datetime format', () => {
157
+ const dt = utils.getDateTimeString();
158
+ assert.ok(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dt), `Expected YYYY-MM-DD HH:MM:SS, got ${dt}`);
159
+ })) passed++; else failed++;
160
+
161
+ // Project name tests
162
+ console.log('\nProject Name Functions:');
163
+
164
+ if (test('getGitRepoName returns string or null', () => {
165
+ const repoName = utils.getGitRepoName();
166
+ assert.ok(repoName === null || typeof repoName === 'string');
167
+ })) passed++; else failed++;
168
+
169
+ if (test('getProjectName returns non-empty string', () => {
170
+ const name = utils.getProjectName();
171
+ assert.ok(name && name.length > 0);
172
+ })) passed++; else failed++;
173
+
174
+ // sanitizeSessionId tests
175
+ console.log('\nsanitizeSessionId:');
176
+
177
+ if (test('sanitizeSessionId strips leading dots', () => {
178
+ assert.strictEqual(utils.sanitizeSessionId('.claude'), 'claude');
179
+ })) passed++; else failed++;
180
+
181
+ if (test('sanitizeSessionId replaces dots and spaces', () => {
182
+ assert.strictEqual(utils.sanitizeSessionId('my.project'), 'my-project');
183
+ assert.strictEqual(utils.sanitizeSessionId('my project'), 'my-project');
184
+ })) passed++; else failed++;
185
+
186
+ if (test('sanitizeSessionId replaces special chars and collapses runs', () => {
187
+ assert.strictEqual(utils.sanitizeSessionId('project@v2'), 'project-v2');
188
+ assert.strictEqual(utils.sanitizeSessionId('a...b'), 'a-b');
189
+ })) passed++; else failed++;
190
+
191
+ if (test('sanitizeSessionId preserves valid chars', () => {
192
+ assert.strictEqual(utils.sanitizeSessionId('my-project_123'), 'my-project_123');
193
+ })) passed++; else failed++;
194
+
195
+ if (test('sanitizeSessionId appends hash suffix for all Windows reserved device names', () => {
196
+ for (const reservedName of ['CON', 'prn', 'Aux', 'nul', 'COM1', 'lpt9']) {
197
+ const sanitized = utils.sanitizeSessionId(reservedName);
198
+ assert.ok(sanitized, `Expected sanitized output for ${reservedName}`);
199
+ assert.notStrictEqual(sanitized.toUpperCase(), reservedName.toUpperCase());
200
+ assert.ok(/-[a-f0-9]{6}$/i.test(sanitized), `Expected deterministic hash suffix for ${reservedName}, got ${sanitized}`);
201
+ }
202
+ })) passed++; else failed++;
203
+
204
+ if (test('sanitizeSessionId returns null for empty or punctuation-only values', () => {
205
+ assert.strictEqual(utils.sanitizeSessionId(''), null);
206
+ assert.strictEqual(utils.sanitizeSessionId(null), null);
207
+ assert.strictEqual(utils.sanitizeSessionId(undefined), null);
208
+ assert.strictEqual(utils.sanitizeSessionId('...'), null);
209
+ assert.strictEqual(utils.sanitizeSessionId('…'), null);
210
+ })) passed++; else failed++;
211
+
212
+ if (test('sanitizeSessionId returns stable hashes for non-ASCII values', () => {
213
+ const chinese = utils.sanitizeSessionId('我的项目');
214
+ const cyrillic = utils.sanitizeSessionId('проект');
215
+ const emoji = utils.sanitizeSessionId(rocketParty);
216
+ assert.ok(/^[a-f0-9]{8}$/.test(chinese), `Expected 8-char hash, got: ${chinese}`);
217
+ assert.ok(/^[a-f0-9]{8}$/.test(cyrillic), `Expected 8-char hash, got: ${cyrillic}`);
218
+ assert.ok(/^[a-f0-9]{8}$/.test(emoji), `Expected 8-char hash, got: ${emoji}`);
219
+ assert.notStrictEqual(chinese, cyrillic);
220
+ assert.notStrictEqual(chinese, emoji);
221
+ assert.strictEqual(utils.sanitizeSessionId('日本語プロジェクト'), utils.sanitizeSessionId('日本語プロジェクト'));
222
+ })) passed++; else failed++;
223
+
224
+ if (test('sanitizeSessionId disambiguates mixed-script names from pure ASCII', () => {
225
+ const mixed = utils.sanitizeSessionId('我的app');
226
+ const mixedTwo = utils.sanitizeSessionId('他的app');
227
+ const pure = utils.sanitizeSessionId('app');
228
+ assert.strictEqual(pure, 'app');
229
+ assert.ok(mixed.startsWith('app-'), `Expected mixed-script prefix, got: ${mixed}`);
230
+ assert.notStrictEqual(mixed, pure);
231
+ assert.notStrictEqual(mixed, mixedTwo);
232
+ })) passed++; else failed++;
233
+
234
+ if (test('sanitizeSessionId is idempotent', () => {
235
+ for (const input of ['.claude', 'my.project', 'project@v2', 'a...b', 'my-project_123']) {
236
+ const once = utils.sanitizeSessionId(input);
237
+ const twice = utils.sanitizeSessionId(once);
238
+ assert.strictEqual(once, twice, `Expected idempotent result for ${input}`);
239
+ }
240
+ })) passed++; else failed++;
241
+
242
+ if (test('sanitizeSessionId preserves readable prefixes for Windows reserved device names', () => {
243
+ const con = utils.sanitizeSessionId('CON');
244
+ const aux = utils.sanitizeSessionId('aux');
245
+ assert.ok(con.startsWith('CON-'), `Expected CON to get a suffix, got: ${con}`);
246
+ assert.ok(aux.startsWith('aux-'), `Expected aux to get a suffix, got: ${aux}`);
247
+ assert.notStrictEqual(utils.sanitizeSessionId('COM1'), 'COM1');
248
+ })) passed++; else failed++;
249
+
250
+ // Session ID tests
251
+ console.log('\nSession ID Functions:');
252
+
253
+ if (test('getSessionIdShort falls back to sanitized project name', () => {
254
+ const original = process.env.CLAUDE_SESSION_ID;
255
+ delete process.env.CLAUDE_SESSION_ID;
256
+ try {
257
+ const shortId = utils.getSessionIdShort();
258
+ assert.strictEqual(shortId, utils.sanitizeSessionId(utils.getProjectName()));
259
+ } finally {
260
+ if (original !== undefined) process.env.CLAUDE_SESSION_ID = original;
261
+ else delete process.env.CLAUDE_SESSION_ID;
262
+ }
263
+ })) passed++; else failed++;
264
+
265
+ if (test('getSessionIdShort returns last 8 characters', () => {
266
+ const original = process.env.CLAUDE_SESSION_ID;
267
+ process.env.CLAUDE_SESSION_ID = 'test-session-abc12345';
268
+ try {
269
+ assert.strictEqual(utils.getSessionIdShort(), 'abc12345');
270
+ } finally {
271
+ if (original) process.env.CLAUDE_SESSION_ID = original;
272
+ else delete process.env.CLAUDE_SESSION_ID;
273
+ }
274
+ })) passed++; else failed++;
275
+
276
+ if (test('getSessionIdShort handles short session IDs', () => {
277
+ const original = process.env.CLAUDE_SESSION_ID;
278
+ process.env.CLAUDE_SESSION_ID = 'short';
279
+ try {
280
+ assert.strictEqual(utils.getSessionIdShort(), 'short');
281
+ } finally {
282
+ if (original) process.env.CLAUDE_SESSION_ID = original;
283
+ else delete process.env.CLAUDE_SESSION_ID;
284
+ }
285
+ })) passed++; else failed++;
286
+
287
+ if (test('getSessionIdShort sanitizes explicit fallback parameter', () => {
288
+ if (process.platform === 'win32') {
289
+ console.log(' (skipped — root CWD differs on Windows)');
290
+ return true;
291
+ }
292
+
293
+ const utilsPath = path.join(__dirname, '..', '..', 'scripts', 'lib', 'utils.js');
294
+ const script = `
295
+ const utils = require('${utilsPath.replace(/'/g, "\\'")}');
296
+ process.stdout.write(utils.getSessionIdShort('my.fallback'));
297
+ `;
298
+ const result = spawnSync('node', ['-e', script], {
299
+ encoding: 'utf8',
300
+ cwd: '/',
301
+ env: { ...process.env, CLAUDE_SESSION_ID: '' },
302
+ timeout: 10000
303
+ });
304
+
305
+ assert.strictEqual(result.status, 0, `Expected exit 0, got ${result.status}. stderr: ${result.stderr}`);
306
+ assert.strictEqual(result.stdout, 'my-fallback');
307
+ })) passed++; else failed++;
308
+
309
+ // File operations tests
310
+ console.log('\nFile Operations:');
311
+
312
+ if (test('readFile returns null for non-existent file', () => {
313
+ const content = utils.readFile('/non/existent/file/path.txt');
314
+ assert.strictEqual(content, null);
315
+ })) passed++; else failed++;
316
+
317
+ if (test('writeFile and readFile work together', () => {
318
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
319
+ const testContent = 'Hello, World!';
320
+ try {
321
+ utils.writeFile(testFile, testContent);
322
+ const read = utils.readFile(testFile);
323
+ assert.strictEqual(read, testContent);
324
+ } finally {
325
+ fs.unlinkSync(testFile);
326
+ }
327
+ })) passed++; else failed++;
328
+
329
+ if (test('appendFile adds content to file', () => {
330
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
331
+ try {
332
+ utils.writeFile(testFile, 'Line 1\n');
333
+ utils.appendFile(testFile, 'Line 2\n');
334
+ const content = utils.readFile(testFile);
335
+ assert.strictEqual(content, 'Line 1\nLine 2\n');
336
+ } finally {
337
+ fs.unlinkSync(testFile);
338
+ }
339
+ })) passed++; else failed++;
340
+
341
+ if (test('replaceInFile replaces text', () => {
342
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
343
+ try {
344
+ utils.writeFile(testFile, 'Hello, World!');
345
+ utils.replaceInFile(testFile, /World/, 'Universe');
346
+ const content = utils.readFile(testFile);
347
+ assert.strictEqual(content, 'Hello, Universe!');
348
+ } finally {
349
+ fs.unlinkSync(testFile);
350
+ }
351
+ })) passed++; else failed++;
352
+
353
+ if (test('countInFile counts occurrences', () => {
354
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
355
+ try {
356
+ utils.writeFile(testFile, 'foo bar foo baz foo');
357
+ const count = utils.countInFile(testFile, /foo/g);
358
+ assert.strictEqual(count, 3);
359
+ } finally {
360
+ fs.unlinkSync(testFile);
361
+ }
362
+ })) passed++; else failed++;
363
+
364
+ if (test('grepFile finds matching lines', () => {
365
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
366
+ try {
367
+ utils.writeFile(testFile, 'line 1 foo\nline 2 bar\nline 3 foo');
368
+ const matches = utils.grepFile(testFile, /foo/);
369
+ assert.strictEqual(matches.length, 2);
370
+ assert.strictEqual(matches[0].lineNumber, 1);
371
+ assert.strictEqual(matches[1].lineNumber, 3);
372
+ } finally {
373
+ fs.unlinkSync(testFile);
374
+ }
375
+ })) passed++; else failed++;
376
+
377
+ // findFiles tests
378
+ console.log('\nfindFiles:');
379
+
380
+ if (test('findFiles returns empty for non-existent directory', () => {
381
+ const results = utils.findFiles('/non/existent/dir', '*.txt');
382
+ assert.strictEqual(results.length, 0);
383
+ })) passed++; else failed++;
384
+
385
+ if (test('findFiles finds matching files', () => {
386
+ const testDir = path.join(utils.getTempDir(), `utils-test-${Date.now()}`);
387
+ try {
388
+ fs.mkdirSync(testDir);
389
+ fs.writeFileSync(path.join(testDir, 'test1.txt'), 'content');
390
+ fs.writeFileSync(path.join(testDir, 'test2.txt'), 'content');
391
+ fs.writeFileSync(path.join(testDir, 'test.md'), 'content');
392
+
393
+ const txtFiles = utils.findFiles(testDir, '*.txt');
394
+ assert.strictEqual(txtFiles.length, 2);
395
+
396
+ const mdFiles = utils.findFiles(testDir, '*.md');
397
+ assert.strictEqual(mdFiles.length, 1);
398
+ } finally {
399
+ fs.rmSync(testDir, { recursive: true });
400
+ }
401
+ })) passed++; else failed++;
402
+
403
+ // Edge case tests for defensive code
404
+ console.log('\nEdge Cases:');
405
+
406
+ if (test('findFiles returns empty for null/undefined dir', () => {
407
+ assert.deepStrictEqual(utils.findFiles(null, '*.txt'), []);
408
+ assert.deepStrictEqual(utils.findFiles(undefined, '*.txt'), []);
409
+ assert.deepStrictEqual(utils.findFiles('', '*.txt'), []);
410
+ })) passed++; else failed++;
411
+
412
+ if (test('findFiles returns empty for null/undefined pattern', () => {
413
+ assert.deepStrictEqual(utils.findFiles('/tmp', null), []);
414
+ assert.deepStrictEqual(utils.findFiles('/tmp', undefined), []);
415
+ assert.deepStrictEqual(utils.findFiles('/tmp', ''), []);
416
+ })) passed++; else failed++;
417
+
418
+ if (test('findFiles supports maxAge filter', () => {
419
+ const testDir = path.join(utils.getTempDir(), `utils-test-maxage-${Date.now()}`);
420
+ try {
421
+ fs.mkdirSync(testDir);
422
+ fs.writeFileSync(path.join(testDir, 'recent.txt'), 'content');
423
+ const results = utils.findFiles(testDir, '*.txt', { maxAge: 1 });
424
+ assert.strictEqual(results.length, 1);
425
+ assert.ok(results[0].path.endsWith('recent.txt'));
426
+ } finally {
427
+ fs.rmSync(testDir, { recursive: true, force: true });
428
+ }
429
+ })) passed++; else failed++;
430
+
431
+ if (test('findFiles supports recursive option', () => {
432
+ const testDir = path.join(utils.getTempDir(), `utils-test-recursive-${Date.now()}`);
433
+ const subDir = path.join(testDir, 'sub');
434
+ try {
435
+ fs.mkdirSync(subDir, { recursive: true });
436
+ fs.writeFileSync(path.join(testDir, 'top.txt'), 'content');
437
+ fs.writeFileSync(path.join(subDir, 'nested.txt'), 'content');
438
+ // Without recursive: only top level
439
+ const shallow = utils.findFiles(testDir, '*.txt', { recursive: false });
440
+ assert.strictEqual(shallow.length, 1);
441
+ // With recursive: finds nested too
442
+ const deep = utils.findFiles(testDir, '*.txt', { recursive: true });
443
+ assert.strictEqual(deep.length, 2);
444
+ } finally {
445
+ fs.rmSync(testDir, { recursive: true, force: true });
446
+ }
447
+ })) passed++; else failed++;
448
+
449
+ if (test('countInFile handles invalid regex pattern', () => {
450
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
451
+ try {
452
+ utils.writeFile(testFile, 'test content');
453
+ const count = utils.countInFile(testFile, '(unclosed');
454
+ assert.strictEqual(count, 0);
455
+ } finally {
456
+ fs.unlinkSync(testFile);
457
+ }
458
+ })) passed++; else failed++;
459
+
460
+ if (test('countInFile handles non-string non-regex pattern', () => {
461
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
462
+ try {
463
+ utils.writeFile(testFile, 'test content');
464
+ const count = utils.countInFile(testFile, 42);
465
+ assert.strictEqual(count, 0);
466
+ } finally {
467
+ fs.unlinkSync(testFile);
468
+ }
469
+ })) passed++; else failed++;
470
+
471
+ if (test('countInFile enforces global flag on RegExp', () => {
472
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
473
+ try {
474
+ utils.writeFile(testFile, 'foo bar foo baz foo');
475
+ // RegExp without global flag — countInFile should still count all
476
+ const count = utils.countInFile(testFile, /foo/);
477
+ assert.strictEqual(count, 3);
478
+ } finally {
479
+ fs.unlinkSync(testFile);
480
+ }
481
+ })) passed++; else failed++;
482
+
483
+ if (test('grepFile handles invalid regex pattern', () => {
484
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
485
+ try {
486
+ utils.writeFile(testFile, 'test content');
487
+ const matches = utils.grepFile(testFile, '[invalid');
488
+ assert.deepStrictEqual(matches, []);
489
+ } finally {
490
+ fs.unlinkSync(testFile);
491
+ }
492
+ })) passed++; else failed++;
493
+
494
+ if (test('replaceInFile returns false for non-existent file', () => {
495
+ const result = utils.replaceInFile('/non/existent/file.txt', 'foo', 'bar');
496
+ assert.strictEqual(result, false);
497
+ })) passed++; else failed++;
498
+
499
+ if (test('countInFile returns 0 for non-existent file', () => {
500
+ const count = utils.countInFile('/non/existent/file.txt', /foo/g);
501
+ assert.strictEqual(count, 0);
502
+ })) passed++; else failed++;
503
+
504
+ if (test('grepFile returns empty for non-existent file', () => {
505
+ const matches = utils.grepFile('/non/existent/file.txt', /foo/);
506
+ assert.deepStrictEqual(matches, []);
507
+ })) passed++; else failed++;
508
+
509
+ if (test('commandExists rejects unsafe command names', () => {
510
+ assert.strictEqual(utils.commandExists('cmd; rm -rf'), false);
511
+ assert.strictEqual(utils.commandExists('$(whoami)'), false);
512
+ assert.strictEqual(utils.commandExists('cmd && echo hi'), false);
513
+ })) passed++; else failed++;
514
+
515
+ if (test('ensureDir is idempotent', () => {
516
+ const testDir = path.join(utils.getTempDir(), `utils-test-idem-${Date.now()}`);
517
+ try {
518
+ const result1 = utils.ensureDir(testDir);
519
+ const result2 = utils.ensureDir(testDir);
520
+ assert.strictEqual(result1, testDir);
521
+ assert.strictEqual(result2, testDir);
522
+ assert.ok(fs.existsSync(testDir));
523
+ } finally {
524
+ fs.rmSync(testDir, { recursive: true, force: true });
525
+ }
526
+ })) passed++; else failed++;
527
+
528
+ // System functions tests
529
+ console.log('\nSystem Functions:');
530
+
531
+ if (test('commandExists finds node', () => {
532
+ const exists = utils.commandExists('node');
533
+ assert.strictEqual(exists, true);
534
+ })) passed++; else failed++;
535
+
536
+ if (test('commandExists returns false for fake command', () => {
537
+ const exists = utils.commandExists('nonexistent_command_12345');
538
+ assert.strictEqual(exists, false);
539
+ })) passed++; else failed++;
540
+
541
+ if (test('runCommand executes simple command', () => {
542
+ const result = utils.runCommand('node --version');
543
+ assert.strictEqual(result.success, true);
544
+ assert.ok(result.output.startsWith('v'), 'Should start with v');
545
+ })) passed++; else failed++;
546
+
547
+ if (test('runCommand handles failed command', () => {
548
+ const result = utils.runCommand('node --invalid-flag-12345');
549
+ assert.strictEqual(result.success, false);
550
+ })) passed++; else failed++;
551
+
552
+ // output() and log() tests
553
+ console.log('\noutput() and log():');
554
+
555
+ if (test('output() writes string to stdout', () => {
556
+ // Capture stdout by temporarily replacing console.log
557
+ let captured = null;
558
+ const origLog = console.log;
559
+ console.log = (v) => { captured = v; };
560
+ try {
561
+ utils.output('hello');
562
+ assert.strictEqual(captured, 'hello');
563
+ } finally {
564
+ console.log = origLog;
565
+ }
566
+ })) passed++; else failed++;
567
+
568
+ if (test('output() JSON-stringifies objects', () => {
569
+ let captured = null;
570
+ const origLog = console.log;
571
+ console.log = (v) => { captured = v; };
572
+ try {
573
+ utils.output({ key: 'value', num: 42 });
574
+ assert.strictEqual(captured, '{"key":"value","num":42}');
575
+ } finally {
576
+ console.log = origLog;
577
+ }
578
+ })) passed++; else failed++;
579
+
580
+ if (test('output() JSON-stringifies null (typeof null === "object")', () => {
581
+ let captured = null;
582
+ const origLog = console.log;
583
+ console.log = (v) => { captured = v; };
584
+ try {
585
+ utils.output(null);
586
+ // typeof null === 'object' in JS, so it goes through JSON.stringify
587
+ assert.strictEqual(captured, 'null');
588
+ } finally {
589
+ console.log = origLog;
590
+ }
591
+ })) passed++; else failed++;
592
+
593
+ if (test('output() handles arrays as objects', () => {
594
+ let captured = null;
595
+ const origLog = console.log;
596
+ console.log = (v) => { captured = v; };
597
+ try {
598
+ utils.output([1, 2, 3]);
599
+ assert.strictEqual(captured, '[1,2,3]');
600
+ } finally {
601
+ console.log = origLog;
602
+ }
603
+ })) passed++; else failed++;
604
+
605
+ if (test('log() writes to stderr', () => {
606
+ let captured = null;
607
+ const origError = console.error;
608
+ console.error = (v) => { captured = v; };
609
+ try {
610
+ utils.log('test message');
611
+ assert.strictEqual(captured, 'test message');
612
+ } finally {
613
+ console.error = origError;
614
+ }
615
+ })) passed++; else failed++;
616
+
617
+ // isGitRepo() tests
618
+ console.log('\nisGitRepo():');
619
+
620
+ if (test('isGitRepo returns true in a git repo', () => {
621
+ // We're running from within the ECC repo, so this should be true
622
+ assert.strictEqual(utils.isGitRepo(), true);
623
+ })) passed++; else failed++;
624
+
625
+ // getGitModifiedFiles() tests
626
+ console.log('\ngetGitModifiedFiles():');
627
+
628
+ if (test('getGitModifiedFiles returns an array', () => {
629
+ const files = utils.getGitModifiedFiles();
630
+ assert.ok(Array.isArray(files));
631
+ })) passed++; else failed++;
632
+
633
+ if (test('getGitModifiedFiles filters by regex patterns', () => {
634
+ const files = utils.getGitModifiedFiles(['\\.NONEXISTENT_EXTENSION$']);
635
+ assert.ok(Array.isArray(files));
636
+ assert.strictEqual(files.length, 0);
637
+ })) passed++; else failed++;
638
+
639
+ if (test('getGitModifiedFiles skips invalid patterns', () => {
640
+ // Mix of valid and invalid patterns — should not throw
641
+ const files = utils.getGitModifiedFiles(['(unclosed', '\\.js$', '[invalid']);
642
+ assert.ok(Array.isArray(files));
643
+ })) passed++; else failed++;
644
+
645
+ if (test('getGitModifiedFiles skips non-string patterns', () => {
646
+ const files = utils.getGitModifiedFiles([null, undefined, 42, '', '\\.js$']);
647
+ assert.ok(Array.isArray(files));
648
+ })) passed++; else failed++;
649
+
650
+ // getLearnedSkillsDir() test
651
+ console.log('\ngetLearnedSkillsDir():');
652
+
653
+ if (test('getLearnedSkillsDir returns path under Claude dir', () => {
654
+ const dir = utils.getLearnedSkillsDir();
655
+ assert.ok(dir.includes('.claude'));
656
+ assert.ok(dir.includes('skills'));
657
+ assert.ok(dir.includes('learned'));
658
+ })) passed++; else failed++;
659
+
660
+ // replaceInFile behavior tests
661
+ console.log('\nreplaceInFile (behavior):');
662
+
663
+ if (test('replaces first match when regex has no g flag', () => {
664
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
665
+ try {
666
+ utils.writeFile(testFile, 'foo bar foo baz foo');
667
+ utils.replaceInFile(testFile, /foo/, 'qux');
668
+ const content = utils.readFile(testFile);
669
+ // Without g flag, only first 'foo' should be replaced
670
+ assert.strictEqual(content, 'qux bar foo baz foo');
671
+ } finally {
672
+ fs.unlinkSync(testFile);
673
+ }
674
+ })) passed++; else failed++;
675
+
676
+ if (test('replaces all matches when regex has g flag', () => {
677
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
678
+ try {
679
+ utils.writeFile(testFile, 'foo bar foo baz foo');
680
+ utils.replaceInFile(testFile, /foo/g, 'qux');
681
+ const content = utils.readFile(testFile);
682
+ assert.strictEqual(content, 'qux bar qux baz qux');
683
+ } finally {
684
+ fs.unlinkSync(testFile);
685
+ }
686
+ })) passed++; else failed++;
687
+
688
+ if (test('replaces with string search (first occurrence)', () => {
689
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
690
+ try {
691
+ utils.writeFile(testFile, 'hello world hello');
692
+ utils.replaceInFile(testFile, 'hello', 'goodbye');
693
+ const content = utils.readFile(testFile);
694
+ // String.replace with string search only replaces first
695
+ assert.strictEqual(content, 'goodbye world hello');
696
+ } finally {
697
+ fs.unlinkSync(testFile);
698
+ }
699
+ })) passed++; else failed++;
700
+
701
+ if (test('replaces all occurrences with string when options.all is true', () => {
702
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
703
+ try {
704
+ utils.writeFile(testFile, 'hello world hello again hello');
705
+ utils.replaceInFile(testFile, 'hello', 'goodbye', { all: true });
706
+ const content = utils.readFile(testFile);
707
+ assert.strictEqual(content, 'goodbye world goodbye again goodbye');
708
+ } finally {
709
+ fs.unlinkSync(testFile);
710
+ }
711
+ })) passed++; else failed++;
712
+
713
+ if (test('options.all is ignored for regex patterns', () => {
714
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
715
+ try {
716
+ utils.writeFile(testFile, 'foo bar foo');
717
+ // all option should be ignored for regex; only g flag matters
718
+ utils.replaceInFile(testFile, /foo/, 'qux', { all: true });
719
+ const content = utils.readFile(testFile);
720
+ assert.strictEqual(content, 'qux bar foo', 'Regex without g should still replace first only');
721
+ } finally {
722
+ fs.unlinkSync(testFile);
723
+ }
724
+ })) passed++; else failed++;
725
+
726
+ if (test('replaces with capture groups', () => {
727
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
728
+ try {
729
+ utils.writeFile(testFile, '**Last Updated:** 10:30');
730
+ utils.replaceInFile(testFile, /\*\*Last Updated:\*\*.*/, '**Last Updated:** 14:45');
731
+ const content = utils.readFile(testFile);
732
+ assert.strictEqual(content, '**Last Updated:** 14:45');
733
+ } finally {
734
+ fs.unlinkSync(testFile);
735
+ }
736
+ })) passed++; else failed++;
737
+
738
+ // writeFile edge cases
739
+ console.log('\nwriteFile (edge cases):');
740
+
741
+ if (test('writeFile overwrites existing content', () => {
742
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
743
+ try {
744
+ utils.writeFile(testFile, 'original');
745
+ utils.writeFile(testFile, 'replaced');
746
+ const content = utils.readFile(testFile);
747
+ assert.strictEqual(content, 'replaced');
748
+ } finally {
749
+ fs.unlinkSync(testFile);
750
+ }
751
+ })) passed++; else failed++;
752
+
753
+ if (test('writeFile handles unicode content', () => {
754
+ const testFile = path.join(utils.getTempDir(), `utils-test-${Date.now()}.txt`);
755
+ try {
756
+ const unicode = `日本語テスト ${String.fromCodePoint(0x1F680)} émojis`;
757
+ utils.writeFile(testFile, unicode);
758
+ const content = utils.readFile(testFile);
759
+ assert.strictEqual(content, unicode);
760
+ } finally {
761
+ fs.unlinkSync(testFile);
762
+ }
763
+ })) passed++; else failed++;
764
+
765
+ // findFiles with regex special characters in pattern
766
+ console.log('\nfindFiles (regex chars):');
767
+
768
+ if (test('findFiles handles regex special chars in pattern', () => {
769
+ const testDir = path.join(utils.getTempDir(), `utils-test-regex-${Date.now()}`);
770
+ try {
771
+ fs.mkdirSync(testDir);
772
+ // Create files with regex-special characters in names
773
+ fs.writeFileSync(path.join(testDir, 'file(1).txt'), 'content');
774
+ fs.writeFileSync(path.join(testDir, 'file+2.txt'), 'content');
775
+ fs.writeFileSync(path.join(testDir, 'file[3].txt'), 'content');
776
+
777
+ // These patterns should match literally, not as regex metacharacters
778
+ const parens = utils.findFiles(testDir, 'file(1).txt');
779
+ assert.strictEqual(parens.length, 1, 'Should match file(1).txt literally');
780
+
781
+ const plus = utils.findFiles(testDir, 'file+2.txt');
782
+ assert.strictEqual(plus.length, 1, 'Should match file+2.txt literally');
783
+
784
+ const brackets = utils.findFiles(testDir, 'file[3].txt');
785
+ assert.strictEqual(brackets.length, 1, 'Should match file[3].txt literally');
786
+ } finally {
787
+ fs.rmSync(testDir, { recursive: true, force: true });
788
+ }
789
+ })) passed++; else failed++;
790
+
791
+ if (test('findFiles wildcard still works with special chars', () => {
792
+ const testDir = path.join(utils.getTempDir(), `utils-test-glob-${Date.now()}`);
793
+ try {
794
+ fs.mkdirSync(testDir);
795
+ fs.writeFileSync(path.join(testDir, 'app(v2).js'), 'content');
796
+ fs.writeFileSync(path.join(testDir, 'app(v3).ts'), 'content');
797
+
798
+ const jsFiles = utils.findFiles(testDir, '*.js');
799
+ assert.strictEqual(jsFiles.length, 1);
800
+ assert.ok(jsFiles[0].path.endsWith('app(v2).js'));
801
+ } finally {
802
+ fs.rmSync(testDir, { recursive: true, force: true });
803
+ }
804
+ })) passed++; else failed++;
805
+
806
+ // readStdinJson tests (via subprocess — safe hardcoded inputs)
807
+ // Use execFileSync with input option instead of shell echo|pipe for Windows compat
808
+ console.log('\nreadStdinJson():');
809
+
810
+ const stdinScript = 'const u=require("./scripts/lib/utils");u.readStdinJson({timeoutMs:2000}).then(d=>{process.stdout.write(JSON.stringify(d))})';
811
+ const stdinOpts = { encoding: 'utf8', cwd: path.join(__dirname, '..', '..'), timeout: 5000 };
812
+
813
+ if (test('readStdinJson parses valid JSON from stdin', () => {
814
+ const { execFileSync } = require('child_process');
815
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: '{"tool_input":{"command":"ls"}}' });
816
+ const parsed = JSON.parse(result);
817
+ assert.deepStrictEqual(parsed, { tool_input: { command: 'ls' } });
818
+ })) passed++; else failed++;
819
+
820
+ if (test('readStdinJson returns {} for invalid JSON', () => {
821
+ const { execFileSync } = require('child_process');
822
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: 'not json' });
823
+ assert.deepStrictEqual(JSON.parse(result), {});
824
+ })) passed++; else failed++;
825
+
826
+ if (test('readStdinJson returns {} for empty stdin', () => {
827
+ const { execFileSync } = require('child_process');
828
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: '' });
829
+ assert.deepStrictEqual(JSON.parse(result), {});
830
+ })) passed++; else failed++;
831
+
832
+ if (test('readStdinJson handles nested objects', () => {
833
+ const { execFileSync } = require('child_process');
834
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: '{"a":{"b":1},"c":[1,2]}' });
835
+ const parsed = JSON.parse(result);
836
+ assert.deepStrictEqual(parsed, { a: { b: 1 }, c: [1, 2] });
837
+ })) passed++; else failed++;
838
+
839
+ // grepFile with global regex (regression: g flag causes alternating matches)
840
+ console.log('\ngrepFile (global regex fix):');
841
+
842
+ if (test('grepFile with /g flag finds ALL matching lines (not alternating)', () => {
843
+ const testFile = path.join(utils.getTempDir(), `utils-test-grep-g-${Date.now()}.txt`);
844
+ try {
845
+ // 4 consecutive lines matching the same pattern
846
+ utils.writeFile(testFile, 'match-line\nmatch-line\nmatch-line\nmatch-line');
847
+ // Bug: without fix, /match/g would only find lines 1 and 3 (alternating)
848
+ const matches = utils.grepFile(testFile, /match/g);
849
+ assert.strictEqual(matches.length, 4, `Should find all 4 lines, found ${matches.length}`);
850
+ assert.strictEqual(matches[0].lineNumber, 1);
851
+ assert.strictEqual(matches[1].lineNumber, 2);
852
+ assert.strictEqual(matches[2].lineNumber, 3);
853
+ assert.strictEqual(matches[3].lineNumber, 4);
854
+ } finally {
855
+ fs.unlinkSync(testFile);
856
+ }
857
+ })) passed++; else failed++;
858
+
859
+ if (test('grepFile preserves regex flags other than g (e.g. case-insensitive)', () => {
860
+ const testFile = path.join(utils.getTempDir(), `utils-test-grep-flags-${Date.now()}.txt`);
861
+ try {
862
+ utils.writeFile(testFile, 'FOO\nfoo\nFoO\nbar');
863
+ const matches = utils.grepFile(testFile, /foo/gi);
864
+ assert.strictEqual(matches.length, 3, `Should find 3 case-insensitive matches, found ${matches.length}`);
865
+ } finally {
866
+ fs.unlinkSync(testFile);
867
+ }
868
+ })) passed++; else failed++;
869
+
870
+ // commandExists edge cases
871
+ console.log('\ncommandExists Edge Cases:');
872
+
873
+ if (test('commandExists rejects empty string', () => {
874
+ assert.strictEqual(utils.commandExists(''), false, 'Empty string should not be a valid command');
875
+ })) passed++; else failed++;
876
+
877
+ if (test('commandExists rejects command with spaces', () => {
878
+ assert.strictEqual(utils.commandExists('my command'), false, 'Commands with spaces should be rejected');
879
+ })) passed++; else failed++;
880
+
881
+ if (test('commandExists rejects command with path separators', () => {
882
+ assert.strictEqual(utils.commandExists('/usr/bin/node'), false, 'Commands with / should be rejected');
883
+ assert.strictEqual(utils.commandExists('..\\cmd'), false, 'Commands with \\ should be rejected');
884
+ })) passed++; else failed++;
885
+
886
+ if (test('commandExists rejects shell metacharacters', () => {
887
+ assert.strictEqual(utils.commandExists('cmd;ls'), false, 'Semicolons should be rejected');
888
+ assert.strictEqual(utils.commandExists('$(whoami)'), false, 'Subshell syntax should be rejected');
889
+ assert.strictEqual(utils.commandExists('cmd|cat'), false, 'Pipes should be rejected');
890
+ })) passed++; else failed++;
891
+
892
+ if (test('commandExists allows dots and underscores', () => {
893
+ // These are valid chars per the regex check — the command might not exist
894
+ // but it shouldn't be rejected by the validator
895
+ const dotResult = utils.commandExists('definitely.not.a.real.tool.12345');
896
+ assert.strictEqual(typeof dotResult, 'boolean', 'Should return boolean, not throw');
897
+ })) passed++; else failed++;
898
+
899
+ // findFiles edge cases
900
+ console.log('\nfindFiles Edge Cases:');
901
+
902
+ if (test('findFiles with ? wildcard matches single character', () => {
903
+ const testDir = path.join(utils.getTempDir(), `ff-qmark-${Date.now()}`);
904
+ utils.ensureDir(testDir);
905
+ try {
906
+ fs.writeFileSync(path.join(testDir, 'a1.txt'), '');
907
+ fs.writeFileSync(path.join(testDir, 'b2.txt'), '');
908
+ fs.writeFileSync(path.join(testDir, 'abc.txt'), '');
909
+
910
+ const results = utils.findFiles(testDir, '??.txt');
911
+ const names = results.map(r => path.basename(r.path)).sort();
912
+ assert.deepStrictEqual(names, ['a1.txt', 'b2.txt'], 'Should match exactly 2-char basenames');
913
+ } finally {
914
+ fs.rmSync(testDir, { recursive: true, force: true });
915
+ }
916
+ })) passed++; else failed++;
917
+
918
+ if (test('findFiles sorts by mtime (newest first)', () => {
919
+ const testDir = path.join(utils.getTempDir(), `ff-sort-${Date.now()}`);
920
+ utils.ensureDir(testDir);
921
+ try {
922
+ const f1 = path.join(testDir, 'old.txt');
923
+ const f2 = path.join(testDir, 'new.txt');
924
+ fs.writeFileSync(f1, 'old');
925
+ // Set older mtime on first file
926
+ const past = new Date(Date.now() - 60000);
927
+ fs.utimesSync(f1, past, past);
928
+ fs.writeFileSync(f2, 'new');
929
+
930
+ const results = utils.findFiles(testDir, '*.txt');
931
+ assert.strictEqual(results.length, 2);
932
+ assert.ok(
933
+ path.basename(results[0].path) === 'new.txt',
934
+ `Newest file should be first, got ${path.basename(results[0].path)}`
935
+ );
936
+ } finally {
937
+ fs.rmSync(testDir, { recursive: true, force: true });
938
+ }
939
+ })) passed++; else failed++;
940
+
941
+ if (test('findFiles with maxAge filters old files', () => {
942
+ const testDir = path.join(utils.getTempDir(), `ff-age-${Date.now()}`);
943
+ utils.ensureDir(testDir);
944
+ try {
945
+ const recent = path.join(testDir, 'recent.txt');
946
+ const old = path.join(testDir, 'old.txt');
947
+ fs.writeFileSync(recent, 'new');
948
+ fs.writeFileSync(old, 'old');
949
+ // Set mtime to 30 days ago
950
+ const past = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
951
+ fs.utimesSync(old, past, past);
952
+
953
+ const results = utils.findFiles(testDir, '*.txt', { maxAge: 7 });
954
+ assert.strictEqual(results.length, 1, 'Should only return recent file');
955
+ assert.ok(results[0].path.includes('recent.txt'), 'Should return the recent file');
956
+ } finally {
957
+ fs.rmSync(testDir, { recursive: true, force: true });
958
+ }
959
+ })) passed++; else failed++;
960
+
961
+ // ensureDir edge cases
962
+ console.log('\nensureDir Edge Cases:');
963
+
964
+ if (test('ensureDir is safe for concurrent calls (EEXIST race)', () => {
965
+ const testDir = path.join(utils.getTempDir(), `ensure-race-${Date.now()}`, 'nested');
966
+ try {
967
+ // Call concurrently — both should succeed without throwing
968
+ const results = [utils.ensureDir(testDir), utils.ensureDir(testDir)];
969
+ assert.strictEqual(results[0], testDir);
970
+ assert.strictEqual(results[1], testDir);
971
+ assert.ok(fs.existsSync(testDir));
972
+ } finally {
973
+ fs.rmSync(path.dirname(testDir), { recursive: true, force: true });
974
+ }
975
+ })) passed++; else failed++;
976
+
977
+ if (test('ensureDir returns the directory path', () => {
978
+ const testDir = path.join(utils.getTempDir(), `ensure-ret-${Date.now()}`);
979
+ try {
980
+ const result = utils.ensureDir(testDir);
981
+ assert.strictEqual(result, testDir, 'Should return the directory path');
982
+ } finally {
983
+ fs.rmSync(testDir, { recursive: true, force: true });
984
+ }
985
+ })) passed++; else failed++;
986
+
987
+ // runCommand edge cases
988
+ console.log('\nrunCommand Edge Cases:');
989
+
990
+ if (test('runCommand returns trimmed output', () => {
991
+ // Windows echo includes quotes in output, use node to ensure consistent behavior
992
+ const result = utils.runCommand('node -e "process.stdout.write(\' hello \')"');
993
+ assert.strictEqual(result.success, true);
994
+ assert.strictEqual(result.output, 'hello', 'Should trim leading/trailing whitespace');
995
+ })) passed++; else failed++;
996
+
997
+ if (test('runCommand captures stderr on failure', () => {
998
+ const result = utils.runCommand('node -e "process.exit(1)"');
999
+ assert.strictEqual(result.success, false);
1000
+ assert.ok(typeof result.output === 'string', 'Output should be a string on failure');
1001
+ })) passed++; else failed++;
1002
+
1003
+ // getGitModifiedFiles edge cases
1004
+ console.log('\ngetGitModifiedFiles Edge Cases:');
1005
+
1006
+ if (test('getGitModifiedFiles returns array with empty patterns', () => {
1007
+ const files = utils.getGitModifiedFiles([]);
1008
+ assert.ok(Array.isArray(files), 'Should return array');
1009
+ })) passed++; else failed++;
1010
+
1011
+ // replaceInFile edge cases
1012
+ console.log('\nreplaceInFile Edge Cases:');
1013
+
1014
+ if (test('replaceInFile with regex capture groups works correctly', () => {
1015
+ const testFile = path.join(utils.getTempDir(), `replace-capture-${Date.now()}.txt`);
1016
+ try {
1017
+ utils.writeFile(testFile, 'version: 1.0.0');
1018
+ const result = utils.replaceInFile(testFile, /version: (\d+)\.(\d+)\.(\d+)/, 'version: $1.$2.99');
1019
+ assert.strictEqual(result, true);
1020
+ assert.strictEqual(utils.readFile(testFile), 'version: 1.0.99');
1021
+ } finally {
1022
+ fs.unlinkSync(testFile);
1023
+ }
1024
+ })) passed++; else failed++;
1025
+
1026
+ // readStdinJson (function API, not actual stdin — more thorough edge cases)
1027
+ console.log('\nreadStdinJson Edge Cases:');
1028
+
1029
+ if (test('readStdinJson type check: returns a Promise', () => {
1030
+ // readStdinJson returns a Promise regardless of stdin state
1031
+ const result = utils.readStdinJson({ timeoutMs: 100 });
1032
+ assert.ok(result instanceof Promise, 'Should return a Promise');
1033
+ // Don't await — just verify it's a Promise type
1034
+ })) passed++; else failed++;
1035
+
1036
+ // ── Round 28: readStdinJson maxSize truncation and edge cases ──
1037
+ console.log('\nreadStdinJson maxSize truncation:');
1038
+
1039
+ if (test('readStdinJson maxSize stops accumulating after threshold (chunk-level guard)', () => {
1040
+ if (process.platform === 'win32') {
1041
+ console.log(' (skipped — stdin chunking behavior differs on Windows)');
1042
+ return true;
1043
+ }
1044
+ const { execFileSync } = require('child_process');
1045
+ // maxSize is a chunk-level guard: once data.length >= maxSize, no MORE chunks are added.
1046
+ // A single small chunk that arrives when data.length < maxSize is added in full.
1047
+ // To test multi-chunk behavior, we send >64KB (Node default highWaterMark=16KB)
1048
+ // which should arrive in multiple chunks. With maxSize=100, only the first chunk(s)
1049
+ // totaling under 100 bytes should be captured; subsequent chunks are dropped.
1050
+ const script = 'const u=require("./scripts/lib/utils");u.readStdinJson({timeoutMs:2000,maxSize:100}).then(d=>{process.stdout.write(JSON.stringify(d))})';
1051
+ // Generate 100KB of data (arrives in multiple chunks)
1052
+ const bigInput = '{"k":"' + 'X'.repeat(100000) + '"}';
1053
+ const result = execFileSync('node', ['-e', script], { ...stdinOpts, input: bigInput });
1054
+ // Truncated mid-string → invalid JSON → resolves to {}
1055
+ assert.deepStrictEqual(JSON.parse(result), {});
1056
+ })) passed++; else failed++;
1057
+
1058
+ if (test('readStdinJson with maxSize large enough preserves valid JSON', () => {
1059
+ const { execFileSync } = require('child_process');
1060
+ const script = 'const u=require("./scripts/lib/utils");u.readStdinJson({timeoutMs:2000,maxSize:1024}).then(d=>{process.stdout.write(JSON.stringify(d))})';
1061
+ const input = JSON.stringify({ key: 'value' });
1062
+ const result = execFileSync('node', ['-e', script], { ...stdinOpts, input });
1063
+ assert.deepStrictEqual(JSON.parse(result), { key: 'value' });
1064
+ })) passed++; else failed++;
1065
+
1066
+ if (test('readStdinJson resolves {} for whitespace-only stdin', () => {
1067
+ const { execFileSync } = require('child_process');
1068
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: ' \n \t ' });
1069
+ // data.trim() is empty → resolves {}
1070
+ assert.deepStrictEqual(JSON.parse(result), {});
1071
+ })) passed++; else failed++;
1072
+
1073
+ if (test('readStdinJson handles JSON with trailing whitespace/newlines', () => {
1074
+ const { execFileSync } = require('child_process');
1075
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: '{"a":1} \n\n' });
1076
+ assert.deepStrictEqual(JSON.parse(result), { a: 1 });
1077
+ })) passed++; else failed++;
1078
+
1079
+ if (test('readStdinJson handles JSON with BOM prefix (returns {})', () => {
1080
+ const { execFileSync } = require('child_process');
1081
+ // BOM (\uFEFF) before JSON makes it invalid for JSON.parse
1082
+ const result = execFileSync('node', ['-e', stdinScript], { ...stdinOpts, input: '\uFEFF{"a":1}' });
1083
+ // BOM prefix makes JSON.parse fail → resolve {}
1084
+ assert.deepStrictEqual(JSON.parse(result), {});
1085
+ })) passed++; else failed++;
1086
+
1087
+ // ── Round 31: ensureDir error propagation ──
1088
+ console.log('\nensureDir Error Propagation (Round 31):');
1089
+
1090
+ if (test('ensureDir wraps non-EEXIST errors with descriptive message', () => {
1091
+ // Attempting to create a dir under a file should fail with ENOTDIR, not EEXIST
1092
+ const testFile = path.join(utils.getTempDir(), `ensure-err-${Date.now()}.txt`);
1093
+ try {
1094
+ fs.writeFileSync(testFile, 'blocking file');
1095
+ const badPath = path.join(testFile, 'subdir');
1096
+ assert.throws(
1097
+ () => utils.ensureDir(badPath),
1098
+ (err) => err.message.includes('Failed to create directory'),
1099
+ 'Should throw with descriptive "Failed to create directory" message'
1100
+ );
1101
+ } finally {
1102
+ fs.unlinkSync(testFile);
1103
+ }
1104
+ })) passed++; else failed++;
1105
+
1106
+ if (test('ensureDir error includes the directory path', () => {
1107
+ const testFile = path.join(utils.getTempDir(), `ensure-err2-${Date.now()}.txt`);
1108
+ try {
1109
+ fs.writeFileSync(testFile, 'blocker');
1110
+ const badPath = path.join(testFile, 'nested', 'dir');
1111
+ try {
1112
+ utils.ensureDir(badPath);
1113
+ assert.fail('Should have thrown');
1114
+ } catch (err) {
1115
+ assert.ok(err.message.includes(badPath), 'Error should include the target path');
1116
+ }
1117
+ } finally {
1118
+ fs.unlinkSync(testFile);
1119
+ }
1120
+ })) passed++; else failed++;
1121
+
1122
+ // ── Round 31: runCommand stderr preference on failure ──
1123
+ console.log('\nrunCommand failure output (Round 31):');
1124
+
1125
+ if (test('runCommand returns stderr content on failure when stderr exists', () => {
1126
+ const result = utils.runCommand('node -e "process.stderr.write(\'custom error\'); process.exit(1)"');
1127
+ assert.strictEqual(result.success, false);
1128
+ assert.ok(result.output.includes('custom error'), 'Should include stderr output');
1129
+ })) passed++; else failed++;
1130
+
1131
+ if (test('runCommand returns error output on failed command', () => {
1132
+ // Use an allowed prefix with a nonexistent subcommand to reach execSync
1133
+ const result = utils.runCommand('git nonexistent-subcmd-xyz-12345');
1134
+ assert.strictEqual(result.success, false);
1135
+ assert.ok(result.output.length > 0, 'Should have some error output');
1136
+ })) passed++; else failed++;
1137
+
1138
+ // ── runCommand security: allowlist and metacharacter blocking ──
1139
+ console.log('\nrunCommand Security (allowlist + metacharacters):');
1140
+
1141
+ if (test('runCommand blocks disallowed command prefix', () => {
1142
+ const result = utils.runCommand('rm -rf /');
1143
+ assert.strictEqual(result.success, false);
1144
+ assert.ok(result.output.includes('unrecognized command prefix'), 'Should mention blocked prefix');
1145
+ })) passed++; else failed++;
1146
+
1147
+ if (test('runCommand blocks curl command', () => {
1148
+ const result = utils.runCommand('curl http://example.com');
1149
+ assert.strictEqual(result.success, false);
1150
+ assert.ok(result.output.includes('unrecognized command prefix'));
1151
+ })) passed++; else failed++;
1152
+
1153
+ if (test('runCommand blocks bash command', () => {
1154
+ const result = utils.runCommand('bash -c "echo hello"');
1155
+ assert.strictEqual(result.success, false);
1156
+ assert.ok(result.output.includes('unrecognized command prefix'));
1157
+ })) passed++; else failed++;
1158
+
1159
+ if (test('runCommand blocks semicolon command chaining', () => {
1160
+ const result = utils.runCommand('git status; echo pwned');
1161
+ assert.strictEqual(result.success, false);
1162
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block semicolon chaining');
1163
+ })) passed++; else failed++;
1164
+
1165
+ if (test('runCommand blocks pipe command chaining', () => {
1166
+ const result = utils.runCommand('git log | cat');
1167
+ assert.strictEqual(result.success, false);
1168
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block pipe chaining');
1169
+ })) passed++; else failed++;
1170
+
1171
+ if (test('runCommand blocks ampersand command chaining', () => {
1172
+ const result = utils.runCommand('git status && echo pwned');
1173
+ assert.strictEqual(result.success, false);
1174
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block ampersand chaining');
1175
+ })) passed++; else failed++;
1176
+
1177
+ if (test('runCommand blocks dollar sign command substitution', () => {
1178
+ const result = utils.runCommand('git log $(whoami)');
1179
+ assert.strictEqual(result.success, false);
1180
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block $ substitution');
1181
+ })) passed++; else failed++;
1182
+
1183
+ if (test('runCommand blocks backtick command substitution', () => {
1184
+ const result = utils.runCommand('git log `whoami`');
1185
+ assert.strictEqual(result.success, false);
1186
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block backtick substitution');
1187
+ })) passed++; else failed++;
1188
+
1189
+ if (test('runCommand allows metacharacters inside double quotes', () => {
1190
+ // Semicolon inside quotes should not trigger metacharacter blocking
1191
+ const result = utils.runCommand('node -e "console.log(1);process.exit(0)"');
1192
+ assert.strictEqual(result.success, true);
1193
+ })) passed++; else failed++;
1194
+
1195
+ if (test('runCommand allows metacharacters inside single quotes', () => {
1196
+ const result = utils.runCommand("node -e 'process.exit(0);'");
1197
+ assert.strictEqual(result.success, true);
1198
+ })) passed++; else failed++;
1199
+
1200
+ if (test('runCommand blocks unquoted metacharacters alongside quoted ones', () => {
1201
+ // Semicolon inside quotes is safe, but && outside is not
1202
+ const result = utils.runCommand('git log "safe;part" && echo pwned');
1203
+ assert.strictEqual(result.success, false);
1204
+ assert.ok(result.output.includes('metacharacters not allowed'));
1205
+ })) passed++; else failed++;
1206
+
1207
+ if (test('runCommand blocks prefix without trailing space', () => {
1208
+ // "gitconfig" starts with "git" but not "git " — must be blocked
1209
+ const result = utils.runCommand('gitconfig --list');
1210
+ assert.strictEqual(result.success, false);
1211
+ assert.ok(result.output.includes('unrecognized command prefix'));
1212
+ })) passed++; else failed++;
1213
+
1214
+ if (test('runCommand allows npx prefix', () => {
1215
+ const result = utils.runCommand('npx --version');
1216
+ assert.strictEqual(result.success, true);
1217
+ })) passed++; else failed++;
1218
+
1219
+ if (test('runCommand blocks newline command injection', () => {
1220
+ const result = utils.runCommand('git status\necho pwned');
1221
+ assert.strictEqual(result.success, false);
1222
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block newline injection');
1223
+ })) passed++; else failed++;
1224
+
1225
+ if (test('runCommand blocks $() inside double quotes (shell still evaluates)', () => {
1226
+ // $() inside double quotes is still evaluated by the shell, so block $ everywhere
1227
+ const result = utils.runCommand('node -e "$(whoami)"');
1228
+ assert.strictEqual(result.success, false);
1229
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block $ inside quotes');
1230
+ })) passed++; else failed++;
1231
+
1232
+ if (test('runCommand blocks backtick inside double quotes (shell still evaluates)', () => {
1233
+ const result = utils.runCommand('node -e "`whoami`"');
1234
+ assert.strictEqual(result.success, false);
1235
+ assert.ok(result.output.includes('metacharacters not allowed'), 'Should block backtick inside quotes');
1236
+ })) passed++; else failed++;
1237
+
1238
+ if (test('runCommand error message does not leak command string', () => {
1239
+ const secret = 'rm secret_password_123';
1240
+ const result = utils.runCommand(secret);
1241
+ assert.strictEqual(result.success, false);
1242
+ assert.ok(!result.output.includes('secret_password_123'), 'Should not leak command contents');
1243
+ })) passed++; else failed++;
1244
+
1245
+ // ── Round 31: getGitModifiedFiles with empty patterns ──
1246
+ console.log('\ngetGitModifiedFiles empty patterns (Round 31):');
1247
+
1248
+ if (test('getGitModifiedFiles with empty array returns all modified files', () => {
1249
+ // With an empty patterns array, every file should match (no filter applied)
1250
+ const withEmpty = utils.getGitModifiedFiles([]);
1251
+ const withNone = utils.getGitModifiedFiles();
1252
+ // Both should return the same list (no filtering)
1253
+ assert.deepStrictEqual(withEmpty, withNone,
1254
+ 'Empty patterns array should behave same as no patterns');
1255
+ })) passed++; else failed++;
1256
+
1257
+ // ── Round 33: readStdinJson error event handling ──
1258
+ console.log('\nreadStdinJson error event (Round 33):');
1259
+
1260
+ if (test('readStdinJson resolves {} when stdin emits error (via broken pipe)', () => {
1261
+ // Spawn a subprocess that reads from stdin, but close the pipe immediately
1262
+ // to trigger an error or early-end condition
1263
+ const { execFileSync } = require('child_process');
1264
+ const script = 'const u=require("./scripts/lib/utils");u.readStdinJson({timeoutMs:2000}).then(d=>{process.stdout.write(JSON.stringify(d))})';
1265
+ // Pipe stdin from /dev/null — this sends EOF immediately (no data)
1266
+ const result = execFileSync('node', ['-e', script], {
1267
+ encoding: 'utf8',
1268
+ input: '', // empty stdin triggers 'end' with empty data
1269
+ timeout: 5000,
1270
+ cwd: path.join(__dirname, '..', '..'),
1271
+ });
1272
+ const parsed = JSON.parse(result);
1273
+ assert.deepStrictEqual(parsed, {}, 'Should resolve to {} for empty stdin (end event path)');
1274
+ })) passed++; else failed++;
1275
+
1276
+ if (test('readStdinJson error handler is guarded by settled flag', () => {
1277
+ // If 'end' fires first setting settled=true, then a late 'error' should be ignored
1278
+ // We test this by verifying the code structure works: send valid JSON, the end event
1279
+ // fires, settled=true, any late error is safely ignored
1280
+ const { execFileSync } = require('child_process');
1281
+ const script = 'const u=require("./scripts/lib/utils");u.readStdinJson({timeoutMs:2000}).then(d=>{process.stdout.write(JSON.stringify(d))})';
1282
+ const result = execFileSync('node', ['-e', script], {
1283
+ encoding: 'utf8',
1284
+ input: '{"test":"settled-guard"}',
1285
+ timeout: 5000,
1286
+ cwd: path.join(__dirname, '..', '..'),
1287
+ });
1288
+ const parsed = JSON.parse(result);
1289
+ assert.strictEqual(parsed.test, 'settled-guard', 'Should parse normally when end fires first');
1290
+ })) passed++; else failed++;
1291
+
1292
+ // replaceInFile returns false when write fails (e.g., read-only file)
1293
+ if (test('replaceInFile returns false on write failure (read-only file)', () => {
1294
+ if (process.platform === 'win32' || process.getuid?.() === 0) {
1295
+ console.log(' (skipped — chmod ineffective on Windows/root)');
1296
+ return;
1297
+ }
1298
+ const testDir = path.join(utils.getTempDir(), `utils-test-readonly-${Date.now()}`);
1299
+ fs.mkdirSync(testDir, { recursive: true });
1300
+ const filePath = path.join(testDir, 'readonly.txt');
1301
+ try {
1302
+ fs.writeFileSync(filePath, 'hello world', 'utf8');
1303
+ fs.chmodSync(filePath, 0o444);
1304
+ const result = utils.replaceInFile(filePath, 'hello', 'goodbye');
1305
+ assert.strictEqual(result, false, 'Should return false when file is read-only');
1306
+ // Verify content unchanged
1307
+ const content = fs.readFileSync(filePath, 'utf8');
1308
+ assert.strictEqual(content, 'hello world', 'Original content should be preserved');
1309
+ } finally {
1310
+ fs.chmodSync(filePath, 0o644);
1311
+ fs.rmSync(testDir, { recursive: true, force: true });
1312
+ }
1313
+ })) passed++; else failed++;
1314
+
1315
+ // ── Round 69: getGitModifiedFiles with ALL invalid patterns ──
1316
+ console.log('\ngetGitModifiedFiles all-invalid patterns (Round 69):');
1317
+
1318
+ if (test('getGitModifiedFiles with all-invalid patterns skips filtering (returns all files)', () => {
1319
+ // When every pattern is invalid regex, compiled.length === 0 at line 386,
1320
+ // so the filtering is skipped entirely and all modified files are returned.
1321
+ // This differs from the mixed-valid test where at least one pattern compiles.
1322
+ const allInvalid = utils.getGitModifiedFiles(['(unclosed', '[bad', '**invalid']);
1323
+ const unfiltered = utils.getGitModifiedFiles();
1324
+ // Both should return the same list — all-invalid patterns = no filtering
1325
+ assert.deepStrictEqual(allInvalid, unfiltered,
1326
+ 'All-invalid patterns should return same result as no patterns (no filtering)');
1327
+ })) passed++; else failed++;
1328
+
1329
+ // ── Round 71: findFiles recursive scan skips unreadable subdirectory ──
1330
+ console.log('\nRound 71: findFiles (unreadable subdirectory in recursive scan):');
1331
+
1332
+ if (test('findFiles recursive scan skips unreadable subdirectory silently', () => {
1333
+ if (process.platform === 'win32' || process.getuid?.() === 0) {
1334
+ console.log(' (skipped — chmod ineffective on Windows/root)');
1335
+ return;
1336
+ }
1337
+ const tmpDir = path.join(utils.getTempDir(), `ecc-findfiles-r71-${Date.now()}`);
1338
+ const readableSubdir = path.join(tmpDir, 'readable');
1339
+ const unreadableSubdir = path.join(tmpDir, 'unreadable');
1340
+ fs.mkdirSync(readableSubdir, { recursive: true });
1341
+ fs.mkdirSync(unreadableSubdir, { recursive: true });
1342
+
1343
+ // Create files in both subdirectories
1344
+ fs.writeFileSync(path.join(readableSubdir, 'found.txt'), 'data');
1345
+ fs.writeFileSync(path.join(unreadableSubdir, 'hidden.txt'), 'data');
1346
+
1347
+ // Make the subdirectory unreadable — readdirSync will throw EACCES
1348
+ fs.chmodSync(unreadableSubdir, 0o000);
1349
+
1350
+ try {
1351
+ const results = utils.findFiles(tmpDir, '*.txt', { recursive: true });
1352
+ // Should find the readable file but silently skip the unreadable dir
1353
+ assert.ok(results.length >= 1, 'Should find at least the readable file');
1354
+ const paths = results.map(r => r.path);
1355
+ assert.ok(paths.some(p => p.includes('found.txt')), 'Should find readable/found.txt');
1356
+ assert.ok(!paths.some(p => p.includes('hidden.txt')), 'Should not find unreadable/hidden.txt');
1357
+ } finally {
1358
+ fs.chmodSync(unreadableSubdir, 0o755);
1359
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1360
+ }
1361
+ })) passed++; else failed++;
1362
+
1363
+ // ── Round 79: countInFile with valid string pattern ──
1364
+ console.log('\nRound 79: countInFile (valid string pattern):');
1365
+
1366
+ if (test('countInFile counts occurrences using a plain string pattern', () => {
1367
+ const testFile = path.join(utils.getTempDir(), `utils-test-count-str-${Date.now()}.txt`);
1368
+ try {
1369
+ utils.writeFile(testFile, 'apple banana apple cherry apple');
1370
+ // Pass a plain string (not RegExp) — exercises typeof pattern === 'string'
1371
+ // branch at utils.js:441-442 which creates new RegExp(pattern, 'g')
1372
+ const count = utils.countInFile(testFile, 'apple');
1373
+ assert.strictEqual(count, 3, 'String pattern should count all occurrences');
1374
+ } finally {
1375
+ fs.unlinkSync(testFile);
1376
+ }
1377
+ })) passed++; else failed++;
1378
+
1379
+ // ── Round 79: grepFile with valid string pattern ──
1380
+ console.log('\nRound 79: grepFile (valid string pattern):');
1381
+
1382
+ if (test('grepFile finds matching lines using a plain string pattern', () => {
1383
+ const testFile = path.join(utils.getTempDir(), `utils-test-grep-str-${Date.now()}.txt`);
1384
+ try {
1385
+ utils.writeFile(testFile, 'line1 alpha\nline2 beta\nline3 alpha\nline4 gamma');
1386
+ // Pass a plain string (not RegExp) — exercises the else branch
1387
+ // at utils.js:468-469 which creates new RegExp(pattern)
1388
+ const matches = utils.grepFile(testFile, 'alpha');
1389
+ assert.strictEqual(matches.length, 2, 'String pattern should find 2 matching lines');
1390
+ assert.strictEqual(matches[0].lineNumber, 1, 'First match at line 1');
1391
+ assert.strictEqual(matches[1].lineNumber, 3, 'Second match at line 3');
1392
+ assert.ok(matches[0].content.includes('alpha'), 'Content should include pattern');
1393
+ } finally {
1394
+ fs.unlinkSync(testFile);
1395
+ }
1396
+ })) passed++; else failed++;
1397
+
1398
+ // ── Round 84: findFiles inner statSync catch (TOCTOU — broken symlink) ──
1399
+ console.log('\nRound 84: findFiles (inner statSync catch — broken symlink):');
1400
+
1401
+ if (test('findFiles skips broken symlinks that match the pattern', () => {
1402
+ // findFiles at utils.js:170-173: readdirSync returns entries including broken
1403
+ // symlinks (entry.isFile() returns false for broken symlinks, but the test also
1404
+ // verifies the overall robustness). On some systems, broken symlinks can be
1405
+ // returned by readdirSync and pass through isFile() depending on the driver.
1406
+ // More importantly: if statSync throws inside the inner loop, catch continues.
1407
+ //
1408
+ // To reliably trigger the statSync catch: create a real file, list it, then
1409
+ // simulate the race. Since we can't truly race, we use a broken symlink which
1410
+ // will at minimum verify the function doesn't crash on unusual dir entries.
1411
+ const tmpDir = path.join(utils.getTempDir(), `ecc-r84-findfiles-toctou-${Date.now()}`);
1412
+ fs.mkdirSync(tmpDir, { recursive: true });
1413
+
1414
+ // Create a real file and a broken symlink, both matching *.txt
1415
+ const realFile = path.join(tmpDir, 'real.txt');
1416
+ fs.writeFileSync(realFile, 'content');
1417
+ const brokenLink = path.join(tmpDir, 'broken.txt');
1418
+ fs.symlinkSync('/nonexistent/path/does/not/exist', brokenLink);
1419
+
1420
+ try {
1421
+ const results = utils.findFiles(tmpDir, '*.txt');
1422
+ // The real file should be found; the broken symlink should be skipped
1423
+ const paths = results.map(r => r.path);
1424
+ assert.ok(paths.some(p => p.includes('real.txt')), 'Should find the real file');
1425
+ assert.ok(!paths.some(p => p.includes('broken.txt')),
1426
+ 'Should not include broken symlink in results');
1427
+ } finally {
1428
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1429
+ }
1430
+ })) passed++; else failed++;
1431
+
1432
+ // ── Round 85: getSessionIdShort fallback parameter ──
1433
+ console.log('\ngetSessionIdShort fallback (Round 85):');
1434
+
1435
+ if (test('getSessionIdShort uses fallback when getProjectName returns null (CWD at root)', () => {
1436
+ if (process.platform === 'win32') {
1437
+ console.log(' (skipped — root CWD differs on Windows)');
1438
+ return;
1439
+ }
1440
+ // Spawn a subprocess at CWD=/ with CLAUDE_SESSION_ID empty.
1441
+ // At /, git rev-parse --show-toplevel fails → getGitRepoName() = null.
1442
+ // path.basename('/') = '' → '' || null = null → getProjectName() = null.
1443
+ // So getSessionIdShort('my-custom-fallback') = null || 'my-custom-fallback'.
1444
+ const utilsPath = path.join(__dirname, '..', '..', 'scripts', 'lib', 'utils.js');
1445
+ const script = `
1446
+ const utils = require('${utilsPath.replace(/'/g, "\\'")}');
1447
+ process.stdout.write(utils.getSessionIdShort('my-custom-fallback'));
1448
+ `;
1449
+ const { spawnSync } = require('child_process');
1450
+ const result = spawnSync('node', ['-e', script], {
1451
+ encoding: 'utf8',
1452
+ cwd: '/',
1453
+ env: { ...process.env, CLAUDE_SESSION_ID: '' },
1454
+ timeout: 10000
1455
+ });
1456
+ assert.strictEqual(result.status, 0, `Should exit 0, got status ${result.status}. stderr: ${result.stderr}`);
1457
+ assert.strictEqual(result.stdout, 'my-custom-fallback',
1458
+ `At CWD=/ with no session ID, should use the fallback parameter. Got: "${result.stdout}"`);
1459
+ })) passed++; else failed++;
1460
+
1461
+ // ── Round 88: replaceInFile with empty replacement (deletion) ──
1462
+ console.log('\nRound 88: replaceInFile with empty replacement string (deletion):');
1463
+ if (test('replaceInFile with empty string replacement deletes matched text', () => {
1464
+ const tmpDir = path.join(utils.getTempDir(), `ecc-r88-replace-empty-${Date.now()}`);
1465
+ fs.mkdirSync(tmpDir, { recursive: true });
1466
+ const tmpFile = path.join(tmpDir, 'delete-test.txt');
1467
+ try {
1468
+ fs.writeFileSync(tmpFile, 'hello REMOVE_ME world');
1469
+ const result = utils.replaceInFile(tmpFile, 'REMOVE_ME ', '');
1470
+ assert.strictEqual(result, true, 'Should return true on successful replacement');
1471
+ const content = fs.readFileSync(tmpFile, 'utf8');
1472
+ assert.strictEqual(content, 'hello world',
1473
+ 'Empty replacement should delete the matched text');
1474
+ } finally {
1475
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1476
+ }
1477
+ })) passed++; else failed++;
1478
+
1479
+ // ── Round 88: countInFile with valid file but zero matches ──
1480
+ console.log('\nRound 88: countInFile with existing file but non-matching pattern:');
1481
+ if (test('countInFile returns 0 for valid file with no pattern matches', () => {
1482
+ const tmpDir = path.join(utils.getTempDir(), `ecc-r88-count-zero-${Date.now()}`);
1483
+ fs.mkdirSync(tmpDir, { recursive: true });
1484
+ const tmpFile = path.join(tmpDir, 'no-match.txt');
1485
+ try {
1486
+ fs.writeFileSync(tmpFile, 'apple banana cherry');
1487
+ const count = utils.countInFile(tmpFile, 'ZZZZNOTHERE');
1488
+ assert.strictEqual(count, 0,
1489
+ 'Should return 0 when regex matches nothing in existing file');
1490
+ const countRegex = utils.countInFile(tmpFile, /ZZZZNOTHERE/g);
1491
+ assert.strictEqual(countRegex, 0,
1492
+ 'Should return 0 for RegExp with no matches in existing file');
1493
+ } finally {
1494
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1495
+ }
1496
+ })) passed++; else failed++;
1497
+
1498
+ // ── Round 92: countInFile with object pattern type ──
1499
+ console.log('\nRound 92: countInFile (non-string non-RegExp pattern):');
1500
+
1501
+ if (test('countInFile returns 0 for object pattern (neither string nor RegExp)', () => {
1502
+ // utils.js line 443-444: The else branch returns 0 when pattern is
1503
+ // not instanceof RegExp and typeof !== 'string'. An object like {invalid: true}
1504
+ // triggers this early return without throwing.
1505
+ const testFile = path.join(utils.getTempDir(), `utils-test-obj-pattern-${Date.now()}.txt`);
1506
+ try {
1507
+ utils.writeFile(testFile, 'some test content to match against');
1508
+ const count = utils.countInFile(testFile, { invalid: 'object' });
1509
+ assert.strictEqual(count, 0, 'Object pattern should return 0');
1510
+ } finally {
1511
+ try { fs.unlinkSync(testFile); } catch { /* best-effort */ }
1512
+ }
1513
+ })) passed++; else failed++;
1514
+
1515
+ // ── Round 93: countInFile with /pattern/i (g flag appended) ──
1516
+ console.log('\nRound 93: countInFile (case-insensitive RegExp, g flag auto-appended):');
1517
+
1518
+ if (test('countInFile with /pattern/i appends g flag and counts case-insensitively', () => {
1519
+ // utils.js line 440: pattern.flags = 'i', 'i'.includes('g') → false,
1520
+ // so new RegExp(source, 'i' + 'g') → /pattern/ig
1521
+ const testFile = path.join(utils.getTempDir(), `utils-test-ci-flag-${Date.now()}.txt`);
1522
+ try {
1523
+ utils.writeFile(testFile, 'Foo foo FOO fOo bar baz');
1524
+ const count = utils.countInFile(testFile, /foo/i);
1525
+ assert.strictEqual(count, 4,
1526
+ 'Case-insensitive regex with auto-appended g should match all 4 occurrences');
1527
+ } finally {
1528
+ try { fs.unlinkSync(testFile); } catch { /* best-effort */ }
1529
+ }
1530
+ })) passed++; else failed++;
1531
+
1532
+ // ── Round 93: countInFile with /pattern/gi (g flag already present) ──
1533
+ console.log('\nRound 93: countInFile (case-insensitive RegExp, g flag preserved):');
1534
+
1535
+ if (test('countInFile with /pattern/gi preserves existing flags and counts correctly', () => {
1536
+ // utils.js line 440: pattern.flags = 'gi', 'gi'.includes('g') → true,
1537
+ // so new RegExp(source, 'gi') — flags preserved unchanged
1538
+ const testFile = path.join(utils.getTempDir(), `utils-test-gi-flag-${Date.now()}.txt`);
1539
+ try {
1540
+ utils.writeFile(testFile, 'Foo foo FOO fOo bar baz');
1541
+ const count = utils.countInFile(testFile, /foo/gi);
1542
+ assert.strictEqual(count, 4,
1543
+ 'Case-insensitive regex with pre-existing g should match all 4 occurrences');
1544
+ } finally {
1545
+ try { fs.unlinkSync(testFile); } catch { /* best-effort */ }
1546
+ }
1547
+ })) passed++; else failed++;
1548
+
1549
+ // ── Round 95: countInFile with regex alternation (no g flag) ──
1550
+ console.log('\nRound 95: countInFile (regex alternation without g flag):');
1551
+
1552
+ if (test('countInFile with /apple|banana/ (alternation, no g) counts all matches', () => {
1553
+ const tmpDir = path.join(utils.getTempDir(), `ecc-r95-alternation-${Date.now()}`);
1554
+ fs.mkdirSync(tmpDir, { recursive: true });
1555
+ const testFile = path.join(tmpDir, 'alternation.txt');
1556
+ try {
1557
+ utils.writeFile(testFile, 'apple banana apple cherry banana apple');
1558
+ // /apple|banana/ has alternation but no g flag — countInFile should auto-append g
1559
+ const count = utils.countInFile(testFile, /apple|banana/);
1560
+ assert.strictEqual(count, 5,
1561
+ 'Should find 3 apples + 2 bananas = 5 total (g flag auto-appended to alternation regex)');
1562
+ } finally {
1563
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1564
+ }
1565
+ })) passed++; else failed++;
1566
+
1567
+ // ── Round 97: getSessionIdShort with whitespace-only CLAUDE_SESSION_ID ──
1568
+ console.log('\nRound 97: getSessionIdShort (whitespace-only session ID):');
1569
+
1570
+ if (test('getSessionIdShort sanitizes whitespace-only CLAUDE_SESSION_ID to fallback', () => {
1571
+ if (process.platform === 'win32') {
1572
+ console.log(' (skipped — root CWD differs on Windows)');
1573
+ return true;
1574
+ }
1575
+
1576
+ const utilsPath = path.join(__dirname, '..', '..', 'scripts', 'lib', 'utils.js');
1577
+ const script = `
1578
+ const utils = require('${utilsPath.replace(/'/g, "\\'")}');
1579
+ process.stdout.write(utils.getSessionIdShort('fallback'));
1580
+ `;
1581
+ const result = spawnSync('node', ['-e', script], {
1582
+ encoding: 'utf8',
1583
+ cwd: '/',
1584
+ env: { ...process.env, CLAUDE_SESSION_ID: ' ' },
1585
+ timeout: 10000
1586
+ });
1587
+
1588
+ assert.strictEqual(result.status, 0, `Expected exit 0, got ${result.status}. stderr: ${result.stderr}`);
1589
+ assert.strictEqual(result.stdout, 'fallback');
1590
+ })) passed++; else failed++;
1591
+
1592
+ // ── Round 97: countInFile with same RegExp object called twice (lastIndex reuse) ──
1593
+ console.log('\nRound 97: countInFile (RegExp lastIndex reuse validation):');
1594
+
1595
+ if (test('countInFile returns consistent count when same RegExp object is reused', () => {
1596
+ // utils.js lines 438-440: Always creates a new RegExp to prevent lastIndex
1597
+ // state bugs. Without this defense, a global regex's lastIndex would persist
1598
+ // between calls, causing alternating match/miss behavior.
1599
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r97-lastindex-'));
1600
+ const testFile = path.join(tmpDir, 'test.txt');
1601
+ try {
1602
+ fs.writeFileSync(testFile, 'foo bar foo baz foo\nfoo again foo');
1603
+ const sharedRegex = /foo/g;
1604
+ // First call
1605
+ const count1 = utils.countInFile(testFile, sharedRegex);
1606
+ // Second call with SAME regex object — would fail without defensive new RegExp
1607
+ const count2 = utils.countInFile(testFile, sharedRegex);
1608
+ assert.strictEqual(count1, 5, 'First call should find 5 matches');
1609
+ assert.strictEqual(count2, 5,
1610
+ 'Second call with same RegExp should also find 5 (lastIndex reset by defensive code)');
1611
+ assert.strictEqual(count1, count2,
1612
+ 'Both calls must return identical counts (proves lastIndex is not shared)');
1613
+ } finally {
1614
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1615
+ }
1616
+ })) passed++; else failed++;
1617
+
1618
+ // ── Round 98: findFiles with maxAge: -1 (negative boundary — excludes everything) ──
1619
+ console.log('\nRound 98: findFiles (maxAge: -1 — negative boundary excludes all):');
1620
+
1621
+ if (test('findFiles with maxAge: -1 excludes all files (ageInDays always >= 0)', () => {
1622
+ // utils.js line 176-178: `if (maxAge !== null) { ageInDays = ...; if (ageInDays <= maxAge) }`
1623
+ // With maxAge: -1, the condition requires ageInDays <= -1. Since ageInDays =
1624
+ // (Date.now() - mtimeMs) / 86400000 is always >= 0 for real files, nothing passes.
1625
+ // This negative boundary deterministically excludes everything.
1626
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r98-maxage-neg-'));
1627
+ try {
1628
+ fs.writeFileSync(path.join(tmpDir, 'fresh.txt'), 'created just now');
1629
+ const results = utils.findFiles(tmpDir, '*.txt', { maxAge: -1 });
1630
+ assert.strictEqual(results.length, 0,
1631
+ 'maxAge: -1 should exclude all files (ageInDays is always >= 0)');
1632
+ // Contrast: maxAge: null (default) should include the file
1633
+ const noMaxAge = utils.findFiles(tmpDir, '*.txt');
1634
+ assert.strictEqual(noMaxAge.length, 1,
1635
+ 'No maxAge (null default) should include the file (proving it exists)');
1636
+ } finally {
1637
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1638
+ }
1639
+ })) passed++; else failed++;
1640
+
1641
+ // ── Round 99: replaceInFile returns true even when pattern not found ──
1642
+ console.log('\nRound 99: replaceInFile (no-match still returns true):');
1643
+
1644
+ if (test('replaceInFile returns true and rewrites file even when search does not match', () => {
1645
+ // utils.js lines 405-417: replaceInFile reads content, calls content.replace(search, replace),
1646
+ // and writes back the result. When the search pattern doesn't match anything,
1647
+ // String.replace() returns the original string unchanged, but the function still
1648
+ // writes it back to disk (changing mtime) and returns true. This means callers
1649
+ // cannot distinguish "replacement made" from "no match found."
1650
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r99-no-match-'));
1651
+ const testFile = path.join(tmpDir, 'test.txt');
1652
+ try {
1653
+ fs.writeFileSync(testFile, 'hello world');
1654
+ const result = utils.replaceInFile(testFile, 'NONEXISTENT_PATTERN', 'replacement');
1655
+ assert.strictEqual(result, true,
1656
+ 'replaceInFile returns true even when pattern is not found (no match guard)');
1657
+ const content = fs.readFileSync(testFile, 'utf8');
1658
+ assert.strictEqual(content, 'hello world',
1659
+ 'Content should be unchanged since pattern did not match');
1660
+ } finally {
1661
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1662
+ }
1663
+ })) passed++; else failed++;
1664
+
1665
+ // ── Round 99: grepFile with CR-only line endings (\r without \n) ──
1666
+ console.log('\nRound 99: grepFile (CR-only line endings — classic Mac format):');
1667
+
1668
+ if (test('grepFile treats CR-only file as a single line (splits on \\n only)', () => {
1669
+ // utils.js line 474: `content.split('\\n')` splits only on \\n (LF).
1670
+ // A file using \\r (CR) line endings (classic Mac format) has no \\n characters,
1671
+ // so split('\\n') returns the entire content as a single element array.
1672
+ // This means grepFile reports everything on "line 1" regardless of \\r positions.
1673
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r99-cr-only-'));
1674
+ const testFile = path.join(tmpDir, 'cr-only.txt');
1675
+ try {
1676
+ // Write file with CR-only line endings (no LF)
1677
+ fs.writeFileSync(testFile, 'alpha\rbeta\rgamma');
1678
+ const matches = utils.grepFile(testFile, 'beta');
1679
+ assert.strictEqual(matches.length, 1,
1680
+ 'Should find exactly 1 match (entire file is one "line")');
1681
+ assert.strictEqual(matches[0].lineNumber, 1,
1682
+ 'Match should be reported on line 1 (no \\n splitting occurred)');
1683
+ assert.ok(matches[0].content.includes('\r'),
1684
+ 'Content should contain \\r characters (unsplit)');
1685
+ } finally {
1686
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1687
+ }
1688
+ })) passed++; else failed++;
1689
+
1690
+ // ── Round 100: findFiles with both maxAge AND recursive (interaction test) ──
1691
+ console.log('\nRound 100: findFiles (maxAge + recursive combined — untested interaction):');
1692
+ if (test('findFiles with maxAge AND recursive filters age across subdirectories', () => {
1693
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r100-maxage-recur-'));
1694
+ const subDir = path.join(tmpDir, 'nested');
1695
+ try {
1696
+ fs.mkdirSync(subDir);
1697
+ // Create files: one in root, one in subdirectory
1698
+ const rootFile = path.join(tmpDir, 'root.txt');
1699
+ const nestedFile = path.join(subDir, 'nested.txt');
1700
+ fs.writeFileSync(rootFile, 'root file');
1701
+ fs.writeFileSync(nestedFile, 'nested file');
1702
+
1703
+ // maxAge: 1 with recursive: true — both files are fresh (ageInDays ≈ 0)
1704
+ const results = utils.findFiles(tmpDir, '*.txt', { maxAge: 1, recursive: true });
1705
+ assert.strictEqual(results.length, 2,
1706
+ 'Both root and nested files should match (fresh, maxAge: 1, recursive: true)');
1707
+
1708
+ // maxAge: -1 with recursive: true — no files should match (age always >= 0)
1709
+ const noResults = utils.findFiles(tmpDir, '*.txt', { maxAge: -1, recursive: true });
1710
+ assert.strictEqual(noResults.length, 0,
1711
+ 'maxAge: -1 should exclude all files even in subdirectories');
1712
+
1713
+ // maxAge: 1 with recursive: false — only root file
1714
+ const rootOnly = utils.findFiles(tmpDir, '*.txt', { maxAge: 1, recursive: false });
1715
+ assert.strictEqual(rootOnly.length, 1,
1716
+ 'recursive: false should only find root-level file');
1717
+ } finally {
1718
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1719
+ }
1720
+ })) passed++; else failed++;
1721
+
1722
+ // ── Round 101: output() with circular reference object throws (no try/catch around JSON.stringify) ──
1723
+ console.log('\nRound 101: output() (circular reference — JSON.stringify crash):');
1724
+ if (test('output() throws TypeError on circular reference object (JSON.stringify has no try/catch)', () => {
1725
+ const circular = { a: 1 };
1726
+ circular.self = circular; // Creates circular reference
1727
+
1728
+ assert.throws(
1729
+ () => utils.output(circular),
1730
+ { name: 'TypeError' },
1731
+ 'JSON.stringify of circular object should throw TypeError (no try/catch in output())'
1732
+ );
1733
+ })) passed++; else failed++;
1734
+
1735
+ // ── Round 103: countInFile with boolean false pattern (non-string non-RegExp) ──
1736
+ console.log('\nRound 103: countInFile (boolean false — explicit type guard returns 0):');
1737
+ if (test('countInFile returns 0 for boolean false pattern (else branch at line 443)', () => {
1738
+ // utils.js lines 438-444: countInFile checks `instanceof RegExp` then `typeof === "string"`.
1739
+ // Boolean `false` fails both checks and falls to the `else return 0` at line 443.
1740
+ // This is the correct rejection path for non-string non-RegExp patterns, but was
1741
+ // previously untested with boolean specifically (only null, undefined, object tested).
1742
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r103-bool-pattern-'));
1743
+ const testFile = path.join(tmpDir, 'test.txt');
1744
+ try {
1745
+ fs.writeFileSync(testFile, 'false is here\nfalse again\ntrue as well');
1746
+ // Even though "false" appears in the content, boolean `false` is rejected by type guard
1747
+ const count = utils.countInFile(testFile, false);
1748
+ assert.strictEqual(count, 0,
1749
+ 'Boolean false should return 0 (typeof false === "boolean", not "string")');
1750
+ // Contrast: string "false" should match normally
1751
+ const stringCount = utils.countInFile(testFile, 'false');
1752
+ assert.strictEqual(stringCount, 2,
1753
+ 'String "false" should match 2 times (proving content exists but type guard blocked boolean)');
1754
+ } finally {
1755
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1756
+ }
1757
+ })) passed++; else failed++;
1758
+
1759
+ // ── Round 103: grepFile with numeric 0 pattern (implicit RegExp coercion) ──
1760
+ console.log('\nRound 103: grepFile (numeric 0 — implicit toString via RegExp constructor):');
1761
+ if (test('grepFile with numeric 0 implicitly coerces to /0/ via RegExp constructor', () => {
1762
+ // utils.js line 468: grepFile's non-RegExp path does `regex = new RegExp(pattern)`.
1763
+ // Unlike countInFile (which has explicit type guards), grepFile passes any value
1764
+ // to the RegExp constructor, which calls toString() on it. So new RegExp(0)
1765
+ // becomes /0/, and grepFile actually searches for lines containing "0".
1766
+ // This contrasts with countInFile(file, 0) which returns 0 (type-rejected).
1767
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r103-grep-numeric-'));
1768
+ const testFile = path.join(tmpDir, 'test.txt');
1769
+ try {
1770
+ fs.writeFileSync(testFile, 'line with 0 zero\nno digit here\n100 bottles');
1771
+ const matches = utils.grepFile(testFile, 0);
1772
+ assert.strictEqual(matches.length, 2,
1773
+ 'grepFile(file, 0) should find 2 lines containing "0" (RegExp(0) → /0/)');
1774
+ assert.strictEqual(matches[0].lineNumber, 1,
1775
+ 'First match on line 1 ("line with 0 zero")');
1776
+ assert.strictEqual(matches[1].lineNumber, 3,
1777
+ 'Second match on line 3 ("100 bottles")');
1778
+ // Contrast: countInFile with numeric 0 returns 0 (type-rejected)
1779
+ const count = utils.countInFile(testFile, 0);
1780
+ assert.strictEqual(count, 0,
1781
+ 'countInFile(file, 0) returns 0 — API inconsistency with grepFile');
1782
+ } finally {
1783
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1784
+ }
1785
+ })) passed++; else failed++;
1786
+
1787
+ // ── Round 105: grepFile with sticky (y) flag — not stripped, causes stateful .test() ──
1788
+ console.log('\nRound 105: grepFile (sticky y flag — not stripped like g, stateful .test() bug):');
1789
+
1790
+ if (test('grepFile with /pattern/y sticky flag misses lines due to lastIndex state', () => {
1791
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r105-grep-sticky-'));
1792
+ const testFile = path.join(tmpDir, 'test.txt');
1793
+ try {
1794
+ fs.writeFileSync(testFile, 'hello world\nhello again\nhello third');
1795
+ // grepFile line 466: `pattern.flags.replace('g', '')` strips g but not y.
1796
+ // With /hello/y (sticky), .test() advances lastIndex after each successful
1797
+ // match. On the next line, .test() starts at lastIndex (not 0), so it fails
1798
+ // unless the match happens at that exact position.
1799
+ const stickyResults = utils.grepFile(testFile, /hello/y);
1800
+ // Without the bug, all 3 lines should match. With sticky flag preserved,
1801
+ // line 1 matches (lastIndex advances to 5), line 2 fails (no 'hello' at
1802
+ // position 5 of "hello again"), line 3 also likely fails.
1803
+ // The g-flag version (properly stripped) should find all 3:
1804
+ const globalResults = utils.grepFile(testFile, /hello/g);
1805
+ assert.strictEqual(globalResults.length, 3,
1806
+ 'g-flag regex should find all 3 lines (g is stripped, stateless)');
1807
+ // Sticky flag causes fewer matches — demonstrating the bug
1808
+ assert.ok(stickyResults.length < 3,
1809
+ `Sticky y flag causes stateful .test() — found ${stickyResults.length}/3 lines ` +
1810
+ '(y flag not stripped like g, so lastIndex advances between lines)');
1811
+ } finally {
1812
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1813
+ }
1814
+ })) passed++; else failed++;
1815
+
1816
+ // ── Round 107: grepFile with ^$ pattern — empty line matching after split ──
1817
+ console.log('\nRound 107: grepFile (empty line matching — ^$ on split lines, trailing \\n creates extra empty element):');
1818
+ if (test('grepFile matches empty lines with ^$ pattern including trailing newline phantom line', () => {
1819
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r107-grep-empty-'));
1820
+ const testFile = path.join(tmpDir, 'test.txt');
1821
+ try {
1822
+ // 'line1\n\nline3\n\n'.split('\n') → ['line1','','line3','',''] (5 elements, 3 empty)
1823
+ fs.writeFileSync(testFile, 'line1\n\nline3\n\n');
1824
+ const results = utils.grepFile(testFile, /^$/);
1825
+ assert.strictEqual(results.length, 3,
1826
+ 'Should match 3 empty lines: line 2, line 4, and trailing phantom line 5');
1827
+ assert.strictEqual(results[0].lineNumber, 2, 'First empty line at position 2');
1828
+ assert.strictEqual(results[1].lineNumber, 4, 'Second empty line at position 4');
1829
+ assert.strictEqual(results[2].lineNumber, 5, 'Third empty line is the trailing phantom from split');
1830
+ } finally {
1831
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1832
+ }
1833
+ })) passed++; else failed++;
1834
+
1835
+ // ── Round 107: replaceInFile where replacement re-introduces search pattern (single-pass) ──
1836
+ console.log('\nRound 107: replaceInFile (replacement contains search pattern — String.replace is single-pass):');
1837
+ if (test('replaceInFile does not re-scan replacement text (single-pass, no infinite loop)', () => {
1838
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r107-replace-reintr-'));
1839
+ const testFile = path.join(tmpDir, 'test.txt');
1840
+ try {
1841
+ fs.writeFileSync(testFile, 'foo bar baz');
1842
+ // Replace "foo" with "foo extra foo" — should only replace the first occurrence
1843
+ const result = utils.replaceInFile(testFile, 'foo', 'foo extra foo');
1844
+ assert.strictEqual(result, true, 'replaceInFile should return true');
1845
+ const content = utils.readFile(testFile);
1846
+ assert.strictEqual(content, 'foo extra foo bar baz',
1847
+ 'Only the original "foo" is replaced — replacement text is not re-scanned');
1848
+ } finally {
1849
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1850
+ }
1851
+ })) passed++; else failed++;
1852
+
1853
+ // ── Round 106: countInFile with named capture groups — match(g) ignores group details ──
1854
+ console.log('\nRound 106: countInFile (named capture groups — String.match(g) returns full matches only):');
1855
+ if (test('countInFile with named capture groups counts matches not groups', () => {
1856
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r106-count-named-'));
1857
+ const testFile = path.join(tmpDir, 'test.txt');
1858
+ try {
1859
+ fs.writeFileSync(testFile, 'foo bar baz\nfoo qux\nbar foo end');
1860
+ // Named capture group — should still count 3 matches for "foo"
1861
+ const count = utils.countInFile(testFile, /(?<word>foo)/);
1862
+ assert.strictEqual(count, 3,
1863
+ 'Named capture group should not inflate count — match(g) returns full matches only');
1864
+ // Compare with plain pattern
1865
+ const plainCount = utils.countInFile(testFile, /foo/);
1866
+ assert.strictEqual(plainCount, 3, 'Plain regex should also find 3 matches');
1867
+ assert.strictEqual(count, plainCount,
1868
+ 'Named group pattern and plain pattern should return identical counts');
1869
+ } finally {
1870
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1871
+ }
1872
+ })) passed++; else failed++;
1873
+
1874
+ // ── Round 106: grepFile with multiline (m) flag — preserved, unlike g which is stripped ──
1875
+ console.log('\nRound 106: grepFile (multiline m flag — preserved in regex, unlike g which is stripped):');
1876
+ if (test('grepFile preserves multiline (m) flag and anchors work on split lines', () => {
1877
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r106-grep-multiline-'));
1878
+ const testFile = path.join(tmpDir, 'test.txt');
1879
+ try {
1880
+ fs.writeFileSync(testFile, 'hello\nworld hello\nhello world');
1881
+ // With m flag + anchors: ^hello$ should match only exact "hello" line
1882
+ const mResults = utils.grepFile(testFile, /^hello$/m);
1883
+ assert.strictEqual(mResults.length, 1,
1884
+ 'With m flag, ^hello$ should match only line 1 (exact "hello")');
1885
+ assert.strictEqual(mResults[0].lineNumber, 1);
1886
+ // Without m flag: same behavior since grepFile splits lines individually
1887
+ const noMResults = utils.grepFile(testFile, /^hello$/);
1888
+ assert.strictEqual(noMResults.length, 1,
1889
+ 'Without m flag, same result — grepFile splits lines so anchors are per-line already');
1890
+ assert.strictEqual(mResults.length, noMResults.length,
1891
+ 'm flag is preserved but irrelevant — line splitting makes anchors per-line already');
1892
+ } finally {
1893
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1894
+ }
1895
+ })) passed++; else failed++;
1896
+
1897
+ // ── Round 109: appendFile creating new file in non-existent directory (ensureDir + appendFileSync) ──
1898
+ console.log('\nRound 109: appendFile (new file creation — ensureDir creates parent, appendFileSync creates file):');
1899
+ if (test('appendFile creates parent directory and new file when neither exist', () => {
1900
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r109-append-new-'));
1901
+ const nestedPath = path.join(tmpDir, 'deep', 'nested', 'dir', 'newfile.txt');
1902
+ try {
1903
+ // Parent directory 'deep/nested/dir' does not exist yet
1904
+ assert.ok(!fs.existsSync(path.join(tmpDir, 'deep')),
1905
+ 'Parent "deep" should not exist before appendFile');
1906
+ utils.appendFile(nestedPath, 'first line\n');
1907
+ assert.ok(fs.existsSync(nestedPath),
1908
+ 'File should be created by appendFile');
1909
+ assert.strictEqual(utils.readFile(nestedPath), 'first line\n',
1910
+ 'Content should match what was appended');
1911
+ // Append again to verify it adds to existing file
1912
+ utils.appendFile(nestedPath, 'second line\n');
1913
+ assert.strictEqual(utils.readFile(nestedPath), 'first line\nsecond line\n',
1914
+ 'Second append should add to existing file');
1915
+ } finally {
1916
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1917
+ }
1918
+ })) passed++; else failed++;
1919
+
1920
+ // ── Round 108: grepFile with Unicode/emoji content — UTF-16 string matching on split lines ──
1921
+ console.log('\nRound 108: grepFile (Unicode/emoji — regex matching on UTF-16 split lines):');
1922
+ if (test('grepFile finds Unicode emoji patterns across lines', () => {
1923
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r108-grep-unicode-'));
1924
+ const testFile = path.join(tmpDir, 'test.txt');
1925
+ try {
1926
+ fs.writeFileSync(testFile, `${partyEmoji} celebration\nnormal line\n${partyEmoji} party\n日本語テスト`);
1927
+ const emojiResults = utils.grepFile(testFile, new RegExp(partyEmoji, 'u'));
1928
+ assert.strictEqual(emojiResults.length, 2,
1929
+ 'Should find emoji on 2 lines (lines 1 and 3)');
1930
+ assert.strictEqual(emojiResults[0].lineNumber, 1);
1931
+ assert.strictEqual(emojiResults[1].lineNumber, 3);
1932
+ const cjkResults = utils.grepFile(testFile, /日本語/);
1933
+ assert.strictEqual(cjkResults.length, 1,
1934
+ 'Should find CJK characters on line 4');
1935
+ assert.strictEqual(cjkResults[0].lineNumber, 4);
1936
+ assert.ok(cjkResults[0].content.includes('日本語テスト'),
1937
+ 'Matched line should contain full CJK text');
1938
+ } finally {
1939
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1940
+ }
1941
+ })) passed++; else failed++;
1942
+
1943
+ // ── Round 110: findFiles root directory unreadable — silent empty return (not throw) ──
1944
+ console.log('\nRound 110: findFiles (root directory unreadable — EACCES on readdirSync caught silently):');
1945
+ if (test('findFiles returns empty array when root directory exists but is unreadable', () => {
1946
+ if (process.platform === 'win32' || process.getuid?.() === 0) {
1947
+ console.log(' (skipped — chmod ineffective on Windows/root)');
1948
+ return true;
1949
+ }
1950
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r110-unreadable-root-'));
1951
+ const unreadableDir = path.join(tmpDir, 'no-read');
1952
+ fs.mkdirSync(unreadableDir);
1953
+ fs.writeFileSync(path.join(unreadableDir, 'secret.txt'), 'hidden');
1954
+ try {
1955
+ fs.chmodSync(unreadableDir, 0o000);
1956
+ // Verify dir exists but is unreadable
1957
+ assert.ok(fs.existsSync(unreadableDir), 'Directory should exist');
1958
+ // findFiles should NOT throw — catch block at line 188 handles EACCES
1959
+ const results = utils.findFiles(unreadableDir, '*');
1960
+ assert.ok(Array.isArray(results), 'Should return an array');
1961
+ assert.strictEqual(results.length, 0,
1962
+ 'Should return empty array when root dir is unreadable (not throw)');
1963
+ // Also test with recursive flag
1964
+ const recursiveResults = utils.findFiles(unreadableDir, '*', { recursive: true });
1965
+ assert.strictEqual(recursiveResults.length, 0,
1966
+ 'Recursive search on unreadable root should also return empty array');
1967
+ } finally {
1968
+ // Restore permissions before cleanup
1969
+ try { fs.chmodSync(unreadableDir, 0o755); } catch (_e) { /* ignore permission errors */ }
1970
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1971
+ }
1972
+ })) passed++; else failed++;
1973
+
1974
+ // ── Round 113: replaceInFile with zero-width regex — inserts between every character ──
1975
+ console.log('\nRound 113: replaceInFile (zero-width regex /(?:)/g — matches every position):');
1976
+ if (test('replaceInFile with zero-width regex /(?:)/g inserts replacement at every position', () => {
1977
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r113-zero-width-'));
1978
+ const testFile = path.join(tmpDir, 'test.txt');
1979
+ try {
1980
+ fs.writeFileSync(testFile, 'abc');
1981
+ // /(?:)/g matches at every position boundary: before 'a', between 'a'-'b', etc.
1982
+ // "abc".replace(/(?:)/g, 'X') → "XaXbXcX" (7 chars from 3)
1983
+ const result = utils.replaceInFile(testFile, /(?:)/g, 'X');
1984
+ assert.strictEqual(result, true, 'Should succeed (no error)');
1985
+ const content = utils.readFile(testFile);
1986
+ assert.strictEqual(content, 'XaXbXcX',
1987
+ 'Zero-width regex inserts at every position boundary');
1988
+
1989
+ // Also test with /^/gm (start of each line)
1990
+ fs.writeFileSync(testFile, 'line1\nline2\nline3');
1991
+ utils.replaceInFile(testFile, /^/gm, '> ');
1992
+ const prefixed = utils.readFile(testFile);
1993
+ assert.strictEqual(prefixed, '> line1\n> line2\n> line3',
1994
+ '/^/gm inserts at start of each line');
1995
+ } finally {
1996
+ fs.rmSync(tmpDir, { recursive: true, force: true });
1997
+ }
1998
+ })) passed++; else failed++;
1999
+
2000
+ // ── Round 114: replaceInFile options.all is silently ignored for RegExp search ──
2001
+ console.log('\nRound 114: replaceInFile (options.all silently ignored for RegExp search):');
2002
+ if (test('replaceInFile ignores options.all when search is a RegExp — falls through to .replace()', () => {
2003
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r114-all-regex-'));
2004
+ const testFile = path.join(tmpDir, 'test.txt');
2005
+ try {
2006
+ // File with repeated pattern: "foo bar foo baz foo"
2007
+ fs.writeFileSync(testFile, 'foo bar foo baz foo');
2008
+
2009
+ // With options.all=true and a non-global RegExp:
2010
+ // Line 411: (options.all && typeof search === 'string') → false (RegExp !== string)
2011
+ // Falls through to content.replace(regex, replace) — only replaces FIRST match
2012
+ const result = utils.replaceInFile(testFile, /foo/, 'QUX', { all: true });
2013
+ assert.strictEqual(result, true, 'Should succeed');
2014
+ const content = utils.readFile(testFile);
2015
+ assert.strictEqual(content, 'QUX bar foo baz foo',
2016
+ 'Non-global RegExp with options.all=true should still only replace FIRST match');
2017
+
2018
+ // Contrast: global RegExp replaces all regardless of options.all
2019
+ fs.writeFileSync(testFile, 'foo bar foo baz foo');
2020
+ utils.replaceInFile(testFile, /foo/g, 'QUX', { all: true });
2021
+ const globalContent = utils.readFile(testFile);
2022
+ assert.strictEqual(globalContent, 'QUX bar QUX baz QUX',
2023
+ 'Global RegExp replaces all matches (options.all irrelevant for RegExp)');
2024
+
2025
+ // String with options.all=true — uses replaceAll, replaces ALL occurrences
2026
+ fs.writeFileSync(testFile, 'foo bar foo baz foo');
2027
+ utils.replaceInFile(testFile, 'foo', 'QUX', { all: true });
2028
+ const allContent = utils.readFile(testFile);
2029
+ assert.strictEqual(allContent, 'QUX bar QUX baz QUX',
2030
+ 'String with options.all=true uses replaceAll — replaces ALL occurrences');
2031
+ } finally {
2032
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2033
+ }
2034
+ })) passed++; else failed++;
2035
+
2036
+ // ── Round 114: output with object containing BigInt — JSON.stringify throws ──
2037
+ console.log('\nRound 114: output (object containing BigInt — JSON.stringify throws):');
2038
+ if (test('output throws TypeError when object contains BigInt values (JSON.stringify cannot serialize)', () => {
2039
+ // Capture original console.log to prevent actual output during test
2040
+ const originalLog = console.log;
2041
+
2042
+ try {
2043
+ // Plain BigInt — typeof is 'bigint', not 'object', so goes to else branch
2044
+ // console.log can handle BigInt directly (prints "42n")
2045
+ let captured = null;
2046
+ console.log = (val) => { captured = val; };
2047
+ utils.output(BigInt(42));
2048
+ // Node.js console.log prints BigInt as-is
2049
+ assert.strictEqual(captured, BigInt(42), 'Plain BigInt goes to else branch, logged directly');
2050
+
2051
+ // Object containing BigInt — typeof is 'object', so JSON.stringify is called
2052
+ // JSON.stringify(BigInt) throws: "Do not know how to serialize a BigInt"
2053
+ console.log = originalLog; // restore before throw test
2054
+ assert.throws(
2055
+ () => utils.output({ value: BigInt(42) }),
2056
+ (err) => err instanceof TypeError && /BigInt/.test(err.message),
2057
+ 'Object with BigInt should throw TypeError from JSON.stringify'
2058
+ );
2059
+
2060
+ // Array containing BigInt — also typeof 'object'
2061
+ assert.throws(
2062
+ () => utils.output([BigInt(1), BigInt(2)]),
2063
+ (err) => err instanceof TypeError && /BigInt/.test(err.message),
2064
+ 'Array with BigInt should also throw TypeError from JSON.stringify'
2065
+ );
2066
+ } finally {
2067
+ console.log = originalLog;
2068
+ }
2069
+ })) passed++; else failed++;
2070
+
2071
+ // ── Round 115: countInFile with empty string pattern — matches at every position boundary ──
2072
+ console.log('\nRound 115: countInFile (empty string pattern — matches at every zero-width position):');
2073
+ if (test('countInFile with empty string pattern returns content.length + 1 (matches between every char)', () => {
2074
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r115-empty-pattern-'));
2075
+ const testFile = path.join(tmpDir, 'test.txt');
2076
+ try {
2077
+ // "hello" is 5 chars → 6 zero-width positions: |h|e|l|l|o|
2078
+ fs.writeFileSync(testFile, 'hello');
2079
+ const count = utils.countInFile(testFile, '');
2080
+ assert.strictEqual(count, 6,
2081
+ 'Empty string pattern creates /(?:)/g which matches at 6 position boundaries in "hello"');
2082
+
2083
+ // Empty file → "" has 1 zero-width position (the empty string itself)
2084
+ fs.writeFileSync(testFile, '');
2085
+ const emptyCount = utils.countInFile(testFile, '');
2086
+ assert.strictEqual(emptyCount, 1,
2087
+ 'Empty file still has 1 zero-width position boundary');
2088
+
2089
+ // Single char → 2 positions: |a|
2090
+ fs.writeFileSync(testFile, 'a');
2091
+ const singleCount = utils.countInFile(testFile, '');
2092
+ assert.strictEqual(singleCount, 2,
2093
+ 'Single character file has 2 position boundaries');
2094
+
2095
+ // Newlines count as characters too
2096
+ fs.writeFileSync(testFile, 'a\nb');
2097
+ const newlineCount = utils.countInFile(testFile, '');
2098
+ assert.strictEqual(newlineCount, 4,
2099
+ '"a\\nb" is 3 chars → 4 position boundaries');
2100
+ } finally {
2101
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2102
+ }
2103
+ })) passed++; else failed++;
2104
+
2105
+ // ── Round 117: grepFile with CRLF content — split('\n') leaves \r, anchored patterns fail ──
2106
+ console.log('\nRound 117: grepFile (CRLF content — trailing \\r breaks anchored regex patterns):');
2107
+ if (test('grepFile with CRLF content: unanchored patterns work but anchored $ fails due to trailing \\r', () => {
2108
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r117-grep-crlf-'));
2109
+ const testFile = path.join(tmpDir, 'test.txt');
2110
+ try {
2111
+ // Write CRLF content
2112
+ fs.writeFileSync(testFile, 'hello\r\nworld\r\nfoo bar\r\n');
2113
+
2114
+ // Unanchored pattern works — 'hello' matches in 'hello\r'
2115
+ const unanchored = utils.grepFile(testFile, 'hello');
2116
+ assert.strictEqual(unanchored.length, 1, 'Unanchored pattern should find 1 match');
2117
+ assert.strictEqual(unanchored[0].lineNumber, 1, 'Should be on line 1');
2118
+ assert.ok(unanchored[0].content.endsWith('\r'),
2119
+ 'Line content should have trailing \\r from split("\\n") on CRLF');
2120
+
2121
+ // Anchored pattern /^hello$/ does NOT match 'hello\r' because $ is before \r
2122
+ const anchored = utils.grepFile(testFile, /^hello$/);
2123
+ assert.strictEqual(anchored.length, 0,
2124
+ 'Anchored /^hello$/ should NOT match "hello\\r" — $ fails before \\r');
2125
+
2126
+ // But /^hello\r?$/ or /^hello/ work
2127
+ const withOptCr = utils.grepFile(testFile, /^hello\r?$/);
2128
+ assert.strictEqual(withOptCr.length, 1,
2129
+ '/^hello\\r?$/ matches "hello\\r" because \\r? consumes the trailing CR');
2130
+
2131
+ // Contrast: LF-only content works with anchored patterns
2132
+ fs.writeFileSync(testFile, 'hello\nworld\nfoo bar\n');
2133
+ const lfAnchored = utils.grepFile(testFile, /^hello$/);
2134
+ assert.strictEqual(lfAnchored.length, 1,
2135
+ 'LF-only content: anchored /^hello$/ matches normally');
2136
+ } finally {
2137
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2138
+ }
2139
+ })) passed++; else failed++;
2140
+
2141
+ // ── Round 116: replaceInFile with null/undefined replacement — JS coerces to string ──
2142
+ console.log('\nRound 116: replaceInFile (null/undefined replacement — JS coerces to string "null"/"undefined"):');
2143
+ if (test('replaceInFile with null replacement coerces to string "null" via String.replace ToString', () => {
2144
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r116-null-replace-'));
2145
+ const testFile = path.join(tmpDir, 'test.txt');
2146
+ try {
2147
+ // null replacement → String.replace coerces null to "null"
2148
+ fs.writeFileSync(testFile, 'hello world');
2149
+ const result = utils.replaceInFile(testFile, 'world', null);
2150
+ assert.strictEqual(result, true, 'Should succeed');
2151
+ const content = utils.readFile(testFile);
2152
+ assert.strictEqual(content, 'hello null',
2153
+ 'null replacement is coerced to string "null" by String.replace');
2154
+
2155
+ // undefined replacement → coerced to "undefined"
2156
+ fs.writeFileSync(testFile, 'hello world');
2157
+ utils.replaceInFile(testFile, 'world', undefined);
2158
+ const undefinedContent = utils.readFile(testFile);
2159
+ assert.strictEqual(undefinedContent, 'hello undefined',
2160
+ 'undefined replacement is coerced to string "undefined" by String.replace');
2161
+
2162
+ // Contrast: empty string replacement works as expected
2163
+ fs.writeFileSync(testFile, 'hello world');
2164
+ utils.replaceInFile(testFile, 'world', '');
2165
+ const emptyContent = utils.readFile(testFile);
2166
+ assert.strictEqual(emptyContent, 'hello ',
2167
+ 'Empty string replacement correctly removes matched text');
2168
+
2169
+ // options.all with null replacement
2170
+ fs.writeFileSync(testFile, 'foo bar foo baz foo');
2171
+ utils.replaceInFile(testFile, 'foo', null, { all: true });
2172
+ const allContent = utils.readFile(testFile);
2173
+ assert.strictEqual(allContent, 'null bar null baz null',
2174
+ 'replaceAll also coerces null to "null" for every occurrence');
2175
+ } finally {
2176
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2177
+ }
2178
+ })) passed++; else failed++;
2179
+
2180
+ // ── Round 116: ensureDir with null path — throws wrapped TypeError ──
2181
+ console.log('\nRound 116: ensureDir (null path — fs.existsSync(null) throws TypeError):');
2182
+ if (test('ensureDir with null path throws wrapped Error from TypeError (ERR_INVALID_ARG_TYPE)', () => {
2183
+ // fs.existsSync(null) throws TypeError in modern Node.js
2184
+ // Caught by ensureDir catch block, err.code !== 'EEXIST' → re-thrown as wrapped Error
2185
+ assert.throws(
2186
+ () => utils.ensureDir(null),
2187
+ (err) => {
2188
+ // Should be a wrapped Error (not raw TypeError)
2189
+ assert.ok(err instanceof Error, 'Should throw an Error');
2190
+ assert.ok(err.message.includes('Failed to create directory'),
2191
+ 'Error message should include "Failed to create directory"');
2192
+ return true;
2193
+ },
2194
+ 'ensureDir(null) should throw wrapped Error'
2195
+ );
2196
+
2197
+ // undefined path — same behavior
2198
+ assert.throws(
2199
+ () => utils.ensureDir(undefined),
2200
+ (err) => err instanceof Error && err.message.includes('Failed to create directory'),
2201
+ 'ensureDir(undefined) should also throw wrapped Error'
2202
+ );
2203
+ })) passed++; else failed++;
2204
+
2205
+ // ── Round 118: writeFile with non-string content — TypeError propagates (no try/catch) ──
2206
+ console.log('\nRound 118: writeFile (non-string content — TypeError propagates uncaught):');
2207
+ if (test('writeFile with null/number content throws TypeError because fs.writeFileSync rejects non-string data', () => {
2208
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r118-writefile-type-'));
2209
+ const testFile = path.join(tmpDir, 'test.txt');
2210
+ try {
2211
+ // null content → TypeError from fs.writeFileSync (data must be string/Buffer/etc.)
2212
+ assert.throws(
2213
+ () => utils.writeFile(testFile, null),
2214
+ (err) => err instanceof TypeError,
2215
+ 'writeFile(path, null) should throw TypeError (no try/catch in writeFile)'
2216
+ );
2217
+
2218
+ // undefined content → TypeError
2219
+ assert.throws(
2220
+ () => utils.writeFile(testFile, undefined),
2221
+ (err) => err instanceof TypeError,
2222
+ 'writeFile(path, undefined) should throw TypeError'
2223
+ );
2224
+
2225
+ // number content → TypeError (numbers not valid for fs.writeFileSync)
2226
+ assert.throws(
2227
+ () => utils.writeFile(testFile, 42),
2228
+ (err) => err instanceof TypeError,
2229
+ 'writeFile(path, 42) should throw TypeError (number not a valid data type)'
2230
+ );
2231
+
2232
+ // Contrast: string content works fine
2233
+ utils.writeFile(testFile, 'valid string content');
2234
+ assert.strictEqual(utils.readFile(testFile), 'valid string content',
2235
+ 'String content should write and read back correctly');
2236
+
2237
+ // Empty string is valid
2238
+ utils.writeFile(testFile, '');
2239
+ assert.strictEqual(utils.readFile(testFile), '',
2240
+ 'Empty string should write correctly');
2241
+ } finally {
2242
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2243
+ }
2244
+ })) passed++; else failed++;
2245
+
2246
+ // ── Round 119: appendFile with non-string content — TypeError propagates (no try/catch) ──
2247
+ console.log('\nRound 119: appendFile (non-string content — TypeError propagates like writeFile):');
2248
+ if (test('appendFile with null/number content throws TypeError (no try/catch wrapper)', () => {
2249
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r119-appendfile-type-'));
2250
+ const testFile = path.join(tmpDir, 'test.txt');
2251
+ try {
2252
+ // Create file with initial content
2253
+ fs.writeFileSync(testFile, 'initial');
2254
+
2255
+ // null content → TypeError from fs.appendFileSync
2256
+ assert.throws(
2257
+ () => utils.appendFile(testFile, null),
2258
+ (err) => err instanceof TypeError,
2259
+ 'appendFile(path, null) should throw TypeError'
2260
+ );
2261
+
2262
+ // undefined content → TypeError
2263
+ assert.throws(
2264
+ () => utils.appendFile(testFile, undefined),
2265
+ (err) => err instanceof TypeError,
2266
+ 'appendFile(path, undefined) should throw TypeError'
2267
+ );
2268
+
2269
+ // number content → TypeError
2270
+ assert.throws(
2271
+ () => utils.appendFile(testFile, 42),
2272
+ (err) => err instanceof TypeError,
2273
+ 'appendFile(path, 42) should throw TypeError'
2274
+ );
2275
+
2276
+ // Verify original content is unchanged after failed appends
2277
+ assert.strictEqual(utils.readFile(testFile), 'initial',
2278
+ 'File content should be unchanged after failed appends');
2279
+
2280
+ // Contrast: string append works
2281
+ utils.appendFile(testFile, ' appended');
2282
+ assert.strictEqual(utils.readFile(testFile), 'initial appended',
2283
+ 'String append should work correctly');
2284
+ } finally {
2285
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2286
+ }
2287
+ })) passed++; else failed++;
2288
+
2289
+ // ── Round 120: replaceInFile with empty string search — prepend vs insert-between-every-char ──
2290
+ console.log('\nRound 120: replaceInFile (empty string search — replace vs replaceAll dramatic difference):');
2291
+ if (test('replaceInFile with empty search: replace prepends at pos 0; replaceAll inserts between every char', () => {
2292
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r120-empty-search-'));
2293
+ const testFile = path.join(tmpDir, 'test.txt');
2294
+ try {
2295
+ // Without options.all: .replace('', 'X') prepends at position 0
2296
+ fs.writeFileSync(testFile, 'hello');
2297
+ utils.replaceInFile(testFile, '', 'X');
2298
+ const prepended = utils.readFile(testFile);
2299
+ assert.strictEqual(prepended, 'Xhello',
2300
+ 'replace("", "X") should prepend X at position 0 only');
2301
+
2302
+ // With options.all: .replaceAll('', 'X') inserts between every character
2303
+ fs.writeFileSync(testFile, 'hello');
2304
+ utils.replaceInFile(testFile, '', 'X', { all: true });
2305
+ const insertedAll = utils.readFile(testFile);
2306
+ assert.strictEqual(insertedAll, 'XhXeXlXlXoX',
2307
+ 'replaceAll("", "X") inserts X at every position boundary');
2308
+
2309
+ // Empty file + empty search
2310
+ fs.writeFileSync(testFile, '');
2311
+ utils.replaceInFile(testFile, '', 'X');
2312
+ const emptyReplace = utils.readFile(testFile);
2313
+ assert.strictEqual(emptyReplace, 'X',
2314
+ 'Empty content + empty search: single insertion at position 0');
2315
+
2316
+ // Empty file + empty search + all
2317
+ fs.writeFileSync(testFile, '');
2318
+ utils.replaceInFile(testFile, '', 'X', { all: true });
2319
+ const emptyAll = utils.readFile(testFile);
2320
+ assert.strictEqual(emptyAll, 'X',
2321
+ 'Empty content + replaceAll("", "X"): single position boundary → "X"');
2322
+ } finally {
2323
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2324
+ }
2325
+ })) passed++; else failed++;
2326
+
2327
+ // ── Round 121: findFiles with ? glob pattern — single character wildcard ──
2328
+ console.log('\nRound 121: findFiles (? glob pattern — converted to . regex for single char match):');
2329
+ if (test('findFiles with ? glob matches single character only — test?.txt matches test1 but not test12', () => {
2330
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r121-glob-question-'));
2331
+ try {
2332
+ // Create test files
2333
+ fs.writeFileSync(path.join(tmpDir, 'test1.txt'), 'a');
2334
+ fs.writeFileSync(path.join(tmpDir, 'testA.txt'), 'b');
2335
+ fs.writeFileSync(path.join(tmpDir, 'test12.txt'), 'c');
2336
+ fs.writeFileSync(path.join(tmpDir, 'test.txt'), 'd');
2337
+
2338
+ // ? matches exactly one character
2339
+ const results = utils.findFiles(tmpDir, 'test?.txt');
2340
+ const names = results.map(r => path.basename(r.path)).sort();
2341
+ assert.ok(names.includes('test1.txt'), 'Should match test1.txt (? = single digit)');
2342
+ assert.ok(names.includes('testA.txt'), 'Should match testA.txt (? = single letter)');
2343
+ assert.ok(!names.includes('test12.txt'), 'Should NOT match test12.txt (12 is two chars)');
2344
+ assert.ok(!names.includes('test.txt'), 'Should NOT match test.txt (no char for ?)');
2345
+
2346
+ // Multiple ? marks
2347
+ fs.writeFileSync(path.join(tmpDir, 'ab.txt'), 'e');
2348
+ fs.writeFileSync(path.join(tmpDir, 'abc.txt'), 'f');
2349
+ const multiResults = utils.findFiles(tmpDir, '??.txt');
2350
+ const multiNames = multiResults.map(r => path.basename(r.path));
2351
+ assert.ok(multiNames.includes('ab.txt'), '?? should match 2-char filename');
2352
+ assert.ok(!multiNames.includes('abc.txt'), '?? should NOT match 3-char filename');
2353
+ } finally {
2354
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2355
+ }
2356
+ })) passed++; else failed++;
2357
+
2358
+ // ── Round 122: findFiles dot extension escaping — *.txt must not match filetxt ──
2359
+ console.log('\nRound 122: findFiles (dot escaping — *.txt matches file.txt but not filetxt):');
2360
+ if (test('findFiles escapes dots in glob pattern so *.txt only matches literal .txt extension', () => {
2361
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r122-dot-escape-'));
2362
+ try {
2363
+ fs.writeFileSync(path.join(tmpDir, 'file.txt'), 'a');
2364
+ fs.writeFileSync(path.join(tmpDir, 'filetxt'), 'b');
2365
+ fs.writeFileSync(path.join(tmpDir, 'file.txtx'), 'c');
2366
+ fs.writeFileSync(path.join(tmpDir, 'notes.txt'), 'd');
2367
+
2368
+ const results = utils.findFiles(tmpDir, '*.txt');
2369
+ const names = results.map(r => path.basename(r.path)).sort();
2370
+
2371
+ assert.ok(names.includes('file.txt'), 'Should match file.txt');
2372
+ assert.ok(names.includes('notes.txt'), 'Should match notes.txt');
2373
+ assert.ok(!names.includes('filetxt'),
2374
+ 'Should NOT match filetxt (dot is escaped to literal, not wildcard)');
2375
+ assert.ok(!names.includes('file.txtx'),
2376
+ 'Should NOT match file.txtx ($ anchor requires exact end)');
2377
+ } finally {
2378
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2379
+ }
2380
+ })) passed++; else failed++;
2381
+
2382
+ // ── Round 123: countInFile with overlapping patterns — match(g) is non-overlapping ──
2383
+ console.log('\nRound 123: countInFile (overlapping patterns — String.match(/g/) is non-overlapping):');
2384
+ if (test('countInFile counts non-overlapping matches only — "aaa" with /aa/g returns 1 not 2', () => {
2385
+ // utils.js line 449: `content.match(regex)` with 'g' flag returns an array of
2386
+ // non-overlapping matches. After matching "aa" starting at index 0, the engine
2387
+ // advances to index 2, where only one "a" remains — no second match.
2388
+ // This is standard JS regex behavior but can surprise users expecting overlap.
2389
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r123-overlap-'));
2390
+ const testFile = path.join(tmpDir, 'test.txt');
2391
+ try {
2392
+ // "aaa" — a human might count 2 occurrences of "aa" (at 0,1) but match(g) finds 1
2393
+ fs.writeFileSync(testFile, 'aaa');
2394
+ const count1 = utils.countInFile(testFile, 'aa');
2395
+ assert.strictEqual(count1, 1,
2396
+ '"aaa".match(/aa/g) returns ["aa"] — only 1 non-overlapping match');
2397
+
2398
+ // "aaaa" — 2 non-overlapping matches (at 0,2), not 3 overlapping (at 0,1,2)
2399
+ fs.writeFileSync(testFile, 'aaaa');
2400
+ const count2 = utils.countInFile(testFile, 'aa');
2401
+ assert.strictEqual(count2, 2,
2402
+ '"aaaa".match(/aa/g) returns ["aa","aa"] — 2 non-overlapping, not 3 overlapping');
2403
+
2404
+ // "abab" with /aba/g — only 1 match (at 0), not 2 (overlapping at 0,2)
2405
+ fs.writeFileSync(testFile, 'ababab');
2406
+ const count3 = utils.countInFile(testFile, 'aba');
2407
+ assert.strictEqual(count3, 1,
2408
+ '"ababab".match(/aba/g) returns 1 — after match at 0, next try starts at 3');
2409
+
2410
+ // RegExp object behaves the same
2411
+ fs.writeFileSync(testFile, 'aaa');
2412
+ const count4 = utils.countInFile(testFile, /aa/);
2413
+ assert.strictEqual(count4, 1,
2414
+ 'RegExp /aa/ also gives 1 non-overlapping match on "aaa" (g flag auto-added)');
2415
+ } finally {
2416
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2417
+ }
2418
+ })) passed++; else failed++;
2419
+
2420
+ // ── Round 123: replaceInFile with $& and $$ substitution tokens in replacement string ──
2421
+ console.log('\nRound 123: replaceInFile ($& and $$ substitution tokens in replacement):');
2422
+ if (test('replaceInFile replacement string interprets $& as matched text and $$ as literal $', () => {
2423
+ // JS String.replace() interprets special patterns in the replacement string:
2424
+ // $& → inserts the entire matched substring
2425
+ // $$ → inserts a literal "$" character
2426
+ // $' → inserts the portion after the matched substring
2427
+ // $` → inserts the portion before the matched substring
2428
+ // This is different from capture groups ($1, $2) already tested in Round 91.
2429
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r123-dollar-'));
2430
+ const testFile = path.join(tmpDir, 'test.txt');
2431
+ try {
2432
+ // $& — inserts the matched text itself
2433
+ fs.writeFileSync(testFile, 'hello world');
2434
+ utils.replaceInFile(testFile, 'world', '[$&]');
2435
+ assert.strictEqual(utils.readFile(testFile), 'hello [world]',
2436
+ '$& in replacement inserts the matched text "world" → "[world]"');
2437
+
2438
+ // $$ — inserts a literal $ sign
2439
+ fs.writeFileSync(testFile, 'price is 100');
2440
+ utils.replaceInFile(testFile, '100', '$$100');
2441
+ assert.strictEqual(utils.readFile(testFile), 'price is $100',
2442
+ '$$ becomes literal $ → "100" replaced with "$100"');
2443
+
2444
+ // $& with options.all — applies to each match
2445
+ fs.writeFileSync(testFile, 'foo bar foo');
2446
+ utils.replaceInFile(testFile, 'foo', '($&)', { all: true });
2447
+ assert.strictEqual(utils.readFile(testFile), '(foo) bar (foo)',
2448
+ '$& in replaceAll inserts each respective matched text');
2449
+
2450
+ // Combined $$ and $& in same replacement (3 $ + &)
2451
+ fs.writeFileSync(testFile, 'item costs 50');
2452
+ utils.replaceInFile(testFile, '50', '$$$&');
2453
+ // In replacement string: $$ → "$" then $& → "50" so result is "$50"
2454
+ assert.strictEqual(utils.readFile(testFile), 'item costs $50',
2455
+ '$$$& (3 dollars + ampersand) means literal $ followed by matched text → "$50"');
2456
+ } finally {
2457
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2458
+ }
2459
+ })) passed++; else failed++;
2460
+
2461
+ // ── Round 124: findFiles matches dotfiles (unlike shell glob where * excludes hidden files) ──
2462
+ console.log('\nRound 124: findFiles (* glob matches dotfiles — unlike shell globbing):');
2463
+ if (test('findFiles with * pattern matches dotfiles because .* regex includes hidden files', () => {
2464
+ // In shell: `ls *` excludes .hidden files. In findFiles, `*` → `.*` regex which
2465
+ // matches ANY filename including those starting with `.`. This is a behavioral
2466
+ // difference from shell globbing that could surprise users.
2467
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r124-dotfiles-'));
2468
+ try {
2469
+ // Create normal and hidden files
2470
+ fs.writeFileSync(path.join(tmpDir, 'normal.txt'), 'visible');
2471
+ fs.writeFileSync(path.join(tmpDir, '.hidden'), 'hidden');
2472
+ fs.writeFileSync(path.join(tmpDir, '.gitignore'), 'ignore');
2473
+ fs.writeFileSync(path.join(tmpDir, 'README.md'), 'readme');
2474
+
2475
+ // * matches ALL files including dotfiles
2476
+ const allResults = utils.findFiles(tmpDir, '*');
2477
+ const names = allResults.map(r => path.basename(r.path)).sort();
2478
+ assert.ok(names.includes('.hidden'),
2479
+ '* should match .hidden (unlike shell glob)');
2480
+ assert.ok(names.includes('.gitignore'),
2481
+ '* should match .gitignore');
2482
+ assert.ok(names.includes('normal.txt'),
2483
+ '* should match normal.txt');
2484
+ assert.strictEqual(names.length, 4,
2485
+ 'Should find all 4 files including 2 dotfiles');
2486
+
2487
+ // *.txt does NOT match dotfiles (because they don't end with .txt)
2488
+ const txtResults = utils.findFiles(tmpDir, '*.txt');
2489
+ assert.strictEqual(txtResults.length, 1,
2490
+ '*.txt should only match normal.txt, not dotfiles');
2491
+
2492
+ // .* pattern specifically matches only dotfiles
2493
+ const dotResults = utils.findFiles(tmpDir, '.*');
2494
+ const dotNames = dotResults.map(r => path.basename(r.path)).sort();
2495
+ assert.ok(dotNames.includes('.hidden'), '.* matches .hidden');
2496
+ assert.ok(dotNames.includes('.gitignore'), '.* matches .gitignore');
2497
+ assert.ok(!dotNames.includes('normal.txt'),
2498
+ '.* should NOT match normal.txt (needs leading dot)');
2499
+ } finally {
2500
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2501
+ }
2502
+ })) passed++; else failed++;
2503
+
2504
+ // ── Round 125: readFile with binary content — returns garbled UTF-8, not null ──
2505
+ console.log('\nRound 125: readFile (binary/non-UTF8 content — garbled, not null):');
2506
+ if (test('readFile with binary content returns garbled string (not null) because UTF-8 decode does not throw', () => {
2507
+ // utils.js line 285: fs.readFileSync(filePath, 'utf8') — binary data gets UTF-8 decoded.
2508
+ // Invalid byte sequences become U+FFFD replacement characters. The function does
2509
+ // NOT return null for binary files (only returns null on ENOENT/permission errors).
2510
+ // This means grepFile/countInFile would operate on corrupted content silently.
2511
+ const tmpDir = fs.mkdtempSync(path.join(utils.getTempDir(), 'r125-binary-'));
2512
+ const testFile = path.join(tmpDir, 'binary.dat');
2513
+ try {
2514
+ // Write raw binary data (invalid UTF-8 sequences)
2515
+ const binaryData = Buffer.from([0x00, 0x80, 0xFF, 0xFE, 0x48, 0x65, 0x6C, 0x6C, 0x6F]);
2516
+ fs.writeFileSync(testFile, binaryData);
2517
+
2518
+ const content = utils.readFile(testFile);
2519
+ assert.ok(content !== null,
2520
+ 'readFile should NOT return null for binary files');
2521
+ assert.ok(typeof content === 'string',
2522
+ 'readFile always returns a string (or null for missing files)');
2523
+ // The string contains "Hello" (bytes 0x48-0x6F) somewhere in the garbled output
2524
+ assert.ok(content.includes('Hello'),
2525
+ 'ASCII subset of binary data should survive UTF-8 decode');
2526
+ // Content length may differ from byte length due to multi-byte replacement chars
2527
+ assert.ok(content.length > 0, 'Non-empty content from binary file');
2528
+
2529
+ // grepFile on binary file — still works but on garbled content
2530
+ const matches = utils.grepFile(testFile, 'Hello');
2531
+ assert.strictEqual(matches.length, 1,
2532
+ 'grepFile finds "Hello" even in binary file (ASCII bytes survive)');
2533
+
2534
+ // Non-existent file — returns null (contrast with binary)
2535
+ const missing = utils.readFile(path.join(tmpDir, 'no-such-file.txt'));
2536
+ assert.strictEqual(missing, null,
2537
+ 'Missing file returns null (not garbled content)');
2538
+ } finally {
2539
+ fs.rmSync(tmpDir, { recursive: true, force: true });
2540
+ }
2541
+ })) passed++; else failed++;
2542
+
2543
+ // ── Round 125: output() with undefined, NaN, Infinity — non-object primitives logged directly ──
2544
+ console.log('\nRound 125: output() (undefined/NaN/Infinity — typeof checks and JSON.stringify):');
2545
+ if (test('output() handles undefined, NaN, Infinity as non-objects — logs directly', () => {
2546
+ // utils.js line 273: `if (typeof data === 'object')` — undefined/NaN/Infinity are NOT objects.
2547
+ // typeof undefined → "undefined", typeof NaN → "number", typeof Infinity → "number"
2548
+ // All three bypass JSON.stringify and go to console.log(data) directly.
2549
+ const origLog = console.log;
2550
+ const logged = [];
2551
+ console.log = (...args) => logged.push(args);
2552
+ try {
2553
+ // undefined — typeof "undefined", logged directly
2554
+ utils.output(undefined);
2555
+ assert.strictEqual(logged[0][0], undefined,
2556
+ 'output(undefined) logs undefined (not "undefined" string)');
2557
+
2558
+ // NaN — typeof "number", logged directly
2559
+ utils.output(NaN);
2560
+ assert.ok(Number.isNaN(logged[1][0]),
2561
+ 'output(NaN) logs NaN directly (typeof "number", not "object")');
2562
+
2563
+ // Infinity — typeof "number", logged directly
2564
+ utils.output(Infinity);
2565
+ assert.strictEqual(logged[2][0], Infinity,
2566
+ 'output(Infinity) logs Infinity directly');
2567
+
2568
+ // Object containing NaN — JSON.stringify converts NaN to null
2569
+ utils.output({ value: NaN, count: Infinity });
2570
+ const parsed = JSON.parse(logged[3][0]);
2571
+ assert.strictEqual(parsed.value, null,
2572
+ 'JSON.stringify converts NaN to null inside objects');
2573
+ assert.strictEqual(parsed.count, null,
2574
+ 'JSON.stringify converts Infinity to null inside objects');
2575
+ } finally {
2576
+ console.log = origLog;
2577
+ }
2578
+ })) passed++; else failed++;
2579
+
2580
+ // ─── stripAnsi ───
2581
+ console.log('\nstripAnsi:');
2582
+
2583
+ if (test('strips SGR color codes (\\x1b[...m)', () => {
2584
+ assert.strictEqual(utils.stripAnsi('\x1b[31mRed text\x1b[0m'), 'Red text');
2585
+ assert.strictEqual(utils.stripAnsi('\x1b[1;36mBold cyan\x1b[0m'), 'Bold cyan');
2586
+ })) passed++; else failed++;
2587
+
2588
+ if (test('strips cursor movement sequences (\\x1b[H, \\x1b[2J, \\x1b[3J)', () => {
2589
+ // These are the exact sequences reported in issue #642
2590
+ assert.strictEqual(utils.stripAnsi('\x1b[H\x1b[2J\x1b[3JHello'), 'Hello');
2591
+ assert.strictEqual(utils.stripAnsi('before\x1b[Hafter'), 'beforeafter');
2592
+ })) passed++; else failed++;
2593
+
2594
+ if (test('strips cursor position sequences (\\x1b[row;colH)', () => {
2595
+ assert.strictEqual(utils.stripAnsi('\x1b[5;10Hplaced'), 'placed');
2596
+ })) passed++; else failed++;
2597
+
2598
+ if (test('strips erase line sequences (\\x1b[K, \\x1b[2K)', () => {
2599
+ assert.strictEqual(utils.stripAnsi('line\x1b[Kend'), 'lineend');
2600
+ assert.strictEqual(utils.stripAnsi('line\x1b[2Kend'), 'lineend');
2601
+ })) passed++; else failed++;
2602
+
2603
+ if (test('strips OSC sequences (window title, hyperlinks)', () => {
2604
+ // OSC terminated by BEL (\x07)
2605
+ assert.strictEqual(utils.stripAnsi('\x1b]0;My Title\x07content'), 'content');
2606
+ // OSC terminated by ST (\x1b\\)
2607
+ assert.strictEqual(utils.stripAnsi('\x1b]8;;https://example.com\x1b\\link\x1b]8;;\x1b\\'), 'link');
2608
+ })) passed++; else failed++;
2609
+
2610
+ if (test('strips charset selection (\\x1b(B)', () => {
2611
+ assert.strictEqual(utils.stripAnsi('\x1b(Bnormal'), 'normal');
2612
+ })) passed++; else failed++;
2613
+
2614
+ if (test('strips bare ESC + letter (\\x1bM reverse index)', () => {
2615
+ assert.strictEqual(utils.stripAnsi('line\x1bMup'), 'lineup');
2616
+ })) passed++; else failed++;
2617
+
2618
+ if (test('handles mixed ANSI sequences in one string', () => {
2619
+ const input = '\x1b[H\x1b[2J\x1b[1;36mSession\x1b[0m summary\x1b[K';
2620
+ assert.strictEqual(utils.stripAnsi(input), 'Session summary');
2621
+ })) passed++; else failed++;
2622
+
2623
+ if (test('returns empty string for non-string input', () => {
2624
+ assert.strictEqual(utils.stripAnsi(null), '');
2625
+ assert.strictEqual(utils.stripAnsi(undefined), '');
2626
+ assert.strictEqual(utils.stripAnsi(42), '');
2627
+ })) passed++; else failed++;
2628
+
2629
+ if (test('preserves string with no ANSI codes', () => {
2630
+ assert.strictEqual(utils.stripAnsi('plain text'), 'plain text');
2631
+ assert.strictEqual(utils.stripAnsi(''), '');
2632
+ })) passed++; else failed++;
2633
+
2634
+ if (test('handles CSI with question mark parameter (DEC private modes)', () => {
2635
+ // e.g. \x1b[?25h (show cursor), \x1b[?25l (hide cursor)
2636
+ assert.strictEqual(utils.stripAnsi('\x1b[?25hvisible\x1b[?25l'), 'visible');
2637
+ })) passed++; else failed++;
2638
+
2639
+ // Summary
2640
+ console.log('\n=== Test Results ===');
2641
+ console.log(`Passed: ${passed}`);
2642
+ console.log(`Failed: ${failed}`);
2643
+ console.log(`Total: ${passed + failed}\n`);
2644
+
2645
+ process.exit(failed > 0 ? 1 : 0);
2646
+ }
2647
+
2648
+ runTests();