kenaz 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +14 -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/spec/task_operations.parity.test.js +0 -1
- package/core/.formation/tests/hello.txt +2 -2
- 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 +28 -549
- 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 +29 -1623
- package/core/.formation/tools/prompt.test.js +26 -594
- 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/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
- 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/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/plugins/kenaz/commands/Amelia.md +1 -1
- package/core/plugins/kenaz/commands/Ansuz.md +15 -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/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
|
|
@@ -2,4 +2,4 @@ Execute `node "${CLAUDE_PLUGIN_ROOT}/hooks/core-resolve.js" .specialist/tools/se
|
|
|
2
2
|
|
|
3
3
|
IMPORTANT: Run this command **foreground** (not background) with timeout=120000. Do NOT use background mode + sleep polling — session.js completes in <5s under normal conditions.
|
|
4
4
|
|
|
5
|
-
Fallback (if session.js fails): Read
|
|
5
|
+
Fallback (if session.js fails): Read `${CLAUDE_PLUGIN_ROOT}/../../.specialist/Amelia/rule.yaml`, load files listed in `files:` by `override_priority` order.
|
|
@@ -12,16 +12,28 @@ ARGUMENTS 含 `[專案: X]` 或 `--project-path X` → PROJECT_PATH = X,下方
|
|
|
12
12
|
|
|
13
13
|
## 每件工作的做法
|
|
14
14
|
- **自己做**:小而明確的修正(約 30 行內、單一檔案或少數檔案)→ 直接改,跑最近的測試,提交。
|
|
15
|
-
-
|
|
15
|
+
- **開卡派工**:中型、可平行、或高風險路徑的工作:
|
|
16
|
+
1. 用 `kenaz_task_create` 開卡(`projectPath` = 目前專案;寫清楚 requirements、acceptance criteria、scope paths)。查卡、改狀態用 `kenaz_task_list` / `kenaz_task_get` / `kenaz_task_update`。
|
|
17
|
+
2. 產生派工內容:`node "${CLAUDE_PLUGIN_ROOT}/hooks/core-resolve.js" .formation/tools/dispatch.js --skill=do --task=TASK_XXX --dispatch-mode=subagent`(加 `--project-path`;Codex 加 `--harness=codex`)。把輸出 JSON 的 `promptText` 交給 subagent,`agentParams` 照用(模型不要自己換)。
|
|
18
|
+
3. subagent 在 worktree 裡改完並 commit;你驗證後合併。
|
|
16
19
|
- 開卡前先確認 scope 與驗收條件對準真正的問題,不要照著錯的假設派工。
|
|
17
20
|
|
|
18
21
|
## 驗證(合併前一定做,強度跟風險相稱)
|
|
19
22
|
- 走**真實路徑**:實際執行會被使用者用到的那條路(真的安裝、真的啟動、真的收發訊息),不只看單元測試。
|
|
20
23
|
- 有**對照組**:證明測試在舊程式上會失敗,或修改前後結果不同。
|
|
21
24
|
- subagent 回報「未驗證」的項目,由你補驗或明講仍未驗證。
|
|
22
|
-
-
|
|
25
|
+
- 合併:`git merge` 後跑相關測試(或 `node "${CLAUDE_PLUGIN_ROOT}/hooks/core-resolve.js" .specialist/Ansuz/tools/verify-and-land.js`),用這個專案自己的測試指令。
|
|
26
|
+
- 只在 Kenaz 核心 repo 本身:Rust 測試走 `npm run test:rust` / `dev/scripts/rust-verify-worktree.js`。
|
|
23
27
|
|
|
24
28
|
## 回報
|
|
25
29
|
用用戶的語言。說清楚:做了什麼、怎麼驗證的、還有什麼沒驗證或需要用戶決定。不說「應該可以」。
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
## Kenaz 本身出問題時:先回報再繞過(wish / field report)
|
|
32
|
+
Kenaz 的工具、hook、安裝、peer 訊息、派工擋住或拖慢工作時(指令失敗、回傳錯的資料、少了能力、行為不如預期),**繞過之前**先呼叫 `kenaz_wish_create`。scope=kenaz 的 wish 會自動送到 Kenaz 團隊成為 field report。
|
|
33
|
+
- `projectPath`:目前專案路徑;`scope`:`kenaz`(Kenaz 本身的問題)或 `project`(只跟這個專案有關)
|
|
34
|
+
- `wish_type`:`bug`(壞了)/`feature`(缺能力,內容寫:需求、現在哪裡不夠、建議做法、還有誰受益)/`question`
|
|
35
|
+
- `content`:一行重現步驟 + 預期 vs 實際 + 版本(`npx kenaz doctor` 那幾行);附上 session id。不要貼金鑰或 token。
|
|
36
|
+
- 一個問題只報一次;報完照常用替代做法把工作完成,並在回報裡告訴用戶已送出 wish。
|
|
37
|
+
- 用戶直接說「回報這個問題」時也用同一個工具(`source`=`user`)。
|
|
38
|
+
|
|
39
|
+
需要更多規則時(用戶授權自主、派工前、合併前)讀 `${CLAUDE_PLUGIN_ROOT}/../../.specialist/Ansuz/RULES.md`。
|