kenaz 0.3.3 → 0.3.6

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 (451) 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 +15 -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/native/claude/README.md +1 -1
  44. package/core/.formation/role-map.yaml +3 -3
  45. package/core/.formation/spec/task_operations.parity.test.js +0 -1
  46. package/core/.formation/spec/task_operations.yaml +3 -3
  47. package/core/.formation/tests/hello.txt +2 -2
  48. package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +4 -4
  49. package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
  50. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
  51. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
  52. package/core/.formation/tools/dispatch.js +33 -554
  53. package/core/.formation/tools/mcp-allowlist.test.js +0 -1
  54. package/core/.formation/tools/post-complete/task2345.test.js +0 -5
  55. package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
  56. package/core/.formation/tools/prompt.js +33 -1623
  57. package/core/.formation/tools/prompt.test.js +26 -594
  58. package/core/.formation/unit/do.yaml +2 -4
  59. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  60. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  61. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  62. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  63. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  64. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  65. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  66. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  67. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  68. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  69. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  70. package/core/.matrix/index.matrix +5 -5
  71. package/core/.rule/general/agent-workflow.yaml +4 -4
  72. package/core/.rule/general/file-size-threshold.yaml +16 -4
  73. package/core/.rule/general/rust-verify-target.yaml +0 -1
  74. package/core/.rule/general/system-invariants.yaml +8 -25
  75. package/core/.specialist/Ansuz/SYSTEM_DOC.md +17 -42
  76. package/core/.specialist/Ansuz/capability.yaml +7 -14
  77. package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +4 -11
  78. package/core/.specialist/Ansuz/elixir.yaml +3 -4
  79. package/core/.specialist/Ansuz/identity_contract.yaml +1 -1
  80. package/core/.specialist/Ansuz/knowledge.yaml +7 -10
  81. package/core/.specialist/Ansuz/rule.yaml +2 -2
  82. package/core/.specialist/Ansuz/tools/verify-and-land.js +22 -0
  83. package/core/.specialist/Ansuz/tools/verify-and-land.test.js +59 -5
  84. package/core/.specialist/Ansuz/workflow.yaml +7 -11
  85. package/core/.specialist/Forseti/core.yaml +1 -1
  86. package/core/.specialist/Heimdall/SKILL.md +1 -1
  87. package/core/.specialist/Heimdall/core.yaml +2 -2
  88. package/core/.specialist/Huginn/rule.yaml +1 -1
  89. package/core/.specialist/tools/README.md +2 -2
  90. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
  91. package/core/.system/collaboration/README.md +1 -1
  92. package/core/.system/formation/LEGACY_SKILLS.md +2 -0
  93. package/core/.system/formation/POST_COMPLETE.md +2 -0
  94. package/core/.system/formation/README.md +2 -0
  95. package/core/KENAZ_CORE_VERSION +1 -1
  96. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  97. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  98. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  99. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  100. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  101. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  102. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  103. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  104. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  105. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  106. package/core/dev/jev-eval/README.md +99 -99
  107. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  108. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  109. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  110. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  111. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  112. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  113. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  114. package/core/dev/scripts/check-file-size.js +44 -17
  115. package/core/dev/scripts/init_git.sh +0 -0
  116. package/core/dev/scripts/init_project.sh +0 -0
  117. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  118. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  119. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  120. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  121. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  122. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  123. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  124. package/core/dev/scripts/run_once.sh +0 -0
  125. package/core/dev/scripts/setup_mcp.sh +0 -0
  126. package/core/dev/scripts/setup_rag.sh +0 -0
  127. package/core/dev/scripts/start_dev_agent.sh +0 -0
  128. package/core/dev/scripts/start_multi_agent.sh +0 -0
  129. package/core/dev/scripts/sync_task_queue.sh +0 -0
  130. package/core/k-cli/README.md +1 -94
  131. package/core/k-cli/test/TEST_SPEC.md +5 -22
  132. package/core/k-cli/test/run.sh +1 -67
  133. package/core/plugins/kenaz/commands/Amelia.md +1 -1
  134. package/core/plugins/kenaz/commands/Ansuz.md +16 -3
  135. package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
  136. package/core/plugins/kenaz/scripts/sync.js +6 -2
  137. package/core/plugins/kenaz/scripts/ygg.js +13 -1
  138. package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
  139. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  140. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  141. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  142. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  143. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  144. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  145. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  146. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  147. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  148. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  149. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  150. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  151. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  152. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  153. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  154. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  155. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  156. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  157. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  158. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  159. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  160. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  161. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  162. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  163. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  164. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  165. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  166. package/lib/cli.js +11 -4
  167. package/package.json +11 -7
  168. package/vendor/install-kenaz-cli.js +18 -7
  169. package/core/.formation/legion/forge.yaml +0 -299
  170. package/core/.formation/legion/hive.yaml +0 -238
  171. package/core/.formation/squad/blitz.yaml +0 -192
  172. package/core/.formation/squad/strategy-tribunal.yaml +0 -354
  173. package/core/.formation/squad/strategy.yaml +0 -349
  174. package/core/.formation/squad/sweep.yaml +0 -208
  175. package/core/.formation/tools/broadcast.js +0 -103
  176. package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
  177. package/core/.formation/tools/dispatch-notifier.js +0 -84
  178. package/core/.formation/tools/formations.js +0 -1203
  179. package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
  180. package/core/.formation/tools/headless-dryrun.test.js +0 -79
  181. package/core/.formation/tools/headless-v2.js +0 -659
  182. package/core/.formation/tools/headless.js +0 -1071
  183. package/core/.formation/tools/legacy-scheduler.js +0 -1994
  184. package/core/.formation/tools/logger.js +0 -273
  185. package/core/.formation/tools/memory-loader.js +0 -422
  186. package/core/.formation/tools/process-state.js +0 -33
  187. package/core/.formation/tools/remote-conflict.js +0 -98
  188. package/core/.formation/tools/runner.js +0 -1332
  189. package/core/.formation/tools/task-utils.js +0 -344
  190. package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
  191. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
  192. package/core/.formation/tools/worktree-leak.test.js +0 -162
  193. package/core/k-cli/dist/alaya/run.js +0 -91
  194. package/core/k-cli/dist/core/output.js +0 -24
  195. package/core/k-cli/dist/core/process.js +0 -38
  196. package/core/k-cli/dist/core/project.js +0 -80
  197. package/core/k-cli/dist/core/spawn.js +0 -268
  198. package/core/k-cli/dist/core/types.js +0 -2
  199. package/core/k-cli/dist/dashboard/update.js +0 -53
  200. package/core/k-cli/dist/dashboard/version.js +0 -20
  201. package/core/k-cli/dist/dispatch/run.js +0 -241
  202. package/core/k-cli/dist/dispatch/status.js +0 -103
  203. package/core/k-cli/dist/index.js +0 -283
  204. package/core/k-cli/dist/project/initialize.js +0 -301
  205. package/core/k-cli/dist/project/install.js +0 -89
  206. package/core/k-cli/dist/project/status.js +0 -138
  207. package/core/k-cli/dist/specialist/list.js +0 -100
  208. package/core/k-cli/dist/specialist/run.js +0 -93
  209. package/core/k-cli/dist/task/create.js +0 -194
  210. package/core/k-cli/dist/task/delete.js +0 -98
  211. package/core/k-cli/dist/task/get.js +0 -55
  212. package/core/k-cli/dist/task/list.js +0 -58
  213. package/core/k-cli/dist/task/submit.js +0 -156
  214. package/core/k-cli/dist/ygg/run.js +0 -51
  215. package/core/k-cli/node_modules/.bin/yaml +0 -16
  216. package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
  217. package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
  218. package/core/k-cli/node_modules/.package-lock.json +0 -23
  219. package/core/k-cli/node_modules/yaml/LICENSE +0 -13
  220. package/core/k-cli/node_modules/yaml/README.md +0 -172
  221. package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
  222. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
  223. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
  224. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
  225. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
  226. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
  227. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
  228. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
  229. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
  230. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
  231. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
  232. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
  233. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
  234. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
  235. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
  236. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
  237. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
  238. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
  239. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
  240. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
  241. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
  242. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
  243. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
  244. package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
  245. package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
  246. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
  247. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
  248. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
  249. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
  250. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
  251. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
  252. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
  253. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
  254. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
  255. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
  256. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
  257. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
  258. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
  259. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
  260. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
  261. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
  262. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
  263. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
  264. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
  265. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
  266. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
  267. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
  268. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
  269. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
  270. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
  271. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
  272. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
  273. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
  274. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
  275. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
  276. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
  277. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
  278. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
  279. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
  280. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
  281. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  282. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
  283. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
  284. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  285. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
  286. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
  287. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
  288. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
  289. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
  290. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
  291. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
  292. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
  293. package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
  294. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
  295. package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
  296. package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
  297. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
  298. package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
  299. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
  300. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
  301. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
  302. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
  303. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
  304. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
  305. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
  306. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
  307. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
  308. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
  309. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
  310. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
  311. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
  312. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
  313. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
  314. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
  315. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
  316. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
  317. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
  318. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
  319. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
  320. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
  321. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
  322. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
  323. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
  324. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
  325. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
  326. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
  327. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
  328. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
  329. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
  330. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
  331. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
  332. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
  333. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
  334. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
  335. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
  336. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
  337. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
  338. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
  339. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
  340. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
  341. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
  342. package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
  343. package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
  344. package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
  345. package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
  346. package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
  347. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
  348. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
  349. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
  350. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
  351. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
  352. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
  353. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
  354. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
  355. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
  356. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
  357. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
  358. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
  359. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
  360. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
  361. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
  362. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
  363. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
  364. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
  365. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
  366. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
  367. package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
  368. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
  369. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
  370. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
  371. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
  372. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
  373. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
  374. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
  375. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
  376. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
  377. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
  378. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
  379. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
  380. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
  381. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
  382. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
  383. package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
  384. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
  385. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
  386. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
  387. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
  388. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
  389. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
  390. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
  391. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
  392. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
  393. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
  394. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
  395. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
  396. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
  397. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
  398. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
  399. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
  400. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
  401. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
  402. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
  403. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
  404. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
  405. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
  406. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
  407. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
  408. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
  409. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
  410. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
  411. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
  412. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
  413. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
  414. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
  415. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
  416. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  417. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
  418. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
  419. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
  420. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  421. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
  422. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
  423. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
  424. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
  425. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
  426. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  427. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
  428. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
  429. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
  430. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
  431. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
  432. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
  433. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
  434. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
  435. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
  436. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
  437. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
  438. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
  439. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
  440. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
  441. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
  442. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
  443. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
  444. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
  445. package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
  446. package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
  447. package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
  448. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
  449. package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
  450. package/core/k-cli/node_modules/yaml/package.json +0 -97
  451. 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
+ }