kenaz 0.3.18 → 0.3.19

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 (308) 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__/m1-hmap-convid.test.js +1 -124
  30. package/core/.formation/tools/dispatch.js +1 -1
  31. package/core/.formation/tools/loader.js +17 -140
  32. package/core/.formation/tools/post-complete.js +0 -31
  33. package/core/.rule/INDEX.yaml +0 -18
  34. package/core/.rule/general/agent-workflow.yaml +14 -164
  35. package/core/.rule/general/project-self-containment.yaml +8 -19
  36. package/core/.rule/general/rust-verify-target.yaml +6 -5
  37. package/core/.rule/general/synapse-code-intelligence.yaml +3 -3
  38. package/core/.specialist/Amelia/capability.yaml +12 -12
  39. package/core/.specialist/Amelia/workflow.yaml +2 -2
  40. package/core/.specialist/Ansuz/SYSTEM_DOC.md +20 -578
  41. package/core/.specialist/Ansuz/cognitive_principles.yaml +2 -3
  42. package/core/.specialist/Ansuz/concepts/boot_rules_summary.yaml +0 -1
  43. package/core/.specialist/Ansuz/concepts/deep_knowledge_pointers.yaml +1 -2
  44. package/core/.specialist/Ansuz/core.yaml +6 -108
  45. package/core/.specialist/Ansuz/guards/lesson_guards.yaml +0 -3
  46. package/core/.specialist/Ansuz/identity_contract.yaml +0 -1
  47. package/core/.specialist/Ansuz/knowledge.yaml +0 -4
  48. package/core/.specialist/Ansuz/rule.yaml +0 -1
  49. package/core/.specialist/Ansuz/tools/handoff-session-identity.test.js +6 -150
  50. package/core/.specialist/tests/runtime-discovery/README.md +1 -1
  51. package/core/.specialist/tools/__tests__/task-2374-usage-counter.test.js +1 -12
  52. package/core/.specialist/tools/prompt-files.test.js +1 -0
  53. package/core/.specialist/tools/task-bridge.js +1 -66
  54. package/core/.system/README.md +11 -552
  55. package/core/.system/collaboration/README.md +10 -174
  56. package/core/CLAUDE.md +1 -6
  57. package/core/KENAZ_CORE_VERSION +1 -1
  58. package/core/dev/scripts/js-yaml-resolution.test.js +1 -1
  59. package/core/dev/scripts/run-rust-tests.js +9 -45
  60. package/core/dev/scripts/rust-verify-worktree.js +4 -4
  61. package/core/dev/scripts/verify-target-dir.js +6 -6
  62. package/core/plugins/kenaz/INVENTORY.md +8 -8
  63. package/core/plugins/kenaz/commands/architect.md +1 -2
  64. package/core/plugins/kenaz/commands/spec.md +1 -1
  65. package/core/plugins/kenaz/commands//347/224/242/345/223/201.md +1 -1
  66. package/core/plugins/kenaz/guidance.md +1 -1
  67. package/core/plugins/kenaz/scripts/sync.js +1 -1
  68. package/core/plugins/kenaz/skills/architect_agent/SKILL.md +11 -92
  69. package/core/plugins/kenaz/skills/assessment_agent/SKILL.md +0 -1
  70. package/core/plugins/kenaz/skills/backend_engineer/SKILL.md +3 -6
  71. package/core/plugins/kenaz/skills/code_reviewer/SKILL.md +1 -1
  72. package/core/plugins/kenaz/skills/code_reviewer/patterns.yaml +1 -1
  73. package/core/plugins/kenaz/skills/designer/SKILL.md +3 -6
  74. package/core/plugins/kenaz/skills/dev_agent/SKILL.md +30 -491
  75. package/core/plugins/kenaz/skills/developer/SKILL.md +3 -6
  76. package/core/plugins/kenaz/skills/feature_agent/SKILL.md +3 -17
  77. package/core/plugins/kenaz/skills/product_manager/SKILL.md +29 -1064
  78. package/core/plugins/kenaz/skills/qa_engineer/SKILL.md +12 -17
  79. package/core/plugins/kenaz/skills/spec_optimizer/SKILL.md +25 -275
  80. package/core/plugins/kenaz/skills/sre_agent/SKILL.md +3 -6
  81. package/package.json +6 -6
  82. package/core/.claude/commands/archive.md +0 -24
  83. package/core/.claude/commands/init.md +0 -112
  84. package/core/.claude/commands/legacy_dev.md +0 -18
  85. package/core/.claude/commands/product-review.md +0 -131
  86. package/core/.claude/commands/strategy.md +0 -141
  87. package/core/.claude/commands/sunny.md +0 -1
  88. package/core/.claude/commands//347/224/242/345/223/201/346/252/242/350/246/226.md +0 -129
  89. package/core/.claude/commands//351/200/262/345/272/246.md +0 -15
  90. package/core/.claude/hooks/__tests__/substrate.test.js +0 -122
  91. package/core/.claude/hooks/_substrate-paths.js +0 -95
  92. package/core/.claude/hooks/context-check.js +0 -51
  93. package/core/.claude/hooks/fatigue-check.js +0 -52
  94. package/core/.claude/hooks/handoff-snapshot-on-commit.js +0 -154
  95. package/core/.claude/hooks/handoff-snapshot-on-question.js +0 -158
  96. package/core/.claude/hooks/handoff-staleness.js +0 -197
  97. package/core/.claude/hooks/jev-thalamus-context.js +0 -17
  98. package/core/.claude/hooks/jev-thalamus-context.test.js +0 -41
  99. package/core/.claude/hooks/lease-release.js +0 -119
  100. package/core/.claude/hooks/lease-touch.js +0 -96
  101. package/core/.claude/hooks/reflex-feedback.js +0 -5
  102. package/core/.claude/hooks/session-init.ps1 +0 -49
  103. package/core/.claude/hooks/sound-event.js +0 -70
  104. package/core/.claude/hooks/sound-event.sh +0 -37
  105. package/core/.claude/hooks/stream-delta.js +0 -169
  106. package/core/.claude/no-hooks.settings.json +0 -3
  107. package/core/.claude/skills/legacy_dev/SKILL.md +0 -202
  108. package/core/.claude/skills/sunny/SKILL.md +0 -74
  109. package/core/.collaboration/cli/commands/assign.js +0 -39
  110. package/core/.collaboration/cli/commands/claim.js +0 -33
  111. package/core/.collaboration/cli/commands/complete.js +0 -44
  112. package/core/.collaboration/cli/commands/create.js +0 -110
  113. package/core/.collaboration/cli/commands/get.js +0 -83
  114. package/core/.collaboration/cli/commands/index.js +0 -52
  115. package/core/.collaboration/cli/commands/list.js +0 -51
  116. package/core/.collaboration/cli/commands/lock.js +0 -45
  117. package/core/.collaboration/cli/commands/rebuild.js +0 -39
  118. package/core/.collaboration/cli/commands/search.js +0 -61
  119. package/core/.collaboration/cli/commands/stats.js +0 -61
  120. package/core/.collaboration/cli/commands/transfer.js +0 -41
  121. package/core/.collaboration/cli/commands/unlock.js +0 -48
  122. package/core/.collaboration/cli/formatters/help-formatter.js +0 -70
  123. package/core/.collaboration/cli/formatters/index.js +0 -7
  124. package/core/.collaboration/cli/task-cli.js +0 -46
  125. package/core/.collaboration/cli/utils/arg-parser.js +0 -74
  126. package/core/.collaboration/cli/utils/git-user.js +0 -25
  127. package/core/.collaboration/cli/utils/index.js +0 -9
  128. package/core/.collaboration/cli/utils/output.js +0 -10
  129. package/core/.collaboration/config/default.yaml +0 -189
  130. package/core/.collaboration/core/conflict-resolver.js +0 -461
  131. package/core/.collaboration/core/conflict-resolver.test.js +0 -389
  132. package/core/.collaboration/core/migrate-legacy.js +0 -260
  133. package/core/.collaboration/docs/API.md +0 -787
  134. package/core/.collaboration/docs/ARCHITECTURE.md +0 -596
  135. package/core/.collaboration/docs/FAQ.md +0 -695
  136. package/core/.collaboration/docs/MIGRATION.md +0 -804
  137. package/core/.collaboration/docs/examples/README.md +0 -320
  138. package/core/.collaboration/docs/examples/advanced-queries.js +0 -261
  139. package/core/.collaboration/docs/examples/basic-usage.js +0 -184
  140. package/core/.collaboration/docs/examples/team-workflow.js +0 -352
  141. package/core/.failure/agent-execution/FAIL-001-agent-no-output.yaml +0 -391
  142. package/core/.failure/agent-execution/FAIL-007-pm-lead-wrong-team-invocation.yaml +0 -0
  143. package/core/.failure/agent-execution/FAIL-010-phase0-poem-format-skipped.yaml +0 -28
  144. package/core/.failure/agent-execution/FAIL-010-skipping-cognitive-checkpoint-after-verification.yaml +0 -59
  145. package/core/.failure/agent-execution/FAIL-012-grep-shortcut-during-investigation.yaml +0 -85
  146. package/core/.failure/architecture/FAIL-006-python-version-compatibility.yaml +0 -445
  147. package/core/.failure/pipeline/FAIL-003-queue-pollution.yaml +0 -335
  148. package/core/.failure/pipeline/README.md +0 -95
  149. package/core/.failure/retired/FAIL-009-skipping-synapse-pulse-before-code-change.yaml +0 -49
  150. package/core/.failure/tools/USAGE_GUIDE.md +0 -323
  151. package/core/.failure/tools/check_failures.ps1 +0 -387
  152. package/core/.failure/tools/log_failure.ps1 +0 -474
  153. package/core/.formation/.episode-input.json +0 -10
  154. package/core/.formation/.merge-lock +0 -1
  155. package/core/.formation/lead.yaml +0 -118
  156. package/core/.formation/legacy.bak/designer.yaml +0 -57
  157. package/core/.formation/legacy.bak/pm.yaml +0 -57
  158. package/core/.formation/legacy.bak/qa.yaml +0 -57
  159. package/core/.formation/legacy.bak/review.yaml +0 -62
  160. package/core/.formation/legacy.bak/scheduler.yaml +0 -129
  161. package/core/.formation/legacy.bak/sre.yaml +0 -57
  162. package/core/.formation/role-map.yaml +0 -274
  163. package/core/.formation/roles/_shared/modules/code_review.yaml +0 -98
  164. package/core/.formation/roles/_shared/modules/security.yaml +0 -103
  165. package/core/.formation/roles/_shared/modules/testing.yaml +0 -14
  166. package/core/.formation/roles/backend/role.yaml +0 -93
  167. package/core/.formation/roles/code_reviewer/role.yaml +0 -102
  168. package/core/.formation/roles/database_optimizer/role.yaml +0 -107
  169. package/core/.formation/roles/designer/role.yaml +0 -66
  170. package/core/.formation/roles/developer/role.yaml +0 -75
  171. package/core/.formation/roles/frontend/role.yaml +0 -134
  172. package/core/.formation/roles/incident_response/role.yaml +0 -89
  173. package/core/.formation/roles/qa/role.yaml +0 -89
  174. package/core/.formation/roles/security/role.yaml +0 -87
  175. package/core/.formation/roles/sre/role.yaml +0 -66
  176. package/core/.formation/skills/coordinator.yaml +0 -52
  177. package/core/.formation/solo/diagnosis.yaml +0 -78
  178. package/core/.formation/solo/strategy.yaml +0 -121
  179. package/core/.formation/tests/hello.txt +0 -2
  180. package/core/.formation/tools/coordinator.js +0 -350
  181. package/core/.formation/tools/jev-correction.js +0 -214
  182. package/core/.formation/tools/jev-correction.test.js +0 -178
  183. package/core/.formation/tools/log-reader.js +0 -232
  184. package/core/.formation/tools/revert-daemon-state.js +0 -162
  185. package/core/.formation/tools/test-drift.js +0 -148
  186. package/core/.formation/unit/heimdall.yaml +0 -96
  187. package/core/.formation/unit/plan.yaml +0 -67
  188. package/core/.formation/unit/think.yaml +0 -58
  189. package/core/.kenaz/MUNINN_SNAPSHOT9_EPISODE.json +0 -32
  190. package/core/.kenaz/MUNINN_SNAPSHOT9_RUNE.json +0 -23
  191. package/core/.kenaz/MUNINN_SNAPSHOT9_SUMMARY.md +0 -89
  192. package/core/.kenaz/ash_TASK_1428-20260507.json +0 -14
  193. package/core/.kenaz/muninn_episode_write.ps1 +0 -17
  194. package/core/.kenaz/muninn_snapshot11_rune_candidates.md +0 -63
  195. package/core/.kenaz/muninn_snapshot1_rune_candidates.md +0 -49
  196. package/core/.kenaz/runes_TASK_1428.json +0 -57
  197. package/core/.kenaz/tmp_heimdall_proposal_8d3e392.json +0 -13
  198. package/core/.kenaz/tmp_props.json +0 -1
  199. package/core/.kenaz/tmp_sounddrop_t1_prompt.txt +0 -371
  200. package/core/.rule/MECHANIZED.md +0 -61
  201. package/core/.rule/general/cortex-memory-recall.yaml +0 -446
  202. package/core/.rule/general/pipeline.yaml +0 -246
  203. package/core/.rule/general/sunny-access-control.yaml +0 -60
  204. package/core/.rule/general/system-invariants.yaml +0 -231
  205. package/core/.rule/pipeline/PPL-002-completed-task-archival.yaml +0 -528
  206. package/core/.rule/pipeline/auto-update.yaml +0 -282
  207. package/core/.rule/pipeline/task-execution.yaml +0 -365
  208. package/core/.specialist/Ansuz/concepts/phase_protocol.yaml +0 -65
  209. package/core/.specialist/Ansuz/experiments/boot_ablation_replay.js +0 -197
  210. package/core/.specialist/Ansuz/tools/bootstrap-anchors.js +0 -289
  211. package/core/.specialist/Ansuz/workflow.yaml +0 -1225
  212. package/core/.specialist/experiments/rg_benchmark.js +0 -523
  213. package/core/.specialist/experiments/rg_benchmark_results.json +0 -27
  214. package/core/.specialist/tools/jev-optional-context.js +0 -107
  215. package/core/.specialist/tools/jev-optional-context.test.js +0 -152
  216. package/core/.specialist/tools/memory-action-log.js +0 -839
  217. package/core/.specialist/tools/phase-gate.js +0 -3534
  218. package/core/.specialist/tools/phase-gate.test.js +0 -85
  219. package/core/.specialist/tools/precompute-runner.js +0 -444
  220. package/core/.specialist/tools/rule-engine.js +0 -621
  221. package/core/.specialist/tools/task-bridge-jev.test.js +0 -170
  222. package/core/.synapse/memory-shared.json.sync +0 -1
  223. package/core/.system/agent-skills/README.md +0 -724
  224. package/core/.system/cli-tools/README.md +0 -724
  225. package/core/.system/cortex/MODULES.md +0 -1046
  226. package/core/.system/dashboard/FRONTEND.md +0 -812
  227. package/core/.system/dashboard/README.md +0 -737
  228. package/core/.system/failure/README.md +0 -723
  229. package/core/.system/formation/LEGACY_SKILLS.md +0 -974
  230. package/core/.system/formation/POST_COMPLETE.md +0 -602
  231. package/core/.system/formation/README.md +0 -1094
  232. package/core/.system/formation/TOOLS_REFERENCE.md +0 -1145
  233. package/core/.system/kenaz/README.md +0 -787
  234. package/core/.system/memory/README.md +0 -719
  235. package/core/.system/pipeline/README.md +0 -712
  236. package/core/.system/rule/README.md +0 -794
  237. package/core/.system/sunny/README.md +0 -476
  238. package/core/.system/sunny/RULES.json +0 -89
  239. package/core/.system/sunny/knowledge/INDEX.md +0 -37
  240. package/core/.system/sunny/knowledge/agent-teams-api.md +0 -0
  241. package/core/.system/sunny/knowledge/ansuz-specialist.md +0 -500
  242. package/core/.system/sunny/knowledge/claude-cli-spawn.md +0 -177
  243. package/core/.system/sunny/knowledge/collaboration-api.md +0 -925
  244. package/core/.system/sunny/teammates/README.md +0 -107
  245. package/core/.system/sunny/teammates/how_to_use.yaml +0 -101
  246. package/core/.system/sunny/teammates/tools/headless/launcher.js +0 -318
  247. package/core/.system/sunny/teammates/tools/powershell/launcher.js +0 -241
  248. package/core/.system/sunny/teammates/tools/powershell/start.bat +0 -50
  249. package/core/.system/sunny/teammates/tools/utils/env.js +0 -96
  250. package/core/.system/sunny/teammates/tools/utils/format-output.js +0 -329
  251. package/core/.system/sunny/tools.json +0 -101
  252. package/core/dev/scripts/cleanup-queue.js +0 -184
  253. package/core/dev/scripts/cleanup_queue.js +0 -86
  254. package/core/dev/scripts/legacy/README.md +0 -39
  255. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +0 -536
  256. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +0 -1978
  257. package/core/dev/scripts/matrix/CLI_README.md +0 -214
  258. package/core/dev/scripts/matrix/README.md +0 -310
  259. package/core/dev/scripts/matrix/package-lock.json +0 -4266
  260. package/core/dev/scripts/matrix/package.json +0 -55
  261. package/core/dev/scripts/matrix/src/abbreviations.ts +0 -295
  262. package/core/dev/scripts/matrix/src/cli/commands/convert.ts +0 -211
  263. package/core/dev/scripts/matrix/src/cli/commands/create.ts +0 -95
  264. package/core/dev/scripts/matrix/src/cli/commands/delete.ts +0 -102
  265. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +0 -140
  266. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +0 -173
  267. package/core/dev/scripts/matrix/src/cli/commands/query.ts +0 -261
  268. package/core/dev/scripts/matrix/src/cli/commands/read.ts +0 -77
  269. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +0 -168
  270. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +0 -126
  271. package/core/dev/scripts/matrix/src/cli/commands/update.ts +0 -147
  272. package/core/dev/scripts/matrix/src/cli/commands/validate.ts +0 -275
  273. package/core/dev/scripts/matrix/src/cli/index.ts +0 -350
  274. package/core/dev/scripts/matrix/src/cli/utils/file-handler.ts +0 -72
  275. package/core/dev/scripts/matrix/src/cli/utils/logger.ts +0 -65
  276. package/core/dev/scripts/matrix/src/index.ts +0 -62
  277. package/core/dev/scripts/matrix/src/indexer/tag-indexer.ts +0 -165
  278. package/core/dev/scripts/matrix/src/parser.ts +0 -281
  279. package/core/dev/scripts/matrix/src/serializer.ts +0 -151
  280. package/core/dev/scripts/matrix/src/validator.ts +0 -301
  281. package/core/dev/scripts/matrix/tests/abbreviations.test.ts +0 -122
  282. package/core/dev/scripts/matrix/tests/cli.test.ts +0 -177
  283. package/core/dev/scripts/matrix/tests/convert.test.ts +0 -143
  284. package/core/dev/scripts/matrix/tests/parser.test.ts +0 -203
  285. package/core/dev/scripts/matrix/tests/query.test.ts +0 -85
  286. package/core/dev/scripts/matrix/tests/serializer.test.ts +0 -197
  287. package/core/dev/scripts/matrix/tests/validate.test.ts +0 -141
  288. package/core/dev/scripts/matrix/tests/validator.test.ts +0 -167
  289. package/core/dev/scripts/matrix/tsconfig.json +0 -20
  290. package/core/dev/scripts/matrix/types/index.d.ts +0 -111
  291. package/core/dev/scripts/matrix/types/index.d.ts.map +0 -1
  292. package/core/dev/scripts/matrix/types/index.js +0 -8
  293. package/core/dev/scripts/matrix/types/index.js.map +0 -1
  294. package/core/dev/scripts/matrix/types/index.ts +0 -124
  295. package/core/dev/scripts/memory-usage-report.js +0 -152
  296. package/core/dev/scripts/probe/ansuz-scaffold-ablation.js +0 -579
  297. package/core/dev/scripts/probe/ansuz-scaffold-ablation.test.js +0 -244
  298. package/core/dev/scripts/probe/hook-latency-probe.js +0 -315
  299. package/core/dev/scripts/probe/hook-latency-probe.test.js +0 -105
  300. package/core/dev/scripts/probe/prediction-signal-auc.js +0 -483
  301. package/core/dev/scripts/probe/prediction-signal-auc.test.js +0 -200
  302. package/core/dev/scripts/test-pty-ws-tunnel.js +0 -229
  303. package/core/dev/scripts/validate_pipeline.js +0 -197
  304. package/core/dev/spikes/task2145-evidence-20261004/backend-log-excerpt.txt +0 -56
  305. package/core/dev/spikes/task2145-evidence-20261004/graph.shadow +0 -0
  306. package/core/dev/spikes/task2145-evidence-20261004/graph.wal +0 -0
  307. package/core/dev/spikes/task2145-evidence-20261004/graph_corrupt_suspect.marker +0 -1
  308. 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
- });