kodelyth-ecc 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (846) hide show
  1. package/.agent/rules/README.md +108 -0
  2. package/.agent/rules/agents.md +94 -0
  3. package/.agent/rules/code-review.md +124 -0
  4. package/.agent/rules/coding-style.md +122 -0
  5. package/.agent/rules/design-quality.md +63 -0
  6. package/.agent/rules/development-workflow.md +44 -0
  7. package/.agent/rules/git-mastery.md +366 -0
  8. package/.agent/rules/git-workflow.md +24 -0
  9. package/.agent/rules/hooks.md +25 -0
  10. package/.agent/rules/kodelyth-always-on.md +63 -0
  11. package/.agent/rules/kodelyth-quickstart.md +207 -0
  12. package/.agent/rules/observability.md +390 -0
  13. package/.agent/rules/patterns.md +50 -0
  14. package/.agent/rules/performance.md +178 -0
  15. package/.agent/rules/security.md +58 -0
  16. package/.agent/rules/smart-debug.md +241 -0
  17. package/.agent/rules/soul.md +32 -0
  18. package/.agent/rules/testing.md +46 -0
  19. package/.agent/skills/api-guardian.md +279 -0
  20. package/.agent/skills/architect.md +211 -0
  21. package/.agent/skills/build-error-resolver.md +114 -0
  22. package/.agent/skills/chief-of-staff.md +151 -0
  23. package/.agent/skills/code-architect.md +71 -0
  24. package/.agent/skills/code-explorer.md +69 -0
  25. package/.agent/skills/code-reviewer.md +237 -0
  26. package/.agent/skills/code-simplifier.md +47 -0
  27. package/.agent/skills/comment-analyzer.md +45 -0
  28. package/.agent/skills/conversation-analyzer.md +52 -0
  29. package/.agent/skills/cpp-build-resolver.md +90 -0
  30. package/.agent/skills/cpp-reviewer.md +72 -0
  31. package/.agent/skills/csharp-reviewer.md +101 -0
  32. package/.agent/skills/dart-build-resolver.md +201 -0
  33. package/.agent/skills/database-reviewer.md +91 -0
  34. package/.agent/skills/debug-detective.md +409 -0
  35. package/.agent/skills/doc-updater.md +107 -0
  36. package/.agent/skills/docs-lookup.md +68 -0
  37. package/.agent/skills/e2e-runner.md +107 -0
  38. package/.agent/skills/flutter-reviewer.md +243 -0
  39. package/.agent/skills/gan-evaluator.md +209 -0
  40. package/.agent/skills/gan-generator.md +131 -0
  41. package/.agent/skills/gan-planner.md +99 -0
  42. package/.agent/skills/go-build-resolver.md +94 -0
  43. package/.agent/skills/go-reviewer.md +76 -0
  44. package/.agent/skills/harness-optimizer.md +35 -0
  45. package/.agent/skills/healthcare-reviewer.md +83 -0
  46. package/.agent/skills/java-build-resolver.md +153 -0
  47. package/.agent/skills/java-reviewer.md +92 -0
  48. package/.agent/skills/kodelyth-advisor.md +172 -0
  49. package/.agent/skills/kotlin-build-resolver.md +118 -0
  50. package/.agent/skills/kotlin-reviewer.md +159 -0
  51. package/.agent/skills/loop-operator.md +36 -0
  52. package/.agent/skills/migration-guide.md +368 -0
  53. package/.agent/skills/opensource-forker.md +198 -0
  54. package/.agent/skills/opensource-packager.md +249 -0
  55. package/.agent/skills/opensource-sanitizer.md +188 -0
  56. package/.agent/skills/pair-programmer.md +260 -0
  57. package/.agent/skills/performance-optimizer.md +446 -0
  58. package/.agent/skills/planner.md +212 -0
  59. package/.agent/skills/pr-test-analyzer.md +45 -0
  60. package/.agent/skills/python-reviewer.md +98 -0
  61. package/.agent/skills/pytorch-build-resolver.md +120 -0
  62. package/.agent/skills/refactor-cleaner.md +85 -0
  63. package/.agent/skills/rust-build-resolver.md +148 -0
  64. package/.agent/skills/rust-reviewer.md +94 -0
  65. package/.agent/skills/security-reviewer.md +108 -0
  66. package/.agent/skills/seo-specialist.md +62 -0
  67. package/.agent/skills/silent-failure-hunter.md +50 -0
  68. package/.agent/skills/tdd-guide.md +91 -0
  69. package/.agent/skills/type-design-analyzer.md +41 -0
  70. package/.agent/skills/typescript-reviewer.md +112 -0
  71. package/.agent/skills/ux-reviewer.md +483 -0
  72. package/.agent/workflows/agent-sort.md +23 -0
  73. package/.agent/workflows/aside.md +164 -0
  74. package/.agent/workflows/build-fix.md +62 -0
  75. package/.agent/workflows/checkpoint.md +74 -0
  76. package/.agent/workflows/claw.md +23 -0
  77. package/.agent/workflows/code-review.md +289 -0
  78. package/.agent/workflows/context-budget.md +23 -0
  79. package/.agent/workflows/cpp-build.md +173 -0
  80. package/.agent/workflows/cpp-review.md +132 -0
  81. package/.agent/workflows/cpp-test.md +251 -0
  82. package/.agent/workflows/devfleet.md +23 -0
  83. package/.agent/workflows/docs.md +23 -0
  84. package/.agent/workflows/e2e.md +268 -0
  85. package/.agent/workflows/eval.md +23 -0
  86. package/.agent/workflows/evolve.md +178 -0
  87. package/.agent/workflows/feature-dev.md +49 -0
  88. package/.agent/workflows/flutter-build.md +164 -0
  89. package/.agent/workflows/flutter-review.md +116 -0
  90. package/.agent/workflows/flutter-test.md +144 -0
  91. package/.agent/workflows/gan-build.md +99 -0
  92. package/.agent/workflows/gan-design.md +35 -0
  93. package/.agent/workflows/go-build.md +183 -0
  94. package/.agent/workflows/go-review.md +148 -0
  95. package/.agent/workflows/go-test.md +268 -0
  96. package/.agent/workflows/gradle-build.md +70 -0
  97. package/.agent/workflows/harness-audit.md +73 -0
  98. package/.agent/workflows/hookify-configure.md +14 -0
  99. package/.agent/workflows/hookify-help.md +46 -0
  100. package/.agent/workflows/hookify-list.md +21 -0
  101. package/.agent/workflows/hookify.md +50 -0
  102. package/.agent/workflows/instinct-export.md +66 -0
  103. package/.agent/workflows/instinct-import.md +114 -0
  104. package/.agent/workflows/instinct-status.md +59 -0
  105. package/.agent/workflows/jira.md +106 -0
  106. package/.agent/workflows/kotlin-build.md +174 -0
  107. package/.agent/workflows/kotlin-review.md +140 -0
  108. package/.agent/workflows/kotlin-test.md +312 -0
  109. package/.agent/workflows/learn-eval.md +116 -0
  110. package/.agent/workflows/learn.md +70 -0
  111. package/.agent/workflows/loop-start.md +32 -0
  112. package/.agent/workflows/loop-status.md +24 -0
  113. package/.agent/workflows/model-route.md +26 -0
  114. package/.agent/workflows/multi-backend.md +158 -0
  115. package/.agent/workflows/multi-execute.md +315 -0
  116. package/.agent/workflows/multi-frontend.md +158 -0
  117. package/.agent/workflows/multi-plan.md +268 -0
  118. package/.agent/workflows/multi-workflow.md +191 -0
  119. package/.agent/workflows/orchestrate.md +135 -0
  120. package/.agent/workflows/plan.md +117 -0
  121. package/.agent/workflows/pm2.md +272 -0
  122. package/.agent/workflows/projects.md +39 -0
  123. package/.agent/workflows/promote.md +41 -0
  124. package/.agent/workflows/prompt-optimize.md +23 -0
  125. package/.agent/workflows/prp-commit.md +112 -0
  126. package/.agent/workflows/prp-implement.md +385 -0
  127. package/.agent/workflows/prp-plan.md +502 -0
  128. package/.agent/workflows/prp-pr.md +184 -0
  129. package/.agent/workflows/prp-prd.md +447 -0
  130. package/.agent/workflows/prune.md +31 -0
  131. package/.agent/workflows/python-review.md +297 -0
  132. package/.agent/workflows/quality-gate.md +29 -0
  133. package/.agent/workflows/refactor-clean.md +80 -0
  134. package/.agent/workflows/resume-session.md +156 -0
  135. package/.agent/workflows/review-pr.md +37 -0
  136. package/.agent/workflows/rules-distill.md +20 -0
  137. package/.agent/workflows/rust-build.md +187 -0
  138. package/.agent/workflows/rust-review.md +142 -0
  139. package/.agent/workflows/rust-test.md +308 -0
  140. package/.agent/workflows/santa-loop.md +175 -0
  141. package/.agent/workflows/save-session.md +275 -0
  142. package/.agent/workflows/sessions.md +333 -0
  143. package/.agent/workflows/setup-pm.md +80 -0
  144. package/.agent/workflows/skill-create.md +174 -0
  145. package/.agent/workflows/skill-health.md +54 -0
  146. package/.agent/workflows/tdd.md +231 -0
  147. package/.agent/workflows/test-coverage.md +69 -0
  148. package/.agent/workflows/update-codemaps.md +72 -0
  149. package/.agent/workflows/update-docs.md +84 -0
  150. package/.agent/workflows/verify.md +23 -0
  151. package/.github/workflows/ci.yml +46 -0
  152. package/.github/workflows/publish.yml +41 -0
  153. package/AGENTS.md +209 -0
  154. package/CHANGELOG.md +236 -0
  155. package/CLAUDE.md +90 -0
  156. package/CONTRIBUTING.md +255 -0
  157. package/KODELYTH.md +74 -0
  158. package/LICENSE +21 -0
  159. package/README.md +414 -0
  160. package/SECURITY.md +77 -0
  161. package/SOUL.md +32 -0
  162. package/VERSION +1 -0
  163. package/agents/api-guardian.md +279 -0
  164. package/agents/architect.md +211 -0
  165. package/agents/build-error-resolver.md +114 -0
  166. package/agents/chief-of-staff.md +151 -0
  167. package/agents/code-architect.md +71 -0
  168. package/agents/code-explorer.md +69 -0
  169. package/agents/code-reviewer.md +237 -0
  170. package/agents/code-simplifier.md +47 -0
  171. package/agents/comment-analyzer.md +45 -0
  172. package/agents/conversation-analyzer.md +52 -0
  173. package/agents/cpp-build-resolver.md +90 -0
  174. package/agents/cpp-reviewer.md +72 -0
  175. package/agents/csharp-reviewer.md +101 -0
  176. package/agents/dart-build-resolver.md +201 -0
  177. package/agents/database-reviewer.md +91 -0
  178. package/agents/debug-detective.md +409 -0
  179. package/agents/doc-updater.md +107 -0
  180. package/agents/docs-lookup.md +68 -0
  181. package/agents/e2e-runner.md +107 -0
  182. package/agents/flutter-reviewer.md +243 -0
  183. package/agents/gan-evaluator.md +209 -0
  184. package/agents/gan-generator.md +131 -0
  185. package/agents/gan-planner.md +99 -0
  186. package/agents/go-build-resolver.md +94 -0
  187. package/agents/go-reviewer.md +76 -0
  188. package/agents/harness-optimizer.md +35 -0
  189. package/agents/healthcare-reviewer.md +83 -0
  190. package/agents/java-build-resolver.md +153 -0
  191. package/agents/java-reviewer.md +92 -0
  192. package/agents/kodelyth-advisor.md +172 -0
  193. package/agents/kotlin-build-resolver.md +118 -0
  194. package/agents/kotlin-reviewer.md +159 -0
  195. package/agents/loop-operator.md +36 -0
  196. package/agents/migration-guide.md +368 -0
  197. package/agents/opensource-forker.md +198 -0
  198. package/agents/opensource-packager.md +249 -0
  199. package/agents/opensource-sanitizer.md +188 -0
  200. package/agents/pair-programmer.md +260 -0
  201. package/agents/performance-optimizer.md +446 -0
  202. package/agents/planner.md +212 -0
  203. package/agents/pr-test-analyzer.md +45 -0
  204. package/agents/python-reviewer.md +98 -0
  205. package/agents/pytorch-build-resolver.md +120 -0
  206. package/agents/refactor-cleaner.md +85 -0
  207. package/agents/rust-build-resolver.md +148 -0
  208. package/agents/rust-reviewer.md +94 -0
  209. package/agents/security-reviewer.md +108 -0
  210. package/agents/seo-specialist.md +62 -0
  211. package/agents/silent-failure-hunter.md +50 -0
  212. package/agents/tdd-guide.md +91 -0
  213. package/agents/type-design-analyzer.md +41 -0
  214. package/agents/typescript-reviewer.md +112 -0
  215. package/agents/ux-reviewer.md +483 -0
  216. package/bin/kodelyth-ecc.js +87 -0
  217. package/commands/agent-sort.md +23 -0
  218. package/commands/aside.md +164 -0
  219. package/commands/build-fix.md +62 -0
  220. package/commands/checkpoint.md +74 -0
  221. package/commands/claw.md +23 -0
  222. package/commands/code-review.md +289 -0
  223. package/commands/context-budget.md +23 -0
  224. package/commands/cpp-build.md +173 -0
  225. package/commands/cpp-review.md +132 -0
  226. package/commands/cpp-test.md +251 -0
  227. package/commands/devfleet.md +23 -0
  228. package/commands/docs.md +23 -0
  229. package/commands/e2e.md +268 -0
  230. package/commands/eval.md +23 -0
  231. package/commands/evolve.md +178 -0
  232. package/commands/feature-dev.md +49 -0
  233. package/commands/flutter-build.md +164 -0
  234. package/commands/flutter-review.md +116 -0
  235. package/commands/flutter-test.md +144 -0
  236. package/commands/gan-build.md +99 -0
  237. package/commands/gan-design.md +35 -0
  238. package/commands/go-build.md +183 -0
  239. package/commands/go-review.md +148 -0
  240. package/commands/go-test.md +268 -0
  241. package/commands/gradle-build.md +70 -0
  242. package/commands/harness-audit.md +73 -0
  243. package/commands/hookify-configure.md +14 -0
  244. package/commands/hookify-help.md +46 -0
  245. package/commands/hookify-list.md +21 -0
  246. package/commands/hookify.md +50 -0
  247. package/commands/instinct-export.md +66 -0
  248. package/commands/instinct-import.md +114 -0
  249. package/commands/instinct-status.md +59 -0
  250. package/commands/jira.md +106 -0
  251. package/commands/kotlin-build.md +174 -0
  252. package/commands/kotlin-review.md +140 -0
  253. package/commands/kotlin-test.md +312 -0
  254. package/commands/learn-eval.md +116 -0
  255. package/commands/learn.md +70 -0
  256. package/commands/loop-start.md +32 -0
  257. package/commands/loop-status.md +24 -0
  258. package/commands/model-route.md +26 -0
  259. package/commands/multi-backend.md +158 -0
  260. package/commands/multi-execute.md +315 -0
  261. package/commands/multi-frontend.md +158 -0
  262. package/commands/multi-plan.md +268 -0
  263. package/commands/multi-workflow.md +191 -0
  264. package/commands/orchestrate.md +135 -0
  265. package/commands/plan.md +117 -0
  266. package/commands/pm2.md +272 -0
  267. package/commands/projects.md +39 -0
  268. package/commands/promote.md +41 -0
  269. package/commands/prompt-optimize.md +23 -0
  270. package/commands/prp-commit.md +112 -0
  271. package/commands/prp-implement.md +385 -0
  272. package/commands/prp-plan.md +502 -0
  273. package/commands/prp-pr.md +184 -0
  274. package/commands/prp-prd.md +447 -0
  275. package/commands/prune.md +31 -0
  276. package/commands/python-review.md +297 -0
  277. package/commands/quality-gate.md +29 -0
  278. package/commands/refactor-clean.md +80 -0
  279. package/commands/resume-session.md +156 -0
  280. package/commands/review-pr.md +37 -0
  281. package/commands/rules-distill.md +20 -0
  282. package/commands/rust-build.md +187 -0
  283. package/commands/rust-review.md +142 -0
  284. package/commands/rust-test.md +308 -0
  285. package/commands/santa-loop.md +175 -0
  286. package/commands/save-session.md +275 -0
  287. package/commands/sessions.md +333 -0
  288. package/commands/setup-pm.md +80 -0
  289. package/commands/skill-create.md +174 -0
  290. package/commands/skill-health.md +54 -0
  291. package/commands/tdd.md +231 -0
  292. package/commands/test-coverage.md +69 -0
  293. package/commands/update-codemaps.md +72 -0
  294. package/commands/update-docs.md +84 -0
  295. package/commands/verify.md +23 -0
  296. package/contexts/dev.md +20 -0
  297. package/contexts/research.md +26 -0
  298. package/contexts/review.md +22 -0
  299. package/dashboard/lib/agent-tracker.js +366 -0
  300. package/dashboard/lib/aggregator.js +118 -0
  301. package/dashboard/lib/cost-calculator.js +50 -0
  302. package/dashboard/lib/platform-detector.js +89 -0
  303. package/dashboard/lib/readers/antigravity-reader.js +113 -0
  304. package/dashboard/lib/readers/claude-reader.js +135 -0
  305. package/dashboard/lib/readers/codex-reader.js +192 -0
  306. package/dashboard/lib/readers/cursor-reader.js +135 -0
  307. package/dashboard/lib/readers/opencode-reader.js +201 -0
  308. package/dashboard/lib/readers/windsurf-reader.js +126 -0
  309. package/dashboard/package.json +24 -0
  310. package/dashboard/public/index.html +1147 -0
  311. package/dashboard/server.js +119 -0
  312. package/hooks/README.md +220 -0
  313. package/hooks/hooks.json +420 -0
  314. package/install.ps1 +190 -0
  315. package/install.sh +583 -0
  316. package/package.json +33 -0
  317. package/rules/README.md +111 -0
  318. package/rules/common/agents.md +50 -0
  319. package/rules/common/code-review.md +124 -0
  320. package/rules/common/coding-style.md +122 -0
  321. package/rules/common/development-workflow.md +44 -0
  322. package/rules/common/git-workflow.md +24 -0
  323. package/rules/common/hooks.md +30 -0
  324. package/rules/common/patterns.md +31 -0
  325. package/rules/common/performance.md +178 -0
  326. package/rules/common/security.md +29 -0
  327. package/rules/common/testing.md +57 -0
  328. package/rules/cpp/coding-style.md +44 -0
  329. package/rules/cpp/hooks.md +39 -0
  330. package/rules/cpp/patterns.md +51 -0
  331. package/rules/cpp/security.md +51 -0
  332. package/rules/cpp/testing.md +44 -0
  333. package/rules/csharp/coding-style.md +72 -0
  334. package/rules/csharp/hooks.md +25 -0
  335. package/rules/csharp/patterns.md +50 -0
  336. package/rules/csharp/security.md +58 -0
  337. package/rules/csharp/testing.md +46 -0
  338. package/rules/dart/coding-style.md +159 -0
  339. package/rules/dart/hooks.md +66 -0
  340. package/rules/dart/patterns.md +261 -0
  341. package/rules/dart/security.md +135 -0
  342. package/rules/dart/testing.md +215 -0
  343. package/rules/golang/coding-style.md +32 -0
  344. package/rules/golang/hooks.md +17 -0
  345. package/rules/golang/patterns.md +45 -0
  346. package/rules/golang/security.md +34 -0
  347. package/rules/golang/testing.md +31 -0
  348. package/rules/java/coding-style.md +114 -0
  349. package/rules/java/hooks.md +18 -0
  350. package/rules/java/patterns.md +146 -0
  351. package/rules/java/security.md +100 -0
  352. package/rules/java/testing.md +131 -0
  353. package/rules/kotlin/coding-style.md +86 -0
  354. package/rules/kotlin/hooks.md +17 -0
  355. package/rules/kotlin/patterns.md +146 -0
  356. package/rules/kotlin/security.md +82 -0
  357. package/rules/kotlin/testing.md +128 -0
  358. package/rules/perl/coding-style.md +46 -0
  359. package/rules/perl/hooks.md +22 -0
  360. package/rules/perl/patterns.md +76 -0
  361. package/rules/perl/security.md +69 -0
  362. package/rules/perl/testing.md +54 -0
  363. package/rules/php/coding-style.md +40 -0
  364. package/rules/php/hooks.md +24 -0
  365. package/rules/php/patterns.md +33 -0
  366. package/rules/php/security.md +37 -0
  367. package/rules/php/testing.md +39 -0
  368. package/rules/python/coding-style.md +42 -0
  369. package/rules/python/hooks.md +19 -0
  370. package/rules/python/patterns.md +39 -0
  371. package/rules/python/security.md +30 -0
  372. package/rules/python/testing.md +38 -0
  373. package/rules/rust/coding-style.md +151 -0
  374. package/rules/rust/hooks.md +16 -0
  375. package/rules/rust/patterns.md +168 -0
  376. package/rules/rust/security.md +141 -0
  377. package/rules/rust/testing.md +154 -0
  378. package/rules/swift/coding-style.md +47 -0
  379. package/rules/swift/hooks.md +20 -0
  380. package/rules/swift/patterns.md +66 -0
  381. package/rules/swift/security.md +33 -0
  382. package/rules/swift/testing.md +45 -0
  383. package/rules/typescript/coding-style.md +199 -0
  384. package/rules/typescript/hooks.md +22 -0
  385. package/rules/typescript/patterns.md +52 -0
  386. package/rules/typescript/security.md +28 -0
  387. package/rules/typescript/testing.md +18 -0
  388. package/rules/web/coding-style.md +96 -0
  389. package/rules/web/design-quality.md +63 -0
  390. package/rules/web/hooks.md +120 -0
  391. package/rules/web/patterns.md +79 -0
  392. package/rules/web/performance.md +64 -0
  393. package/rules/web/security.md +57 -0
  394. package/rules/web/testing.md +55 -0
  395. package/rules/zh/README.md +108 -0
  396. package/rules/zh/agents.md +50 -0
  397. package/rules/zh/code-review.md +124 -0
  398. package/rules/zh/coding-style.md +48 -0
  399. package/rules/zh/development-workflow.md +44 -0
  400. package/rules/zh/git-workflow.md +24 -0
  401. package/rules/zh/hooks.md +30 -0
  402. package/rules/zh/patterns.md +31 -0
  403. package/rules/zh/performance.md +55 -0
  404. package/rules/zh/security.md +29 -0
  405. package/rules/zh/testing.md +29 -0
  406. package/scripts/agent-tracker-hook.js +81 -0
  407. package/scripts/build-opencode.js +26 -0
  408. package/scripts/catalog.js +186 -0
  409. package/scripts/ci/catalog.js +648 -0
  410. package/scripts/ci/check-unicode-safety.js +246 -0
  411. package/scripts/ci/validate-agents.js +81 -0
  412. package/scripts/ci/validate-commands.js +136 -0
  413. package/scripts/ci/validate-hooks.js +239 -0
  414. package/scripts/ci/validate-install-manifests.js +214 -0
  415. package/scripts/ci/validate-no-personal-paths.js +63 -0
  416. package/scripts/ci/validate-rules.js +81 -0
  417. package/scripts/ci/validate-skills.js +56 -0
  418. package/scripts/claw.js +468 -0
  419. package/scripts/codemaps/generate.ts +330 -0
  420. package/scripts/codex/check-codex-global-state.sh +250 -0
  421. package/scripts/codex/install-global-git-hooks.sh +65 -0
  422. package/scripts/codex/merge-codex-config.js +317 -0
  423. package/scripts/codex/merge-mcp-config.js +335 -0
  424. package/scripts/codex-git-hooks/pre-commit +77 -0
  425. package/scripts/codex-git-hooks/pre-push +124 -0
  426. package/scripts/doctor.js +111 -0
  427. package/scripts/ecc.js +216 -0
  428. package/scripts/gan-harness.sh +299 -0
  429. package/scripts/harness-audit.js +735 -0
  430. package/scripts/hooks/auto-tmux-dev.js +88 -0
  431. package/scripts/hooks/branch-name-check.js +163 -0
  432. package/scripts/hooks/check-console-log.js +71 -0
  433. package/scripts/hooks/check-hook-enabled.js +12 -0
  434. package/scripts/hooks/config-protection.js +140 -0
  435. package/scripts/hooks/cost-tracker.js +78 -0
  436. package/scripts/hooks/design-quality-check.js +131 -0
  437. package/scripts/hooks/desktop-notify.js +168 -0
  438. package/scripts/hooks/doc-file-warning.js +90 -0
  439. package/scripts/hooks/evaluate-session.js +100 -0
  440. package/scripts/hooks/governance-capture.js +334 -0
  441. package/scripts/hooks/mcp-health-check.js +619 -0
  442. package/scripts/hooks/post-bash-build-complete.js +27 -0
  443. package/scripts/hooks/post-bash-command-log.js +73 -0
  444. package/scripts/hooks/post-bash-pr-created.js +36 -0
  445. package/scripts/hooks/post-edit-accumulator.js +78 -0
  446. package/scripts/hooks/post-edit-console-warn.js +54 -0
  447. package/scripts/hooks/post-edit-format.js +109 -0
  448. package/scripts/hooks/post-edit-typecheck.js +96 -0
  449. package/scripts/hooks/pre-bash-commit-quality.js +405 -0
  450. package/scripts/hooks/pre-bash-dev-server-block.js +187 -0
  451. package/scripts/hooks/pre-bash-git-push-reminder.js +28 -0
  452. package/scripts/hooks/pre-bash-tmux-reminder.js +33 -0
  453. package/scripts/hooks/pre-compact.js +48 -0
  454. package/scripts/hooks/pre-write-doc-warn.js +9 -0
  455. package/scripts/hooks/quality-gate.js +168 -0
  456. package/scripts/hooks/run-with-flags-shell.sh +36 -0
  457. package/scripts/hooks/run-with-flags.js +181 -0
  458. package/scripts/hooks/session-end-marker.js +67 -0
  459. package/scripts/hooks/session-end.js +301 -0
  460. package/scripts/hooks/session-start-bootstrap.js +161 -0
  461. package/scripts/hooks/session-start.js +492 -0
  462. package/scripts/hooks/smart-suggest.js +138 -0
  463. package/scripts/hooks/stop-format-typecheck.js +209 -0
  464. package/scripts/hooks/suggest-compact.js +80 -0
  465. package/scripts/hooks/test-reminder.js +128 -0
  466. package/scripts/install-apply.js +150 -0
  467. package/scripts/install-plan.js +266 -0
  468. package/scripts/lib/agent-compress.js +244 -0
  469. package/scripts/lib/hook-flags.js +74 -0
  470. package/scripts/lib/inspection.js +212 -0
  471. package/scripts/lib/install/apply.js +265 -0
  472. package/scripts/lib/install/config.js +89 -0
  473. package/scripts/lib/install/request.js +120 -0
  474. package/scripts/lib/install/runtime.js +54 -0
  475. package/scripts/lib/install-executor.js +672 -0
  476. package/scripts/lib/install-lifecycle.js +1226 -0
  477. package/scripts/lib/install-manifests.js +551 -0
  478. package/scripts/lib/install-state.js +313 -0
  479. package/scripts/lib/install-targets/antigravity-project.js +85 -0
  480. package/scripts/lib/install-targets/claude-home.js +10 -0
  481. package/scripts/lib/install-targets/codebuddy-project.js +50 -0
  482. package/scripts/lib/install-targets/codex-home.js +10 -0
  483. package/scripts/lib/install-targets/cursor-project.js +50 -0
  484. package/scripts/lib/install-targets/gemini-project.js +10 -0
  485. package/scripts/lib/install-targets/helpers.js +340 -0
  486. package/scripts/lib/install-targets/opencode-home.js +10 -0
  487. package/scripts/lib/install-targets/registry.js +70 -0
  488. package/scripts/lib/mcp-config.js +56 -0
  489. package/scripts/lib/observer-sessions.js +175 -0
  490. package/scripts/lib/orchestration-session.js +299 -0
  491. package/scripts/lib/package-manager.d.ts +119 -0
  492. package/scripts/lib/package-manager.js +431 -0
  493. package/scripts/lib/project-detect.js +428 -0
  494. package/scripts/lib/resolve-ecc-root.js +118 -0
  495. package/scripts/lib/resolve-formatter.js +185 -0
  496. package/scripts/lib/session-adapters/canonical-session.js +531 -0
  497. package/scripts/lib/session-adapters/claude-history.js +160 -0
  498. package/scripts/lib/session-adapters/dmux-tmux.js +90 -0
  499. package/scripts/lib/session-adapters/registry.js +127 -0
  500. package/scripts/lib/session-aliases.d.ts +136 -0
  501. package/scripts/lib/session-aliases.js +481 -0
  502. package/scripts/lib/session-manager.d.ts +132 -0
  503. package/scripts/lib/session-manager.js +533 -0
  504. package/scripts/lib/shell-split.js +86 -0
  505. package/scripts/lib/skill-evolution/dashboard.js +401 -0
  506. package/scripts/lib/skill-evolution/health.js +263 -0
  507. package/scripts/lib/skill-evolution/index.js +20 -0
  508. package/scripts/lib/skill-evolution/provenance.js +187 -0
  509. package/scripts/lib/skill-evolution/tracker.js +146 -0
  510. package/scripts/lib/skill-evolution/versioning.js +237 -0
  511. package/scripts/lib/skill-improvement/amendify.js +89 -0
  512. package/scripts/lib/skill-improvement/evaluate.js +59 -0
  513. package/scripts/lib/skill-improvement/health.js +118 -0
  514. package/scripts/lib/skill-improvement/observations.js +108 -0
  515. package/scripts/lib/state-store/index.js +191 -0
  516. package/scripts/lib/state-store/migrations.js +178 -0
  517. package/scripts/lib/state-store/queries.js +697 -0
  518. package/scripts/lib/state-store/schema.js +92 -0
  519. package/scripts/lib/tmux-worktree-orchestrator.js +598 -0
  520. package/scripts/lib/utils.d.ts +196 -0
  521. package/scripts/lib/utils.js +629 -0
  522. package/scripts/list-installed.js +91 -0
  523. package/scripts/orchestrate-codex-worker.sh +107 -0
  524. package/scripts/orchestrate-worktrees.js +108 -0
  525. package/scripts/orchestration-status.js +62 -0
  526. package/scripts/release.sh +83 -0
  527. package/scripts/repair.js +98 -0
  528. package/scripts/session-inspect.js +150 -0
  529. package/scripts/sessions-cli.js +178 -0
  530. package/scripts/setup-package-manager.js +204 -0
  531. package/scripts/skill-create-output.js +244 -0
  532. package/scripts/skills-health.js +132 -0
  533. package/scripts/status.js +177 -0
  534. package/scripts/sync-ecc-to-codex.sh +534 -0
  535. package/scripts/uninstall.js +97 -0
  536. package/skills/agent-eval/SKILL.md +145 -0
  537. package/skills/agent-harness-construction/SKILL.md +73 -0
  538. package/skills/agent-introspection-debugging/SKILL.md +153 -0
  539. package/skills/agent-payment-x402/SKILL.md +178 -0
  540. package/skills/agent-sort/SKILL.md +215 -0
  541. package/skills/agentic-engineering/SKILL.md +63 -0
  542. package/skills/ai-first-engineering/SKILL.md +51 -0
  543. package/skills/ai-regression-testing/SKILL.md +385 -0
  544. package/skills/android-clean-architecture/SKILL.md +339 -0
  545. package/skills/api-connector-builder/SKILL.md +121 -0
  546. package/skills/api-design/SKILL.md +523 -0
  547. package/skills/architecture-decision-records/SKILL.md +179 -0
  548. package/skills/article-writing/SKILL.md +79 -0
  549. package/skills/automation-audit-ops/SKILL.md +142 -0
  550. package/skills/autonomous-agent-harness/SKILL.md +267 -0
  551. package/skills/autonomous-loops/SKILL.md +610 -0
  552. package/skills/backend-patterns/SKILL.md +598 -0
  553. package/skills/benchmark/SKILL.md +93 -0
  554. package/skills/blueprint/SKILL.md +105 -0
  555. package/skills/brand-voice/SKILL.md +97 -0
  556. package/skills/brand-voice/references/voice-profile-schema.md +55 -0
  557. package/skills/browser-qa/SKILL.md +87 -0
  558. package/skills/bun-runtime/SKILL.md +84 -0
  559. package/skills/canary-watch/SKILL.md +99 -0
  560. package/skills/carrier-relationship-management/SKILL.md +212 -0
  561. package/skills/ck/SKILL.md +147 -0
  562. package/skills/ck/commands/forget.mjs +44 -0
  563. package/skills/ck/commands/info.mjs +24 -0
  564. package/skills/ck/commands/init.mjs +143 -0
  565. package/skills/ck/commands/list.mjs +40 -0
  566. package/skills/ck/commands/migrate.mjs +202 -0
  567. package/skills/ck/commands/resume.mjs +36 -0
  568. package/skills/ck/commands/save.mjs +210 -0
  569. package/skills/ck/commands/shared.mjs +387 -0
  570. package/skills/ck/hooks/session-start.mjs +224 -0
  571. package/skills/claude-api/SKILL.md +337 -0
  572. package/skills/claude-devfleet/SKILL.md +103 -0
  573. package/skills/click-path-audit/SKILL.md +244 -0
  574. package/skills/clickhouse-io/SKILL.md +439 -0
  575. package/skills/code-tour/SKILL.md +236 -0
  576. package/skills/codebase-onboarding/SKILL.md +233 -0
  577. package/skills/coding-standards/SKILL.md +549 -0
  578. package/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  579. package/skills/configure-ecc/SKILL.md +367 -0
  580. package/skills/connections-optimizer/SKILL.md +189 -0
  581. package/skills/content-engine/SKILL.md +131 -0
  582. package/skills/content-hash-cache-pattern/SKILL.md +161 -0
  583. package/skills/context-budget/SKILL.md +135 -0
  584. package/skills/continuous-agent-loop/SKILL.md +45 -0
  585. package/skills/continuous-learning/SKILL.md +123 -0
  586. package/skills/continuous-learning/config.json +18 -0
  587. package/skills/continuous-learning/evaluate-session.sh +69 -0
  588. package/skills/continuous-learning-v2/SKILL.md +365 -0
  589. package/skills/continuous-learning-v2/agents/observer-loop.sh +271 -0
  590. package/skills/continuous-learning-v2/agents/observer.md +198 -0
  591. package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  592. package/skills/continuous-learning-v2/agents/start-observer.sh +244 -0
  593. package/skills/continuous-learning-v2/config.json +8 -0
  594. package/skills/continuous-learning-v2/hooks/observe.sh +428 -0
  595. package/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
  596. package/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  597. package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +984 -0
  598. package/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  599. package/skills/council/SKILL.md +203 -0
  600. package/skills/cpp-coding-standards/SKILL.md +723 -0
  601. package/skills/cpp-testing/SKILL.md +324 -0
  602. package/skills/crosspost/SKILL.md +111 -0
  603. package/skills/csharp-testing/SKILL.md +321 -0
  604. package/skills/customer-billing-ops/SKILL.md +140 -0
  605. package/skills/customs-trade-compliance/SKILL.md +263 -0
  606. package/skills/dart-flutter-patterns/SKILL.md +563 -0
  607. package/skills/dashboard-builder/SKILL.md +109 -0
  608. package/skills/data-scraper-agent/SKILL.md +764 -0
  609. package/skills/database-migrations/SKILL.md +429 -0
  610. package/skills/deep-research/SKILL.md +155 -0
  611. package/skills/defi-amm-security/SKILL.md +160 -0
  612. package/skills/deployment-patterns/SKILL.md +427 -0
  613. package/skills/design-system/SKILL.md +82 -0
  614. package/skills/django-patterns/SKILL.md +734 -0
  615. package/skills/django-security/SKILL.md +593 -0
  616. package/skills/django-tdd/SKILL.md +729 -0
  617. package/skills/django-verification/SKILL.md +469 -0
  618. package/skills/dmux-workflows/SKILL.md +191 -0
  619. package/skills/docker-patterns/SKILL.md +364 -0
  620. package/skills/documentation-lookup/SKILL.md +90 -0
  621. package/skills/dotnet-patterns/SKILL.md +321 -0
  622. package/skills/e2e-testing/SKILL.md +326 -0
  623. package/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  624. package/skills/email-ops/SKILL.md +121 -0
  625. package/skills/energy-procurement/SKILL.md +228 -0
  626. package/skills/enterprise-agent-ops/SKILL.md +50 -0
  627. package/skills/eval-harness/SKILL.md +270 -0
  628. package/skills/evm-token-decimals/SKILL.md +130 -0
  629. package/skills/exa-search/SKILL.md +103 -0
  630. package/skills/fal-ai-media/SKILL.md +284 -0
  631. package/skills/finance-billing-ops/SKILL.md +127 -0
  632. package/skills/flutter-dart-code-review/SKILL.md +435 -0
  633. package/skills/foundation-models-on-device/SKILL.md +243 -0
  634. package/skills/frontend-design/SKILL.md +145 -0
  635. package/skills/frontend-patterns/SKILL.md +642 -0
  636. package/skills/frontend-slides/SKILL.md +184 -0
  637. package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  638. package/skills/gan-style-harness/SKILL.md +278 -0
  639. package/skills/git-mastery/SKILL.md +366 -0
  640. package/skills/git-workflow/SKILL.md +715 -0
  641. package/skills/github-ops/SKILL.md +144 -0
  642. package/skills/golang-patterns/SKILL.md +674 -0
  643. package/skills/golang-testing/SKILL.md +720 -0
  644. package/skills/google-workspace-ops/SKILL.md +95 -0
  645. package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  646. package/skills/healthcare-emr-patterns/SKILL.md +159 -0
  647. package/skills/healthcare-eval-harness/SKILL.md +207 -0
  648. package/skills/healthcare-phi-compliance/SKILL.md +145 -0
  649. package/skills/hexagonal-architecture/SKILL.md +276 -0
  650. package/skills/hipaa-compliance/SKILL.md +78 -0
  651. package/skills/hookify-rules/SKILL.md +128 -0
  652. package/skills/inventory-demand-planning/SKILL.md +247 -0
  653. package/skills/investor-materials/SKILL.md +96 -0
  654. package/skills/investor-outreach/SKILL.md +91 -0
  655. package/skills/iterative-retrieval/SKILL.md +211 -0
  656. package/skills/java-coding-standards/SKILL.md +147 -0
  657. package/skills/jira-integration/SKILL.md +293 -0
  658. package/skills/jpa-patterns/SKILL.md +151 -0
  659. package/skills/knowledge-ops/SKILL.md +154 -0
  660. package/skills/kodelyth-quickstart/SKILL.md +207 -0
  661. package/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  662. package/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  663. package/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  664. package/skills/kotlin-patterns/SKILL.md +711 -0
  665. package/skills/kotlin-testing/SKILL.md +824 -0
  666. package/skills/laravel-patterns/SKILL.md +415 -0
  667. package/skills/laravel-plugin-discovery/SKILL.md +229 -0
  668. package/skills/laravel-security/SKILL.md +285 -0
  669. package/skills/laravel-tdd/SKILL.md +283 -0
  670. package/skills/laravel-verification/SKILL.md +179 -0
  671. package/skills/lead-intelligence/SKILL.md +321 -0
  672. package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  673. package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  674. package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  675. package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  676. package/skills/liquid-glass-design/SKILL.md +279 -0
  677. package/skills/llm-trading-agent-security/SKILL.md +146 -0
  678. package/skills/logistics-exception-management/SKILL.md +222 -0
  679. package/skills/manim-video/SKILL.md +89 -0
  680. package/skills/manim-video/assets/network_graph_scene.py +52 -0
  681. package/skills/market-research/SKILL.md +75 -0
  682. package/skills/mcp-server-patterns/SKILL.md +67 -0
  683. package/skills/messages-ops/SKILL.md +104 -0
  684. package/skills/nanoclaw-repl/SKILL.md +33 -0
  685. package/skills/nestjs-patterns/SKILL.md +230 -0
  686. package/skills/nextjs-turbopack/SKILL.md +44 -0
  687. package/skills/nodejs-keccak256/SKILL.md +102 -0
  688. package/skills/nutrient-document-processing/SKILL.md +167 -0
  689. package/skills/nuxt4-patterns/SKILL.md +100 -0
  690. package/skills/observability/SKILL.md +390 -0
  691. package/skills/openclaw-persona-forge/SKILL.md +296 -0
  692. package/skills/openclaw-persona-forge/gacha.py +224 -0
  693. package/skills/openclaw-persona-forge/gacha.sh +5 -0
  694. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  695. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  696. package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  697. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  698. package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  699. package/skills/openclaw-persona-forge/references/output-template.md +166 -0
  700. package/skills/opensource-pipeline/SKILL.md +255 -0
  701. package/skills/perl-patterns/SKILL.md +504 -0
  702. package/skills/perl-security/SKILL.md +503 -0
  703. package/skills/perl-testing/SKILL.md +475 -0
  704. package/skills/plankton-code-quality/SKILL.md +236 -0
  705. package/skills/postgres-patterns/SKILL.md +147 -0
  706. package/skills/product-capability/SKILL.md +141 -0
  707. package/skills/product-lens/SKILL.md +92 -0
  708. package/skills/production-scheduling/SKILL.md +238 -0
  709. package/skills/project-flow-ops/SKILL.md +111 -0
  710. package/skills/prompt-optimizer/SKILL.md +397 -0
  711. package/skills/python-patterns/SKILL.md +750 -0
  712. package/skills/python-testing/SKILL.md +816 -0
  713. package/skills/pytorch-patterns/SKILL.md +396 -0
  714. package/skills/quality-nonconformance/SKILL.md +260 -0
  715. package/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  716. package/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  717. package/skills/remotion-video-creation/SKILL.md +43 -0
  718. package/skills/remotion-video-creation/rules/3d.md +86 -0
  719. package/skills/remotion-video-creation/rules/animations.md +29 -0
  720. package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  721. package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  722. package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  723. package/skills/remotion-video-creation/rules/assets.md +78 -0
  724. package/skills/remotion-video-creation/rules/audio.md +172 -0
  725. package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  726. package/skills/remotion-video-creation/rules/can-decode.md +75 -0
  727. package/skills/remotion-video-creation/rules/charts.md +58 -0
  728. package/skills/remotion-video-creation/rules/compositions.md +146 -0
  729. package/skills/remotion-video-creation/rules/display-captions.md +126 -0
  730. package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  731. package/skills/remotion-video-creation/rules/fonts.md +152 -0
  732. package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  733. package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  734. package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  735. package/skills/remotion-video-creation/rules/gifs.md +138 -0
  736. package/skills/remotion-video-creation/rules/images.md +130 -0
  737. package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  738. package/skills/remotion-video-creation/rules/lottie.md +67 -0
  739. package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  740. package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  741. package/skills/remotion-video-creation/rules/sequencing.md +106 -0
  742. package/skills/remotion-video-creation/rules/tailwind.md +11 -0
  743. package/skills/remotion-video-creation/rules/text-animations.md +20 -0
  744. package/skills/remotion-video-creation/rules/timing.md +179 -0
  745. package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  746. package/skills/remotion-video-creation/rules/transitions.md +122 -0
  747. package/skills/remotion-video-creation/rules/trimming.md +52 -0
  748. package/skills/remotion-video-creation/rules/videos.md +171 -0
  749. package/skills/repo-scan/SKILL.md +78 -0
  750. package/skills/research-ops/SKILL.md +112 -0
  751. package/skills/returns-reverse-logistics/SKILL.md +240 -0
  752. package/skills/rules-distill/SKILL.md +264 -0
  753. package/skills/rules-distill/scripts/scan-rules.sh +58 -0
  754. package/skills/rules-distill/scripts/scan-skills.sh +129 -0
  755. package/skills/rust-patterns/SKILL.md +499 -0
  756. package/skills/rust-testing/SKILL.md +500 -0
  757. package/skills/safety-guard/SKILL.md +75 -0
  758. package/skills/santa-method/SKILL.md +306 -0
  759. package/skills/search-first/SKILL.md +161 -0
  760. package/skills/security-bounty-hunter/SKILL.md +99 -0
  761. package/skills/security-review/SKILL.md +495 -0
  762. package/skills/security-review/cloud-infrastructure-security.md +361 -0
  763. package/skills/security-scan/SKILL.md +165 -0
  764. package/skills/seo/SKILL.md +154 -0
  765. package/skills/skill-comply/SKILL.md +58 -0
  766. package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  767. package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  768. package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  769. package/skills/skill-comply/prompts/classifier.md +24 -0
  770. package/skills/skill-comply/prompts/scenario_generator.md +62 -0
  771. package/skills/skill-comply/prompts/spec_generator.md +42 -0
  772. package/skills/skill-comply/pyproject.toml +15 -0
  773. package/skills/skill-comply/scripts/__init__.py +0 -0
  774. package/skills/skill-comply/scripts/classifier.py +85 -0
  775. package/skills/skill-comply/scripts/grader.py +122 -0
  776. package/skills/skill-comply/scripts/parser.py +107 -0
  777. package/skills/skill-comply/scripts/report.py +170 -0
  778. package/skills/skill-comply/scripts/run.py +127 -0
  779. package/skills/skill-comply/scripts/runner.py +161 -0
  780. package/skills/skill-comply/scripts/scenario_generator.py +70 -0
  781. package/skills/skill-comply/scripts/spec_generator.py +72 -0
  782. package/skills/skill-comply/scripts/utils.py +13 -0
  783. package/skills/skill-comply/tests/test_grader.py +137 -0
  784. package/skills/skill-comply/tests/test_parser.py +90 -0
  785. package/skills/skill-stocktake/SKILL.md +193 -0
  786. package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  787. package/skills/skill-stocktake/scripts/save-results.sh +56 -0
  788. package/skills/skill-stocktake/scripts/scan.sh +170 -0
  789. package/skills/smart-debug/SKILL.md +241 -0
  790. package/skills/social-graph-ranker/SKILL.md +154 -0
  791. package/skills/springboot-patterns/SKILL.md +314 -0
  792. package/skills/springboot-security/SKILL.md +272 -0
  793. package/skills/springboot-tdd/SKILL.md +158 -0
  794. package/skills/springboot-verification/SKILL.md +231 -0
  795. package/skills/strategic-compact/SKILL.md +131 -0
  796. package/skills/strategic-compact/suggest-compact.sh +54 -0
  797. package/skills/swift-actor-persistence/SKILL.md +143 -0
  798. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  799. package/skills/swift-protocol-di-testing/SKILL.md +190 -0
  800. package/skills/swiftui-patterns/SKILL.md +259 -0
  801. package/skills/tdd-workflow/SKILL.md +463 -0
  802. package/skills/team-builder/SKILL.md +168 -0
  803. package/skills/terminal-ops/SKILL.md +109 -0
  804. package/skills/token-budget-advisor/SKILL.md +133 -0
  805. package/skills/ui-demo/SKILL.md +465 -0
  806. package/skills/unified-notifications-ops/SKILL.md +187 -0
  807. package/skills/verification-loop/SKILL.md +126 -0
  808. package/skills/video-editing/SKILL.md +310 -0
  809. package/skills/videodb/SKILL.md +374 -0
  810. package/skills/videodb/reference/api-reference.md +550 -0
  811. package/skills/videodb/reference/capture-reference.md +407 -0
  812. package/skills/videodb/reference/capture.md +101 -0
  813. package/skills/videodb/reference/editor.md +443 -0
  814. package/skills/videodb/reference/generative.md +331 -0
  815. package/skills/videodb/reference/rtstream-reference.md +564 -0
  816. package/skills/videodb/reference/rtstream.md +65 -0
  817. package/skills/videodb/reference/search.md +230 -0
  818. package/skills/videodb/reference/streaming.md +406 -0
  819. package/skills/videodb/reference/use-cases.md +118 -0
  820. package/skills/videodb/scripts/ws_listener.py +282 -0
  821. package/skills/visa-doc-translate/README.md +86 -0
  822. package/skills/visa-doc-translate/SKILL.md +117 -0
  823. package/skills/workspace-surface-audit/SKILL.md +125 -0
  824. package/skills/x-api/SKILL.md +230 -0
  825. package/social/card-agents.svg +96 -0
  826. package/social/card-install.svg +99 -0
  827. package/social/card-main.svg +133 -0
  828. package/social/github-social-preview.svg +147 -0
  829. package/social/readme-agents.svg +139 -0
  830. package/social/readme-hero.svg +131 -0
  831. package/social/readme-lens.svg +140 -0
  832. package/social/readme-savings.svg +56 -0
  833. package/social/x-card-agents-grid.svg +94 -0
  834. package/social/x-card-free.svg +95 -0
  835. package/social/x-card-hook.svg +77 -0
  836. package/tests/hooks/branch-name-check.test.js +184 -0
  837. package/tests/hooks/smart-suggest.test.js +149 -0
  838. package/tests/hooks/test-reminder.test.js +181 -0
  839. package/tests/run-all.js +55 -0
  840. package/wiki/Agent-Reference.md +199 -0
  841. package/wiki/FAQ.md +142 -0
  842. package/wiki/Home.md +50 -0
  843. package/wiki/Hook-Reference.md +101 -0
  844. package/wiki/Installation-Guide.md +126 -0
  845. package/wiki/Platform-Support.md +106 -0
  846. package/wiki/Skill-Reference.md +103 -0
@@ -0,0 +1,492 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SessionStart Hook - Load previous context on new session
4
+ *
5
+ * Cross-platform (Windows, macOS, Linux)
6
+ *
7
+ * Runs when a new Claude session starts. Loads the most recent session
8
+ * summary into Claude's context via stdout, and reports available
9
+ * sessions and learned skills.
10
+ */
11
+
12
+ const {
13
+ getClaudeDir,
14
+ getSessionsDir,
15
+ getSessionSearchDirs,
16
+ getLearnedSkillsDir,
17
+ getProjectName,
18
+ findFiles,
19
+ ensureDir,
20
+ readFile,
21
+ stripAnsi,
22
+ log
23
+ } = require('../lib/utils');
24
+ const { resolveProjectContext, writeSessionLease, resolveSessionId } = require('../lib/observer-sessions');
25
+ const { getPackageManager, getSelectionPrompt } = require('../lib/package-manager');
26
+ const { listAliases } = require('../lib/session-aliases');
27
+ const { detectProjectType } = require('../lib/project-detect');
28
+ const path = require('path');
29
+ const fs = require('fs');
30
+
31
+ const INSTINCT_CONFIDENCE_THRESHOLD = 0.7;
32
+ const MAX_INJECTED_INSTINCTS = 6;
33
+ const DEFAULT_SESSION_RETENTION_DAYS = 30;
34
+
35
+ /**
36
+ * Resolve a filesystem path to its canonical (real) form.
37
+ *
38
+ * Handles symlinks and, on case-insensitive filesystems (macOS, Windows),
39
+ * normalizes casing so that path comparisons are reliable.
40
+ * Falls back to the original path if resolution fails (e.g. path no longer exists).
41
+ *
42
+ * @param {string} p - The path to normalize.
43
+ * @returns {string} The canonical path, or the original if resolution fails.
44
+ */
45
+ function normalizePath(p) {
46
+ try {
47
+ return fs.realpathSync(p);
48
+ } catch {
49
+ return p;
50
+ }
51
+ }
52
+
53
+ function dedupeRecentSessions(searchDirs) {
54
+ const recentSessionsByName = new Map();
55
+
56
+ for (const [dirIndex, dir] of searchDirs.entries()) {
57
+ const matches = findFiles(dir, '*-session.tmp', { maxAge: 7 });
58
+
59
+ for (const match of matches) {
60
+ const basename = path.basename(match.path);
61
+ const current = {
62
+ ...match,
63
+ basename,
64
+ dirIndex,
65
+ };
66
+ const existing = recentSessionsByName.get(basename);
67
+
68
+ if (
69
+ !existing
70
+ || current.mtime > existing.mtime
71
+ || (current.mtime === existing.mtime && current.dirIndex < existing.dirIndex)
72
+ ) {
73
+ recentSessionsByName.set(basename, current);
74
+ }
75
+ }
76
+ }
77
+
78
+ return Array.from(recentSessionsByName.values())
79
+ .sort((left, right) => right.mtime - left.mtime || left.dirIndex - right.dirIndex);
80
+ }
81
+
82
+ function getSessionRetentionDays() {
83
+ const raw = process.env.ECC_SESSION_RETENTION_DAYS;
84
+ if (!raw) return DEFAULT_SESSION_RETENTION_DAYS;
85
+ const parsed = Number.parseInt(raw, 10);
86
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : DEFAULT_SESSION_RETENTION_DAYS;
87
+ }
88
+
89
+ function pruneExpiredSessions(searchDirs, retentionDays) {
90
+ const uniqueDirs = Array.from(new Set(searchDirs.filter(dir => typeof dir === 'string' && dir.length > 0)));
91
+ let removed = 0;
92
+
93
+ for (const dir of uniqueDirs) {
94
+ if (!fs.existsSync(dir)) continue;
95
+
96
+ let entries;
97
+ try {
98
+ entries = fs.readdirSync(dir, { withFileTypes: true });
99
+ } catch {
100
+ continue;
101
+ }
102
+
103
+ for (const entry of entries) {
104
+ if (!entry.isFile() || !entry.name.endsWith('-session.tmp')) continue;
105
+
106
+ const fullPath = path.join(dir, entry.name);
107
+ let stats;
108
+ try {
109
+ stats = fs.statSync(fullPath);
110
+ } catch {
111
+ continue;
112
+ }
113
+
114
+ const ageInDays = (Date.now() - stats.mtimeMs) / (1000 * 60 * 60 * 24);
115
+ if (ageInDays <= retentionDays) continue;
116
+
117
+ try {
118
+ fs.rmSync(fullPath, { force: true });
119
+ removed += 1;
120
+ } catch (error) {
121
+ log(`[SessionStart] Warning: failed to prune expired session ${fullPath}: ${error.message}`);
122
+ }
123
+ }
124
+ }
125
+
126
+ return removed;
127
+ }
128
+
129
+ /**
130
+ * Select the best matching session for the current working directory.
131
+ *
132
+ * Session files written by session-end.js contain header fields like:
133
+ * **Project:** my-project
134
+ * **Worktree:** /path/to/project
135
+ *
136
+ * This function reads each session file once, caching its content, and
137
+ * returns both the selected session object and its already-read content
138
+ * to avoid duplicate I/O in the caller.
139
+ *
140
+ * Priority (highest to lowest):
141
+ * 1. Exact worktree (cwd) match — most recent
142
+ * 2. Same project name match — most recent
143
+ * 3. Fallback to overall most recent (original behavior)
144
+ *
145
+ * Sessions are already sorted newest-first, so the first match in each
146
+ * category wins.
147
+ *
148
+ * @param {Array<Object>} sessions - Deduplicated session list, sorted newest-first.
149
+ * @param {string} cwd - Current working directory (process.cwd()).
150
+ * @param {string} currentProject - Current project name from getProjectName().
151
+ * @returns {{ session: Object, content: string, matchReason: string } | null}
152
+ * The best matching session with its cached content and match reason,
153
+ * or null if the sessions array is empty or all files are unreadable.
154
+ */
155
+ function selectMatchingSession(sessions, cwd, currentProject) {
156
+ if (sessions.length === 0) return null;
157
+
158
+ // Normalize cwd once outside the loop to avoid repeated syscalls
159
+ const normalizedCwd = normalizePath(cwd);
160
+
161
+ let projectMatch = null;
162
+ let projectMatchContent = null;
163
+ let fallbackSession = null;
164
+ let fallbackContent = null;
165
+
166
+ for (const session of sessions) {
167
+ const content = readFile(session.path);
168
+ if (!content) continue;
169
+
170
+ // Cache first readable session+content pair for fallback
171
+ if (!fallbackSession) {
172
+ fallbackSession = session;
173
+ fallbackContent = content;
174
+ }
175
+
176
+ // Extract **Worktree:** field
177
+ const worktreeMatch = content.match(/\*\*Worktree:\*\*\s*(.+)$/m);
178
+ const sessionWorktree = worktreeMatch ? worktreeMatch[1].trim() : '';
179
+
180
+ // Exact worktree match — best possible, return immediately
181
+ // Normalize both paths to handle symlinks and case-insensitive filesystems
182
+ if (sessionWorktree && normalizePath(sessionWorktree) === normalizedCwd) {
183
+ return { session, content, matchReason: 'worktree' };
184
+ }
185
+
186
+ // Project name match — keep searching for a worktree match
187
+ if (!projectMatch && currentProject) {
188
+ const projectFieldMatch = content.match(/\*\*Project:\*\*\s*(.+)$/m);
189
+ const sessionProject = projectFieldMatch ? projectFieldMatch[1].trim() : '';
190
+ if (sessionProject && sessionProject === currentProject) {
191
+ projectMatch = session;
192
+ projectMatchContent = content;
193
+ }
194
+ }
195
+ }
196
+
197
+ if (projectMatch) {
198
+ return { session: projectMatch, content: projectMatchContent, matchReason: 'project' };
199
+ }
200
+
201
+ // Fallback: most recent readable session (original behavior)
202
+ if (fallbackSession) {
203
+ return { session: fallbackSession, content: fallbackContent, matchReason: 'recency-fallback' };
204
+ }
205
+
206
+ log('[SessionStart] All session files were unreadable');
207
+ return null;
208
+ }
209
+
210
+ function parseInstinctFile(content) {
211
+ const instincts = [];
212
+ let current = null;
213
+ let inFrontmatter = false;
214
+ let contentLines = [];
215
+
216
+ for (const line of String(content).split('\n')) {
217
+ if (line.trim() === '---') {
218
+ if (inFrontmatter) {
219
+ inFrontmatter = false;
220
+ } else {
221
+ if (current && current.id) {
222
+ current.content = contentLines.join('\n').trim();
223
+ instincts.push(current);
224
+ }
225
+ current = {};
226
+ contentLines = [];
227
+ inFrontmatter = true;
228
+ }
229
+ continue;
230
+ }
231
+
232
+ if (inFrontmatter) {
233
+ const separatorIndex = line.indexOf(':');
234
+ if (separatorIndex === -1) continue;
235
+ const key = line.slice(0, separatorIndex).trim();
236
+ let value = line.slice(separatorIndex + 1).trim();
237
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
238
+ value = value.slice(1, -1);
239
+ }
240
+ if (key === 'confidence') {
241
+ const parsed = Number.parseFloat(value);
242
+ current[key] = Number.isFinite(parsed) ? parsed : 0.5;
243
+ } else {
244
+ current[key] = value;
245
+ }
246
+ } else if (current) {
247
+ contentLines.push(line);
248
+ }
249
+ }
250
+
251
+ if (current && current.id) {
252
+ current.content = contentLines.join('\n').trim();
253
+ instincts.push(current);
254
+ }
255
+
256
+ return instincts;
257
+ }
258
+
259
+ function readInstinctsFromDir(directory, scope) {
260
+ if (!directory || !fs.existsSync(directory)) return [];
261
+
262
+ const entries = fs.readdirSync(directory, { withFileTypes: true })
263
+ .filter(entry => entry.isFile() && /\.(ya?ml|md)$/i.test(entry.name))
264
+ .sort((left, right) => left.name.localeCompare(right.name));
265
+
266
+ const instincts = [];
267
+ for (const entry of entries) {
268
+ const filePath = path.join(directory, entry.name);
269
+ try {
270
+ const parsed = parseInstinctFile(fs.readFileSync(filePath, 'utf8'));
271
+ for (const instinct of parsed) {
272
+ instincts.push({
273
+ ...instinct,
274
+ _scopeLabel: scope,
275
+ _sourceFile: filePath,
276
+ });
277
+ }
278
+ } catch (error) {
279
+ log(`[SessionStart] Warning: failed to parse instinct file ${filePath}: ${error.message}`);
280
+ }
281
+ }
282
+
283
+ return instincts;
284
+ }
285
+
286
+ function extractInstinctAction(content) {
287
+ const actionMatch = String(content || '').match(/## Action\s*\n+([\s\S]+?)(?:\n## |\n---|$)/);
288
+ const actionBlock = (actionMatch ? actionMatch[1] : String(content || '')).trim();
289
+ const firstLine = actionBlock
290
+ .split('\n')
291
+ .map(line => line.trim())
292
+ .find(Boolean);
293
+
294
+ return firstLine || '';
295
+ }
296
+
297
+ function summarizeActiveInstincts(observerContext) {
298
+ const homunculusDir = path.join(getClaudeDir(), 'homunculus');
299
+ const globalDirs = [
300
+ { dir: path.join(homunculusDir, 'instincts', 'personal'), scope: 'global' },
301
+ { dir: path.join(homunculusDir, 'instincts', 'inherited'), scope: 'global' },
302
+ ];
303
+ const projectDirs = observerContext.isGlobal ? [] : [
304
+ { dir: path.join(observerContext.projectDir, 'instincts', 'personal'), scope: 'project' },
305
+ { dir: path.join(observerContext.projectDir, 'instincts', 'inherited'), scope: 'project' },
306
+ ];
307
+
308
+ const scopedInstincts = [
309
+ ...projectDirs.flatMap(({ dir, scope }) => readInstinctsFromDir(dir, scope)),
310
+ ...globalDirs.flatMap(({ dir, scope }) => readInstinctsFromDir(dir, scope)),
311
+ ];
312
+
313
+ const deduped = new Map();
314
+ for (const instinct of scopedInstincts) {
315
+ if (!instinct.id || instinct.confidence < INSTINCT_CONFIDENCE_THRESHOLD) continue;
316
+ const existing = deduped.get(instinct.id);
317
+ if (!existing || (existing._scopeLabel !== 'project' && instinct._scopeLabel === 'project')) {
318
+ deduped.set(instinct.id, instinct);
319
+ }
320
+ }
321
+
322
+ const ranked = Array.from(deduped.values())
323
+ .map(instinct => ({
324
+ ...instinct,
325
+ action: extractInstinctAction(instinct.content),
326
+ }))
327
+ .filter(instinct => instinct.action)
328
+ .sort((left, right) => {
329
+ if (right.confidence !== left.confidence) return right.confidence - left.confidence;
330
+ if (left._scopeLabel !== right._scopeLabel) return left._scopeLabel === 'project' ? -1 : 1;
331
+ return String(left.id).localeCompare(String(right.id));
332
+ })
333
+ .slice(0, MAX_INJECTED_INSTINCTS);
334
+
335
+ if (ranked.length === 0) {
336
+ return '';
337
+ }
338
+
339
+ log(`[SessionStart] Injecting ${ranked.length} instinct(s) into session context`);
340
+
341
+ const lines = ranked.map(instinct => {
342
+ const scope = instinct._scopeLabel === 'project' ? 'project' : 'global';
343
+ const confidence = `${Math.round(instinct.confidence * 100)}%`;
344
+ return `- [${scope} ${confidence}] ${instinct.action}`;
345
+ });
346
+
347
+ return `Active instincts:\n${lines.join('\n')}`;
348
+ }
349
+
350
+ async function main() {
351
+ const sessionsDir = getSessionsDir();
352
+ const sessionSearchDirs = getSessionSearchDirs();
353
+ const learnedDir = getLearnedSkillsDir();
354
+ const additionalContextParts = [];
355
+ const observerContext = resolveProjectContext();
356
+
357
+ // Ensure directories exist
358
+ ensureDir(sessionsDir);
359
+ ensureDir(learnedDir);
360
+
361
+ const retentionDays = getSessionRetentionDays();
362
+ const prunedSessions = pruneExpiredSessions(sessionSearchDirs, retentionDays);
363
+ if (prunedSessions > 0) {
364
+ log(`[SessionStart] Pruned ${prunedSessions} expired session(s) older than ${retentionDays} day(s)`);
365
+ }
366
+
367
+ const observerSessionId = resolveSessionId();
368
+ if (observerSessionId) {
369
+ writeSessionLease(observerContext, observerSessionId, {
370
+ hook: 'SessionStart',
371
+ projectRoot: observerContext.projectRoot
372
+ });
373
+ log(`[SessionStart] Registered observer lease for ${observerSessionId}`);
374
+ } else {
375
+ log('[SessionStart] No CLAUDE_SESSION_ID available; skipping observer lease registration');
376
+ }
377
+
378
+ const instinctSummary = summarizeActiveInstincts(observerContext);
379
+ if (instinctSummary) {
380
+ additionalContextParts.push(instinctSummary);
381
+ }
382
+
383
+ // Check for recent session files (last 7 days)
384
+ const recentSessions = dedupeRecentSessions(sessionSearchDirs);
385
+
386
+ if (recentSessions.length > 0) {
387
+ log(`[SessionStart] Found ${recentSessions.length} recent session(s)`);
388
+
389
+ // Prefer a session that matches the current working directory or project.
390
+ // Session files contain **Project:** and **Worktree:** header fields written
391
+ // by session-end.js, so we can match against them.
392
+ const cwd = process.cwd();
393
+ const currentProject = getProjectName() || '';
394
+
395
+ const result = selectMatchingSession(recentSessions, cwd, currentProject);
396
+
397
+ if (result) {
398
+ log(`[SessionStart] Selected: ${result.session.path} (match: ${result.matchReason})`);
399
+
400
+ // Use the already-read content from selectMatchingSession (no duplicate I/O)
401
+ const content = stripAnsi(result.content);
402
+ if (content && !content.includes('[Session context goes here]')) {
403
+ additionalContextParts.push(`Previous session summary:\n${content}`);
404
+ }
405
+ } else {
406
+ log('[SessionStart] No matching session found');
407
+ }
408
+ }
409
+
410
+ // Check for learned skills
411
+ const learnedSkills = findFiles(learnedDir, '*.md');
412
+
413
+ if (learnedSkills.length > 0) {
414
+ log(`[SessionStart] ${learnedSkills.length} learned skill(s) available in ${learnedDir}`);
415
+ }
416
+
417
+ // Check for available session aliases
418
+ const aliases = listAliases({ limit: 5 });
419
+
420
+ if (aliases.length > 0) {
421
+ const aliasNames = aliases.map(a => a.name).join(', ');
422
+ log(`[SessionStart] ${aliases.length} session alias(es) available: ${aliasNames}`);
423
+ log(`[SessionStart] Use /sessions load <alias> to continue a previous session`);
424
+ }
425
+
426
+ // Detect and report package manager
427
+ const pm = getPackageManager();
428
+ log(`[SessionStart] Package manager: ${pm.name} (${pm.source})`);
429
+
430
+ // If no explicit package manager config was found, show selection prompt
431
+ if (pm.source === 'default') {
432
+ log('[SessionStart] No package manager preference found.');
433
+ log(getSelectionPrompt());
434
+ }
435
+
436
+ // Detect project type and frameworks (#293)
437
+ const projectInfo = detectProjectType();
438
+ if (projectInfo.languages.length > 0 || projectInfo.frameworks.length > 0) {
439
+ const parts = [];
440
+ if (projectInfo.languages.length > 0) {
441
+ parts.push(`languages: ${projectInfo.languages.join(', ')}`);
442
+ }
443
+ if (projectInfo.frameworks.length > 0) {
444
+ parts.push(`frameworks: ${projectInfo.frameworks.join(', ')}`);
445
+ }
446
+ log(`[SessionStart] Project detected — ${parts.join('; ')}`);
447
+ additionalContextParts.push(`Project type: ${JSON.stringify(projectInfo)}`);
448
+ } else {
449
+ log('[SessionStart] No specific project type detected');
450
+ }
451
+
452
+ await writeSessionStartPayload(additionalContextParts.join('\n\n'));
453
+ }
454
+
455
+ function writeSessionStartPayload(additionalContext) {
456
+ return new Promise((resolve, reject) => {
457
+ let settled = false;
458
+ const payload = JSON.stringify({
459
+ hookSpecificOutput: {
460
+ hookEventName: 'SessionStart',
461
+ additionalContext
462
+ }
463
+ });
464
+
465
+ const handleError = (err) => {
466
+ if (settled) return;
467
+ settled = true;
468
+ if (err) {
469
+ log(`[SessionStart] stdout write error: ${err.message}`);
470
+ }
471
+ reject(err || new Error('stdout stream error'));
472
+ };
473
+
474
+ process.stdout.once('error', handleError);
475
+ process.stdout.write(payload, (err) => {
476
+ process.stdout.removeListener('error', handleError);
477
+ if (settled) return;
478
+ settled = true;
479
+ if (err) {
480
+ log(`[SessionStart] stdout write error: ${err.message}`);
481
+ reject(err);
482
+ return;
483
+ }
484
+ resolve();
485
+ });
486
+ });
487
+ }
488
+
489
+ main().catch(err => {
490
+ console.error('[SessionStart] Error:', err.message);
491
+ process.exitCode = 0; // Don't block on errors
492
+ });
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Kodelyth ECC — Smart Suggest Hook
4
+ * Stop: runs after each Claude response
5
+ *
6
+ * Reads what just happened in the session transcript and suggests
7
+ * the most logical next agent or command to invoke.
8
+ *
9
+ * Respects ECC_DISABLED_HOOKS env var.
10
+ */
11
+
12
+ 'use strict'
13
+
14
+ const SUGGESTION_RULES = [
15
+ {
16
+ // Code was written/edited → suggest code review
17
+ signals: ['file_path', 'new_string', 'old_string', 'content'],
18
+ keywords: ['.ts', '.tsx', '.js', '.py', '.go', '.rs', '.java', '.kt'],
19
+ notKeywords: ['test', 'spec', '__test__'],
20
+ suggestion: 'use code-reviewer',
21
+ reason: 'Code was written — review before committing',
22
+ },
23
+ {
24
+ // Error/bug mentioned → suggest debug-detective
25
+ signals: ['error', 'bug', 'crash', 'exception', 'undefined', 'null', 'failed', 'broken'],
26
+ suggestion: 'use debug-detective',
27
+ reason: 'A bug or error is present — trace it to root cause',
28
+ },
29
+ {
30
+ // PR created → suggest security review
31
+ signals: ['pull_request', 'gh pr create', 'created pr', 'pull request'],
32
+ suggestion: 'use security-reviewer',
33
+ reason: 'PR was created — run a security check before merge',
34
+ },
35
+ {
36
+ // Build succeeded → suggest E2E tests
37
+ signals: ['build succeeded', 'compiled successfully', 'build passed', 'tests passed'],
38
+ suggestion: 'use e2e-runner',
39
+ reason: 'Build passed — verify critical user flows with E2E tests',
40
+ },
41
+ {
42
+ // API route created/modified → suggest api-guardian
43
+ signals: ['route', 'endpoint', 'controller', 'handler', '/api/'],
44
+ suggestion: 'use api-guardian',
45
+ reason: 'API was modified — check for breaking changes',
46
+ },
47
+ {
48
+ // New feature planning → suggest pair programmer
49
+ signals: ['i want to', 'i need to', 'how do i', 'help me build', 'implement'],
50
+ suggestion: 'use pair-programmer',
51
+ reason: 'Planning a feature — think it through before coding',
52
+ },
53
+ {
54
+ // Frontend UI written → suggest ux-reviewer
55
+ signals: ['.tsx', '.jsx', 'component', '<button', '<form', '<input', 'onClick', 'onChange'],
56
+ suggestion: 'use ux-reviewer',
57
+ reason: 'UI was built — check UX and accessibility',
58
+ },
59
+ {
60
+ // Major dependency mentioned → suggest migration guide
61
+ signals: ['upgrade', 'migrate', 'version', 'breaking change', 'deprecated'],
62
+ suggestion: 'use migration-guide',
63
+ reason: 'Migration or upgrade detected — get a phased plan',
64
+ },
65
+ ]
66
+
67
+ function isDisabled () {
68
+ const disabled = (process.env.ECC_DISABLED_HOOKS || '').split(',')
69
+ return disabled.includes('kodelyth:smart-suggest')
70
+ }
71
+
72
+ function detectSuggestion (content) {
73
+ const lower = content.toLowerCase()
74
+
75
+ for (const rule of SUGGESTION_RULES) {
76
+ const hasSignal = (rule.signals || []).some(s => lower.includes(s.toLowerCase()))
77
+ const hasKeyword = !rule.keywords || rule.keywords.some(k => lower.includes(k.toLowerCase()))
78
+ const hasNoExclusion = !rule.notKeywords || !rule.notKeywords.some(k => lower.includes(k.toLowerCase()))
79
+
80
+ if (hasSignal && hasKeyword && hasNoExclusion) {
81
+ return rule
82
+ }
83
+ }
84
+
85
+ return null
86
+ }
87
+
88
+ async function main () {
89
+ if (isDisabled()) {
90
+ const raw = await readStdin()
91
+ process.stdout.write(raw)
92
+ return
93
+ }
94
+
95
+ const raw = await readStdin()
96
+ let input
97
+
98
+ try {
99
+ input = JSON.parse(raw)
100
+ } catch {
101
+ process.stdout.write(raw)
102
+ return
103
+ }
104
+
105
+ // Extract content from the session transcript
106
+ const transcript = JSON.stringify(input || {})
107
+ const rule = detectSuggestion(transcript)
108
+
109
+ if (rule) {
110
+ const message = [
111
+ '',
112
+ '┌─ Kodelyth Smart Suggest ───────────────────────────────────┐',
113
+ `│ Next: ${rule.suggestion.padEnd(54)} │`,
114
+ `│ Why: ${rule.reason.slice(0, 54).padEnd(54)} │`,
115
+ '└────────────────────────────────────────────────────────────┘',
116
+ '',
117
+ ].join('\n')
118
+
119
+ process.stderr.write(message)
120
+ }
121
+
122
+ process.stdout.write(raw)
123
+ }
124
+
125
+ function readStdin () {
126
+ return new Promise((resolve) => {
127
+ let data = ''
128
+ process.stdin.setEncoding('utf8')
129
+ process.stdin.on('data', chunk => { data += chunk })
130
+ process.stdin.on('end', () => resolve(data))
131
+ process.stdin.on('error', () => resolve(data))
132
+ setTimeout(() => resolve(data), 3000)
133
+ })
134
+ }
135
+
136
+ main().catch(() => {
137
+ process.exit(0)
138
+ })