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.
- package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
- package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
- package/core/.claude/commands/Ansuz.md +15 -2
- package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
- package/core/.claude/hooks/handoff-staleness.js +2 -2
- package/core/.claude/hooks/session-init.ps1 +49 -49
- package/core/.claude/hooks/turn-context.js +50 -2
- package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/core/.collaboration/core/task-api.js +1 -4
- package/core/.formation/README.md +21 -146
- package/core/.formation/bifrost/codex-doctor.js +37 -2
- package/core/.formation/bifrost/codex-doctor.test.js +18 -0
- package/core/.formation/bifrost/launch.js +1 -1
- package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
- package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
- package/core/.formation/bifrost/setup-codex.js +3 -0
- package/core/.formation/native/claude/README.md +1 -1
- package/core/.formation/role-map.yaml +3 -3
- package/core/.formation/spec/task_operations.parity.test.js +0 -1
- package/core/.formation/spec/task_operations.yaml +3 -3
- package/core/.formation/tests/hello.txt +2 -2
- package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +4 -4
- package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
- package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
- package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
- package/core/.formation/tools/dispatch.js +33 -554
- package/core/.formation/tools/mcp-allowlist.test.js +0 -1
- package/core/.formation/tools/post-complete/task2345.test.js +0 -5
- package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
- package/core/.formation/tools/prompt.js +33 -1623
- package/core/.formation/tools/prompt.test.js +26 -594
- package/core/.formation/unit/do.yaml +2 -4
- package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
- package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
- package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
- package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
- package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
- package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
- package/core/.kenaz/muninn_episode_write.ps1 +17 -17
- package/core/.kenaz/specialist/field_report_watermark.json +1 -1
- package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
- package/core/.kenaz/specialist/t1777_probe.txt +1 -1
- package/core/.matrix/index.matrix +5 -5
- package/core/.rule/general/agent-workflow.yaml +4 -4
- package/core/.rule/general/file-size-threshold.yaml +16 -4
- package/core/.rule/general/rust-verify-target.yaml +0 -1
- package/core/.rule/general/system-invariants.yaml +8 -25
- package/core/.specialist/Ansuz/SYSTEM_DOC.md +17 -42
- package/core/.specialist/Ansuz/capability.yaml +7 -14
- package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +4 -11
- package/core/.specialist/Ansuz/elixir.yaml +3 -4
- package/core/.specialist/Ansuz/identity_contract.yaml +1 -1
- package/core/.specialist/Ansuz/knowledge.yaml +7 -10
- package/core/.specialist/Ansuz/rule.yaml +2 -2
- package/core/.specialist/Ansuz/tools/verify-and-land.js +22 -0
- package/core/.specialist/Ansuz/tools/verify-and-land.test.js +59 -5
- package/core/.specialist/Ansuz/workflow.yaml +7 -11
- package/core/.specialist/Forseti/core.yaml +1 -1
- package/core/.specialist/Heimdall/SKILL.md +1 -1
- package/core/.specialist/Heimdall/core.yaml +2 -2
- package/core/.specialist/Huginn/rule.yaml +1 -1
- package/core/.specialist/tools/README.md +2 -2
- package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
- package/core/.system/collaboration/README.md +1 -1
- package/core/.system/formation/LEGACY_SKILLS.md +2 -0
- package/core/.system/formation/POST_COMPLETE.md +2 -0
- package/core/.system/formation/README.md +2 -0
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
- package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
- package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
- package/core/dev/jev-eval/README.md +99 -99
- package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
- package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
- package/core/dev/pipeline/tasks/.gitkeep +1 -1
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
- package/core/dev/scripts/check-file-size.js +44 -17
- package/core/dev/scripts/init_git.sh +0 -0
- package/core/dev/scripts/init_project.sh +0 -0
- package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
- package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
- package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
- package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
- package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
- package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
- package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
- package/core/dev/scripts/run_once.sh +0 -0
- package/core/dev/scripts/setup_mcp.sh +0 -0
- package/core/dev/scripts/setup_rag.sh +0 -0
- package/core/dev/scripts/start_dev_agent.sh +0 -0
- package/core/dev/scripts/start_multi_agent.sh +0 -0
- package/core/dev/scripts/sync_task_queue.sh +0 -0
- package/core/k-cli/README.md +1 -94
- package/core/k-cli/test/TEST_SPEC.md +5 -22
- package/core/k-cli/test/run.sh +1 -67
- package/core/plugins/kenaz/commands/Amelia.md +1 -1
- package/core/plugins/kenaz/commands/Ansuz.md +16 -3
- package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
- package/core/plugins/kenaz/scripts/sync.js +6 -2
- package/core/plugins/kenaz/scripts/ygg.js +13 -1
- package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/lib/cli.js +11 -4
- package/package.json +11 -7
- package/vendor/install-kenaz-cli.js +18 -7
- package/core/.formation/legion/forge.yaml +0 -299
- package/core/.formation/legion/hive.yaml +0 -238
- package/core/.formation/squad/blitz.yaml +0 -192
- package/core/.formation/squad/strategy-tribunal.yaml +0 -354
- package/core/.formation/squad/strategy.yaml +0 -349
- package/core/.formation/squad/sweep.yaml +0 -208
- package/core/.formation/tools/broadcast.js +0 -103
- package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
- package/core/.formation/tools/dispatch-notifier.js +0 -84
- package/core/.formation/tools/formations.js +0 -1203
- package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
- package/core/.formation/tools/headless-dryrun.test.js +0 -79
- package/core/.formation/tools/headless-v2.js +0 -659
- package/core/.formation/tools/headless.js +0 -1071
- package/core/.formation/tools/legacy-scheduler.js +0 -1994
- package/core/.formation/tools/logger.js +0 -273
- package/core/.formation/tools/memory-loader.js +0 -422
- package/core/.formation/tools/process-state.js +0 -33
- package/core/.formation/tools/remote-conflict.js +0 -98
- package/core/.formation/tools/runner.js +0 -1332
- package/core/.formation/tools/task-utils.js +0 -344
- package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
- package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
- package/core/.formation/tools/worktree-leak.test.js +0 -162
- package/core/k-cli/dist/alaya/run.js +0 -91
- package/core/k-cli/dist/core/output.js +0 -24
- package/core/k-cli/dist/core/process.js +0 -38
- package/core/k-cli/dist/core/project.js +0 -80
- package/core/k-cli/dist/core/spawn.js +0 -268
- package/core/k-cli/dist/core/types.js +0 -2
- package/core/k-cli/dist/dashboard/update.js +0 -53
- package/core/k-cli/dist/dashboard/version.js +0 -20
- package/core/k-cli/dist/dispatch/run.js +0 -241
- package/core/k-cli/dist/dispatch/status.js +0 -103
- package/core/k-cli/dist/index.js +0 -283
- package/core/k-cli/dist/project/initialize.js +0 -301
- package/core/k-cli/dist/project/install.js +0 -89
- package/core/k-cli/dist/project/status.js +0 -138
- package/core/k-cli/dist/specialist/list.js +0 -100
- package/core/k-cli/dist/specialist/run.js +0 -93
- package/core/k-cli/dist/task/create.js +0 -194
- package/core/k-cli/dist/task/delete.js +0 -98
- package/core/k-cli/dist/task/get.js +0 -55
- package/core/k-cli/dist/task/list.js +0 -58
- package/core/k-cli/dist/task/submit.js +0 -156
- package/core/k-cli/dist/ygg/run.js +0 -51
- package/core/k-cli/node_modules/.bin/yaml +0 -16
- package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
- package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
- package/core/k-cli/node_modules/.package-lock.json +0 -23
- package/core/k-cli/node_modules/yaml/LICENSE +0 -13
- package/core/k-cli/node_modules/yaml/README.md +0 -172
- package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
- package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
- package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
- package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
- package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
- package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
- package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
- package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
- package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
- package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
- package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
- package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
- package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
- package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
- package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
- package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
- package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
- package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
- package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
- package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
- package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
- package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
- package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
- package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
- package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
- package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
- package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
- package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
- package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
- package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
- package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
- package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
- package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
- package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
- package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
- package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
- package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
- package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
- package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
- package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
- package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
- package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
- package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
- package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
- package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
- package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
- package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
- package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
- package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
- package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
- package/core/k-cli/node_modules/yaml/package.json +0 -97
- package/core/k-cli/node_modules/yaml/util.js +0 -2
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* stats command - Display statistics about .matrix file
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
import { FileHandler } from '../utils/file-handler';
|
|
7
|
-
import { MatrixParser } from '../../parser';
|
|
8
|
-
import { TagIndexer } from '../../indexer/tag-indexer';
|
|
9
|
-
import type { DataRecord } from '../../../types';
|
|
10
|
-
|
|
11
|
-
interface StatsOptions {
|
|
12
|
-
verbose?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export async function statsCommand(
|
|
16
|
-
file: string,
|
|
17
|
-
options: StatsOptions = {}
|
|
18
|
-
): Promise<void> {
|
|
19
|
-
const filePath = FileHandler.ensureExtension(file);
|
|
20
|
-
|
|
21
|
-
// Read file
|
|
22
|
-
const content = FileHandler.read(filePath);
|
|
23
|
-
if (!content) {
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// Parse file
|
|
28
|
-
const parser = new MatrixParser();
|
|
29
|
-
const result = parser.parse(content);
|
|
30
|
-
|
|
31
|
-
if (!result.success) {
|
|
32
|
-
console.error(chalk.red('Failed to parse file'));
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const matrixFile = result.data!;
|
|
37
|
-
|
|
38
|
-
// Build tag index
|
|
39
|
-
const indexer = new TagIndexer();
|
|
40
|
-
indexer.buildIndex(matrixFile);
|
|
41
|
-
|
|
42
|
-
console.log(chalk.bold.cyan('\nš Matrix File Statistics\n'));
|
|
43
|
-
console.log(chalk.gray(`File: ${filePath}\n`));
|
|
44
|
-
|
|
45
|
-
// 1. Overview
|
|
46
|
-
console.log(chalk.bold('Overview:'));
|
|
47
|
-
console.log(` Total Rules: ${chalk.green(matrixFile.data.records.length)}`);
|
|
48
|
-
console.log(` Version: ${chalk.yellow(matrixFile.meta.v)}`);
|
|
49
|
-
console.log(` Category: ${chalk.yellow(matrixFile.meta.cat)}\n`);
|
|
50
|
-
|
|
51
|
-
// 2. Priority Distribution
|
|
52
|
-
const priorityStats = groupBy(matrixFile.data.records, 'p');
|
|
53
|
-
console.log(chalk.bold('Priority Distribution:'));
|
|
54
|
-
printDistribution(priorityStats, ['P0', 'P1', 'P2', 'P3']);
|
|
55
|
-
|
|
56
|
-
// 3. Source Distribution
|
|
57
|
-
const sourceStats = groupBy(matrixFile.rules, 'source');
|
|
58
|
-
console.log(chalk.bold('\nSource Distribution:'));
|
|
59
|
-
printDistribution(sourceStats);
|
|
60
|
-
|
|
61
|
-
// 4. Category Distribution
|
|
62
|
-
const categoryStats = groupBy(matrixFile.rules, 'category');
|
|
63
|
-
if (Object.keys(categoryStats).length > 0) {
|
|
64
|
-
console.log(chalk.bold('\nCategory Distribution:'));
|
|
65
|
-
printDistribution(categoryStats);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// 5. Status Distribution
|
|
69
|
-
const statusStats = groupBy(matrixFile.rules, 'status');
|
|
70
|
-
if (Object.keys(statusStats).length > 0) {
|
|
71
|
-
console.log(chalk.bold('\nStatus Distribution:'));
|
|
72
|
-
printDistribution(statusStats, [
|
|
73
|
-
'pending',
|
|
74
|
-
'in_progress',
|
|
75
|
-
'completed',
|
|
76
|
-
'blocked',
|
|
77
|
-
'cancelled',
|
|
78
|
-
]);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// 6. Domain Distribution
|
|
82
|
-
const domainStats = groupBy(matrixFile.rules, 'domain');
|
|
83
|
-
if (Object.keys(domainStats).length > 0) {
|
|
84
|
-
console.log(chalk.bold('\nDomain Distribution:'));
|
|
85
|
-
printDistribution(domainStats);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// 7. Tag Statistics
|
|
89
|
-
const tagStats = indexer.getTagStats();
|
|
90
|
-
if (tagStats.length > 0) {
|
|
91
|
-
console.log(chalk.bold('\nTop Tags:'));
|
|
92
|
-
const topTags = tagStats.slice(0, 10);
|
|
93
|
-
for (const stat of topTags) {
|
|
94
|
-
console.log(` ${chalk.cyan(stat.tag)}: ${chalk.green(stat.count)}`);
|
|
95
|
-
}
|
|
96
|
-
if (tagStats.length > 10) {
|
|
97
|
-
console.log(chalk.gray(` ... and ${tagStats.length - 10} more`));
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// 8. Verbose mode: Show all rules
|
|
102
|
-
if (options.verbose) {
|
|
103
|
-
console.log(chalk.bold('\nAll Rules:'));
|
|
104
|
-
for (const rule of matrixFile.rules) {
|
|
105
|
-
console.log(` ${chalk.cyan(rule.id)}: ${rule.title || '(no title)'}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
console.log(); // Empty line at end
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Group rules by field
|
|
114
|
-
*/
|
|
115
|
-
function groupBy(
|
|
116
|
-
rules: Rule[],
|
|
117
|
-
field: keyof Rule
|
|
118
|
-
): Record<string, number> {
|
|
119
|
-
const result: Record<string, number> = {};
|
|
120
|
-
|
|
121
|
-
for (const rule of rules) {
|
|
122
|
-
const value = rule[field];
|
|
123
|
-
if (value) {
|
|
124
|
-
const key = String(value);
|
|
125
|
-
result[key] = (result[key] || 0) + 1;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return result;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Print distribution with bar chart
|
|
134
|
-
*/
|
|
135
|
-
function printDistribution(
|
|
136
|
-
stats: Record<string, number>,
|
|
137
|
-
order?: string[]
|
|
138
|
-
): void {
|
|
139
|
-
const entries = Object.entries(stats);
|
|
140
|
-
|
|
141
|
-
// Sort by order if provided, otherwise by count descending
|
|
142
|
-
if (order) {
|
|
143
|
-
entries.sort((a, b) => {
|
|
144
|
-
const aIndex = order.indexOf(a[0]);
|
|
145
|
-
const bIndex = order.indexOf(b[0]);
|
|
146
|
-
if (aIndex === -1 && bIndex === -1) return 0;
|
|
147
|
-
if (aIndex === -1) return 1;
|
|
148
|
-
if (bIndex === -1) return -1;
|
|
149
|
-
return aIndex - bIndex;
|
|
150
|
-
});
|
|
151
|
-
} else {
|
|
152
|
-
entries.sort((a, b) => b[1] - a[1]);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Calculate max count for bar chart
|
|
156
|
-
const maxCount = Math.max(...entries.map(([, count]) => count));
|
|
157
|
-
const maxBarLength = 30;
|
|
158
|
-
|
|
159
|
-
for (const [key, count] of entries) {
|
|
160
|
-
const barLength = Math.ceil((count / maxCount) * maxBarLength);
|
|
161
|
-
const bar = 'ā'.repeat(barLength);
|
|
162
|
-
const percentage = ((count / entries.reduce((sum, [, c]) => sum + c, 0)) * 100).toFixed(1);
|
|
163
|
-
|
|
164
|
-
console.log(
|
|
165
|
-
` ${chalk.yellow(key.padEnd(15))} ${chalk.green(bar)} ${chalk.cyan(count)} ${chalk.gray(`(${percentage}%)`)}`
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* stats command - Display statistics about .matrix file
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { FileHandler } from '../utils/file-handler';
|
|
7
|
+
import { MatrixParser } from '../../parser';
|
|
8
|
+
import { TagIndexer } from '../../indexer/tag-indexer';
|
|
9
|
+
import type { DataRecord } from '../../../types';
|
|
10
|
+
|
|
11
|
+
interface StatsOptions {
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function statsCommand(
|
|
16
|
+
file: string,
|
|
17
|
+
options: StatsOptions = {}
|
|
18
|
+
): Promise<void> {
|
|
19
|
+
const filePath = FileHandler.ensureExtension(file);
|
|
20
|
+
|
|
21
|
+
// Read file
|
|
22
|
+
const content = FileHandler.read(filePath);
|
|
23
|
+
if (!content) {
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Parse file
|
|
28
|
+
const parser = new MatrixParser();
|
|
29
|
+
const result = parser.parse(content);
|
|
30
|
+
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
console.error(chalk.red('Failed to parse file'));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const matrixFile = result.data!;
|
|
37
|
+
|
|
38
|
+
// Build tag index
|
|
39
|
+
const indexer = new TagIndexer();
|
|
40
|
+
indexer.buildIndex(matrixFile);
|
|
41
|
+
|
|
42
|
+
console.log(chalk.bold.cyan('\nš Matrix File Statistics\n'));
|
|
43
|
+
console.log(chalk.gray(`File: ${filePath}\n`));
|
|
44
|
+
|
|
45
|
+
// 1. Overview
|
|
46
|
+
console.log(chalk.bold('Overview:'));
|
|
47
|
+
console.log(` Total Rules: ${chalk.green(matrixFile.data.records.length)}`);
|
|
48
|
+
console.log(` Version: ${chalk.yellow(matrixFile.meta.v)}`);
|
|
49
|
+
console.log(` Category: ${chalk.yellow(matrixFile.meta.cat)}\n`);
|
|
50
|
+
|
|
51
|
+
// 2. Priority Distribution
|
|
52
|
+
const priorityStats = groupBy(matrixFile.data.records, 'p');
|
|
53
|
+
console.log(chalk.bold('Priority Distribution:'));
|
|
54
|
+
printDistribution(priorityStats, ['P0', 'P1', 'P2', 'P3']);
|
|
55
|
+
|
|
56
|
+
// 3. Source Distribution
|
|
57
|
+
const sourceStats = groupBy(matrixFile.rules, 'source');
|
|
58
|
+
console.log(chalk.bold('\nSource Distribution:'));
|
|
59
|
+
printDistribution(sourceStats);
|
|
60
|
+
|
|
61
|
+
// 4. Category Distribution
|
|
62
|
+
const categoryStats = groupBy(matrixFile.rules, 'category');
|
|
63
|
+
if (Object.keys(categoryStats).length > 0) {
|
|
64
|
+
console.log(chalk.bold('\nCategory Distribution:'));
|
|
65
|
+
printDistribution(categoryStats);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 5. Status Distribution
|
|
69
|
+
const statusStats = groupBy(matrixFile.rules, 'status');
|
|
70
|
+
if (Object.keys(statusStats).length > 0) {
|
|
71
|
+
console.log(chalk.bold('\nStatus Distribution:'));
|
|
72
|
+
printDistribution(statusStats, [
|
|
73
|
+
'pending',
|
|
74
|
+
'in_progress',
|
|
75
|
+
'completed',
|
|
76
|
+
'blocked',
|
|
77
|
+
'cancelled',
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 6. Domain Distribution
|
|
82
|
+
const domainStats = groupBy(matrixFile.rules, 'domain');
|
|
83
|
+
if (Object.keys(domainStats).length > 0) {
|
|
84
|
+
console.log(chalk.bold('\nDomain Distribution:'));
|
|
85
|
+
printDistribution(domainStats);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// 7. Tag Statistics
|
|
89
|
+
const tagStats = indexer.getTagStats();
|
|
90
|
+
if (tagStats.length > 0) {
|
|
91
|
+
console.log(chalk.bold('\nTop Tags:'));
|
|
92
|
+
const topTags = tagStats.slice(0, 10);
|
|
93
|
+
for (const stat of topTags) {
|
|
94
|
+
console.log(` ${chalk.cyan(stat.tag)}: ${chalk.green(stat.count)}`);
|
|
95
|
+
}
|
|
96
|
+
if (tagStats.length > 10) {
|
|
97
|
+
console.log(chalk.gray(` ... and ${tagStats.length - 10} more`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// 8. Verbose mode: Show all rules
|
|
102
|
+
if (options.verbose) {
|
|
103
|
+
console.log(chalk.bold('\nAll Rules:'));
|
|
104
|
+
for (const rule of matrixFile.rules) {
|
|
105
|
+
console.log(` ${chalk.cyan(rule.id)}: ${rule.title || '(no title)'}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
console.log(); // Empty line at end
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Group rules by field
|
|
114
|
+
*/
|
|
115
|
+
function groupBy(
|
|
116
|
+
rules: Rule[],
|
|
117
|
+
field: keyof Rule
|
|
118
|
+
): Record<string, number> {
|
|
119
|
+
const result: Record<string, number> = {};
|
|
120
|
+
|
|
121
|
+
for (const rule of rules) {
|
|
122
|
+
const value = rule[field];
|
|
123
|
+
if (value) {
|
|
124
|
+
const key = String(value);
|
|
125
|
+
result[key] = (result[key] || 0) + 1;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Print distribution with bar chart
|
|
134
|
+
*/
|
|
135
|
+
function printDistribution(
|
|
136
|
+
stats: Record<string, number>,
|
|
137
|
+
order?: string[]
|
|
138
|
+
): void {
|
|
139
|
+
const entries = Object.entries(stats);
|
|
140
|
+
|
|
141
|
+
// Sort by order if provided, otherwise by count descending
|
|
142
|
+
if (order) {
|
|
143
|
+
entries.sort((a, b) => {
|
|
144
|
+
const aIndex = order.indexOf(a[0]);
|
|
145
|
+
const bIndex = order.indexOf(b[0]);
|
|
146
|
+
if (aIndex === -1 && bIndex === -1) return 0;
|
|
147
|
+
if (aIndex === -1) return 1;
|
|
148
|
+
if (bIndex === -1) return -1;
|
|
149
|
+
return aIndex - bIndex;
|
|
150
|
+
});
|
|
151
|
+
} else {
|
|
152
|
+
entries.sort((a, b) => b[1] - a[1]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Calculate max count for bar chart
|
|
156
|
+
const maxCount = Math.max(...entries.map(([, count]) => count));
|
|
157
|
+
const maxBarLength = 30;
|
|
158
|
+
|
|
159
|
+
for (const [key, count] of entries) {
|
|
160
|
+
const barLength = Math.ceil((count / maxCount) * maxBarLength);
|
|
161
|
+
const bar = 'ā'.repeat(barLength);
|
|
162
|
+
const percentage = ((count / entries.reduce((sum, [, c]) => sum + c, 0)) * 100).toFixed(1);
|
|
163
|
+
|
|
164
|
+
console.log(
|
|
165
|
+
` ${chalk.yellow(key.padEnd(15))} ${chalk.green(bar)} ${chalk.cyan(count)} ${chalk.gray(`(${percentage}%)`)}`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* tokens command - Calculate token count and compression ratio
|
|
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
|
-
|
|
11
|
-
interface TokensOptions {
|
|
12
|
-
verbose?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export async function tokensCommand(
|
|
16
|
-
file: string,
|
|
17
|
-
options: TokensOptions = {}
|
|
18
|
-
): Promise<void> {
|
|
19
|
-
const filePath = resolveFilePath(file);
|
|
20
|
-
|
|
21
|
-
// Read original .matrix content
|
|
22
|
-
const matrixContent = fs.readFileSync(filePath, 'utf-8');
|
|
23
|
-
|
|
24
|
-
// Parse and convert to JSON
|
|
25
|
-
const matrixFile = parseMatrixFile(filePath);
|
|
26
|
-
const jsonContent = JSON.stringify(matrixFile, null, 2);
|
|
27
|
-
|
|
28
|
-
// Calculate token counts (using simple estimation)
|
|
29
|
-
const matrixTokens = estimateTokenCount(matrixContent);
|
|
30
|
-
const jsonTokens = estimateTokenCount(jsonContent);
|
|
31
|
-
|
|
32
|
-
// Calculate compression ratio
|
|
33
|
-
const compressionRatio = (jsonTokens / matrixTokens).toFixed(2);
|
|
34
|
-
|
|
35
|
-
// Calculate sizes
|
|
36
|
-
const matrixSize = Buffer.byteLength(matrixContent, 'utf-8');
|
|
37
|
-
const jsonSize = Buffer.byteLength(jsonContent, 'utf-8');
|
|
38
|
-
const sizeRatio = (jsonSize / matrixSize).toFixed(2);
|
|
39
|
-
|
|
40
|
-
console.log(chalk.bold.cyan('\nš¢ Token Analysis\n'));
|
|
41
|
-
console.log(chalk.gray(`File: ${filePath}\n`));
|
|
42
|
-
|
|
43
|
-
// Token counts
|
|
44
|
-
console.log(chalk.bold('Token Counts:'));
|
|
45
|
-
console.log(` .matrix format: ${chalk.green(matrixTokens.toLocaleString())} tokens`);
|
|
46
|
-
console.log(` JSON format: ${chalk.yellow(jsonTokens.toLocaleString())} tokens`);
|
|
47
|
-
console.log(` Compression: ${chalk.cyan(compressionRatio)}:1`);
|
|
48
|
-
console.log();
|
|
49
|
-
|
|
50
|
-
// File sizes
|
|
51
|
-
console.log(chalk.bold('File Sizes:'));
|
|
52
|
-
console.log(` .matrix format: ${chalk.green(formatBytes(matrixSize))}`);
|
|
53
|
-
console.log(` JSON format: ${chalk.yellow(formatBytes(jsonSize))}`);
|
|
54
|
-
console.log(` Size ratio: ${chalk.cyan(sizeRatio)}:1`);
|
|
55
|
-
console.log();
|
|
56
|
-
|
|
57
|
-
// Efficiency analysis
|
|
58
|
-
console.log(chalk.bold('Efficiency:'));
|
|
59
|
-
const tokenSavings = jsonTokens - matrixTokens;
|
|
60
|
-
const tokenSavingsPercent = ((tokenSavings / jsonTokens) * 100).toFixed(1);
|
|
61
|
-
console.log(` Token savings: ${chalk.green(`-${tokenSavings.toLocaleString()}`)} (${tokenSavingsPercent}%)`);
|
|
62
|
-
|
|
63
|
-
const sizeSavings = jsonSize - matrixSize;
|
|
64
|
-
const sizeSavingsPercent = ((sizeSavings / jsonSize) * 100).toFixed(1);
|
|
65
|
-
console.log(` Size savings: ${chalk.green(`-${formatBytes(sizeSavings)}`)} (${sizeSavingsPercent}%)`);
|
|
66
|
-
console.log();
|
|
67
|
-
|
|
68
|
-
// Verbose mode: Show rule breakdown
|
|
69
|
-
if (options.verbose) {
|
|
70
|
-
console.log(chalk.bold('Rule Breakdown:'));
|
|
71
|
-
console.log(` Total rules: ${chalk.cyan(matrixFile.rules.length)}`);
|
|
72
|
-
console.log(` Avg tokens/rule: ${chalk.cyan(Math.round(matrixTokens / matrixFile.rules.length))}`);
|
|
73
|
-
console.log();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Compression assessment
|
|
77
|
-
const compressionQuality = parseFloat(compressionRatio);
|
|
78
|
-
let assessment = '';
|
|
79
|
-
let assessmentColor = chalk.green;
|
|
80
|
-
|
|
81
|
-
if (compressionQuality >= 5) {
|
|
82
|
-
assessment = 'Excellent compression! (ā„5:1 target met)';
|
|
83
|
-
assessmentColor = chalk.green.bold;
|
|
84
|
-
} else if (compressionQuality >= 3) {
|
|
85
|
-
assessment = 'Good compression (3-5:1)';
|
|
86
|
-
assessmentColor = chalk.yellow;
|
|
87
|
-
} else if (compressionQuality >= 2) {
|
|
88
|
-
assessment = 'Moderate compression (2-3:1)';
|
|
89
|
-
assessmentColor = chalk.yellow;
|
|
90
|
-
} else {
|
|
91
|
-
assessment = 'Low compression (<2:1)';
|
|
92
|
-
assessmentColor = chalk.red;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
console.log(assessmentColor(`ā ${assessment}`));
|
|
96
|
-
console.log();
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Estimate token count using simple heuristics
|
|
101
|
-
* (Approximates GPT tokenization without needing tiktoken dependency)
|
|
102
|
-
*/
|
|
103
|
-
function estimateTokenCount(text: string): number {
|
|
104
|
-
// Simple estimation: ~4 characters per token for English text
|
|
105
|
-
// This is a rough approximation; actual tokenization varies
|
|
106
|
-
// For more accuracy, use tiktoken library
|
|
107
|
-
|
|
108
|
-
// Remove whitespace for better estimation
|
|
109
|
-
const trimmedText = text.replace(/\s+/g, ' ').trim();
|
|
110
|
-
|
|
111
|
-
// Count words and punctuation as separate tokens
|
|
112
|
-
const words = trimmedText.split(/\s+/).length;
|
|
113
|
-
const punctuation = (trimmedText.match(/[.,;:!?()[\]{}'"]/g) || []).length;
|
|
114
|
-
|
|
115
|
-
// Estimate: words + punctuation + special chars
|
|
116
|
-
return Math.ceil((words + punctuation) * 1.3);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Format bytes to human-readable string
|
|
121
|
-
*/
|
|
122
|
-
function formatBytes(bytes: number): string {
|
|
123
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
124
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
|
|
125
|
-
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
126
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* tokens command - Calculate token count and compression ratio
|
|
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
|
+
|
|
11
|
+
interface TokensOptions {
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function tokensCommand(
|
|
16
|
+
file: string,
|
|
17
|
+
options: TokensOptions = {}
|
|
18
|
+
): Promise<void> {
|
|
19
|
+
const filePath = resolveFilePath(file);
|
|
20
|
+
|
|
21
|
+
// Read original .matrix content
|
|
22
|
+
const matrixContent = fs.readFileSync(filePath, 'utf-8');
|
|
23
|
+
|
|
24
|
+
// Parse and convert to JSON
|
|
25
|
+
const matrixFile = parseMatrixFile(filePath);
|
|
26
|
+
const jsonContent = JSON.stringify(matrixFile, null, 2);
|
|
27
|
+
|
|
28
|
+
// Calculate token counts (using simple estimation)
|
|
29
|
+
const matrixTokens = estimateTokenCount(matrixContent);
|
|
30
|
+
const jsonTokens = estimateTokenCount(jsonContent);
|
|
31
|
+
|
|
32
|
+
// Calculate compression ratio
|
|
33
|
+
const compressionRatio = (jsonTokens / matrixTokens).toFixed(2);
|
|
34
|
+
|
|
35
|
+
// Calculate sizes
|
|
36
|
+
const matrixSize = Buffer.byteLength(matrixContent, 'utf-8');
|
|
37
|
+
const jsonSize = Buffer.byteLength(jsonContent, 'utf-8');
|
|
38
|
+
const sizeRatio = (jsonSize / matrixSize).toFixed(2);
|
|
39
|
+
|
|
40
|
+
console.log(chalk.bold.cyan('\nš¢ Token Analysis\n'));
|
|
41
|
+
console.log(chalk.gray(`File: ${filePath}\n`));
|
|
42
|
+
|
|
43
|
+
// Token counts
|
|
44
|
+
console.log(chalk.bold('Token Counts:'));
|
|
45
|
+
console.log(` .matrix format: ${chalk.green(matrixTokens.toLocaleString())} tokens`);
|
|
46
|
+
console.log(` JSON format: ${chalk.yellow(jsonTokens.toLocaleString())} tokens`);
|
|
47
|
+
console.log(` Compression: ${chalk.cyan(compressionRatio)}:1`);
|
|
48
|
+
console.log();
|
|
49
|
+
|
|
50
|
+
// File sizes
|
|
51
|
+
console.log(chalk.bold('File Sizes:'));
|
|
52
|
+
console.log(` .matrix format: ${chalk.green(formatBytes(matrixSize))}`);
|
|
53
|
+
console.log(` JSON format: ${chalk.yellow(formatBytes(jsonSize))}`);
|
|
54
|
+
console.log(` Size ratio: ${chalk.cyan(sizeRatio)}:1`);
|
|
55
|
+
console.log();
|
|
56
|
+
|
|
57
|
+
// Efficiency analysis
|
|
58
|
+
console.log(chalk.bold('Efficiency:'));
|
|
59
|
+
const tokenSavings = jsonTokens - matrixTokens;
|
|
60
|
+
const tokenSavingsPercent = ((tokenSavings / jsonTokens) * 100).toFixed(1);
|
|
61
|
+
console.log(` Token savings: ${chalk.green(`-${tokenSavings.toLocaleString()}`)} (${tokenSavingsPercent}%)`);
|
|
62
|
+
|
|
63
|
+
const sizeSavings = jsonSize - matrixSize;
|
|
64
|
+
const sizeSavingsPercent = ((sizeSavings / jsonSize) * 100).toFixed(1);
|
|
65
|
+
console.log(` Size savings: ${chalk.green(`-${formatBytes(sizeSavings)}`)} (${sizeSavingsPercent}%)`);
|
|
66
|
+
console.log();
|
|
67
|
+
|
|
68
|
+
// Verbose mode: Show rule breakdown
|
|
69
|
+
if (options.verbose) {
|
|
70
|
+
console.log(chalk.bold('Rule Breakdown:'));
|
|
71
|
+
console.log(` Total rules: ${chalk.cyan(matrixFile.rules.length)}`);
|
|
72
|
+
console.log(` Avg tokens/rule: ${chalk.cyan(Math.round(matrixTokens / matrixFile.rules.length))}`);
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Compression assessment
|
|
77
|
+
const compressionQuality = parseFloat(compressionRatio);
|
|
78
|
+
let assessment = '';
|
|
79
|
+
let assessmentColor = chalk.green;
|
|
80
|
+
|
|
81
|
+
if (compressionQuality >= 5) {
|
|
82
|
+
assessment = 'Excellent compression! (ā„5:1 target met)';
|
|
83
|
+
assessmentColor = chalk.green.bold;
|
|
84
|
+
} else if (compressionQuality >= 3) {
|
|
85
|
+
assessment = 'Good compression (3-5:1)';
|
|
86
|
+
assessmentColor = chalk.yellow;
|
|
87
|
+
} else if (compressionQuality >= 2) {
|
|
88
|
+
assessment = 'Moderate compression (2-3:1)';
|
|
89
|
+
assessmentColor = chalk.yellow;
|
|
90
|
+
} else {
|
|
91
|
+
assessment = 'Low compression (<2:1)';
|
|
92
|
+
assessmentColor = chalk.red;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
console.log(assessmentColor(`ā ${assessment}`));
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Estimate token count using simple heuristics
|
|
101
|
+
* (Approximates GPT tokenization without needing tiktoken dependency)
|
|
102
|
+
*/
|
|
103
|
+
function estimateTokenCount(text: string): number {
|
|
104
|
+
// Simple estimation: ~4 characters per token for English text
|
|
105
|
+
// This is a rough approximation; actual tokenization varies
|
|
106
|
+
// For more accuracy, use tiktoken library
|
|
107
|
+
|
|
108
|
+
// Remove whitespace for better estimation
|
|
109
|
+
const trimmedText = text.replace(/\s+/g, ' ').trim();
|
|
110
|
+
|
|
111
|
+
// Count words and punctuation as separate tokens
|
|
112
|
+
const words = trimmedText.split(/\s+/).length;
|
|
113
|
+
const punctuation = (trimmedText.match(/[.,;:!?()[\]{}'"]/g) || []).length;
|
|
114
|
+
|
|
115
|
+
// Estimate: words + punctuation + special chars
|
|
116
|
+
return Math.ceil((words + punctuation) * 1.3);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Format bytes to human-readable string
|
|
121
|
+
*/
|
|
122
|
+
function formatBytes(bytes: number): string {
|
|
123
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
124
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
|
|
125
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
126
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|