kenaz 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
  2. package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
  3. package/core/.claude/commands/Ansuz.md +14 -2
  4. package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
  5. package/core/.claude/hooks/handoff-staleness.js +2 -2
  6. package/core/.claude/hooks/session-init.ps1 +49 -49
  7. package/core/.claude/hooks/turn-context.js +50 -2
  8. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
  9. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
  10. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
  11. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
  12. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
  13. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  14. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  15. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  16. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  17. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  18. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  19. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  20. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  21. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  22. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  23. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  24. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  25. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  26. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  27. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
  28. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
  29. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  30. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  31. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  32. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
  33. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  34. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
  35. package/core/.collaboration/core/task-api.js +1 -4
  36. package/core/.formation/README.md +21 -146
  37. package/core/.formation/bifrost/codex-doctor.js +37 -2
  38. package/core/.formation/bifrost/codex-doctor.test.js +18 -0
  39. package/core/.formation/bifrost/launch.js +1 -1
  40. package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
  41. package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
  42. package/core/.formation/bifrost/setup-codex.js +3 -0
  43. package/core/.formation/spec/task_operations.parity.test.js +0 -1
  44. package/core/.formation/tests/hello.txt +2 -2
  45. package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
  46. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
  47. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
  48. package/core/.formation/tools/dispatch.js +28 -549
  49. package/core/.formation/tools/mcp-allowlist.test.js +0 -1
  50. package/core/.formation/tools/post-complete/task2345.test.js +0 -5
  51. package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
  52. package/core/.formation/tools/prompt.js +29 -1623
  53. package/core/.formation/tools/prompt.test.js +26 -594
  54. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  55. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  56. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  57. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  58. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  59. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  60. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  61. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  62. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  63. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  64. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  65. package/core/.matrix/index.matrix +5 -5
  66. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
  67. package/core/KENAZ_CORE_VERSION +1 -1
  68. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  69. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  70. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  71. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  72. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  73. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  74. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  75. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  76. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  77. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  78. package/core/dev/jev-eval/README.md +99 -99
  79. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  80. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  81. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  82. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  83. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  84. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  85. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  86. package/core/dev/scripts/init_git.sh +0 -0
  87. package/core/dev/scripts/init_project.sh +0 -0
  88. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  89. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  90. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  91. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  92. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  93. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  94. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  95. package/core/dev/scripts/run_once.sh +0 -0
  96. package/core/dev/scripts/setup_mcp.sh +0 -0
  97. package/core/dev/scripts/setup_rag.sh +0 -0
  98. package/core/dev/scripts/start_dev_agent.sh +0 -0
  99. package/core/dev/scripts/start_multi_agent.sh +0 -0
  100. package/core/dev/scripts/sync_task_queue.sh +0 -0
  101. package/core/plugins/kenaz/commands/Amelia.md +1 -1
  102. package/core/plugins/kenaz/commands/Ansuz.md +15 -3
  103. package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
  104. package/core/plugins/kenaz/scripts/sync.js +6 -2
  105. package/core/plugins/kenaz/scripts/ygg.js +13 -1
  106. package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
  107. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  108. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  109. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  110. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  111. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  112. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  113. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  114. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  115. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  116. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  117. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  118. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  119. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  120. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  121. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  122. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  123. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  124. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  125. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  126. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  127. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  128. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  129. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  130. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  131. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  132. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  133. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  134. package/lib/cli.js +11 -4
  135. package/package.json +11 -7
  136. package/vendor/install-kenaz-cli.js +18 -7
  137. package/core/.formation/tools/broadcast.js +0 -103
  138. package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
  139. package/core/.formation/tools/dispatch-notifier.js +0 -84
  140. package/core/.formation/tools/formations.js +0 -1203
  141. package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
  142. package/core/.formation/tools/headless-dryrun.test.js +0 -79
  143. package/core/.formation/tools/headless-v2.js +0 -659
  144. package/core/.formation/tools/headless.js +0 -1071
  145. package/core/.formation/tools/legacy-scheduler.js +0 -1994
  146. package/core/.formation/tools/logger.js +0 -273
  147. package/core/.formation/tools/memory-loader.js +0 -422
  148. package/core/.formation/tools/process-state.js +0 -33
  149. package/core/.formation/tools/remote-conflict.js +0 -98
  150. package/core/.formation/tools/runner.js +0 -1332
  151. package/core/.formation/tools/task-utils.js +0 -344
  152. package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
  153. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
  154. package/core/.formation/tools/worktree-leak.test.js +0 -162
  155. package/core/k-cli/dist/alaya/run.js +0 -91
  156. package/core/k-cli/dist/core/output.js +0 -24
  157. package/core/k-cli/dist/core/process.js +0 -38
  158. package/core/k-cli/dist/core/project.js +0 -80
  159. package/core/k-cli/dist/core/spawn.js +0 -268
  160. package/core/k-cli/dist/core/types.js +0 -2
  161. package/core/k-cli/dist/dashboard/update.js +0 -53
  162. package/core/k-cli/dist/dashboard/version.js +0 -20
  163. package/core/k-cli/dist/dispatch/run.js +0 -241
  164. package/core/k-cli/dist/dispatch/status.js +0 -103
  165. package/core/k-cli/dist/index.js +0 -283
  166. package/core/k-cli/dist/project/initialize.js +0 -301
  167. package/core/k-cli/dist/project/install.js +0 -89
  168. package/core/k-cli/dist/project/status.js +0 -138
  169. package/core/k-cli/dist/specialist/list.js +0 -100
  170. package/core/k-cli/dist/specialist/run.js +0 -93
  171. package/core/k-cli/dist/task/create.js +0 -194
  172. package/core/k-cli/dist/task/delete.js +0 -98
  173. package/core/k-cli/dist/task/get.js +0 -55
  174. package/core/k-cli/dist/task/list.js +0 -58
  175. package/core/k-cli/dist/task/submit.js +0 -156
  176. package/core/k-cli/dist/ygg/run.js +0 -51
  177. package/core/k-cli/node_modules/.bin/yaml +0 -16
  178. package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
  179. package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
  180. package/core/k-cli/node_modules/.package-lock.json +0 -23
  181. package/core/k-cli/node_modules/yaml/LICENSE +0 -13
  182. package/core/k-cli/node_modules/yaml/README.md +0 -172
  183. package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
  184. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
  185. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
  186. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
  187. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
  188. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
  189. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
  190. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
  191. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
  192. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
  193. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
  194. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
  195. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
  196. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
  197. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
  198. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
  199. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
  200. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
  201. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
  202. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
  203. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
  204. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
  205. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
  206. package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
  207. package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
  208. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
  209. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
  210. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
  211. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
  212. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
  213. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
  214. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
  215. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
  216. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
  217. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
  218. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
  219. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
  220. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
  221. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
  222. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
  223. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
  224. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
  225. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
  226. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
  227. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
  228. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
  229. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
  230. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
  231. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
  232. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
  233. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
  234. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
  235. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
  236. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
  237. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
  238. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
  239. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
  240. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
  241. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
  242. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
  243. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  244. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
  245. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
  246. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  247. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
  248. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
  249. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
  250. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
  251. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
  252. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
  253. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
  254. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
  255. package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
  256. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
  257. package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
  258. package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
  259. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
  260. package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
  261. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
  262. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
  263. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
  264. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
  265. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
  266. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
  267. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
  268. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
  269. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
  270. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
  271. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
  272. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
  273. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
  274. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
  275. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
  276. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
  277. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
  278. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
  279. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
  280. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
  281. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
  282. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
  283. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
  284. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
  285. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
  286. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
  287. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
  288. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
  289. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
  290. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
  291. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
  292. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
  293. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
  294. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
  295. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
  296. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
  297. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
  298. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
  299. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
  300. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
  301. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
  302. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
  303. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
  304. package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
  305. package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
  306. package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
  307. package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
  308. package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
  309. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
  310. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
  311. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
  312. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
  313. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
  314. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
  315. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
  316. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
  317. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
  318. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
  319. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
  320. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
  321. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
  322. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
  323. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
  324. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
  325. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
  326. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
  327. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
  328. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
  329. package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
  330. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
  331. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
  332. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
  333. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
  334. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
  335. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
  336. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
  337. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
  338. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
  339. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
  340. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
  341. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
  342. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
  343. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
  344. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
  345. package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
  346. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
  347. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
  348. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
  349. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
  350. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
  351. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
  352. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
  353. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
  354. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
  355. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
  356. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
  357. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
  358. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
  359. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
  360. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
  361. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
  362. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
  363. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
  364. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
  365. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
  366. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
  367. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
  368. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
  369. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
  370. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
  371. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
  372. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
  373. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
  374. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
  375. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
  376. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
  377. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
  378. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  379. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
  380. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
  381. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
  382. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  383. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
  384. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
  385. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
  386. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
  387. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
  388. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  389. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
  390. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
  391. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
  392. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
  393. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
  394. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
  395. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
  396. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
  397. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
  398. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
  399. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
  400. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
  401. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
  402. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
  403. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
  404. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
  405. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
  406. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
  407. package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
  408. package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
  409. package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
  410. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
  411. package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
  412. package/core/k-cli/node_modules/yaml/package.json +0 -97
  413. package/core/k-cli/node_modules/yaml/util.js +0 -2
@@ -1,140 +1,140 @@
1
- /**
2
- * list-tags command - List all tags and their usage counts
3
- */
4
-
5
- import chalk from 'chalk';
6
- import { resolveFilePath } from '../utils/file-handler';
7
- import { parseMatrixFile } from '../../parser';
8
- import { TagIndexer } from '../../indexer/tag-indexer';
9
-
10
- interface ListTagsOptions {
11
- type?: string; // Filter by tag type: source, category, priority, domain, custom
12
- sort?: 'name' | 'count'; // Sort by name or count
13
- }
14
-
15
- export async function listTagsCommand(
16
- file: string,
17
- options: ListTagsOptions = {}
18
- ): Promise<void> {
19
- const filePath = resolveFilePath(file);
20
-
21
- // Parse file
22
- const matrixFile = parseMatrixFile(filePath);
23
-
24
- // Build tag index
25
- const indexer = new TagIndexer();
26
- indexer.buildIndex(matrixFile);
27
-
28
- // Get tag statistics
29
- let tagStats = indexer.getTagStats();
30
-
31
- // Filter by type if specified
32
- if (options.type) {
33
- const typePrefix = options.type.toLowerCase();
34
- tagStats = tagStats.filter((stat) => {
35
- if (typePrefix === 'custom') {
36
- return stat.tag.startsWith('#');
37
- }
38
- return stat.tag.startsWith(`${typePrefix}:`);
39
- });
40
- }
41
-
42
- // Sort by name if specified
43
- if (options.sort === 'name') {
44
- tagStats.sort((a, b) => a.tag.localeCompare(b.tag));
45
- }
46
- // Default: already sorted by count descending
47
-
48
- console.log(chalk.bold.cyan('\n🏷️ Tags\n'));
49
- console.log(chalk.gray(`File: ${filePath}\n`));
50
-
51
- if (tagStats.length === 0) {
52
- console.log(chalk.yellow('No tags found.'));
53
- console.log();
54
- return;
55
- }
56
-
57
- // Group tags by type
58
- const groupedTags = groupTagsByType(tagStats);
59
-
60
- // Display each group
61
- for (const [type, tags] of Object.entries(groupedTags)) {
62
- if (!options.type || options.type.toLowerCase() === type.toLowerCase()) {
63
- console.log(chalk.bold(`${getTypeEmoji(type)} ${type}:`));
64
-
65
- for (const stat of tags) {
66
- const tagDisplay = stat.tag.replace(`${type.toLowerCase()}:`, '');
67
- const bar = '█'.repeat(Math.min(stat.count, 20));
68
- console.log(
69
- ` ${chalk.cyan(tagDisplay.padEnd(20))} ${chalk.green(bar)} ${chalk.yellow(stat.count)}`
70
- );
71
- }
72
-
73
- console.log();
74
- }
75
- }
76
-
77
- // Summary
78
- console.log(chalk.bold('Summary:'));
79
- console.log(` Total tags: ${chalk.cyan(tagStats.length)}`);
80
- console.log(` Total tag types: ${chalk.cyan(Object.keys(groupedTags).length)}`);
81
- console.log();
82
- }
83
-
84
- /**
85
- * Group tags by type
86
- */
87
- function groupTagsByType(
88
- tagStats: { tag: string; count: number; ruleIds: string[] }[]
89
- ): Record<string, typeof tagStats> {
90
- const grouped: Record<string, typeof tagStats> = {
91
- Source: [],
92
- Category: [],
93
- Priority: [],
94
- Domain: [],
95
- Custom: [],
96
- };
97
-
98
- for (const stat of tagStats) {
99
- if (stat.tag.startsWith('source:')) {
100
- grouped.Source.push(stat);
101
- } else if (stat.tag.startsWith('category:')) {
102
- grouped.Category.push(stat);
103
- } else if (stat.tag.startsWith('priority:')) {
104
- grouped.Priority.push(stat);
105
- } else if (stat.tag.startsWith('domain:')) {
106
- grouped.Domain.push(stat);
107
- } else {
108
- grouped.Custom.push(stat);
109
- }
110
- }
111
-
112
- // Remove empty groups
113
- for (const key of Object.keys(grouped)) {
114
- if (grouped[key].length === 0) {
115
- delete grouped[key];
116
- }
117
- }
118
-
119
- return grouped;
120
- }
121
-
122
- /**
123
- * Get emoji for tag type
124
- */
125
- function getTypeEmoji(type: string): string {
126
- switch (type.toLowerCase()) {
127
- case 'source':
128
- return '📦';
129
- case 'category':
130
- return '📂';
131
- case 'priority':
132
- return '⚡';
133
- case 'domain':
134
- return '🌐';
135
- case 'custom':
136
- return '🏷️';
137
- default:
138
- return '•';
139
- }
140
- }
1
+ /**
2
+ * list-tags command - List all tags and their usage counts
3
+ */
4
+
5
+ import chalk from 'chalk';
6
+ import { resolveFilePath } from '../utils/file-handler';
7
+ import { parseMatrixFile } from '../../parser';
8
+ import { TagIndexer } from '../../indexer/tag-indexer';
9
+
10
+ interface ListTagsOptions {
11
+ type?: string; // Filter by tag type: source, category, priority, domain, custom
12
+ sort?: 'name' | 'count'; // Sort by name or count
13
+ }
14
+
15
+ export async function listTagsCommand(
16
+ file: string,
17
+ options: ListTagsOptions = {}
18
+ ): Promise<void> {
19
+ const filePath = resolveFilePath(file);
20
+
21
+ // Parse file
22
+ const matrixFile = parseMatrixFile(filePath);
23
+
24
+ // Build tag index
25
+ const indexer = new TagIndexer();
26
+ indexer.buildIndex(matrixFile);
27
+
28
+ // Get tag statistics
29
+ let tagStats = indexer.getTagStats();
30
+
31
+ // Filter by type if specified
32
+ if (options.type) {
33
+ const typePrefix = options.type.toLowerCase();
34
+ tagStats = tagStats.filter((stat) => {
35
+ if (typePrefix === 'custom') {
36
+ return stat.tag.startsWith('#');
37
+ }
38
+ return stat.tag.startsWith(`${typePrefix}:`);
39
+ });
40
+ }
41
+
42
+ // Sort by name if specified
43
+ if (options.sort === 'name') {
44
+ tagStats.sort((a, b) => a.tag.localeCompare(b.tag));
45
+ }
46
+ // Default: already sorted by count descending
47
+
48
+ console.log(chalk.bold.cyan('\n🏷️ Tags\n'));
49
+ console.log(chalk.gray(`File: ${filePath}\n`));
50
+
51
+ if (tagStats.length === 0) {
52
+ console.log(chalk.yellow('No tags found.'));
53
+ console.log();
54
+ return;
55
+ }
56
+
57
+ // Group tags by type
58
+ const groupedTags = groupTagsByType(tagStats);
59
+
60
+ // Display each group
61
+ for (const [type, tags] of Object.entries(groupedTags)) {
62
+ if (!options.type || options.type.toLowerCase() === type.toLowerCase()) {
63
+ console.log(chalk.bold(`${getTypeEmoji(type)} ${type}:`));
64
+
65
+ for (const stat of tags) {
66
+ const tagDisplay = stat.tag.replace(`${type.toLowerCase()}:`, '');
67
+ const bar = '█'.repeat(Math.min(stat.count, 20));
68
+ console.log(
69
+ ` ${chalk.cyan(tagDisplay.padEnd(20))} ${chalk.green(bar)} ${chalk.yellow(stat.count)}`
70
+ );
71
+ }
72
+
73
+ console.log();
74
+ }
75
+ }
76
+
77
+ // Summary
78
+ console.log(chalk.bold('Summary:'));
79
+ console.log(` Total tags: ${chalk.cyan(tagStats.length)}`);
80
+ console.log(` Total tag types: ${chalk.cyan(Object.keys(groupedTags).length)}`);
81
+ console.log();
82
+ }
83
+
84
+ /**
85
+ * Group tags by type
86
+ */
87
+ function groupTagsByType(
88
+ tagStats: { tag: string; count: number; ruleIds: string[] }[]
89
+ ): Record<string, typeof tagStats> {
90
+ const grouped: Record<string, typeof tagStats> = {
91
+ Source: [],
92
+ Category: [],
93
+ Priority: [],
94
+ Domain: [],
95
+ Custom: [],
96
+ };
97
+
98
+ for (const stat of tagStats) {
99
+ if (stat.tag.startsWith('source:')) {
100
+ grouped.Source.push(stat);
101
+ } else if (stat.tag.startsWith('category:')) {
102
+ grouped.Category.push(stat);
103
+ } else if (stat.tag.startsWith('priority:')) {
104
+ grouped.Priority.push(stat);
105
+ } else if (stat.tag.startsWith('domain:')) {
106
+ grouped.Domain.push(stat);
107
+ } else {
108
+ grouped.Custom.push(stat);
109
+ }
110
+ }
111
+
112
+ // Remove empty groups
113
+ for (const key of Object.keys(grouped)) {
114
+ if (grouped[key].length === 0) {
115
+ delete grouped[key];
116
+ }
117
+ }
118
+
119
+ return grouped;
120
+ }
121
+
122
+ /**
123
+ * Get emoji for tag type
124
+ */
125
+ function getTypeEmoji(type: string): string {
126
+ switch (type.toLowerCase()) {
127
+ case 'source':
128
+ return '📦';
129
+ case 'category':
130
+ return '📂';
131
+ case 'priority':
132
+ return '⚡';
133
+ case 'domain':
134
+ return '🌐';
135
+ case 'custom':
136
+ return '🏷️';
137
+ default:
138
+ return '•';
139
+ }
140
+ }
@@ -1,173 +1,173 @@
1
- /**
2
- * add-tag / remove-tag commands - Manage rule tags
3
- */
4
-
5
- import chalk from 'chalk';
6
- import * as fs from 'fs';
7
- import { resolveFilePath } from '../utils/file-handler';
8
- import { parseMatrixFile } from '../../parser';
9
- import { serializeMatrixFile } from '../../serializer';
10
- import { TagIndexer, buildTagIndex } from '../../indexer/tag-indexer';
11
-
12
- interface ManageTagsOptions {
13
- force?: boolean;
14
- }
15
-
16
- /**
17
- * Add tag to a rule
18
- */
19
- export async function addTagCommand(
20
- file: string,
21
- ruleId: string,
22
- tag: string,
23
- options: ManageTagsOptions = {}
24
- ): Promise<void> {
25
- const filePath = resolveFilePath(file);
26
-
27
- // Parse file
28
- const matrixFile = parseMatrixFile(filePath);
29
-
30
- // Find rule
31
- const rule = matrixFile.rules.find((r) => r.id === ruleId);
32
- if (!rule) {
33
- throw new Error(`Rule not found: ${ruleId}`);
34
- }
35
-
36
- // Ensure tag starts with # (for custom tags)
37
- const normalizedTag = tag.startsWith('#') ? tag : `#${tag}`;
38
-
39
- // Initialize tags array if not exists
40
- if (!rule.tags) {
41
- rule.tags = [];
42
- }
43
-
44
- // Check if tag already exists
45
- if (Array.isArray(rule.tags) && rule.tags.includes(normalizedTag)) {
46
- console.log(chalk.yellow(`Tag already exists: ${normalizedTag}`));
47
- return;
48
- }
49
-
50
- // Add tag
51
- if (Array.isArray(rule.tags)) {
52
- rule.tags.push(normalizedTag);
53
- } else {
54
- rule.tags = [normalizedTag];
55
- }
56
-
57
- // Save file
58
- const serialized = serializeMatrixFile(matrixFile);
59
- fs.writeFileSync(filePath, serialized, 'utf-8');
60
-
61
- // Rebuild tag index
62
- const indexPath = filePath.replace('.matrix', '.tags.json');
63
- buildTagIndex(matrixFile, indexPath);
64
-
65
- console.log(chalk.green(`✓ Tag added: ${normalizedTag} to ${ruleId}`));
66
- console.log(chalk.gray(` Index updated: ${indexPath}`));
67
- }
68
-
69
- /**
70
- * Remove tag from a rule
71
- */
72
- export async function removeTagCommand(
73
- file: string,
74
- ruleId: string,
75
- tag: string,
76
- options: ManageTagsOptions = {}
77
- ): Promise<void> {
78
- const filePath = resolveFilePath(file);
79
-
80
- // Parse file
81
- const matrixFile = parseMatrixFile(filePath);
82
-
83
- // Find rule
84
- const rule = matrixFile.rules.find((r) => r.id === ruleId);
85
- if (!rule) {
86
- throw new Error(`Rule not found: ${ruleId}`);
87
- }
88
-
89
- // Ensure tag starts with # (for custom tags)
90
- const normalizedTag = tag.startsWith('#') ? tag : `#${tag}`;
91
-
92
- // Check if rule has tags
93
- if (!rule.tags || !Array.isArray(rule.tags)) {
94
- console.log(chalk.yellow(`Rule has no tags: ${ruleId}`));
95
- return;
96
- }
97
-
98
- // Find tag index
99
- const tagIndex = rule.tags.indexOf(normalizedTag);
100
- if (tagIndex === -1) {
101
- console.log(chalk.yellow(`Tag not found: ${normalizedTag}`));
102
- return;
103
- }
104
-
105
- // Remove tag
106
- rule.tags.splice(tagIndex, 1);
107
-
108
- // Save file
109
- const serialized = serializeMatrixFile(matrixFile);
110
- fs.writeFileSync(filePath, serialized, 'utf-8');
111
-
112
- // Rebuild tag index
113
- const indexPath = filePath.replace('.matrix', '.tags.json');
114
- buildTagIndex(matrixFile, indexPath);
115
-
116
- console.log(chalk.green(`✓ Tag removed: ${normalizedTag} from ${ruleId}`));
117
- console.log(chalk.gray(` Index updated: ${indexPath}`));
118
- }
119
-
120
- /**
121
- * List tags for a specific rule
122
- */
123
- export async function showRuleTagsCommand(
124
- file: string,
125
- ruleId: string
126
- ): Promise<void> {
127
- const filePath = resolveFilePath(file);
128
-
129
- // Parse file
130
- const matrixFile = parseMatrixFile(filePath);
131
-
132
- // Find rule
133
- const rule = matrixFile.rules.find((r) => r.id === ruleId);
134
- if (!rule) {
135
- throw new Error(`Rule not found: ${ruleId}`);
136
- }
137
-
138
- console.log(chalk.bold.cyan(`\n🏷️ Tags for ${ruleId}\n`));
139
-
140
- // Collect all tags
141
- const allTags: string[] = [];
142
-
143
- if (rule.source) allTags.push(`source:${rule.source}`);
144
- if (rule.category) allTags.push(`category:${rule.category}`);
145
- if (rule.priority) allTags.push(`priority:${rule.priority}`);
146
- if (rule.domain) allTags.push(`domain:${rule.domain}`);
147
- if (rule.tags && Array.isArray(rule.tags)) {
148
- allTags.push(...rule.tags);
149
- }
150
-
151
- if (allTags.length === 0) {
152
- console.log(chalk.yellow('No tags found.'));
153
- } else {
154
- for (const tag of allTags) {
155
- const emoji = getTagEmoji(tag);
156
- console.log(` ${emoji} ${chalk.cyan(tag)}`);
157
- }
158
- }
159
-
160
- console.log();
161
- }
162
-
163
- /**
164
- * Get emoji for tag
165
- */
166
- function getTagEmoji(tag: string): string {
167
- if (tag.startsWith('source:')) return '📦';
168
- if (tag.startsWith('category:')) return '📂';
169
- if (tag.startsWith('priority:')) return '⚡';
170
- if (tag.startsWith('domain:')) return '🌐';
171
- if (tag.startsWith('#')) return '🏷️';
172
- return '•';
173
- }
1
+ /**
2
+ * add-tag / remove-tag commands - Manage rule tags
3
+ */
4
+
5
+ import chalk from 'chalk';
6
+ import * as fs from 'fs';
7
+ import { resolveFilePath } from '../utils/file-handler';
8
+ import { parseMatrixFile } from '../../parser';
9
+ import { serializeMatrixFile } from '../../serializer';
10
+ import { TagIndexer, buildTagIndex } from '../../indexer/tag-indexer';
11
+
12
+ interface ManageTagsOptions {
13
+ force?: boolean;
14
+ }
15
+
16
+ /**
17
+ * Add tag to a rule
18
+ */
19
+ export async function addTagCommand(
20
+ file: string,
21
+ ruleId: string,
22
+ tag: string,
23
+ options: ManageTagsOptions = {}
24
+ ): Promise<void> {
25
+ const filePath = resolveFilePath(file);
26
+
27
+ // Parse file
28
+ const matrixFile = parseMatrixFile(filePath);
29
+
30
+ // Find rule
31
+ const rule = matrixFile.rules.find((r) => r.id === ruleId);
32
+ if (!rule) {
33
+ throw new Error(`Rule not found: ${ruleId}`);
34
+ }
35
+
36
+ // Ensure tag starts with # (for custom tags)
37
+ const normalizedTag = tag.startsWith('#') ? tag : `#${tag}`;
38
+
39
+ // Initialize tags array if not exists
40
+ if (!rule.tags) {
41
+ rule.tags = [];
42
+ }
43
+
44
+ // Check if tag already exists
45
+ if (Array.isArray(rule.tags) && rule.tags.includes(normalizedTag)) {
46
+ console.log(chalk.yellow(`Tag already exists: ${normalizedTag}`));
47
+ return;
48
+ }
49
+
50
+ // Add tag
51
+ if (Array.isArray(rule.tags)) {
52
+ rule.tags.push(normalizedTag);
53
+ } else {
54
+ rule.tags = [normalizedTag];
55
+ }
56
+
57
+ // Save file
58
+ const serialized = serializeMatrixFile(matrixFile);
59
+ fs.writeFileSync(filePath, serialized, 'utf-8');
60
+
61
+ // Rebuild tag index
62
+ const indexPath = filePath.replace('.matrix', '.tags.json');
63
+ buildTagIndex(matrixFile, indexPath);
64
+
65
+ console.log(chalk.green(`✓ Tag added: ${normalizedTag} to ${ruleId}`));
66
+ console.log(chalk.gray(` Index updated: ${indexPath}`));
67
+ }
68
+
69
+ /**
70
+ * Remove tag from a rule
71
+ */
72
+ export async function removeTagCommand(
73
+ file: string,
74
+ ruleId: string,
75
+ tag: string,
76
+ options: ManageTagsOptions = {}
77
+ ): Promise<void> {
78
+ const filePath = resolveFilePath(file);
79
+
80
+ // Parse file
81
+ const matrixFile = parseMatrixFile(filePath);
82
+
83
+ // Find rule
84
+ const rule = matrixFile.rules.find((r) => r.id === ruleId);
85
+ if (!rule) {
86
+ throw new Error(`Rule not found: ${ruleId}`);
87
+ }
88
+
89
+ // Ensure tag starts with # (for custom tags)
90
+ const normalizedTag = tag.startsWith('#') ? tag : `#${tag}`;
91
+
92
+ // Check if rule has tags
93
+ if (!rule.tags || !Array.isArray(rule.tags)) {
94
+ console.log(chalk.yellow(`Rule has no tags: ${ruleId}`));
95
+ return;
96
+ }
97
+
98
+ // Find tag index
99
+ const tagIndex = rule.tags.indexOf(normalizedTag);
100
+ if (tagIndex === -1) {
101
+ console.log(chalk.yellow(`Tag not found: ${normalizedTag}`));
102
+ return;
103
+ }
104
+
105
+ // Remove tag
106
+ rule.tags.splice(tagIndex, 1);
107
+
108
+ // Save file
109
+ const serialized = serializeMatrixFile(matrixFile);
110
+ fs.writeFileSync(filePath, serialized, 'utf-8');
111
+
112
+ // Rebuild tag index
113
+ const indexPath = filePath.replace('.matrix', '.tags.json');
114
+ buildTagIndex(matrixFile, indexPath);
115
+
116
+ console.log(chalk.green(`✓ Tag removed: ${normalizedTag} from ${ruleId}`));
117
+ console.log(chalk.gray(` Index updated: ${indexPath}`));
118
+ }
119
+
120
+ /**
121
+ * List tags for a specific rule
122
+ */
123
+ export async function showRuleTagsCommand(
124
+ file: string,
125
+ ruleId: string
126
+ ): Promise<void> {
127
+ const filePath = resolveFilePath(file);
128
+
129
+ // Parse file
130
+ const matrixFile = parseMatrixFile(filePath);
131
+
132
+ // Find rule
133
+ const rule = matrixFile.rules.find((r) => r.id === ruleId);
134
+ if (!rule) {
135
+ throw new Error(`Rule not found: ${ruleId}`);
136
+ }
137
+
138
+ console.log(chalk.bold.cyan(`\n🏷️ Tags for ${ruleId}\n`));
139
+
140
+ // Collect all tags
141
+ const allTags: string[] = [];
142
+
143
+ if (rule.source) allTags.push(`source:${rule.source}`);
144
+ if (rule.category) allTags.push(`category:${rule.category}`);
145
+ if (rule.priority) allTags.push(`priority:${rule.priority}`);
146
+ if (rule.domain) allTags.push(`domain:${rule.domain}`);
147
+ if (rule.tags && Array.isArray(rule.tags)) {
148
+ allTags.push(...rule.tags);
149
+ }
150
+
151
+ if (allTags.length === 0) {
152
+ console.log(chalk.yellow('No tags found.'));
153
+ } else {
154
+ for (const tag of allTags) {
155
+ const emoji = getTagEmoji(tag);
156
+ console.log(` ${emoji} ${chalk.cyan(tag)}`);
157
+ }
158
+ }
159
+
160
+ console.log();
161
+ }
162
+
163
+ /**
164
+ * Get emoji for tag
165
+ */
166
+ function getTagEmoji(tag: string): string {
167
+ if (tag.startsWith('source:')) return '📦';
168
+ if (tag.startsWith('category:')) return '📂';
169
+ if (tag.startsWith('priority:')) return '⚡';
170
+ if (tag.startsWith('domain:')) return '🌐';
171
+ if (tag.startsWith('#')) return '🏷️';
172
+ return '•';
173
+ }