kenaz 0.3.3 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
- package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
- package/core/.claude/commands/Ansuz.md +15 -2
- package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
- package/core/.claude/hooks/handoff-staleness.js +2 -2
- package/core/.claude/hooks/session-init.ps1 +49 -49
- package/core/.claude/hooks/turn-context.js +50 -2
- package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/core/.collaboration/core/task-api.js +1 -4
- package/core/.formation/README.md +21 -146
- package/core/.formation/bifrost/codex-doctor.js +37 -2
- package/core/.formation/bifrost/codex-doctor.test.js +18 -0
- package/core/.formation/bifrost/launch.js +1 -1
- package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
- package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
- package/core/.formation/bifrost/setup-codex.js +3 -0
- package/core/.formation/native/claude/README.md +1 -1
- package/core/.formation/role-map.yaml +3 -3
- package/core/.formation/spec/task_operations.parity.test.js +0 -1
- package/core/.formation/spec/task_operations.yaml +3 -3
- package/core/.formation/tests/hello.txt +2 -2
- package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +4 -4
- package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
- package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
- package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
- package/core/.formation/tools/dispatch.js +33 -554
- package/core/.formation/tools/mcp-allowlist.test.js +0 -1
- package/core/.formation/tools/post-complete/task2345.test.js +0 -5
- package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
- package/core/.formation/tools/prompt.js +33 -1623
- package/core/.formation/tools/prompt.test.js +26 -594
- package/core/.formation/unit/do.yaml +2 -4
- package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
- package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
- package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
- package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
- package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
- package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
- package/core/.kenaz/muninn_episode_write.ps1 +17 -17
- package/core/.kenaz/specialist/field_report_watermark.json +1 -1
- package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
- package/core/.kenaz/specialist/t1777_probe.txt +1 -1
- package/core/.matrix/index.matrix +5 -5
- package/core/.rule/general/agent-workflow.yaml +4 -4
- package/core/.rule/general/file-size-threshold.yaml +16 -4
- package/core/.rule/general/rust-verify-target.yaml +0 -1
- package/core/.rule/general/system-invariants.yaml +8 -25
- package/core/.specialist/Ansuz/SYSTEM_DOC.md +17 -42
- package/core/.specialist/Ansuz/capability.yaml +7 -14
- package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +4 -11
- package/core/.specialist/Ansuz/elixir.yaml +3 -4
- package/core/.specialist/Ansuz/identity_contract.yaml +1 -1
- package/core/.specialist/Ansuz/knowledge.yaml +7 -10
- package/core/.specialist/Ansuz/rule.yaml +2 -2
- package/core/.specialist/Ansuz/tools/verify-and-land.js +22 -0
- package/core/.specialist/Ansuz/tools/verify-and-land.test.js +59 -5
- package/core/.specialist/Ansuz/workflow.yaml +7 -11
- package/core/.specialist/Forseti/core.yaml +1 -1
- package/core/.specialist/Heimdall/SKILL.md +1 -1
- package/core/.specialist/Heimdall/core.yaml +2 -2
- package/core/.specialist/Huginn/rule.yaml +1 -1
- package/core/.specialist/tools/README.md +2 -2
- package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
- package/core/.system/collaboration/README.md +1 -1
- package/core/.system/formation/LEGACY_SKILLS.md +2 -0
- package/core/.system/formation/POST_COMPLETE.md +2 -0
- package/core/.system/formation/README.md +2 -0
- package/core/KENAZ_CORE_VERSION +1 -1
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
- package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
- package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
- package/core/dev/jev-eval/README.md +99 -99
- package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
- package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
- package/core/dev/pipeline/tasks/.gitkeep +1 -1
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
- package/core/dev/scripts/check-file-size.js +44 -17
- package/core/dev/scripts/init_git.sh +0 -0
- package/core/dev/scripts/init_project.sh +0 -0
- package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
- package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
- package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
- package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
- package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
- package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
- package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
- package/core/dev/scripts/run_once.sh +0 -0
- package/core/dev/scripts/setup_mcp.sh +0 -0
- package/core/dev/scripts/setup_rag.sh +0 -0
- package/core/dev/scripts/start_dev_agent.sh +0 -0
- package/core/dev/scripts/start_multi_agent.sh +0 -0
- package/core/dev/scripts/sync_task_queue.sh +0 -0
- package/core/k-cli/README.md +1 -94
- package/core/k-cli/test/TEST_SPEC.md +5 -22
- package/core/k-cli/test/run.sh +1 -67
- package/core/plugins/kenaz/commands/Amelia.md +1 -1
- package/core/plugins/kenaz/commands/Ansuz.md +16 -3
- package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
- package/core/plugins/kenaz/scripts/sync.js +6 -2
- package/core/plugins/kenaz/scripts/ygg.js +13 -1
- package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
- package/lib/cli.js +11 -4
- package/package.json +11 -7
- package/vendor/install-kenaz-cli.js +18 -7
- package/core/.formation/legion/forge.yaml +0 -299
- package/core/.formation/legion/hive.yaml +0 -238
- package/core/.formation/squad/blitz.yaml +0 -192
- package/core/.formation/squad/strategy-tribunal.yaml +0 -354
- package/core/.formation/squad/strategy.yaml +0 -349
- package/core/.formation/squad/sweep.yaml +0 -208
- package/core/.formation/tools/broadcast.js +0 -103
- package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
- package/core/.formation/tools/dispatch-notifier.js +0 -84
- package/core/.formation/tools/formations.js +0 -1203
- package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
- package/core/.formation/tools/headless-dryrun.test.js +0 -79
- package/core/.formation/tools/headless-v2.js +0 -659
- package/core/.formation/tools/headless.js +0 -1071
- package/core/.formation/tools/legacy-scheduler.js +0 -1994
- package/core/.formation/tools/logger.js +0 -273
- package/core/.formation/tools/memory-loader.js +0 -422
- package/core/.formation/tools/process-state.js +0 -33
- package/core/.formation/tools/remote-conflict.js +0 -98
- package/core/.formation/tools/runner.js +0 -1332
- package/core/.formation/tools/task-utils.js +0 -344
- package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
- package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
- package/core/.formation/tools/worktree-leak.test.js +0 -162
- package/core/k-cli/dist/alaya/run.js +0 -91
- package/core/k-cli/dist/core/output.js +0 -24
- package/core/k-cli/dist/core/process.js +0 -38
- package/core/k-cli/dist/core/project.js +0 -80
- package/core/k-cli/dist/core/spawn.js +0 -268
- package/core/k-cli/dist/core/types.js +0 -2
- package/core/k-cli/dist/dashboard/update.js +0 -53
- package/core/k-cli/dist/dashboard/version.js +0 -20
- package/core/k-cli/dist/dispatch/run.js +0 -241
- package/core/k-cli/dist/dispatch/status.js +0 -103
- package/core/k-cli/dist/index.js +0 -283
- package/core/k-cli/dist/project/initialize.js +0 -301
- package/core/k-cli/dist/project/install.js +0 -89
- package/core/k-cli/dist/project/status.js +0 -138
- package/core/k-cli/dist/specialist/list.js +0 -100
- package/core/k-cli/dist/specialist/run.js +0 -93
- package/core/k-cli/dist/task/create.js +0 -194
- package/core/k-cli/dist/task/delete.js +0 -98
- package/core/k-cli/dist/task/get.js +0 -55
- package/core/k-cli/dist/task/list.js +0 -58
- package/core/k-cli/dist/task/submit.js +0 -156
- package/core/k-cli/dist/ygg/run.js +0 -51
- package/core/k-cli/node_modules/.bin/yaml +0 -16
- package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
- package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
- package/core/k-cli/node_modules/.package-lock.json +0 -23
- package/core/k-cli/node_modules/yaml/LICENSE +0 -13
- package/core/k-cli/node_modules/yaml/README.md +0 -172
- package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
- package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
- package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
- package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
- package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
- package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
- package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
- package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
- package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
- package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
- package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
- package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
- package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
- package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
- package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
- package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
- package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
- package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
- package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
- package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
- package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
- package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
- package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
- package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
- package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
- package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
- package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
- package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
- package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
- package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
- package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
- package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
- package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
- package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
- package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
- package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
- package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
- package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
- package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
- package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
- package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
- package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
- package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
- package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
- package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
- package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
- package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
- package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
- package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
- package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
- package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
- package/core/k-cli/node_modules/yaml/package.json +0 -97
- package/core/k-cli/node_modules/yaml/util.js +0 -2
|
@@ -1,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))
|
|
@@ -2111,8 +2111,7 @@ class TaskAPI {
|
|
|
2111
2111
|
// TASK_2264: decide up front whether post-complete (below) will measure 'after' in-process.
|
|
2112
2112
|
// TASK_2288 single-winner rule: whenever a post-complete run is expected for this completion,
|
|
2113
2113
|
// post-complete's own measurement is the ONE 'after' capture (it runs after merge and feeds the
|
|
2114
|
-
// verdict), so moveTask must not also spawn one. Expected = in-process (below)
|
|
2115
|
-
// (headless.js / scheduler, signalled by FORMATION_HEADLESS / FORMATION_SCHEDULER) runs it itself.
|
|
2114
|
+
// verdict), so moveTask must not also spawn one. Expected = in-process (below).
|
|
2116
2115
|
// moveTask's detached capture stays the sole one only when nobody measures: --skip-post-complete.
|
|
2117
2116
|
const postCompleteRuns = !options.skipPostComplete;
|
|
2118
2117
|
const result = await this.moveTask(taskId, 'done', updatedTask, { skipHealthAfter: postCompleteRuns });
|
|
@@ -2135,8 +2134,6 @@ class TaskAPI {
|
|
|
2135
2134
|
}
|
|
2136
2135
|
|
|
2137
2136
|
// 自動執行 post-complete(除非明確跳過)
|
|
2138
|
-
// - FORMATION_SCHEDULER: 由 scheduler 統一管理,避免重複執行
|
|
2139
|
-
// - FORMATION_HEADLESS: 由 headless.js onDone 統一執行,避免並行 agent git 衝突
|
|
2140
2137
|
if (postCompleteRuns) {
|
|
2141
2138
|
try {
|
|
2142
2139
|
const { postComplete } = require('../../.formation/tools/post-complete.js');
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
# Formation System
|
|
2
2
|
|
|
3
|
-
Agent
|
|
3
|
+
Subagent 調度。唯一的 live 路徑:`dispatch.js --dispatch-mode=subagent` 印出 JSON(`promptText` + `agentParams`),由 Ansuz 交給 Agent tool(或 `--harness=codex` 的 Codex `spawn_agent`)執行。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Headless(`claude -p`、`kenaz_dispatch`)、Squad、Legion、Legacy scheduler 已退役;`squad/`、`legion/` 的 YAML 只是歷史定義,`dispatch.js` 遇到會直接報錯結束。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
Unit → Solo → Squad → Legion
|
|
9
|
-
1×1 1×N N×1 Native Team
|
|
10
|
-
最輕量 最靈活 真並行 最重火力
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
---
|
|
7
|
+
## 陣型
|
|
14
8
|
|
|
15
9
|
### Unit
|
|
16
10
|
|
|
@@ -18,138 +12,37 @@ Unit → Solo → Squad → Legion
|
|
|
18
12
|
|
|
19
13
|
派出一個 subagent 執行單一任務,完成後回報結果。不切換角色、不協作,純粹的「去做這件事」。
|
|
20
14
|
|
|
21
|
-
- 機制:`Task` 工具,單次調用
|
|
22
|
-
- 成本:最低
|
|
23
15
|
- 適用:明確的單一任務、Bug 修復、檔案修改、腳本執行
|
|
24
|
-
|
|
25
|
-
---
|
|
16
|
+
- 可用 skill:`do`、`think`、`plan`
|
|
26
17
|
|
|
27
18
|
### Solo
|
|
28
19
|
|
|
29
20
|
**1 agent, N perspectives** — 單人多視角自主切換。
|
|
30
21
|
|
|
31
|
-
|
|
22
|
+
一個 subagent,同時裝備多個專業視角,由 agent 自主決定何時切換。
|
|
32
23
|
|
|
33
|
-
- 機制:`dispatch.js --formation=solo
|
|
34
|
-
- 成本:低(單次 subagent 調用)
|
|
24
|
+
- 機制:`dispatch.js --formation=solo`
|
|
35
25
|
- 適用:策略分析、程式碼審查、方案評估、設計決策
|
|
36
26
|
- 可用 skill:`strategy`(策略分析)、`diagnosis`(問題診斷)
|
|
37
27
|
|
|
38
|
-
```
|
|
39
|
-
範例:Solo + Strategy
|
|
40
|
-
→ [技術專家] 分析架構影響
|
|
41
|
-
→ 發現成本問題 → [產品策略師] 評估 ROI
|
|
42
|
-
→ 發現安全疑慮 → [風險分析師] 識別風險
|
|
43
|
-
→ 綜合判斷,產出結論
|
|
44
|
-
(視角切換由 agent 自主決定,非固定順序)
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
### Squad
|
|
50
|
-
|
|
51
|
-
**N agents, 1 task** — 多 agent 並行協作。
|
|
52
|
-
|
|
53
|
-
同時派出多個 subagent,各自負責任務的不同部分,並行執行後整合成果。成員之間不能互相通訊(那是 Legion 的事),各自獨立完成後由 lead 整合。
|
|
54
|
-
|
|
55
|
-
- 機制:`dispatch.js --formation=squad`,並行啟動多個 Claude 進程
|
|
56
|
-
- 成本:中等(隨 agent 數量線性增長)
|
|
57
|
-
- 適用:並行子任務開發、跨模組批量修改、多區域同步掃蕩
|
|
58
|
-
- 可用 skill:`blitz`(通用並行拆分)、`sweep`(同規則多範圍掃蕩)
|
|
59
|
-
|
|
60
|
-
**核心約束**:
|
|
61
|
-
- 成員之間 **不通訊**,只靠 `shared_context`(啟動前定義的共享約定)協調
|
|
62
|
-
- 每個成員的 `scope_paths` 不得重疊(避免檔案衝突)
|
|
63
|
-
- 如果子任務之間有依賴關係,不適合用 Squad
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
範例 1:Squad + blitz(並行拆分)
|
|
67
|
-
├── [part_1] → 實作模組 A 的功能
|
|
68
|
-
├── [part_2] → 實作模組 B 的功能
|
|
69
|
-
└── [part_3] → 實作模組 C 的功能
|
|
70
|
-
→ lead 整合驗證,統一提交
|
|
71
|
-
|
|
72
|
-
範例 2:Squad + sweep(同規則掃蕩)
|
|
73
|
-
├── [zone_1] → 重構 cmd_modules/ 下的模組
|
|
74
|
-
├── [zone_2] → 重構 components/ 下的元件
|
|
75
|
-
└── [zone_3] → 重構 lib/ 下的工具函數
|
|
76
|
-
→ lead 驗證一致性,統一提交
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
### Legion
|
|
82
|
-
|
|
83
|
-
**Native Team** — 即時溝通的完整團隊。
|
|
84
|
-
|
|
85
|
-
使用 Claude Code 原生的 TeamCreate 機制,建立持久化團隊。成員之間可互相通訊、即時協調。Legion 的核心價值不是「更多人」,而是「即時溝通」— 只在成員的工作互相影響、需要即時協調時使用。
|
|
86
|
-
|
|
87
|
-
- 機制:`TeamCreate` + `SendMessage`
|
|
88
|
-
- 成本:最高(持久化 context + 通訊開銷)
|
|
89
|
-
- 適用:有順序依賴、回饋循環、或高度耦合的複雜任務
|
|
90
|
-
- 可用 skill:`forge`(順序流水線)、`hive`(網狀即時協調)
|
|
91
|
-
|
|
92
|
-
**核心價值**(Squad 做不到的事):
|
|
93
|
-
- 即時通知「我改了 X,你要更新」
|
|
94
|
-
- 回饋循環(review → fix → re-review)
|
|
95
|
-
- 順序依賴(A 做完 B 才開始)
|
|
96
|
-
- 動態調整(做到一半改方向)
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
範例 1:Legion + forge(鍛造)
|
|
100
|
-
Designer ──→ Implementer(s) ──→ Reviewer
|
|
101
|
-
↑ 回饋修正 ←──────────────────↓
|
|
102
|
-
→ 設計 → 打造 → 淬煉,有序且有品質把關
|
|
103
|
-
|
|
104
|
-
範例 2:Legion + hive(蜂巢)
|
|
105
|
-
Worker A ←→ Worker B
|
|
106
|
-
↕ ↕
|
|
107
|
-
Worker C ←→ Worker D
|
|
108
|
-
→ 所有人即時互聯,任何變更即時同步
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
## 選擇指南
|
|
114
|
-
|
|
115
|
-
| 問自己 | 答案 | 陣型 |
|
|
116
|
-
|--------|------|------|
|
|
117
|
-
| 任務簡單、目標明確? | Yes | **Unit** |
|
|
118
|
-
| 需要多角度分析? | Yes | **Solo** |
|
|
119
|
-
| 需要同時做多件事? | Yes | **Squad** |
|
|
120
|
-
| 有順序依賴或回饋循環? | Yes | **Legion** (forge) |
|
|
121
|
-
| 工作高度耦合、需即時協調? | Yes | **Legion** (hive) |
|
|
122
|
-
|
|
123
28
|
---
|
|
124
29
|
|
|
125
30
|
## 啟動方式
|
|
126
31
|
|
|
127
|
-
### Headless Mode(推薦)
|
|
128
|
-
|
|
129
|
-
由 Formation Lead 配好任務後直接呼叫,subagent 不問問題:
|
|
130
|
-
|
|
131
32
|
```bash
|
|
132
|
-
# Unit
|
|
133
|
-
node .formation/tools/
|
|
33
|
+
# Unit
|
|
34
|
+
node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent
|
|
134
35
|
|
|
135
|
-
# Solo
|
|
136
|
-
node .formation/tools/
|
|
36
|
+
# Solo
|
|
37
|
+
node .formation/tools/dispatch.js --formation=solo --skill=strategy --task=TASK_172 --dispatch-mode=subagent
|
|
137
38
|
|
|
138
|
-
#
|
|
139
|
-
node .formation/tools/
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
node .formation/tools/headless.js --formation=legion --skill=forge --task=TASK_202
|
|
143
|
-
|
|
144
|
-
# Dry run(只看 prompt,不啟動)
|
|
145
|
-
node .formation/tools/headless.js --formation=legion --skill=forge --task=TASK_202 --dry-run
|
|
39
|
+
# Codex harness / 子專案 / 只看 payload 不產生副作用
|
|
40
|
+
node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --harness=codex
|
|
41
|
+
node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --project-path <path>
|
|
42
|
+
node .formation/tools/dispatch.js --skill=do --task=TASK_172 --dispatch-mode=subagent --dry-run
|
|
146
43
|
```
|
|
147
44
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
```bash
|
|
151
|
-
node .formation/tools/dispatch.js --skill=do --task=TASK_172
|
|
152
|
-
```
|
|
45
|
+
缺 `--dispatch-mode=subagent`、或指定 squad/legion skill,都會以非零 exit code 結束並印出原因。
|
|
153
46
|
|
|
154
47
|
---
|
|
155
48
|
|
|
@@ -158,31 +51,13 @@ node .formation/tools/dispatch.js --skill=do --task=TASK_172
|
|
|
158
51
|
```
|
|
159
52
|
.formation/
|
|
160
53
|
├── README.md # 本文件
|
|
161
|
-
├── lead.yaml # Formation Lead
|
|
54
|
+
├── lead.yaml # Formation Lead
|
|
162
55
|
├── tools/
|
|
163
|
-
│ ├──
|
|
164
|
-
│ ├── dispatch.js # CLI 入口(互動式)
|
|
56
|
+
│ ├── dispatch.js # CLI 入口(--dispatch-mode=subagent)
|
|
165
57
|
│ ├── loader.js # YAML/Task 載入
|
|
166
|
-
│ ├── prompt.js #
|
|
167
|
-
│ ├──
|
|
168
|
-
│ ├── logger.js # Log 格式化
|
|
58
|
+
│ ├── prompt.js # Subagent prompt 組裝 + 傳輸前綴
|
|
59
|
+
│ ├── post-complete.js # 完成後 merge / 驗證
|
|
169
60
|
│ └── utils.js # 工具函數
|
|
170
|
-
├──
|
|
171
|
-
|
|
172
|
-
│ ├── solo/
|
|
173
|
-
│ ├── squad/
|
|
174
|
-
│ └── legion/
|
|
175
|
-
├── unit/ # Unit 陣型定義
|
|
176
|
-
│ ├── do.yaml # 執行者
|
|
177
|
-
│ ├── think.yaml # 分析者
|
|
178
|
-
│ └── plan.yaml # 規劃者
|
|
179
|
-
├── solo/ # Solo 陣型定義(含視角集)
|
|
180
|
-
│ ├── strategy.yaml # 策略分析(6 視角)
|
|
181
|
-
│ └── diagnosis.yaml # 問題診斷(4 視角)
|
|
182
|
-
├── squad/ # Squad 陣型定義(含協作模板)
|
|
183
|
-
│ ├── blitz.yaml # 通用並行拆分
|
|
184
|
-
│ └── sweep.yaml # 同規則多範圍掃蕩
|
|
185
|
-
└── legion/ # Legion 陣型定義(含溝通模式)
|
|
186
|
-
├── forge.yaml # 順序流水線(設計→打造→淬煉)
|
|
187
|
-
└── hive.yaml # 網狀即時協調(全連接)
|
|
61
|
+
├── unit/ # do / think / plan
|
|
62
|
+
└── solo/ # strategy / diagnosis
|
|
188
63
|
```
|
|
@@ -40,12 +40,47 @@ function writeIfChanged(f, text) {
|
|
|
40
40
|
return 'written';
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
// Global Codex instructions (~/.codex/AGENTS.md, read by every Codex session): a marked Kenaz block,
|
|
44
|
+
// so Codex agents know how to report Kenaz problems (wish / field report) like Claude's /Ansuz does.
|
|
45
|
+
// Only the text between the markers is ours; the user's own content is never touched.
|
|
46
|
+
const AGENTS_BEGIN = '<!-- kenaz:begin (managed by kenaz install; edits here are overwritten) -->';
|
|
47
|
+
const AGENTS_END = '<!-- kenaz:end -->';
|
|
48
|
+
function agentsBlock() {
|
|
49
|
+
return [AGENTS_BEGIN, '## Kenaz',
|
|
50
|
+
'- Kenaz tools come from the `kenaz-dashboard` MCP server (kenaz-server on 127.0.0.1:18080); `$kenaz status|init|ygg ...` runs the Kenaz CLI (needs network access to 127.0.0.1).',
|
|
51
|
+
'- When Kenaz itself blocks or degrades the work (a tool/hook/install/peer/dispatch failure, wrong data, missing capability), call `kenaz_wish_create` BEFORE working around it:',
|
|
52
|
+
' projectPath = this project; scope = `kenaz` (Kenaz problem) or `project`; wish_type = `bug` | `feature` | `question`;',
|
|
53
|
+
' content = one-line repro + expected vs actual + versions (`npx kenaz doctor` lines) + session id. Never paste keys or tokens.',
|
|
54
|
+
' A scope=kenaz wish is sent to the Kenaz team as a field report. Report each problem once, then finish the work with the workaround and tell the user the wish was filed.',
|
|
55
|
+
AGENTS_END].join('\n');
|
|
56
|
+
}
|
|
57
|
+
function withoutAgentsBlock(text) {
|
|
58
|
+
const a = text.indexOf(AGENTS_BEGIN), b = text.indexOf(AGENTS_END);
|
|
59
|
+
if (a < 0 || b < a) return text;
|
|
60
|
+
return (text.slice(0, a) + text.slice(b + AGENTS_END.length)).replace(/\n{3,}/g, '\n\n').trim() + '\n';
|
|
61
|
+
}
|
|
62
|
+
function installAgentsBlock() {
|
|
63
|
+
const f = path.join(codexHome(), 'AGENTS.md');
|
|
64
|
+
const cur = fs.existsSync(f) ? fs.readFileSync(f, 'utf8') : '';
|
|
65
|
+
const base = withoutAgentsBlock(cur).trim();
|
|
66
|
+
return writeIfChanged(f, (base ? base + '\n\n' : '') + agentsBlock() + '\n');
|
|
67
|
+
}
|
|
68
|
+
function removeAgentsBlock(dryRun) {
|
|
69
|
+
const f = path.join(codexHome(), 'AGENTS.md');
|
|
70
|
+
if (!fs.existsSync(f)) return 'absent';
|
|
71
|
+
const cur = fs.readFileSync(f, 'utf8');
|
|
72
|
+
if (!cur.includes(AGENTS_BEGIN)) return 'absent';
|
|
73
|
+
if (!dryRun) { const rest = withoutAgentsBlock(cur); if (rest.trim()) fs.writeFileSync(f, rest); else fs.rmSync(f, { force: true }); }
|
|
74
|
+
return 'removed';
|
|
75
|
+
}
|
|
76
|
+
|
|
43
77
|
function installPrompts(core) {
|
|
44
78
|
const f = path.join(codexHome(), 'prompts', 'kenaz.md');
|
|
45
79
|
const skill = path.join(codexHome(), 'skills', 'kenaz', 'SKILL.md');
|
|
46
80
|
const a = writeIfChanged(f, promptText(core));
|
|
47
81
|
const b = writeIfChanged(skill, skillText(core));
|
|
48
|
-
|
|
82
|
+
const c = installAgentsBlock();
|
|
83
|
+
return { file: f, skill, action: [a, b, c].every((x) => x === 'unchanged') ? 'unchanged' : 'written' };
|
|
49
84
|
}
|
|
50
85
|
|
|
51
86
|
// Per event: is our shim registered, and does codex hold a trusted_hash for it (hooks.state)?
|
|
@@ -95,7 +130,7 @@ function diagnose() {
|
|
|
95
130
|
return { trust, delivery_mode: deliveryMode(trust), ok: notes.length === 0, notes };
|
|
96
131
|
}
|
|
97
132
|
|
|
98
|
-
module.exports = { promptText, skillText, installPrompts, hookTrust, deliveryMode, diagnose, SHIM_REL, EVENTS };
|
|
133
|
+
module.exports = { promptText, skillText, installPrompts, installAgentsBlock, removeAgentsBlock, agentsBlock, hookTrust, deliveryMode, diagnose, SHIM_REL, EVENTS };
|
|
99
134
|
|
|
100
135
|
if (require.main === module) {
|
|
101
136
|
if (process.argv.includes('--install-prompts')) console.log(JSON.stringify(installPrompts()));
|
|
@@ -49,3 +49,21 @@ test('shim honours Kenaz mode: off silent, full control still runs', () => {
|
|
|
49
49
|
assert.strictEqual(off.stderr.includes('event='), false);
|
|
50
50
|
assert.ok(full.stderr.includes('event=SessionStart')); // control: hook does run when not off
|
|
51
51
|
});
|
|
52
|
+
|
|
53
|
+
test('global AGENTS.md gets one managed Kenaz block (wish / field report guidance); user text kept; removal leaves the rest', () => {
|
|
54
|
+
const home = fs.mkdtempSync(path.join(os.tmpdir(), 'cx-agents-'));
|
|
55
|
+
process.env.CODEX_HOME = home;
|
|
56
|
+
const f = path.join(home, 'AGENTS.md');
|
|
57
|
+
fs.writeFileSync(f, '# My own Codex rules\nAlways be terse.\n');
|
|
58
|
+
D.installAgentsBlock();
|
|
59
|
+
D.installAgentsBlock(); // idempotent: still one block
|
|
60
|
+
const t = fs.readFileSync(f, 'utf8');
|
|
61
|
+
assert.match(t, /Always be terse\./);
|
|
62
|
+
assert.strictEqual(t.split('kenaz:begin').length - 1, 1);
|
|
63
|
+
assert.match(t, /kenaz_wish_create/);
|
|
64
|
+
assert.strictEqual(D.removeAgentsBlock(false), 'removed');
|
|
65
|
+
const after = fs.readFileSync(f, 'utf8');
|
|
66
|
+
assert.match(after, /Always be terse\./);
|
|
67
|
+
assert.doesNotMatch(after, /kenaz:begin|kenaz_wish_create/);
|
|
68
|
+
delete process.env.CODEX_HOME;
|
|
69
|
+
});
|
|
@@ -305,7 +305,7 @@ function writeOverride(prompt, bootContext) {
|
|
|
305
305
|
|
|
306
306
|
fs.writeFileSync(OVERRIDE_PATH, content, 'utf8');
|
|
307
307
|
|
|
308
|
-
// Write adapter signal file
|
|
308
|
+
// Write adapter signal file (read by session.js and the Dashboard bifrost-active route)
|
|
309
309
|
const signalPath = path.join(ROOT, '.formation', '.bifrost-active');
|
|
310
310
|
fs.writeFileSync(signalPath, JSON.stringify({ adapter: 'openai', specialist: SPECIALIST, pid: process.pid, started: new Date().toISOString() }));
|
|
311
311
|
|
|
@@ -123,6 +123,11 @@ async function main() {
|
|
|
123
123
|
try { mode = require(path.resolve(ROOT, 'plugins/kenaz/hooks/mode.js')).resolveMode(p.cwd || process.cwd()); } catch {}
|
|
124
124
|
if (mode === 'off') process.exit(0);
|
|
125
125
|
console.error('[codex-hook-shim] event=' + ev);
|
|
126
|
+
// Register this project with kenaz-server (idempotent, no-op when known): Codex sessions never run
|
|
127
|
+
// the Claude turn-context hook, so a Codex-only machine stayed out of its room (field report).
|
|
128
|
+
const registering = (ev === 'SessionStart' || ev === 'UserPromptSubmit')
|
|
129
|
+
? (() => { try { const r = resolvePeerProjectRoot(p.cwd || process.cwd()); return r ? peerRequest('POST', '/api/projects/register', { projectPath: r }) : null; } catch { return null; } })()
|
|
130
|
+
: null;
|
|
126
131
|
const payload = normalizeHookPayload(p);
|
|
127
132
|
if (ev === 'UserPromptSubmit') {
|
|
128
133
|
payload.specialist = p.specialist || payload.specialist;
|
|
@@ -164,6 +169,7 @@ async function main() {
|
|
|
164
169
|
}).catch(() => {}).finally(() => process.exit(0));
|
|
165
170
|
return; // exit handled by finally above
|
|
166
171
|
}
|
|
172
|
+
if (registering) await registering; // bounded by PEER_TIMEOUT_MS; fail-open
|
|
167
173
|
process.exit(0);
|
|
168
174
|
}
|
|
169
175
|
|
|
@@ -33,7 +33,17 @@ async function fixture({ project, cwd = path.resolve('hook-cwd'), reject = false
|
|
|
33
33
|
readFileSync: () => { throw new Error('no real state reads'); },
|
|
34
34
|
};
|
|
35
35
|
// TASK_2299 peer pull deps; no KENAZ_PEER_PULL in these fixtures, so no request is expected.
|
|
36
|
-
|
|
36
|
+
// The only request allowed here is the idempotent project registration (SessionStart /
|
|
37
|
+
// UserPromptSubmit); the fake fails it at once, like a server that is down (fail-open).
|
|
38
|
+
if (id === 'http') return { request: (opts) => {
|
|
39
|
+
if (opts && opts.method === 'POST' && opts.path === '/api/projects/register') {
|
|
40
|
+
effects.http.push('register');
|
|
41
|
+
const handlers = {};
|
|
42
|
+
const req = { on: (ev, fn) => { handlers[ev] = fn; return req; }, destroy: () => {}, end: () => { if (handlers.error) handlers.error(new Error('down')); } };
|
|
43
|
+
return req;
|
|
44
|
+
}
|
|
45
|
+
effects.http.push('request'); assert.fail('unexpected peer request');
|
|
46
|
+
} };
|
|
37
47
|
if (id.endsWith('_peer-project-root.js')) return { resolvePeerProjectRoot: dir => dir };
|
|
38
48
|
if (id === 'child_process') return { execFileSync: () => assert.fail('unexpected child') };
|
|
39
49
|
effects.modules.push(id);
|
|
@@ -231,6 +231,9 @@ function uninstall(options = {}) {
|
|
|
231
231
|
if (res.hooks === 'removed' && !dryRun) fs.writeFileSync(cfg, out.join('\n').replace(/\n{3,}/g, '\n\n'), 'utf8');
|
|
232
232
|
const prompt = path.join(getCodexHome(), 'prompts', 'kenaz.md');
|
|
233
233
|
if (fs.existsSync(prompt)) { res.prompt = 'removed'; if (!dryRun) fs.rmSync(prompt, { force: true }); }
|
|
234
|
+
const skillDir = path.join(getCodexHome(), 'skills', 'kenaz');
|
|
235
|
+
if (fs.existsSync(skillDir)) { res.skill = 'removed'; if (!dryRun) fs.rmSync(skillDir, { recursive: true, force: true }); }
|
|
236
|
+
try { res.agents_md = require('./codex-doctor').removeAgentsBlock(dryRun); } catch (_) { /* doctor optional */ }
|
|
234
237
|
log((dryRun ? 'dry-run: ' : '') + 'codex uninstall ' + JSON.stringify(res));
|
|
235
238
|
return { success: true, ...res };
|
|
236
239
|
}
|
|
@@ -51,7 +51,7 @@ no surprise dependencies.
|
|
|
51
51
|
4. When the user picks an entry, the id is written into
|
|
52
52
|
`.kenaz/dashboard-models.json` via
|
|
53
53
|
`POST /api/dashboard/settings/models` and consumed by
|
|
54
|
-
`
|
|
54
|
+
`SpecialistPanel.handleLaunch`.
|
|
55
55
|
|
|
56
56
|
## Adding a new model
|
|
57
57
|
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
# Amelia 判斷 role 時參考此表,dispatch 時用此表解析 --role 路徑
|
|
4
4
|
#
|
|
5
5
|
# Usage:
|
|
6
|
-
# node .formation/tools/
|
|
7
|
-
#
|
|
6
|
+
# node .formation/tools/dispatch.js --skill=do --task=TASK_XXX --dispatch-mode=subagent
|
|
7
|
+
# (此表僅供 Amelia 判斷 role 參考;dispatch.js 不讀取它。headless-v2 已退役)
|
|
8
8
|
|
|
9
9
|
version: "2.0"
|
|
10
10
|
|
|
@@ -259,7 +259,7 @@ roles:
|
|
|
259
259
|
- 新功能開發
|
|
260
260
|
|
|
261
261
|
# ─────────────────────────────────────────
|
|
262
|
-
# Base Skills
|
|
262
|
+
# Base Skills(歷史:原 headless-v2 的 --base 選項)
|
|
263
263
|
# ─────────────────────────────────────────
|
|
264
264
|
|
|
265
265
|
bases:
|
|
@@ -28,7 +28,6 @@ const PROJECT_ROOT = path.resolve(SPEC_DIR, '../..');
|
|
|
28
28
|
const FILES = {
|
|
29
29
|
taskApi: path.join(PROJECT_ROOT, '.collaboration/core/task-api.js'),
|
|
30
30
|
postComplete: path.join(PROJECT_ROOT, '.formation/tools/post-complete/staging.js'),
|
|
31
|
-
headless: path.join(PROJECT_ROOT, '.formation/tools/headless.js'),
|
|
32
31
|
kenazRs: path.join(PROJECT_ROOT, 'dashboard/src-tauri/src/infrastructure/http_server/routes/mcp_tools/kenaz.rs'),
|
|
33
32
|
spec: path.join(SPEC_DIR, 'task_operations.yaml'),
|
|
34
33
|
};
|