kenaz 0.3.18 → 0.3.20

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 (329) hide show
  1. package/core/.claude/commands/agent-worker.md +1 -1
  2. package/core/.claude/commands/architect.md +1 -2
  3. package/core/.claude/commands/spec.md +1 -1
  4. package/core/.claude/commands//347/224/242/345/223/201.md +1 -1
  5. package/core/.claude/hooks/__tests__/task-1977-dedupe-guard.test.js +8 -8
  6. package/core/.claude/skills/architect_agent/SKILL.md +11 -92
  7. package/core/.claude/skills/assessment_agent/SKILL.md +0 -1
  8. package/core/.claude/skills/backend_engineer/SKILL.md +3 -6
  9. package/core/.claude/skills/code_reviewer/SKILL.md +1 -1
  10. package/core/.claude/skills/code_reviewer/patterns.yaml +1 -1
  11. package/core/.claude/skills/designer/SKILL.md +3 -6
  12. package/core/.claude/skills/dev_agent/SKILL.md +30 -491
  13. package/core/.claude/skills/developer/SKILL.md +3 -6
  14. package/core/.claude/skills/feature_agent/SKILL.md +3 -17
  15. package/core/.claude/skills/product_manager/SKILL.md +29 -1064
  16. package/core/.claude/skills/qa_engineer/SKILL.md +12 -17
  17. package/core/.claude/skills/spec_optimizer/SKILL.md +25 -275
  18. package/core/.claude/skills/sre_agent/SKILL.md +3 -6
  19. package/core/.collaboration/README.md +2 -3
  20. package/core/.collaboration/core/task-api.js +5 -138
  21. package/core/.collaboration/docs/CLI.md +0 -2
  22. package/core/.failure/INDEX.yaml +6 -40
  23. package/core/.failure/agent-execution/FAIL-013-search-cwd-drift-and-case-mismatch.yaml +1 -1
  24. package/core/.failure/tools/README.md +9 -227
  25. package/core/.formation/bifrost/launch.js +1 -6
  26. package/core/.formation/bifrost/launch.test.js +1 -1
  27. package/core/.formation/bifrost/shared/ansuz-boot-policy.js +3 -3
  28. package/core/.formation/bifrost/shared/ansuz-boot-policy.test.js +1 -2
  29. package/core/.formation/tools/__tests__/arms.test.js +41 -0
  30. package/core/.formation/tools/__tests__/diagnose-bug.test.js +10 -0
  31. package/core/.formation/tools/__tests__/m1-hmap-convid.test.js +1 -124
  32. package/core/.formation/tools/arms.js +48 -0
  33. package/core/.formation/tools/dispatch.js +24 -15
  34. package/core/.formation/tools/kenaz-stats.js +32 -8
  35. package/core/.formation/tools/kenaz-stats.test.js +15 -2
  36. package/core/.formation/tools/loader.js +17 -140
  37. package/core/.formation/tools/post-complete.js +0 -31
  38. package/core/.formation/tools/prompt.js +16 -1
  39. package/core/.formation/tools/prompt.test.js +20 -0
  40. package/core/.rule/INDEX.yaml +0 -18
  41. package/core/.rule/general/agent-workflow.yaml +14 -164
  42. package/core/.rule/general/project-self-containment.yaml +8 -19
  43. package/core/.rule/general/rust-verify-target.yaml +6 -5
  44. package/core/.rule/general/synapse-code-intelligence.yaml +3 -3
  45. package/core/.specialist/Amelia/capability.yaml +12 -12
  46. package/core/.specialist/Amelia/workflow.yaml +2 -2
  47. package/core/.specialist/Ansuz/SYSTEM_DOC.md +20 -578
  48. package/core/.specialist/Ansuz/cognitive_principles.yaml +2 -3
  49. package/core/.specialist/Ansuz/concepts/boot_rules_summary.yaml +0 -1
  50. package/core/.specialist/Ansuz/concepts/deep_knowledge_pointers.yaml +1 -2
  51. package/core/.specialist/Ansuz/core.yaml +6 -108
  52. package/core/.specialist/Ansuz/guards/lesson_guards.yaml +0 -3
  53. package/core/.specialist/Ansuz/identity_contract.yaml +0 -1
  54. package/core/.specialist/Ansuz/knowledge.yaml +0 -4
  55. package/core/.specialist/Ansuz/rule.yaml +0 -1
  56. package/core/.specialist/Ansuz/tools/handoff-session-identity.test.js +6 -150
  57. package/core/.specialist/tests/runtime-discovery/README.md +1 -1
  58. package/core/.specialist/tools/__tests__/task-2374-usage-counter.test.js +1 -12
  59. package/core/.specialist/tools/ansuz-boot-fast.js +7 -4
  60. package/core/.specialist/tools/ansuz-boot-fast.test.js +10 -3
  61. package/core/.specialist/tools/prompt-files.test.js +1 -0
  62. package/core/.specialist/tools/task-bridge.js +1 -66
  63. package/core/.system/README.md +11 -552
  64. package/core/.system/collaboration/README.md +10 -174
  65. package/core/CLAUDE.md +1 -6
  66. package/core/KENAZ_CORE_VERSION +1 -1
  67. package/core/dev/scripts/js-yaml-resolution.test.js +1 -1
  68. package/core/dev/scripts/peer-identity-e2e.js +402 -0
  69. package/core/dev/scripts/peer-identity-e2e.md +47 -0
  70. package/core/dev/scripts/relay-admin.js +94 -0
  71. package/core/dev/scripts/relay-admin.test.js +131 -0
  72. package/core/dev/scripts/run-rust-tests.js +9 -45
  73. package/core/dev/scripts/rust-verify-worktree.js +4 -4
  74. package/core/dev/scripts/verify-target-dir.js +6 -6
  75. package/core/plugins/kenaz/INVENTORY.md +8 -8
  76. package/core/plugins/kenaz/README.md +10 -0
  77. package/core/plugins/kenaz/commands/architect.md +1 -2
  78. package/core/plugins/kenaz/commands/spec.md +1 -1
  79. package/core/plugins/kenaz/commands//347/224/242/345/223/201.md +1 -1
  80. package/core/plugins/kenaz/guidance.md +1 -1
  81. package/core/plugins/kenaz/hooks/kenaz-hook.js +2 -1
  82. package/core/plugins/kenaz/hooks/sdk-gate.js +9 -0
  83. package/core/plugins/kenaz/scripts/kenaz.test.js +15 -3
  84. package/core/plugins/kenaz/scripts/sync.js +1 -1
  85. package/core/plugins/kenaz/scripts/ygg.js +8 -0
  86. package/core/plugins/kenaz/scripts/ygg.test.js +72 -0
  87. package/core/plugins/kenaz/skills/architect_agent/SKILL.md +11 -92
  88. package/core/plugins/kenaz/skills/assessment_agent/SKILL.md +0 -1
  89. package/core/plugins/kenaz/skills/backend_engineer/SKILL.md +3 -6
  90. package/core/plugins/kenaz/skills/code_reviewer/SKILL.md +1 -1
  91. package/core/plugins/kenaz/skills/code_reviewer/patterns.yaml +1 -1
  92. package/core/plugins/kenaz/skills/designer/SKILL.md +3 -6
  93. package/core/plugins/kenaz/skills/dev_agent/SKILL.md +30 -491
  94. package/core/plugins/kenaz/skills/developer/SKILL.md +3 -6
  95. package/core/plugins/kenaz/skills/feature_agent/SKILL.md +3 -17
  96. package/core/plugins/kenaz/skills/product_manager/SKILL.md +29 -1064
  97. package/core/plugins/kenaz/skills/qa_engineer/SKILL.md +12 -17
  98. package/core/plugins/kenaz/skills/spec_optimizer/SKILL.md +25 -275
  99. package/core/plugins/kenaz/skills/sre_agent/SKILL.md +3 -6
  100. package/core/plugins/kenaz-peer/hooks/register.test.ts +32 -0
  101. package/core/plugins/kenaz-peer/hooks/register.ts +9 -0
  102. package/package.json +6 -6
  103. package/core/.claude/commands/archive.md +0 -24
  104. package/core/.claude/commands/init.md +0 -112
  105. package/core/.claude/commands/legacy_dev.md +0 -18
  106. package/core/.claude/commands/product-review.md +0 -131
  107. package/core/.claude/commands/strategy.md +0 -141
  108. package/core/.claude/commands/sunny.md +0 -1
  109. package/core/.claude/commands//347/224/242/345/223/201/346/252/242/350/246/226.md +0 -129
  110. package/core/.claude/commands//351/200/262/345/272/246.md +0 -15
  111. package/core/.claude/hooks/__tests__/substrate.test.js +0 -122
  112. package/core/.claude/hooks/_substrate-paths.js +0 -95
  113. package/core/.claude/hooks/context-check.js +0 -51
  114. package/core/.claude/hooks/fatigue-check.js +0 -52
  115. package/core/.claude/hooks/handoff-snapshot-on-commit.js +0 -154
  116. package/core/.claude/hooks/handoff-snapshot-on-question.js +0 -158
  117. package/core/.claude/hooks/handoff-staleness.js +0 -197
  118. package/core/.claude/hooks/jev-thalamus-context.js +0 -17
  119. package/core/.claude/hooks/jev-thalamus-context.test.js +0 -41
  120. package/core/.claude/hooks/lease-release.js +0 -119
  121. package/core/.claude/hooks/lease-touch.js +0 -96
  122. package/core/.claude/hooks/reflex-feedback.js +0 -5
  123. package/core/.claude/hooks/session-init.ps1 +0 -49
  124. package/core/.claude/hooks/sound-event.js +0 -70
  125. package/core/.claude/hooks/sound-event.sh +0 -37
  126. package/core/.claude/hooks/stream-delta.js +0 -169
  127. package/core/.claude/no-hooks.settings.json +0 -3
  128. package/core/.claude/skills/legacy_dev/SKILL.md +0 -202
  129. package/core/.claude/skills/sunny/SKILL.md +0 -74
  130. package/core/.collaboration/cli/commands/assign.js +0 -39
  131. package/core/.collaboration/cli/commands/claim.js +0 -33
  132. package/core/.collaboration/cli/commands/complete.js +0 -44
  133. package/core/.collaboration/cli/commands/create.js +0 -110
  134. package/core/.collaboration/cli/commands/get.js +0 -83
  135. package/core/.collaboration/cli/commands/index.js +0 -52
  136. package/core/.collaboration/cli/commands/list.js +0 -51
  137. package/core/.collaboration/cli/commands/lock.js +0 -45
  138. package/core/.collaboration/cli/commands/rebuild.js +0 -39
  139. package/core/.collaboration/cli/commands/search.js +0 -61
  140. package/core/.collaboration/cli/commands/stats.js +0 -61
  141. package/core/.collaboration/cli/commands/transfer.js +0 -41
  142. package/core/.collaboration/cli/commands/unlock.js +0 -48
  143. package/core/.collaboration/cli/formatters/help-formatter.js +0 -70
  144. package/core/.collaboration/cli/formatters/index.js +0 -7
  145. package/core/.collaboration/cli/task-cli.js +0 -46
  146. package/core/.collaboration/cli/utils/arg-parser.js +0 -74
  147. package/core/.collaboration/cli/utils/git-user.js +0 -25
  148. package/core/.collaboration/cli/utils/index.js +0 -9
  149. package/core/.collaboration/cli/utils/output.js +0 -10
  150. package/core/.collaboration/config/default.yaml +0 -189
  151. package/core/.collaboration/core/conflict-resolver.js +0 -461
  152. package/core/.collaboration/core/conflict-resolver.test.js +0 -389
  153. package/core/.collaboration/core/migrate-legacy.js +0 -260
  154. package/core/.collaboration/docs/API.md +0 -787
  155. package/core/.collaboration/docs/ARCHITECTURE.md +0 -596
  156. package/core/.collaboration/docs/FAQ.md +0 -695
  157. package/core/.collaboration/docs/MIGRATION.md +0 -804
  158. package/core/.collaboration/docs/examples/README.md +0 -320
  159. package/core/.collaboration/docs/examples/advanced-queries.js +0 -261
  160. package/core/.collaboration/docs/examples/basic-usage.js +0 -184
  161. package/core/.collaboration/docs/examples/team-workflow.js +0 -352
  162. package/core/.failure/agent-execution/FAIL-001-agent-no-output.yaml +0 -391
  163. package/core/.failure/agent-execution/FAIL-007-pm-lead-wrong-team-invocation.yaml +0 -0
  164. package/core/.failure/agent-execution/FAIL-010-phase0-poem-format-skipped.yaml +0 -28
  165. package/core/.failure/agent-execution/FAIL-010-skipping-cognitive-checkpoint-after-verification.yaml +0 -59
  166. package/core/.failure/agent-execution/FAIL-012-grep-shortcut-during-investigation.yaml +0 -85
  167. package/core/.failure/architecture/FAIL-006-python-version-compatibility.yaml +0 -445
  168. package/core/.failure/pipeline/FAIL-003-queue-pollution.yaml +0 -335
  169. package/core/.failure/pipeline/README.md +0 -95
  170. package/core/.failure/retired/FAIL-009-skipping-synapse-pulse-before-code-change.yaml +0 -49
  171. package/core/.failure/tools/USAGE_GUIDE.md +0 -323
  172. package/core/.failure/tools/check_failures.ps1 +0 -387
  173. package/core/.failure/tools/log_failure.ps1 +0 -474
  174. package/core/.formation/.episode-input.json +0 -10
  175. package/core/.formation/.merge-lock +0 -1
  176. package/core/.formation/lead.yaml +0 -118
  177. package/core/.formation/legacy.bak/designer.yaml +0 -57
  178. package/core/.formation/legacy.bak/pm.yaml +0 -57
  179. package/core/.formation/legacy.bak/qa.yaml +0 -57
  180. package/core/.formation/legacy.bak/review.yaml +0 -62
  181. package/core/.formation/legacy.bak/scheduler.yaml +0 -129
  182. package/core/.formation/legacy.bak/sre.yaml +0 -57
  183. package/core/.formation/role-map.yaml +0 -274
  184. package/core/.formation/roles/_shared/modules/code_review.yaml +0 -98
  185. package/core/.formation/roles/_shared/modules/security.yaml +0 -103
  186. package/core/.formation/roles/_shared/modules/testing.yaml +0 -14
  187. package/core/.formation/roles/backend/role.yaml +0 -93
  188. package/core/.formation/roles/code_reviewer/role.yaml +0 -102
  189. package/core/.formation/roles/database_optimizer/role.yaml +0 -107
  190. package/core/.formation/roles/designer/role.yaml +0 -66
  191. package/core/.formation/roles/developer/role.yaml +0 -75
  192. package/core/.formation/roles/frontend/role.yaml +0 -134
  193. package/core/.formation/roles/incident_response/role.yaml +0 -89
  194. package/core/.formation/roles/qa/role.yaml +0 -89
  195. package/core/.formation/roles/security/role.yaml +0 -87
  196. package/core/.formation/roles/sre/role.yaml +0 -66
  197. package/core/.formation/skills/coordinator.yaml +0 -52
  198. package/core/.formation/solo/diagnosis.yaml +0 -78
  199. package/core/.formation/solo/strategy.yaml +0 -121
  200. package/core/.formation/tests/hello.txt +0 -2
  201. package/core/.formation/tools/coordinator.js +0 -350
  202. package/core/.formation/tools/jev-correction.js +0 -214
  203. package/core/.formation/tools/jev-correction.test.js +0 -178
  204. package/core/.formation/tools/log-reader.js +0 -232
  205. package/core/.formation/tools/revert-daemon-state.js +0 -162
  206. package/core/.formation/tools/test-drift.js +0 -148
  207. package/core/.formation/unit/heimdall.yaml +0 -96
  208. package/core/.formation/unit/plan.yaml +0 -67
  209. package/core/.formation/unit/think.yaml +0 -58
  210. package/core/.kenaz/MUNINN_SNAPSHOT9_EPISODE.json +0 -32
  211. package/core/.kenaz/MUNINN_SNAPSHOT9_RUNE.json +0 -23
  212. package/core/.kenaz/MUNINN_SNAPSHOT9_SUMMARY.md +0 -89
  213. package/core/.kenaz/ash_TASK_1428-20260507.json +0 -14
  214. package/core/.kenaz/muninn_episode_write.ps1 +0 -17
  215. package/core/.kenaz/muninn_snapshot11_rune_candidates.md +0 -63
  216. package/core/.kenaz/muninn_snapshot1_rune_candidates.md +0 -49
  217. package/core/.kenaz/runes_TASK_1428.json +0 -57
  218. package/core/.kenaz/tmp_heimdall_proposal_8d3e392.json +0 -13
  219. package/core/.kenaz/tmp_props.json +0 -1
  220. package/core/.kenaz/tmp_sounddrop_t1_prompt.txt +0 -371
  221. package/core/.rule/MECHANIZED.md +0 -61
  222. package/core/.rule/general/cortex-memory-recall.yaml +0 -446
  223. package/core/.rule/general/pipeline.yaml +0 -246
  224. package/core/.rule/general/sunny-access-control.yaml +0 -60
  225. package/core/.rule/general/system-invariants.yaml +0 -231
  226. package/core/.rule/pipeline/PPL-002-completed-task-archival.yaml +0 -528
  227. package/core/.rule/pipeline/auto-update.yaml +0 -282
  228. package/core/.rule/pipeline/task-execution.yaml +0 -365
  229. package/core/.specialist/Ansuz/concepts/phase_protocol.yaml +0 -65
  230. package/core/.specialist/Ansuz/experiments/boot_ablation_replay.js +0 -197
  231. package/core/.specialist/Ansuz/tools/bootstrap-anchors.js +0 -289
  232. package/core/.specialist/Ansuz/workflow.yaml +0 -1225
  233. package/core/.specialist/experiments/rg_benchmark.js +0 -523
  234. package/core/.specialist/experiments/rg_benchmark_results.json +0 -27
  235. package/core/.specialist/tools/jev-optional-context.js +0 -107
  236. package/core/.specialist/tools/jev-optional-context.test.js +0 -152
  237. package/core/.specialist/tools/memory-action-log.js +0 -839
  238. package/core/.specialist/tools/phase-gate.js +0 -3534
  239. package/core/.specialist/tools/phase-gate.test.js +0 -85
  240. package/core/.specialist/tools/precompute-runner.js +0 -444
  241. package/core/.specialist/tools/rule-engine.js +0 -621
  242. package/core/.specialist/tools/task-bridge-jev.test.js +0 -170
  243. package/core/.synapse/memory-shared.json.sync +0 -1
  244. package/core/.system/agent-skills/README.md +0 -724
  245. package/core/.system/cli-tools/README.md +0 -724
  246. package/core/.system/cortex/MODULES.md +0 -1046
  247. package/core/.system/dashboard/FRONTEND.md +0 -812
  248. package/core/.system/dashboard/README.md +0 -737
  249. package/core/.system/failure/README.md +0 -723
  250. package/core/.system/formation/LEGACY_SKILLS.md +0 -974
  251. package/core/.system/formation/POST_COMPLETE.md +0 -602
  252. package/core/.system/formation/README.md +0 -1094
  253. package/core/.system/formation/TOOLS_REFERENCE.md +0 -1145
  254. package/core/.system/kenaz/README.md +0 -787
  255. package/core/.system/memory/README.md +0 -719
  256. package/core/.system/pipeline/README.md +0 -712
  257. package/core/.system/rule/README.md +0 -794
  258. package/core/.system/sunny/README.md +0 -476
  259. package/core/.system/sunny/RULES.json +0 -89
  260. package/core/.system/sunny/knowledge/INDEX.md +0 -37
  261. package/core/.system/sunny/knowledge/agent-teams-api.md +0 -0
  262. package/core/.system/sunny/knowledge/ansuz-specialist.md +0 -500
  263. package/core/.system/sunny/knowledge/claude-cli-spawn.md +0 -177
  264. package/core/.system/sunny/knowledge/collaboration-api.md +0 -925
  265. package/core/.system/sunny/teammates/README.md +0 -107
  266. package/core/.system/sunny/teammates/how_to_use.yaml +0 -101
  267. package/core/.system/sunny/teammates/tools/headless/launcher.js +0 -318
  268. package/core/.system/sunny/teammates/tools/powershell/launcher.js +0 -241
  269. package/core/.system/sunny/teammates/tools/powershell/start.bat +0 -50
  270. package/core/.system/sunny/teammates/tools/utils/env.js +0 -96
  271. package/core/.system/sunny/teammates/tools/utils/format-output.js +0 -329
  272. package/core/.system/sunny/tools.json +0 -101
  273. package/core/dev/scripts/cleanup-queue.js +0 -184
  274. package/core/dev/scripts/cleanup_queue.js +0 -86
  275. package/core/dev/scripts/legacy/README.md +0 -39
  276. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +0 -536
  277. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +0 -1978
  278. package/core/dev/scripts/matrix/CLI_README.md +0 -214
  279. package/core/dev/scripts/matrix/README.md +0 -310
  280. package/core/dev/scripts/matrix/package-lock.json +0 -4266
  281. package/core/dev/scripts/matrix/package.json +0 -55
  282. package/core/dev/scripts/matrix/src/abbreviations.ts +0 -295
  283. package/core/dev/scripts/matrix/src/cli/commands/convert.ts +0 -211
  284. package/core/dev/scripts/matrix/src/cli/commands/create.ts +0 -95
  285. package/core/dev/scripts/matrix/src/cli/commands/delete.ts +0 -102
  286. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +0 -140
  287. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +0 -173
  288. package/core/dev/scripts/matrix/src/cli/commands/query.ts +0 -261
  289. package/core/dev/scripts/matrix/src/cli/commands/read.ts +0 -77
  290. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +0 -168
  291. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +0 -126
  292. package/core/dev/scripts/matrix/src/cli/commands/update.ts +0 -147
  293. package/core/dev/scripts/matrix/src/cli/commands/validate.ts +0 -275
  294. package/core/dev/scripts/matrix/src/cli/index.ts +0 -350
  295. package/core/dev/scripts/matrix/src/cli/utils/file-handler.ts +0 -72
  296. package/core/dev/scripts/matrix/src/cli/utils/logger.ts +0 -65
  297. package/core/dev/scripts/matrix/src/index.ts +0 -62
  298. package/core/dev/scripts/matrix/src/indexer/tag-indexer.ts +0 -165
  299. package/core/dev/scripts/matrix/src/parser.ts +0 -281
  300. package/core/dev/scripts/matrix/src/serializer.ts +0 -151
  301. package/core/dev/scripts/matrix/src/validator.ts +0 -301
  302. package/core/dev/scripts/matrix/tests/abbreviations.test.ts +0 -122
  303. package/core/dev/scripts/matrix/tests/cli.test.ts +0 -177
  304. package/core/dev/scripts/matrix/tests/convert.test.ts +0 -143
  305. package/core/dev/scripts/matrix/tests/parser.test.ts +0 -203
  306. package/core/dev/scripts/matrix/tests/query.test.ts +0 -85
  307. package/core/dev/scripts/matrix/tests/serializer.test.ts +0 -197
  308. package/core/dev/scripts/matrix/tests/validate.test.ts +0 -141
  309. package/core/dev/scripts/matrix/tests/validator.test.ts +0 -167
  310. package/core/dev/scripts/matrix/tsconfig.json +0 -20
  311. package/core/dev/scripts/matrix/types/index.d.ts +0 -111
  312. package/core/dev/scripts/matrix/types/index.d.ts.map +0 -1
  313. package/core/dev/scripts/matrix/types/index.js +0 -8
  314. package/core/dev/scripts/matrix/types/index.js.map +0 -1
  315. package/core/dev/scripts/matrix/types/index.ts +0 -124
  316. package/core/dev/scripts/memory-usage-report.js +0 -152
  317. package/core/dev/scripts/probe/ansuz-scaffold-ablation.js +0 -579
  318. package/core/dev/scripts/probe/ansuz-scaffold-ablation.test.js +0 -244
  319. package/core/dev/scripts/probe/hook-latency-probe.js +0 -315
  320. package/core/dev/scripts/probe/hook-latency-probe.test.js +0 -105
  321. package/core/dev/scripts/probe/prediction-signal-auc.js +0 -483
  322. package/core/dev/scripts/probe/prediction-signal-auc.test.js +0 -200
  323. package/core/dev/scripts/test-pty-ws-tunnel.js +0 -229
  324. package/core/dev/scripts/validate_pipeline.js +0 -197
  325. package/core/dev/spikes/task2145-evidence-20261004/backend-log-excerpt.txt +0 -56
  326. package/core/dev/spikes/task2145-evidence-20261004/graph.shadow +0 -0
  327. package/core/dev/spikes/task2145-evidence-20261004/graph.wal +0 -0
  328. package/core/dev/spikes/task2145-evidence-20261004/graph_corrupt_suspect.marker +0 -1
  329. package/core/plugins/kenaz/commands/strategy.md +0 -141
@@ -1,177 +0,0 @@
1
- /**
2
- * CLI Integration Tests
3
- * Tests the matrix CLI commands
4
- */
5
-
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { MatrixParser } from '../src/parser';
9
- import { MatrixSerializer } from '../src/serializer';
10
- import type { MatrixFile } from '../types';
11
-
12
- const TEST_DIR = path.join(__dirname, '__temp__');
13
- const TEST_FILE = path.join(TEST_DIR, 'test.matrix');
14
-
15
- describe('Matrix CLI Integration', () => {
16
- beforeEach(() => {
17
- // Create test directory
18
- if (!fs.existsSync(TEST_DIR)) {
19
- fs.mkdirSync(TEST_DIR, { recursive: true });
20
- }
21
- });
22
-
23
- afterEach(() => {
24
- // Clean up test directory
25
- if (fs.existsSync(TEST_DIR)) {
26
- fs.rmSync(TEST_DIR, { recursive: true, force: true });
27
- }
28
- });
29
-
30
- describe('Create Command', () => {
31
- it('should create a new .matrix file with basic structure', () => {
32
- const matrixFile: MatrixFile = {
33
- meta: { v: '1.0.0', c: 'T' },
34
- index: { n: 0 },
35
- data: { records: [] },
36
- };
37
-
38
- const serializer = new MatrixSerializer();
39
- const content = serializer.serialize(matrixFile);
40
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
41
-
42
- expect(fs.existsSync(TEST_FILE)).toBe(true);
43
-
44
- const parser = new MatrixParser();
45
- const result = parser.parse(content);
46
-
47
- expect(result.success).toBe(true);
48
- expect(result.data?.meta.v).toBe('1.0.0');
49
- expect(result.data?.meta.c).toBe('T');
50
- expect(result.data?.index.n).toBe(0);
51
- });
52
- });
53
-
54
- describe('Read Command', () => {
55
- it('should parse and read .matrix file correctly', () => {
56
- const matrixFile: MatrixFile = {
57
- meta: { v: '1.0.0', c: 'T' },
58
- index: { n: 2 },
59
- data: {
60
- records: [
61
- { id: 'TASK_001', fields: { status: 'pending', priority: 'P0' } },
62
- { id: 'TASK_002', fields: { status: 'completed', priority: 'P1' } },
63
- ],
64
- },
65
- };
66
-
67
- const serializer = new MatrixSerializer();
68
- const content = serializer.serialize(matrixFile);
69
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
70
-
71
- const parser = new MatrixParser();
72
- const result = parser.parse(fs.readFileSync(TEST_FILE, 'utf-8'));
73
-
74
- expect(result.success).toBe(true);
75
- expect(result.data?.data?.records.length).toBe(2);
76
- expect(result.data?.data?.records[0].id).toBe('TASK_001');
77
- });
78
- });
79
-
80
- describe('Update Command', () => {
81
- it('should update a rule field and auto-update index', () => {
82
- const matrixFile: MatrixFile = {
83
- meta: { v: '1.0.0', c: 'T' },
84
- index: { n: 1, upd: '2026-02-09 15:00:00' },
85
- data: {
86
- records: [{ id: 'TASK_001', fields: { status: 'pending', priority: 'P0' } }],
87
- },
88
- };
89
-
90
- const serializer = new MatrixSerializer();
91
- let content = serializer.serialize(matrixFile);
92
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
93
-
94
- // Update the rule
95
- const parser = new MatrixParser();
96
- const result = parser.parse(fs.readFileSync(TEST_FILE, 'utf-8'));
97
- const data = result.data!;
98
-
99
- data.data!.records[0].fields.status = 'completed';
100
- data.index.upd = '2026-02-09 15:30:00';
101
-
102
- content = serializer.serialize(data);
103
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
104
-
105
- // Verify update
106
- const updatedResult = parser.parse(fs.readFileSync(TEST_FILE, 'utf-8'));
107
- expect(updatedResult.data?.data?.records[0].fields.status).toBe('completed');
108
- expect(updatedResult.data?.index.upd).toBe('2026-02-09 15:30:00');
109
- });
110
- });
111
-
112
- describe('Delete Command', () => {
113
- it('should delete a rule and update index statistics', () => {
114
- const matrixFile: MatrixFile = {
115
- meta: { v: '1.0.0', c: 'T' },
116
- index: { n: 2 },
117
- data: {
118
- records: [
119
- { id: 'TASK_001', fields: { status: 'pending' } },
120
- { id: 'TASK_002', fields: { status: 'completed' } },
121
- ],
122
- },
123
- };
124
-
125
- const serializer = new MatrixSerializer();
126
- let content = serializer.serialize(matrixFile);
127
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
128
-
129
- // Delete rule
130
- const parser = new MatrixParser();
131
- const result = parser.parse(fs.readFileSync(TEST_FILE, 'utf-8'));
132
- const data = result.data!;
133
-
134
- // Remove TASK_001
135
- const index = data.data!.records.findIndex(r => r.id === 'TASK_001');
136
- data.data!.records.splice(index, 1);
137
- data.index.n = data.data!.records.length;
138
-
139
- content = serializer.serialize(data);
140
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
141
-
142
- // Verify deletion
143
- const updatedResult = parser.parse(fs.readFileSync(TEST_FILE, 'utf-8'));
144
- expect(updatedResult.data?.data?.records.length).toBe(1);
145
- expect(updatedResult.data?.data?.records[0].id).toBe('TASK_002');
146
- expect(updatedResult.data?.index.n).toBe(1);
147
- });
148
- });
149
-
150
- describe('Error Handling', () => {
151
- it('should handle non-existent files gracefully', () => {
152
- const nonExistentFile = path.join(TEST_DIR, 'nonexistent.matrix');
153
- expect(fs.existsSync(nonExistentFile)).toBe(false);
154
- });
155
-
156
- it('should handle invalid rule IDs', () => {
157
- const matrixFile: MatrixFile = {
158
- meta: { v: '1.0.0', c: 'T' },
159
- index: { n: 1 },
160
- data: {
161
- records: [{ id: 'TASK_001', fields: { status: 'pending' } }],
162
- },
163
- };
164
-
165
- const serializer = new MatrixSerializer();
166
- const content = serializer.serialize(matrixFile);
167
- fs.writeFileSync(TEST_FILE, content, 'utf-8');
168
-
169
- const parser = new MatrixParser();
170
- const result = parser.parse(fs.readFileSync(TEST_FILE, 'utf-8'));
171
- const data = result.data!;
172
-
173
- const invalidIndex = data.data!.records.findIndex(r => r.id === 'INVALID_ID');
174
- expect(invalidIndex).toBe(-1);
175
- });
176
- });
177
- });
@@ -1,143 +0,0 @@
1
- /**
2
- * Convert command tests
3
- */
4
-
5
- import { describe, it, expect, beforeEach, afterEach } from '@jest/globals';
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { convertCommand } from '../src/cli/commands/convert';
9
-
10
- describe('Convert Command', () => {
11
- const testDir = path.join(__dirname, 'temp');
12
- const matrixFile = path.join(testDir, 'test.matrix');
13
- const jsonFile = path.join(testDir, 'test.json');
14
-
15
- beforeEach(() => {
16
- // Create temp directory
17
- if (!fs.existsSync(testDir)) {
18
- fs.mkdirSync(testDir, { recursive: true });
19
- }
20
- });
21
-
22
- afterEach(() => {
23
- // Clean up
24
- [matrixFile, jsonFile].forEach(file => {
25
- if (fs.existsSync(file)) {
26
- fs.unlinkSync(file);
27
- }
28
- });
29
- if (fs.existsSync(testDir)) {
30
- fs.rmdirSync(testDir);
31
- }
32
- });
33
-
34
- it('should convert .matrix to JSON', async () => {
35
- // Create test .matrix file
36
- const matrixContent = `# Test
37
- @meta |v=1.0|c=T|
38
- @index |tot=2|
39
- @data
40
- TASK_001|st=P|p=P0|title=Task One|
41
- TASK_002|st=C|p=P1|title=Task Two|
42
- `;
43
- fs.writeFileSync(matrixFile, matrixContent, 'utf-8');
44
-
45
- // Convert
46
- await convertCommand(matrixFile, jsonFile, {});
47
-
48
- // Verify JSON file was created
49
- expect(fs.existsSync(jsonFile)).toBe(true);
50
-
51
- // Verify JSON content
52
- const jsonData = JSON.parse(fs.readFileSync(jsonFile, 'utf-8'));
53
- expect(jsonData.version).toBe('1.0');
54
- expect(jsonData.category).toBe('T');
55
- expect(jsonData.records).toHaveLength(2);
56
- expect(jsonData.records[0].id).toBe('TASK_001');
57
- });
58
-
59
- it('should convert JSON to .matrix', async () => {
60
- // Create test JSON file
61
- const jsonData = {
62
- version: '1.0',
63
- category: 'T',
64
- statistics: { tot: 2 },
65
- records: [
66
- { id: 'TASK_001', status: 'pending', priority: 'P0', title: 'Task One' },
67
- { id: 'TASK_002', status: 'completed', priority: 'P1', title: 'Task Two' },
68
- ],
69
- };
70
- fs.writeFileSync(jsonFile, JSON.stringify(jsonData, null, 2), 'utf-8');
71
-
72
- // Convert
73
- await convertCommand(jsonFile, matrixFile, {});
74
-
75
- // Verify .matrix file was created
76
- expect(fs.existsSync(matrixFile)).toBe(true);
77
-
78
- // Verify .matrix content
79
- const matrixContent = fs.readFileSync(matrixFile, 'utf-8');
80
- expect(matrixContent).toContain('@meta');
81
- expect(matrixContent).toContain('@index');
82
- expect(matrixContent).toContain('@data');
83
- expect(matrixContent).toContain('TASK_001');
84
- expect(matrixContent).toContain('TASK_002');
85
- });
86
-
87
- it('should preserve all metadata in round-trip conversion', async () => {
88
- // Create original .matrix
89
- const originalMatrix = `# Test with metadata
90
- @meta |v=2.1|c=M|author=test|created=260207-1430|
91
- @index |tot=1|completed=1|
92
- @data
93
- MEM_001|st=C|p=P0|title=Memory Item|desc=Description here|
94
- `;
95
- fs.writeFileSync(matrixFile, originalMatrix, 'utf-8');
96
-
97
- // Convert to JSON
98
- await convertCommand(matrixFile, jsonFile, {});
99
-
100
- // Convert back to .matrix
101
- const matrixFile2 = path.join(testDir, 'test2.matrix');
102
- await convertCommand(jsonFile, matrixFile2, {});
103
-
104
- // Verify metadata preserved
105
- const finalMatrix = fs.readFileSync(matrixFile2, 'utf-8');
106
- expect(finalMatrix).toContain('v=2.1');
107
- expect(finalMatrix).toContain('c=M');
108
- expect(finalMatrix).toContain('MEM_001');
109
-
110
- // Clean up extra file
111
- if (fs.existsSync(matrixFile2)) {
112
- fs.unlinkSync(matrixFile2);
113
- }
114
- });
115
-
116
- it('should auto-detect formats', async () => {
117
- // Create .matrix file
118
- const matrixContent = `# Auto-detect test
119
- @meta |v=1.0|c=T|
120
- @index |tot=1|
121
- @data
122
- TASK_001|st=P|p=P0|
123
- `;
124
- fs.writeFileSync(matrixFile, matrixContent, 'utf-8');
125
-
126
- // Convert without specifying formats
127
- await convertCommand(matrixFile, jsonFile, {});
128
-
129
- expect(fs.existsSync(jsonFile)).toBe(true);
130
- });
131
-
132
- it('should throw error for same input/output format', async () => {
133
- fs.writeFileSync(matrixFile, '@meta |v=1.0|c=T|\n@index |tot=0|', 'utf-8');
134
-
135
- await expect(
136
- convertCommand(matrixFile, 'output.matrix', { from: 'matrix', to: 'matrix' })
137
- ).rejects.toThrow();
138
- });
139
-
140
- it('should throw error for non-existent input file', async () => {
141
- await expect(convertCommand('nonexistent.matrix', jsonFile, {})).rejects.toThrow();
142
- });
143
- });
@@ -1,203 +0,0 @@
1
- /**
2
- * MatrixParser 單元測試
3
- */
4
-
5
- import { MatrixParser } from '../src/parser';
6
-
7
- describe('MatrixParser', () => {
8
- let parser: MatrixParser;
9
-
10
- beforeEach(() => {
11
- parser = new MatrixParser();
12
- });
13
-
14
- describe('基本解析', () => {
15
- it('應該解析最小有效文件', () => {
16
- const content = `# .matrix v1.0
17
- @meta |v=1.0|c=test|
18
- @index |tot=0|`;
19
-
20
- const result = parser.parse(content);
21
-
22
- expect(result.success).toBe(true);
23
- expect(result.data).toBeDefined();
24
- expect(result.data?.meta.v).toBe('1.0');
25
- expect(result.data?.meta.c).toBe('test');
26
- expect(result.data?.index.tot).toBe(0);
27
- });
28
-
29
- it('應該解析包含所有層級的文件', () => {
30
- const content = `# .matrix v1.0
31
- @meta |v=1.0|c=test|t=260208|
32
- @index |tot=1|c=1|
33
- @data
34
- T1|st=C|p=0|`;
35
-
36
- const result = parser.parse(content);
37
-
38
- expect(result.success).toBe(true);
39
- expect(result.data?.data).toBeDefined();
40
- expect(result.data?.data?.records.length).toBe(1);
41
- expect(result.data?.data?.records[0].id).toBe('T1');
42
- expect(result.data?.data?.records[0].fields.status).toBe('completed');
43
- expect(result.data?.data?.records[0].fields.priority).toBe('P0');
44
- });
45
-
46
- it('應該正確解析複雜任務記錄', () => {
47
- const content = `@meta |v=1.0|c=tasks|
48
- @index |tot=1|
49
- @data
50
- T121|st=C|p=0|dur=135m|ct=260206-1430|desc=API integration|dep=T120,T121|`;
51
-
52
- const result = parser.parse(content);
53
-
54
- expect(result.success).toBe(true);
55
- const record = result.data?.data?.records[0];
56
- expect(record?.id).toBe('T121');
57
- expect(record?.fields.status).toBe('completed');
58
- expect(record?.fields.priority).toBe('P0');
59
- expect(record?.fields.duration).toBe('135m');
60
- expect(record?.fields.created_at).toBe('260206-1430');
61
- expect(record?.fields.description).toBe('API integration');
62
- expect(record?.fields.dependencies).toEqual(['T120', 'T121']);
63
- });
64
-
65
- it('應該解析任務組格式', () => {
66
- const content = `@meta |v=1.0|c=memory|
67
- @index |tot=1|
68
- @data
69
- 260207|dev|T123,st=P,dur=45m;T124,st=P,dur=60m|note=DB migration|`;
70
-
71
- const result = parser.parse(content);
72
-
73
- expect(result.success).toBe(true);
74
- const record = result.data?.data?.records[0];
75
- expect(record?.id).toBe('260207');
76
- expect(record?.fields.type).toBe('dev');
77
-
78
- const tasks = record?.fields.tasks;
79
- expect(Array.isArray(tasks)).toBe(true);
80
- expect(tasks.length).toBe(2);
81
- expect(tasks[0].id).toBe('T123');
82
- expect(tasks[0].status).toBe('in_progress');
83
- expect(tasks[0].duration).toBe('45m');
84
- });
85
- });
86
-
87
- describe('值類型解析', () => {
88
- it('應該正確解析布林值', () => {
89
- const content = `@meta |v=1.0|c=test|
90
- @index |act=1|en=0|`;
91
-
92
- const result = parser.parse(content);
93
-
94
- expect(result.data?.index.act).toBe(true);
95
- expect(result.data?.index.en).toBe(false);
96
- });
97
-
98
- it('應該正確解析數字', () => {
99
- const content = `@meta |v=1.0|c=test|
100
- @index |tot=123|succ=81.3|`;
101
-
102
- const result = parser.parse(content);
103
-
104
- expect(result.data?.index.tot).toBe(123);
105
- expect(result.data?.index.succ).toBe(81.3);
106
- });
107
-
108
- it('應該正確解析列表', () => {
109
- const content = `@meta |v=1.0|c=test|
110
- @index |tot=1|
111
- @data
112
- T1|dep=T120,T121,T122|`;
113
-
114
- const result = parser.parse(content);
115
-
116
- const record = result.data?.data?.records[0];
117
- expect(Array.isArray(record?.fields.dependencies)).toBe(true);
118
- expect(record?.fields.dependencies).toEqual(['T120', 'T121', 'T122']);
119
- });
120
-
121
- it('應該正確解析百分比', () => {
122
- const content = `@meta |v=1.0|c=test|
123
- @index |succ=81.3%|`;
124
-
125
- const result = parser.parse(content);
126
-
127
- expect(result.data?.index.succ).toBe(81.3);
128
- });
129
- });
130
-
131
- describe('錯誤處理', () => {
132
- it('應該檢測缺少 @meta', () => {
133
- const content = `@index |tot=1|`;
134
-
135
- const result = parser.parse(content);
136
-
137
- expect(result.success).toBe(false);
138
- expect(result.error?.code).toBe('E001');
139
- expect(result.error?.message).toContain('@meta');
140
- });
141
-
142
- it('應該檢測缺少 @index', () => {
143
- const content = `@meta |v=1.0|c=test|`;
144
-
145
- const result = parser.parse(content);
146
-
147
- expect(result.success).toBe(false);
148
- expect(result.error?.code).toBe('E001');
149
- expect(result.error?.message).toContain('@index');
150
- });
151
-
152
- it('應該檢測 @meta 格式錯誤', () => {
153
- const content = `@meta |v=1.0|c=test
154
- @index |tot=1|`;
155
-
156
- const result = parser.parse(content);
157
-
158
- expect(result.success).toBe(false);
159
- expect(result.error?.code).toBe('E003');
160
- });
161
-
162
- it('應該檢測欄位格式錯誤', () => {
163
- const content = `@meta |v=1.0|c=test|
164
- @index |tot=1|
165
- @data
166
- T1|st:C|`;
167
-
168
- const result = parser.parse(content);
169
-
170
- expect(result.success).toBe(false);
171
- expect(result.error?.code).toBe('E004');
172
- });
173
- });
174
-
175
- describe('解析選項', () => {
176
- it('非嚴格模式應該容許錯誤', () => {
177
- const parser = new MatrixParser({ strict: false });
178
- const content = `@meta |v=1.0|c=test|
179
- @index |tot=1|
180
- @data
181
- T1|invalid_format|`;
182
-
183
- const result = parser.parse(content);
184
-
185
- expect(result.success).toBe(false);
186
- expect(result.error).toBeDefined();
187
- });
188
-
189
- it('autoFix 應該自動展開時間戳', () => {
190
- const parser = new MatrixParser({ autoFix: true });
191
- const content = `@meta |v=1.0|c=test|
192
- @index |tot=1|
193
- @data
194
- T1|ct=260207-0530|`;
195
-
196
- const result = parser.parse(content);
197
-
198
- expect(result.success).toBe(true);
199
- const record = result.data?.data?.records[0];
200
- expect(record?.fields.created_at).toBe('2026-02-07T05:30:00Z');
201
- });
202
- });
203
- });
@@ -1,85 +0,0 @@
1
- /**
2
- * Query command tests
3
- */
4
-
5
- import { describe, it, expect, beforeEach, afterEach } from '@jest/globals';
6
- import * as fs from 'fs';
7
- import * as path from 'path';
8
- import { queryCommand } from '../src/cli/commands/query';
9
-
10
- describe('Query Command', () => {
11
- const testDir = path.join(__dirname, 'temp');
12
- const testFile = path.join(testDir, 'test.matrix');
13
-
14
- beforeEach(() => {
15
- // Create temp directory
16
- if (!fs.existsSync(testDir)) {
17
- fs.mkdirSync(testDir, { recursive: true });
18
- }
19
-
20
- // Create test .matrix file
21
- const content = `# Test tasks
22
- @meta |v=1.0|c=T|
23
- @index |tot=5|pending=2|inprogress=1|completed=2|
24
- @data
25
- TASK_001|st=P|p=P0|title=Feature A|tags=feature,backend|
26
- TASK_002|st=I|p=P1|title=Bug Fix B|tags=bug,frontend|
27
- TASK_003|st=C|p=P0|title=Feature C|tags=feature,auth|
28
- TASK_004|st=C|p=P2|title=Refactor D|tags=refactor|
29
- TASK_005|st=P|p=P1|title=Feature E|tags=feature,backend|
30
- `;
31
- fs.writeFileSync(testFile, content, 'utf-8');
32
- });
33
-
34
- afterEach(() => {
35
- // Clean up
36
- if (fs.existsSync(testFile)) {
37
- fs.unlinkSync(testFile);
38
- }
39
- if (fs.existsSync(testDir)) {
40
- fs.rmdirSync(testDir);
41
- }
42
- });
43
-
44
- it('should query all records (no filter)', async () => {
45
- // This will output to console, we just test it doesn't throw
46
- await expect(queryCommand(testFile, {})).resolves.not.toThrow();
47
- });
48
-
49
- it('should filter by status', async () => {
50
- await expect(queryCommand(testFile, { status: 'pending' })).resolves.not.toThrow();
51
- });
52
-
53
- it('should filter by priority', async () => {
54
- await expect(queryCommand(testFile, { priority: 'P0' })).resolves.not.toThrow();
55
- });
56
-
57
- it('should filter by tag', async () => {
58
- await expect(queryCommand(testFile, { tag: 'feature' })).resolves.not.toThrow();
59
- });
60
-
61
- it('should filter by keyword', async () => {
62
- await expect(queryCommand(testFile, { keyword: 'auth' })).resolves.not.toThrow();
63
- });
64
-
65
- it('should support multiple filters', async () => {
66
- await expect(
67
- queryCommand(testFile, {
68
- status: 'completed',
69
- priority: 'P0',
70
- })
71
- ).resolves.not.toThrow();
72
- });
73
-
74
- it('should support json format', async () => {
75
- await expect(queryCommand(testFile, { format: 'json' })).resolves.not.toThrow();
76
- });
77
-
78
- it('should support compact format', async () => {
79
- await expect(queryCommand(testFile, { format: 'compact' })).resolves.not.toThrow();
80
- });
81
-
82
- it('should throw error for non-existent file', async () => {
83
- await expect(queryCommand('nonexistent.matrix', {})).rejects.toThrow();
84
- });
85
- });