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,106 +1,106 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
UI/UX Pro Max Search - BM25 search engine for UI/UX style guides
|
|
5
|
-
Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]
|
|
6
|
-
python search.py "<query>" --design-system [-p "Project Name"]
|
|
7
|
-
python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]
|
|
8
|
-
|
|
9
|
-
Domains: style, prompt, color, chart, landing, product, ux, typography
|
|
10
|
-
Stacks: html-tailwind, react, nextjs
|
|
11
|
-
|
|
12
|
-
Persistence (Master + Overrides pattern):
|
|
13
|
-
--persist Save design system to design-system/MASTER.md
|
|
14
|
-
--page Also create a page-specific override file in design-system/pages/
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
import argparse
|
|
18
|
-
from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack
|
|
19
|
-
from design_system import generate_design_system, persist_design_system
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def format_output(result):
|
|
23
|
-
"""Format results for Claude consumption (token-optimized)"""
|
|
24
|
-
if "error" in result:
|
|
25
|
-
return f"Error: {result['error']}"
|
|
26
|
-
|
|
27
|
-
output = []
|
|
28
|
-
if result.get("stack"):
|
|
29
|
-
output.append(f"## UI Pro Max Stack Guidelines")
|
|
30
|
-
output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
|
|
31
|
-
else:
|
|
32
|
-
output.append(f"## UI Pro Max Search Results")
|
|
33
|
-
output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
|
|
34
|
-
output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
|
|
35
|
-
|
|
36
|
-
for i, row in enumerate(result['results'], 1):
|
|
37
|
-
output.append(f"### Result {i}")
|
|
38
|
-
for key, value in row.items():
|
|
39
|
-
value_str = str(value)
|
|
40
|
-
if len(value_str) > 300:
|
|
41
|
-
value_str = value_str[:300] + "..."
|
|
42
|
-
output.append(f"- **{key}:** {value_str}")
|
|
43
|
-
output.append("")
|
|
44
|
-
|
|
45
|
-
return "\n".join(output)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if __name__ == "__main__":
|
|
49
|
-
parser = argparse.ArgumentParser(description="UI Pro Max Search")
|
|
50
|
-
parser.add_argument("query", help="Search query")
|
|
51
|
-
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
|
52
|
-
parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
|
|
53
|
-
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
|
54
|
-
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
55
|
-
# Design system generation
|
|
56
|
-
parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")
|
|
57
|
-
parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")
|
|
58
|
-
parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")
|
|
59
|
-
# Persistence (Master + Overrides pattern)
|
|
60
|
-
parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")
|
|
61
|
-
parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")
|
|
62
|
-
parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")
|
|
63
|
-
|
|
64
|
-
args = parser.parse_args()
|
|
65
|
-
|
|
66
|
-
# Design system takes priority
|
|
67
|
-
if args.design_system:
|
|
68
|
-
result = generate_design_system(
|
|
69
|
-
args.query,
|
|
70
|
-
args.project_name,
|
|
71
|
-
args.format,
|
|
72
|
-
persist=args.persist,
|
|
73
|
-
page=args.page,
|
|
74
|
-
output_dir=args.output_dir
|
|
75
|
-
)
|
|
76
|
-
print(result)
|
|
77
|
-
|
|
78
|
-
# Print persistence confirmation
|
|
79
|
-
if args.persist:
|
|
80
|
-
project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"
|
|
81
|
-
print("\n" + "=" * 60)
|
|
82
|
-
print(f"✅ Design system persisted to design-system/{project_slug}/")
|
|
83
|
-
print(f" 📄 design-system/{project_slug}/MASTER.md (Global Source of Truth)")
|
|
84
|
-
if args.page:
|
|
85
|
-
page_filename = args.page.lower().replace(' ', '-')
|
|
86
|
-
print(f" 📄 design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")
|
|
87
|
-
print("")
|
|
88
|
-
print(f"📖 Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")
|
|
89
|
-
print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")
|
|
90
|
-
print("=" * 60)
|
|
91
|
-
# Stack search
|
|
92
|
-
elif args.stack:
|
|
93
|
-
result = search_stack(args.query, args.stack, args.max_results)
|
|
94
|
-
if args.json:
|
|
95
|
-
import json
|
|
96
|
-
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
97
|
-
else:
|
|
98
|
-
print(format_output(result))
|
|
99
|
-
# Domain search
|
|
100
|
-
else:
|
|
101
|
-
result = search(args.query, args.domain, args.max_results)
|
|
102
|
-
if args.json:
|
|
103
|
-
import json
|
|
104
|
-
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
105
|
-
else:
|
|
106
|
-
print(format_output(result))
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
UI/UX Pro Max Search - BM25 search engine for UI/UX style guides
|
|
5
|
+
Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]
|
|
6
|
+
python search.py "<query>" --design-system [-p "Project Name"]
|
|
7
|
+
python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]
|
|
8
|
+
|
|
9
|
+
Domains: style, prompt, color, chart, landing, product, ux, typography
|
|
10
|
+
Stacks: html-tailwind, react, nextjs
|
|
11
|
+
|
|
12
|
+
Persistence (Master + Overrides pattern):
|
|
13
|
+
--persist Save design system to design-system/MASTER.md
|
|
14
|
+
--page Also create a page-specific override file in design-system/pages/
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack
|
|
19
|
+
from design_system import generate_design_system, persist_design_system
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def format_output(result):
|
|
23
|
+
"""Format results for Claude consumption (token-optimized)"""
|
|
24
|
+
if "error" in result:
|
|
25
|
+
return f"Error: {result['error']}"
|
|
26
|
+
|
|
27
|
+
output = []
|
|
28
|
+
if result.get("stack"):
|
|
29
|
+
output.append(f"## UI Pro Max Stack Guidelines")
|
|
30
|
+
output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
|
|
31
|
+
else:
|
|
32
|
+
output.append(f"## UI Pro Max Search Results")
|
|
33
|
+
output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
|
|
34
|
+
output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
|
|
35
|
+
|
|
36
|
+
for i, row in enumerate(result['results'], 1):
|
|
37
|
+
output.append(f"### Result {i}")
|
|
38
|
+
for key, value in row.items():
|
|
39
|
+
value_str = str(value)
|
|
40
|
+
if len(value_str) > 300:
|
|
41
|
+
value_str = value_str[:300] + "..."
|
|
42
|
+
output.append(f"- **{key}:** {value_str}")
|
|
43
|
+
output.append("")
|
|
44
|
+
|
|
45
|
+
return "\n".join(output)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if __name__ == "__main__":
|
|
49
|
+
parser = argparse.ArgumentParser(description="UI Pro Max Search")
|
|
50
|
+
parser.add_argument("query", help="Search query")
|
|
51
|
+
parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
|
|
52
|
+
parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
|
|
53
|
+
parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
|
|
54
|
+
parser.add_argument("--json", action="store_true", help="Output as JSON")
|
|
55
|
+
# Design system generation
|
|
56
|
+
parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")
|
|
57
|
+
parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")
|
|
58
|
+
parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")
|
|
59
|
+
# Persistence (Master + Overrides pattern)
|
|
60
|
+
parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")
|
|
61
|
+
parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")
|
|
62
|
+
parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")
|
|
63
|
+
|
|
64
|
+
args = parser.parse_args()
|
|
65
|
+
|
|
66
|
+
# Design system takes priority
|
|
67
|
+
if args.design_system:
|
|
68
|
+
result = generate_design_system(
|
|
69
|
+
args.query,
|
|
70
|
+
args.project_name,
|
|
71
|
+
args.format,
|
|
72
|
+
persist=args.persist,
|
|
73
|
+
page=args.page,
|
|
74
|
+
output_dir=args.output_dir
|
|
75
|
+
)
|
|
76
|
+
print(result)
|
|
77
|
+
|
|
78
|
+
# Print persistence confirmation
|
|
79
|
+
if args.persist:
|
|
80
|
+
project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"
|
|
81
|
+
print("\n" + "=" * 60)
|
|
82
|
+
print(f"✅ Design system persisted to design-system/{project_slug}/")
|
|
83
|
+
print(f" 📄 design-system/{project_slug}/MASTER.md (Global Source of Truth)")
|
|
84
|
+
if args.page:
|
|
85
|
+
page_filename = args.page.lower().replace(' ', '-')
|
|
86
|
+
print(f" 📄 design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")
|
|
87
|
+
print("")
|
|
88
|
+
print(f"📖 Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")
|
|
89
|
+
print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")
|
|
90
|
+
print("=" * 60)
|
|
91
|
+
# Stack search
|
|
92
|
+
elif args.stack:
|
|
93
|
+
result = search_stack(args.query, args.stack, args.max_results)
|
|
94
|
+
if args.json:
|
|
95
|
+
import json
|
|
96
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
97
|
+
else:
|
|
98
|
+
print(format_output(result))
|
|
99
|
+
# Domain search
|
|
100
|
+
else:
|
|
101
|
+
result = search(args.query, args.domain, args.max_results)
|
|
102
|
+
if args.json:
|
|
103
|
+
import json
|
|
104
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
105
|
+
else:
|
|
106
|
+
print(format_output(result))
|
package/lib/cli.js
CHANGED
|
@@ -55,7 +55,10 @@ function platformServer() {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function onPath(cmd) {
|
|
58
|
-
|
|
58
|
+
const r = process.platform === 'win32' // one string with shell (.cmd shims); args + shell:true is deprecated (DEP0190)
|
|
59
|
+
? spawnSync(cmd + ' --version', { encoding: 'utf8', shell: true, timeout: 15000 })
|
|
60
|
+
: spawnSync(cmd, ['--version'], { encoding: 'utf8', timeout: 15000 });
|
|
61
|
+
return r.status === 0;
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
/** setup-codex.js from the installed core (dry-run and doctor-before-install: from the package). */
|
|
@@ -197,9 +200,9 @@ function status(p, flags, out) {
|
|
|
197
200
|
return 0;
|
|
198
201
|
}
|
|
199
202
|
|
|
200
|
-
function probe(port) {
|
|
203
|
+
function probe(port, urlPath = '/api/health') {
|
|
201
204
|
return new Promise((resolve) => {
|
|
202
|
-
const req = http.get({ host: '127.0.0.1', port, path:
|
|
205
|
+
const req = http.get({ host: '127.0.0.1', port, path: urlPath, timeout: 2500 }, (res) => {
|
|
203
206
|
let body = ''; res.on('data', (d) => { body += d; }); res.on('end', () => resolve({ ok: res.statusCode < 500, detail: `HTTP ${res.statusCode} on :${port}`, body }));
|
|
204
207
|
});
|
|
205
208
|
req.on('timeout', () => { req.destroy(); resolve({ ok: false, detail: `no answer on 127.0.0.1:${port}` }); });
|
|
@@ -229,7 +232,11 @@ async function doctor(p, flags, out, deps = {}) {
|
|
|
229
232
|
const o = d.portOwner;
|
|
230
233
|
add(`port ${d.port} owner`, o && d.ownerIsDashboard ? 'FAIL' : 'ok', o ? `PID ${o.pid} ${o.exe || o.name}${d.ownerIsDashboard ? ' (Dashboard)' : ''}` : 'nobody listening');
|
|
231
234
|
}
|
|
232
|
-
|
|
235
|
+
// Ask the running server first: its answer carries its own version. The status file can still
|
|
236
|
+
// describe the previous binary right after an upgrade (field report: "[running 0.3.1]" on 0.3.3).
|
|
237
|
+
let upd = null;
|
|
238
|
+
if (r.ok) { const u = await probe(process.env.KENAZ_HTTP_PORT || '18080', '/api/update/status'); try { upd = JSON.parse(u.body); } catch (_) { /* older server */ } }
|
|
239
|
+
if (!upd || !upd.state) upd = readJson(path.join(p.dir, 'update', 'status.json')); // TASK_2378, written by kenaz-server
|
|
233
240
|
if (!upd) add('self-update', 'skip', 'no status yet (kenaz-server has not run the updater)');
|
|
234
241
|
else {
|
|
235
242
|
const d = { disabled: `off: ${upd.reason}`, error: `last check failed: ${upd.last_error}`, staged: `${upd.staged_version} staged, applies when idle`,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kenaz",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Install Kenaz (plugin, hooks, kenaz-server) for Claude Code and Codex: npx kenaz install",
|
|
5
5
|
"bin": {
|
|
6
6
|
"kenaz": "bin/kenaz.js"
|
|
@@ -20,11 +20,15 @@
|
|
|
20
20
|
"test": "node --test lib/cli.test.js"
|
|
21
21
|
},
|
|
22
22
|
"optionalDependencies": {
|
|
23
|
-
"@kenazai/server-
|
|
24
|
-
"@kenazai/server-darwin-
|
|
25
|
-
"@kenazai/server-
|
|
26
|
-
"@kenazai/server-linux-x64": "0.3.
|
|
27
|
-
"@kenazai/server-
|
|
23
|
+
"@kenazai/server-darwin-arm64": "0.3.5",
|
|
24
|
+
"@kenazai/server-darwin-x64": "0.3.5",
|
|
25
|
+
"@kenazai/server-linux-arm64": "0.3.5",
|
|
26
|
+
"@kenazai/server-linux-x64": "0.3.5",
|
|
27
|
+
"@kenazai/server-win32-x64": "0.3.5"
|
|
28
28
|
},
|
|
29
|
-
"license": "UNLICENSED"
|
|
29
|
+
"license": "UNLICENSED",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/xyz9516/KenazAI.git"
|
|
33
|
+
}
|
|
30
34
|
}
|
|
@@ -111,7 +111,9 @@ function retireDashboardHooks(file, dry) {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
function claudeVersion() {
|
|
114
|
-
const r =
|
|
114
|
+
const r = process.platform === 'win32' // one string with shell (.cmd shim): args + shell:true is deprecated (DEP0190)
|
|
115
|
+
? spawnSync('claude --version', { encoding: 'utf8', shell: true, timeout: 15000 })
|
|
116
|
+
: spawnSync('claude', ['--version'], { encoding: 'utf8', timeout: 15000 });
|
|
115
117
|
return r.status === 0 ? parseVersion(r.stdout) : null;
|
|
116
118
|
}
|
|
117
119
|
|
|
@@ -125,14 +127,21 @@ function winVbs(bin, core) { // hidden window, env for task tools; server binds
|
|
|
125
127
|
return 'Set sh = WScript.CreateObject("WScript.Shell")\r\nsh.Environment("Process")("KENAZ_SOURCE_DIR") = "' + core + '"\r\n' +
|
|
126
128
|
'sh.Run """' + bin + '""", 0, False\r\n';
|
|
127
129
|
}
|
|
128
|
-
|
|
130
|
+
// launchd and systemd start the server with a bare PATH (/usr/bin:/bin...), so `node` from Homebrew,
|
|
131
|
+
// nvm or /usr/local was not found and every MCP tool that runs a node script failed with
|
|
132
|
+
// "No such file or directory" (field report, macOS 0.3.1). Put the node running this install first.
|
|
133
|
+
function servicePath(nodeExe = process.execPath) {
|
|
134
|
+
return [path.dirname(nodeExe), '/opt/homebrew/bin', '/usr/local/bin', '/usr/bin', '/bin', '/usr/sbin', '/sbin']
|
|
135
|
+
.filter((d, i, a) => a.indexOf(d) === i).join(':');
|
|
136
|
+
}
|
|
137
|
+
function launchdPlist(bin, core, log, nodeExe) {
|
|
129
138
|
return '<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0"><dict>\n' +
|
|
130
139
|
' <key>Label</key><string>' + LABEL + '</string>\n <key>ProgramArguments</key><array><string>' + bin + '</string></array>\n' +
|
|
131
|
-
' <key>EnvironmentVariables</key><dict><key>KENAZ_SOURCE_DIR</key><string>' + core + '</string></dict>\n' +
|
|
140
|
+
' <key>EnvironmentVariables</key><dict><key>KENAZ_SOURCE_DIR</key><string>' + core + '</string><key>PATH</key><string>' + servicePath(nodeExe) + '</string></dict>\n' +
|
|
132
141
|
' <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><true/>\n <key>StandardOutPath</key><string>' + log + '</string>\n <key>StandardErrorPath</key><string>' + log + '</string>\n</dict></plist>\n';
|
|
133
142
|
}
|
|
134
|
-
function systemdUnit(bin, core) {
|
|
135
|
-
return '[Unit]\nDescription=Kenaz server (headless backend)\nAfter=network.target\n\n[Service]\nExecStart=' + bin + '\nEnvironment=KENAZ_SOURCE_DIR=' + core + '\nRestart=on-failure\n\n[Install]\nWantedBy=default.target\n';
|
|
143
|
+
function systemdUnit(bin, core, nodeExe) {
|
|
144
|
+
return '[Unit]\nDescription=Kenaz server (headless backend)\nAfter=network.target\n\n[Service]\nExecStart=' + bin + '\nEnvironment=KENAZ_SOURCE_DIR=' + core + '\nEnvironment=PATH=' + servicePath(nodeExe) + '\nRestart=on-failure\n\n[Install]\nWantedBy=default.target\n';
|
|
136
145
|
}
|
|
137
146
|
|
|
138
147
|
function servicePlan(home, bin, core, platform = process.platform) {
|
|
@@ -163,7 +172,9 @@ function serviceInstall(plan, dry, log) {
|
|
|
163
172
|
fs.mkdirSync(path.dirname(plan.fallbackFile), { recursive: true });
|
|
164
173
|
fs.copyFileSync(plan.files[0][0], plan.fallbackFile);
|
|
165
174
|
sh('wscript.exe', [plan.files[0][0]]);
|
|
166
|
-
|
|
175
|
+
// schtasks' stderr is in the console's OEM code page (garbled when echoed); the usual cause is
|
|
176
|
+
// missing admin rights for /SC ONLOGON. The Startup-folder launcher starts at logon the same way.
|
|
177
|
+
log('schtasks needs administrator rights here (exit ' + r.status + '); installed the Startup-folder launcher instead (also starts at logon)');
|
|
167
178
|
}
|
|
168
179
|
} else if (plan.kind === 'launchd') {
|
|
169
180
|
log('launchctl load -w ' + plan.unit); if (!dry) sh('launchctl', ['load', '-w', plan.unit]);
|
|
@@ -259,7 +270,7 @@ function main(argv, out = console.log, getVersion = claudeVersion) { // getVersi
|
|
|
259
270
|
else if (!bin) { out('service: skipped, kenaz-server binary not found (pass --server-bin)'); rc = 1; }
|
|
260
271
|
else serviceInstall(plan, dry, log);
|
|
261
272
|
}
|
|
262
|
-
if (cmd === 'install' && rc === 0) out('Next: cd <your project>; claude; /kenaz init; /Ansuz');
|
|
273
|
+
if (cmd === 'install' && rc === 0) out('Next: cd <your project>; claude; /kenaz:kenaz init; /kenaz:Ansuz (Codex: run /hooks once to trust the kenaz hooks, then $kenaz status)');
|
|
263
274
|
if (cmd === 'uninstall') out('Project .kenaz/ data was left untouched.');
|
|
264
275
|
return rc;
|
|
265
276
|
}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
/**
|
|
3
|
-
* Broadcast Layer
|
|
4
|
-
*
|
|
5
|
-
* Supabase/Yggdrasil broadcast helpers extracted from headless.js.
|
|
6
|
-
* Lazy-loaded singletons — no hard dependency on supabase-client at require time.
|
|
7
|
-
*
|
|
8
|
-
* Exports: getSupabaseClient, getTaskSync, getCommitSync, syncCommit,
|
|
9
|
-
* broadcastStatus, broadcastStatusSync
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const path = require('path');
|
|
13
|
-
const { ROOT } = require('./utils');
|
|
14
|
-
|
|
15
|
-
// ─────────────────────────────────────────
|
|
16
|
-
// Yggdrasil: kenaz_status 廣播 + commit-sync(lazy loaded, graceful degradation)
|
|
17
|
-
// ─────────────────────────────────────────
|
|
18
|
-
let _supabaseClient = null;
|
|
19
|
-
let _taskSync = null;
|
|
20
|
-
let _commitSync = null;
|
|
21
|
-
|
|
22
|
-
function getSupabaseClient(projectPath) {
|
|
23
|
-
if (_supabaseClient === undefined) return null;
|
|
24
|
-
if (!_supabaseClient) try { _supabaseClient = require('./supabase-client'); } catch { _supabaseClient = undefined; return null; }
|
|
25
|
-
return _supabaseClient.getClient(projectPath);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function getTaskSync() {
|
|
29
|
-
if (_taskSync === undefined) return null;
|
|
30
|
-
if (!_taskSync) try { _taskSync = require('./task-sync'); } catch { _taskSync = undefined; return null; }
|
|
31
|
-
return _taskSync;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function getCommitSync() {
|
|
35
|
-
if (_commitSync === undefined) return null;
|
|
36
|
-
if (!_commitSync) try { _commitSync = require('./commit-sync'); } catch { _commitSync = undefined; return null; }
|
|
37
|
-
return _commitSync;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* 同步 commit 到 kenaz_commits。
|
|
42
|
-
* 回傳 Promise(await 時確保完成,或 fire-and-forget)。
|
|
43
|
-
*/
|
|
44
|
-
function syncCommit(taskId, projectPath) {
|
|
45
|
-
try {
|
|
46
|
-
const cs = getCommitSync();
|
|
47
|
-
if (!cs) return Promise.resolve();
|
|
48
|
-
return cs.syncLatestCommit({ taskId, projectPath }).catch(() => {});
|
|
49
|
-
} catch { return Promise.resolve(); }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* 廣播 kenaz_status — 讓 Agent Monitor 和其他機器看到 dispatch agent。
|
|
54
|
-
* 回傳 Promise — caller 可 await 確保完成。
|
|
55
|
-
*/
|
|
56
|
-
function broadcastStatus(projectPath, updates) {
|
|
57
|
-
try {
|
|
58
|
-
const sb = getSupabaseClient(projectPath);
|
|
59
|
-
if (!sb) return Promise.resolve();
|
|
60
|
-
const { client, config } = sb;
|
|
61
|
-
const ts = getTaskSync();
|
|
62
|
-
const project = ts?.resolveProjectName?.(projectPath || ROOT) || path.basename(ROOT);
|
|
63
|
-
return client.from('kenaz_status').upsert({
|
|
64
|
-
node_name: config.node_name,
|
|
65
|
-
project,
|
|
66
|
-
...updates,
|
|
67
|
-
}, { onConflict: 'node_name,project' }).then(() => {}).catch(() => {});
|
|
68
|
-
} catch { return Promise.resolve(); }
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 同步版 broadcastStatus — 用於 process exit 前確保送達。
|
|
73
|
-
* 使用 synchronous HTTP(spawnSync + curl)避免 async 在退出時丟失。
|
|
74
|
-
*/
|
|
75
|
-
function broadcastStatusSync(projectPath, updates) {
|
|
76
|
-
try {
|
|
77
|
-
const sb = getSupabaseClient(projectPath);
|
|
78
|
-
if (!sb) return;
|
|
79
|
-
const { config } = sb;
|
|
80
|
-
const ts = getTaskSync();
|
|
81
|
-
const project = ts?.resolveProjectName?.(projectPath || ROOT) || path.basename(ROOT);
|
|
82
|
-
const payload = { node_name: config.node_name, project, ...updates };
|
|
83
|
-
const url = `${config.supabase_url}/rest/v1/kenaz_status`;
|
|
84
|
-
const { spawnSync } = require('child_process');
|
|
85
|
-
spawnSync('curl', [
|
|
86
|
-
'-s', '-X', 'POST', url,
|
|
87
|
-
'-H', `apikey: ${config.supabase_anon_key}`,
|
|
88
|
-
'-H', `Authorization: Bearer ${config.supabase_anon_key}`,
|
|
89
|
-
'-H', 'Content-Type: application/json',
|
|
90
|
-
'-H', 'Prefer: resolution=merge-duplicates',
|
|
91
|
-
'-d', JSON.stringify(payload),
|
|
92
|
-
], { timeout: 5000, stdio: 'ignore', windowsHide: true });
|
|
93
|
-
} catch { /* best-effort */ }
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
module.exports = {
|
|
97
|
-
getSupabaseClient,
|
|
98
|
-
getTaskSync,
|
|
99
|
-
getCommitSync,
|
|
100
|
-
syncCommit,
|
|
101
|
-
broadcastStatus,
|
|
102
|
-
broadcastStatusSync,
|
|
103
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// TASK_2274: formation-mode `--dry-run` must have NO side effects: no git init
|
|
2
|
-
// of the target, no resource lock files, no claim adoption. Drives the real CLI
|
|
3
|
-
// entry (dispatch.js -> dispatch()) against a temp project root.
|
|
4
|
-
const test = require('node:test');
|
|
5
|
-
const assert = require('node:assert/strict');
|
|
6
|
-
const fs = require('fs');
|
|
7
|
-
const os = require('os');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const { spawnSync } = require('child_process');
|
|
10
|
-
|
|
11
|
-
const DISPATCH = path.join(__dirname, 'dispatch.js');
|
|
12
|
-
|
|
13
|
-
function mkProject() {
|
|
14
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), 't2274_'));
|
|
15
|
-
fs.mkdirSync(path.join(root, '.kenaz', 'tasks', 'backlog'), { recursive: true });
|
|
16
|
-
fs.mkdirSync(path.join(root, '.kenaz', 'tasks', 'active'), { recursive: true });
|
|
17
|
-
fs.writeFileSync(path.join(root, '.kenaz', 'tasks', 'backlog', 'TASK_9001_dryrun.yaml'), [
|
|
18
|
-
'id: TASK_9001', 'title: dry run probe', 'description: probe', 'status: backlog',
|
|
19
|
-
'priority: P2', 'scope_paths:', ' - src/x.js', 'resources:', ' - dryrun_res', ''].join('\n'));
|
|
20
|
-
return root;
|
|
21
|
-
}
|
|
22
|
-
function run(root, extra, envOver) {
|
|
23
|
-
const env = { ...process.env, ...(envOver || {}) }; delete env.CLAUDE_PROJECT_DIR;
|
|
24
|
-
return spawnSync(process.execPath, [DISPATCH, '--formation=unit', '--skill=do', '--task=TASK_9001',
|
|
25
|
-
'--project-path', root, ...extra], { encoding: 'utf8', env, windowsHide: true, timeout: 90000 });
|
|
26
|
-
}
|
|
27
|
-
const lockFile = (root) => path.join(root, '.kenaz', 'locks', 'resource_dryrun_res.lock');
|
|
28
|
-
|
|
29
|
-
test('formation-mode --dry-run: no git init, no resource lock, reports intent', () => {
|
|
30
|
-
const root = mkProject();
|
|
31
|
-
try {
|
|
32
|
-
const r = run(root, ['--dry-run']);
|
|
33
|
-
const out = (r.stdout || '') + (r.stderr || '');
|
|
34
|
-
assert.equal(r.status, 0, out.slice(-500));
|
|
35
|
-
assert.ok(!fs.existsSync(path.join(root, '.git')), 'dry-run must not git init');
|
|
36
|
-
assert.ok(!fs.existsSync(lockFile(root)), 'dry-run must not acquire resource lock');
|
|
37
|
-
assert.match(out, /\[dry-run\] resource locks NOT acquired: dryrun_res/);
|
|
38
|
-
assert.match(out, /\[dry-run\] would git init/);
|
|
39
|
-
} finally { fs.rmSync(root, { recursive: true, force: true }); }
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('control: non-dry-run formation dispatch DOES git init and acquire the lock', () => {
|
|
43
|
-
const root = mkProject();
|
|
44
|
-
try {
|
|
45
|
-
// PATH = node + git dirs only and a fake HOME, so the real agent launch cannot
|
|
46
|
-
// find a claude binary (it fails after the lock/git steps we are asserting).
|
|
47
|
-
const gitDirs = spawnSync(process.platform === 'win32' ? 'where' : 'which', ['git'], { encoding: 'utf8' })
|
|
48
|
-
.stdout.split(/\r?\n/).filter(Boolean).map((p) => path.dirname(p));
|
|
49
|
-
const PATH = [path.dirname(process.execPath), ...gitDirs].join(path.delimiter);
|
|
50
|
-
run(root, [], { PATH, Path: PATH, USERPROFILE: root, HOME: root });
|
|
51
|
-
assert.ok(fs.existsSync(path.join(root, '.git')), 'control: git init expected');
|
|
52
|
-
assert.ok(fs.existsSync(lockFile(root)), 'control: lock expected');
|
|
53
|
-
} finally { fs.rmSync(root, { recursive: true, force: true }); }
|
|
54
|
-
});
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const { ROOT } = require('./utils');
|
|
6
|
-
|
|
7
|
-
function getDispatchNotificationFile(corePath = ROOT) {
|
|
8
|
-
return path.join(corePath, '.formation', '.dispatch-notifications.json');
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function readDispatchNotifications(corePath = ROOT) {
|
|
12
|
-
const file = getDispatchNotificationFile(corePath);
|
|
13
|
-
try {
|
|
14
|
-
if (fs.existsSync(file)) {
|
|
15
|
-
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
16
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
17
|
-
}
|
|
18
|
-
} catch {}
|
|
19
|
-
return [];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function writeDispatchNotifications(list, corePath = ROOT) {
|
|
23
|
-
const file = getDispatchNotificationFile(corePath);
|
|
24
|
-
try {
|
|
25
|
-
fs.writeFileSync(file, JSON.stringify(list, null, 2));
|
|
26
|
-
} catch {}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function enqueueDispatchNotification(event, corePath = ROOT) {
|
|
30
|
-
if (!event || !event.originSessionId || !event.taskId || !event.status) return null;
|
|
31
|
-
|
|
32
|
-
const list = readDispatchNotifications(corePath);
|
|
33
|
-
const notification = {
|
|
34
|
-
id: event.id || `dispatch-${event.taskId}-${Date.now()}`,
|
|
35
|
-
originSessionId: event.originSessionId,
|
|
36
|
-
taskId: event.taskId,
|
|
37
|
-
status: event.status,
|
|
38
|
-
summary: event.summary || '',
|
|
39
|
-
formation: event.formation || 'unit',
|
|
40
|
-
skill: event.skill || 'do',
|
|
41
|
-
dispatchSessionId: event.dispatchSessionId || null,
|
|
42
|
-
projectPath: event.projectPath || null,
|
|
43
|
-
logPath: event.logPath || null,
|
|
44
|
-
metadata: event.metadata || {},
|
|
45
|
-
createdAt: event.createdAt || new Date().toISOString(),
|
|
46
|
-
};
|
|
47
|
-
list.push(notification);
|
|
48
|
-
writeDispatchNotifications(list, corePath);
|
|
49
|
-
return notification;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function takeDispatchNotifications(originSessionId, corePath = ROOT) {
|
|
53
|
-
if (!originSessionId) return [];
|
|
54
|
-
const list = readDispatchNotifications(corePath);
|
|
55
|
-
if (list.length === 0) return [];
|
|
56
|
-
|
|
57
|
-
const matches = [];
|
|
58
|
-
const remaining = [];
|
|
59
|
-
for (const item of list) {
|
|
60
|
-
if (item && item.originSessionId === originSessionId) {
|
|
61
|
-
matches.push(item);
|
|
62
|
-
} else {
|
|
63
|
-
remaining.push(item);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (matches.length > 0) {
|
|
68
|
-
if (remaining.length === 0) {
|
|
69
|
-
try { fs.unlinkSync(getDispatchNotificationFile(corePath)); } catch {}
|
|
70
|
-
} else {
|
|
71
|
-
writeDispatchNotifications(remaining, corePath);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return matches;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
module.exports = {
|
|
79
|
-
getDispatchNotificationFile,
|
|
80
|
-
readDispatchNotifications,
|
|
81
|
-
writeDispatchNotifications,
|
|
82
|
-
enqueueDispatchNotification,
|
|
83
|
-
takeDispatchNotifications,
|
|
84
|
-
};
|