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,162 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TASK_1530 — regression test for the Bifrost/Codex worktree WRITE-LEAK class.
|
|
3
|
-
*
|
|
4
|
-
* Confirmed external-user incident: a Codex (OpenAI adapter) dispatch wrote a
|
|
5
|
-
* modified tracked file to the MAIN repo instead of the isolated worktree, then:
|
|
6
|
-
* 1. spawnBifrost never set CLAUDE_PROJECT_DIR / never captured
|
|
7
|
-
* originalWorktreeHead → detectWorktreeLeak NEVER fired for Bifrost.
|
|
8
|
-
* 2. detectWorktreeLeak was WARN-ONLY: it wrote a marker + console.error but
|
|
9
|
-
* did NOT salvage the leaked content nor block the dispatch, so the file
|
|
10
|
-
* sat in the main working tree where a later force-checkout could discard
|
|
11
|
-
* it, and the dispatch was still reported as a clean success.
|
|
12
|
-
*
|
|
13
|
-
* This test drives the REAL detectWorktreeLeak (exported from runner.js) against
|
|
14
|
-
* a synthetic temp repo + worktree (no external repo needed), simulating a
|
|
15
|
-
* dispatch that produced ZERO task-branch commits while the main repo has an
|
|
16
|
-
* uncommitted TRACKED modification. It asserts:
|
|
17
|
-
* • the leak is SALVAGED — recoverable on a branch, and
|
|
18
|
-
* • the dispatch is BLOCKED — child._formationExitCode flips to 1.
|
|
19
|
-
*
|
|
20
|
-
* Revert-proof: if the runner.js change (salvage + block) is reverted, this test
|
|
21
|
-
* fails (no salvage branch / exit code stays 0).
|
|
22
|
-
*
|
|
23
|
-
* Scaffolding mirrors ./post-complete/worktree-rescue.test.js (TASK_1529).
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
const test = require('node:test');
|
|
27
|
-
const assert = require('node:assert/strict');
|
|
28
|
-
const fs = require('fs');
|
|
29
|
-
const os = require('os');
|
|
30
|
-
const path = require('path');
|
|
31
|
-
const { execSync } = require('child_process');
|
|
32
|
-
|
|
33
|
-
const { detectWorktreeLeak } = require('./runner');
|
|
34
|
-
|
|
35
|
-
function git(cmd, cwd) {
|
|
36
|
-
return execSync(cmd, { cwd, encoding: 'utf8', timeout: 20000, stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
37
|
-
}
|
|
38
|
-
function gitSafe(cmd, cwd) {
|
|
39
|
-
try { return git(cmd, cwd); } catch { return null; }
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function makeGitRepo(dir) {
|
|
43
|
-
git('git init', dir);
|
|
44
|
-
git('git config user.email "test@test.com"', dir);
|
|
45
|
-
git('git config user.name "Test"', dir);
|
|
46
|
-
git('git config commit.gpgsign false', dir);
|
|
47
|
-
gitSafe('git checkout -b userwork', dir);
|
|
48
|
-
fs.writeFileSync(path.join(dir, 'README.md'), 'init\n');
|
|
49
|
-
git('git add README.md', dir);
|
|
50
|
-
git('git commit --no-verify -m "init"', dir);
|
|
51
|
-
const cur = git('git rev-parse --abbrev-ref HEAD', dir);
|
|
52
|
-
if (cur !== 'userwork') git(`git branch -m ${cur} userwork`, dir);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function setup() {
|
|
56
|
-
const tmpRoot = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'tn1530-')));
|
|
57
|
-
const repo = path.join(tmpRoot, 'repo');
|
|
58
|
-
fs.mkdirSync(repo, { recursive: true });
|
|
59
|
-
makeGitRepo(repo);
|
|
60
|
-
return { tmpRoot, repo };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function teardown(tmpRoot, repo) {
|
|
64
|
-
try {
|
|
65
|
-
const wt = git('git worktree list --porcelain', repo);
|
|
66
|
-
for (const line of wt.split('\n')) {
|
|
67
|
-
if (line.startsWith('worktree ')) {
|
|
68
|
-
const p = line.slice('worktree '.length).trim();
|
|
69
|
-
if (p && path.resolve(p) !== path.resolve(repo)) {
|
|
70
|
-
gitSafe(`git worktree remove --force "${p}"`, repo);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
} catch { /* best effort */ }
|
|
75
|
-
fs.rmSync(tmpRoot, { recursive: true, force: true });
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
79
|
-
// LEAK: zero task-branch commits + main repo has an uncommitted tracked change.
|
|
80
|
-
// detectWorktreeLeak must SALVAGE the leaked change AND BLOCK the dispatch.
|
|
81
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
82
|
-
|
|
83
|
-
test('TASK_1530: Bifrost write-leak (zero task commits + dirty main) is salvaged AND blocks dispatch', () => {
|
|
84
|
-
const { tmpRoot, repo } = setup();
|
|
85
|
-
try {
|
|
86
|
-
// Baseline tracked file the user cares about.
|
|
87
|
-
const lostContent = 'module.exports = { version: 2, critical: true };\n';
|
|
88
|
-
fs.writeFileSync(path.join(repo, 'kb.js'), 'module.exports = { version: 1 };\n');
|
|
89
|
-
git('git add kb.js', repo);
|
|
90
|
-
git('git commit --no-verify -m "seed kb.js baseline"', repo);
|
|
91
|
-
|
|
92
|
-
// Agent worktree on a task branch — snapshot HEAD BEFORE any agent work
|
|
93
|
-
// (exactly what spawnBifrost now captures as originalWorktreeHead).
|
|
94
|
-
const worktree = path.join(tmpRoot, 'wt');
|
|
95
|
-
git(`git worktree add -b task/task_repro1530 "${worktree}" HEAD`, repo);
|
|
96
|
-
const originalWorktreeHead = git('git rev-parse HEAD', worktree);
|
|
97
|
-
|
|
98
|
-
// THE BUG: the Codex agent produced ZERO commits on the task branch, and its
|
|
99
|
-
// modified tracked file landed in the MAIN repo (CLAUDE_PROJECT_DIR misroute).
|
|
100
|
-
fs.writeFileSync(path.join(repo, 'kb.js'), lostContent);
|
|
101
|
-
|
|
102
|
-
// Simulate runner.js's child object so the function can flip the exit code.
|
|
103
|
-
const child = { _formation: { sessionId: 'sess1530', skill: 'feature_agent' } };
|
|
104
|
-
|
|
105
|
-
// Drive the REAL detector against the synthetic repo (mainRoot = temp repo).
|
|
106
|
-
const res = detectWorktreeLeak(worktree, originalWorktreeHead, child, repo);
|
|
107
|
-
|
|
108
|
-
// 1) A leak must be reported.
|
|
109
|
-
assert.ok(res && res.leaked === true, `expected leak to be detected, got ${JSON.stringify(res)}`);
|
|
110
|
-
|
|
111
|
-
// 2) The dispatch must be BLOCKED: exit code flipped to 1.
|
|
112
|
-
assert.equal(child._formationExitCode, 1,
|
|
113
|
-
`expected child._formationExitCode=1 (blocked), got ${child._formationExitCode}`);
|
|
114
|
-
assert.ok(child._formationLeak, 'expected child._formationLeak to be set');
|
|
115
|
-
|
|
116
|
-
// 3) The leaked modification must be SALVAGED onto a recoverable branch.
|
|
117
|
-
assert.ok(res.salvageBranch, `expected a salvage branch, got ${res.salvageBranch}`);
|
|
118
|
-
const salvaged = gitSafe(`git show ${res.salvageBranch}:kb.js`, repo);
|
|
119
|
-
assert.equal(salvaged, lostContent.trim(),
|
|
120
|
-
`salvage branch must contain the leaked kb.js content. Got: ${JSON.stringify(salvaged)}`);
|
|
121
|
-
|
|
122
|
-
// 4) A LEAK_DETECTED marker is persisted in the worktree.
|
|
123
|
-
assert.ok(fs.existsSync(path.join(worktree, 'LEAK_DETECTED')), 'expected LEAK_DETECTED marker');
|
|
124
|
-
} finally {
|
|
125
|
-
teardown(tmpRoot, repo);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
130
|
-
// REGRESSION GUARD: a healthy dispatch (>=1 task-branch commit) must NOT be
|
|
131
|
-
// flagged as a leak even if the main repo happens to be dirty.
|
|
132
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
133
|
-
|
|
134
|
-
test('TASK_1530 regression: dispatch WITH task-branch commits is NOT flagged as leak', () => {
|
|
135
|
-
const { tmpRoot, repo } = setup();
|
|
136
|
-
try {
|
|
137
|
-
fs.writeFileSync(path.join(repo, 'kb.js'), 'v1\n');
|
|
138
|
-
git('git add kb.js', repo);
|
|
139
|
-
git('git commit --no-verify -m "seed"', repo);
|
|
140
|
-
|
|
141
|
-
const worktree = path.join(tmpRoot, 'wt');
|
|
142
|
-
git(`git worktree add -b task/task_ok1530 "${worktree}" HEAD`, repo);
|
|
143
|
-
const originalWorktreeHead = git('git rev-parse HEAD', worktree);
|
|
144
|
-
|
|
145
|
-
// Agent committed real work on the task branch (the healthy path).
|
|
146
|
-
fs.writeFileSync(path.join(worktree, 'feature.js'), 'export const x = 1;\n');
|
|
147
|
-
git('git add feature.js', worktree);
|
|
148
|
-
git('git commit --no-verify -m "[TASK_OK1530] add feature"', worktree);
|
|
149
|
-
|
|
150
|
-
// Main repo is incidentally dirty (e.g. unrelated state files).
|
|
151
|
-
fs.writeFileSync(path.join(repo, 'kb.js'), 'v1\nincidental\n');
|
|
152
|
-
|
|
153
|
-
const child = { _formation: { sessionId: 'sessok', skill: 'feature_agent' } };
|
|
154
|
-
const res = detectWorktreeLeak(worktree, originalWorktreeHead, child, repo);
|
|
155
|
-
|
|
156
|
-
assert.equal(res, null, `healthy dispatch must not be flagged as leak, got ${JSON.stringify(res)}`);
|
|
157
|
-
assert.equal(child._formationExitCode, undefined, 'exit code must remain unset for healthy dispatch');
|
|
158
|
-
assert.ok(!child._formationLeak, 'no leak record for healthy dispatch');
|
|
159
|
-
} finally {
|
|
160
|
-
teardown(tmpRoot, repo);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.status = status;
|
|
4
|
-
exports.register = register;
|
|
5
|
-
const output_1 = require("../core/output");
|
|
6
|
-
// TASK_2361: Alaya device registration without the Dashboard Google login.
|
|
7
|
-
//
|
|
8
|
-
// Flow (RFC 8628 style, relay contract documented in TASK_2361):
|
|
9
|
-
// POST {relay}/auth/device/start -> {device_code, user_code, verification_url, interval, expires_in}
|
|
10
|
-
// user opens verification_url in any browser and approves (Google login at the relay)
|
|
11
|
-
// POST {relay}/auth/device/poll {device_code} -> 202 pending | 200 {token} | 410 expired | 403 denied
|
|
12
|
-
// The JWT is handed to the local kenaz-server, which runs the one existing
|
|
13
|
-
// register-device implementation (hub_client::register_alaya_device).
|
|
14
|
-
// The JWT is held in memory only: never printed, never written.
|
|
15
|
-
const server = () => process.env.KENAZ_SERVER_URL || `http://127.0.0.1:${process.env.KENAZ_HTTP_PORT || "18080"}`;
|
|
16
|
-
const relay = () => (process.env.KENAZ_RELAY_URL || "https://app.kenazai.com").replace(/\/+$/, "");
|
|
17
|
-
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
18
|
-
const fail = (msg) => {
|
|
19
|
-
console.error(msg);
|
|
20
|
-
process.exit(1);
|
|
21
|
-
};
|
|
22
|
-
async function serverFetch(path, init) {
|
|
23
|
-
try {
|
|
24
|
-
return await fetch(`${server()}${path}`, init);
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return fail(`Cannot reach kenaz-server at ${server()}. Start it first (kenaz-server or the Dashboard).`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async function status(flags) {
|
|
31
|
-
const res = await serverFetch("/api/rust/alaya/status");
|
|
32
|
-
if (!res.ok)
|
|
33
|
-
fail(`kenaz-server returned ${res.status}`);
|
|
34
|
-
const s = (await res.json());
|
|
35
|
-
(0, output_1.output)(flags.json
|
|
36
|
-
? s
|
|
37
|
-
: `Alaya: ${s.registered ? "registered" : "not registered"}; outbox depth: ${s.outbox_depth}` +
|
|
38
|
-
(s.registered ? "" : "\nRun: k-cli alaya register"), flags);
|
|
39
|
-
}
|
|
40
|
-
async function register(flags) {
|
|
41
|
-
const st = await serverFetch("/api/rust/alaya/status");
|
|
42
|
-
if (st.ok && (await st.json()).registered) {
|
|
43
|
-
(0, output_1.output)(flags.json ? { registered: true, already_registered: true } : "Alaya: already registered", flags);
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const start = await fetch(`${relay()}/auth/device/start`, {
|
|
47
|
-
method: "POST",
|
|
48
|
-
headers: { "content-type": "application/json" },
|
|
49
|
-
body: "{}",
|
|
50
|
-
}).catch((e) => fail(`Cannot reach relay ${relay()}: ${e.message}`));
|
|
51
|
-
if (start.status === 404) {
|
|
52
|
-
fail(`Relay ${relay()} has no device-code endpoint yet (POST /auth/device/start).\n` +
|
|
53
|
-
"Hub/relay change required; see TASK_2361 technical notes. Meanwhile, log in once via the Dashboard.");
|
|
54
|
-
}
|
|
55
|
-
if (!start.ok)
|
|
56
|
-
fail(`Relay device/start failed: HTTP ${start.status}`);
|
|
57
|
-
const d = (await start.json());
|
|
58
|
-
console.log(`Open ${d.verification_url} in any browser and enter code: ${d.user_code}`);
|
|
59
|
-
const deadline = Date.now() + (d.expires_in ?? 600) * 1000;
|
|
60
|
-
const intervalMs = Math.max(1, d.interval ?? 5) * 1000;
|
|
61
|
-
let token = "";
|
|
62
|
-
while (Date.now() < deadline) {
|
|
63
|
-
await sleep(intervalMs);
|
|
64
|
-
const p = await fetch(`${relay()}/auth/device/poll`, {
|
|
65
|
-
method: "POST",
|
|
66
|
-
headers: { "content-type": "application/json" },
|
|
67
|
-
body: JSON.stringify({ device_code: d.device_code }),
|
|
68
|
-
}).catch(() => null);
|
|
69
|
-
if (!p || p.status === 202 || p.status === 428)
|
|
70
|
-
continue;
|
|
71
|
-
if (p.status === 403)
|
|
72
|
-
fail("Approval denied.");
|
|
73
|
-
if (p.status === 410)
|
|
74
|
-
fail("Code expired. Run the command again.");
|
|
75
|
-
if (!p.ok)
|
|
76
|
-
fail(`Relay device/poll failed: HTTP ${p.status}`);
|
|
77
|
-
token = (await p.json()).token ?? "";
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
if (!token)
|
|
81
|
-
fail("Timed out waiting for approval.");
|
|
82
|
-
const r = await serverFetch("/api/rust/alaya/register", {
|
|
83
|
-
method: "POST",
|
|
84
|
-
headers: { "content-type": "application/json" },
|
|
85
|
-
body: JSON.stringify({ token }),
|
|
86
|
-
});
|
|
87
|
-
const res = (await r.json().catch(() => ({})));
|
|
88
|
-
if (!r.ok || !res.registered)
|
|
89
|
-
fail(`Registration failed: ${res.error ?? `HTTP ${r.status}`}`);
|
|
90
|
-
(0, output_1.output)(flags.json ? res : "Alaya: registered (~/.kenaz/alaya.toml written); queued reports will drain", flags);
|
|
91
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatTable = formatTable;
|
|
4
|
-
exports.output = output;
|
|
5
|
-
function formatTable(headers, rows) {
|
|
6
|
-
const colWidths = headers.map((h, i) => {
|
|
7
|
-
const vals = [h, ...rows.map((r) => String(r[i] || ""))];
|
|
8
|
-
return Math.max(...vals.map((v) => v.length));
|
|
9
|
-
});
|
|
10
|
-
const sep = colWidths.map((w) => "-".repeat(w + 2)).join("+");
|
|
11
|
-
const line = (cells) => cells.map((c, i) => ` ${String(c).padEnd(colWidths[i])} `).join("|");
|
|
12
|
-
return [line(headers), sep, ...rows.map((r) => line(r))].join("\n");
|
|
13
|
-
}
|
|
14
|
-
function output(data, opts = {}) {
|
|
15
|
-
if (opts.json) {
|
|
16
|
-
console.log(JSON.stringify(data, null, 2));
|
|
17
|
-
}
|
|
18
|
-
else if (typeof data === "string") {
|
|
19
|
-
console.log(data);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
console.log(JSON.stringify(data, null, 2));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.nodeProcess = nodeProcess;
|
|
4
|
-
const child_process_1 = require("child_process");
|
|
5
|
-
/**
|
|
6
|
-
* Spawn a process and return stdout.
|
|
7
|
-
* cmd defaults to node (process.execPath).
|
|
8
|
-
* shell defaults to false to avoid Windows arg escaping issues.
|
|
9
|
-
*/
|
|
10
|
-
function nodeProcess(args, cwd, timeout = 10000, cmd = process.execPath, shell = false) {
|
|
11
|
-
return new Promise((resolve, reject) => {
|
|
12
|
-
const child = (0, child_process_1.spawn)(cmd, args, {
|
|
13
|
-
cwd,
|
|
14
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
15
|
-
windowsHide: true,
|
|
16
|
-
shell,
|
|
17
|
-
});
|
|
18
|
-
let stdout = "";
|
|
19
|
-
let stderr = "";
|
|
20
|
-
child.stdout.on("data", (d) => (stdout += d));
|
|
21
|
-
child.stderr.on("data", (d) => (stderr += d));
|
|
22
|
-
const timer = setTimeout(() => {
|
|
23
|
-
child.kill();
|
|
24
|
-
reject(new Error("timeout"));
|
|
25
|
-
}, timeout);
|
|
26
|
-
child.on("close", (code) => {
|
|
27
|
-
clearTimeout(timer);
|
|
28
|
-
if (code !== 0)
|
|
29
|
-
reject(new Error(stderr || `exit code ${code}`));
|
|
30
|
-
else
|
|
31
|
-
resolve(stdout.trim());
|
|
32
|
-
});
|
|
33
|
-
child.on("error", (e) => {
|
|
34
|
-
clearTimeout(timer);
|
|
35
|
-
reject(e);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.resolveProject = resolveProject;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const yaml = __importStar(require("yaml"));
|
|
40
|
-
function resolveProject(explicitPath) {
|
|
41
|
-
const cwd = path.resolve(explicitPath || process.cwd());
|
|
42
|
-
const isCore = fs.existsSync(path.join(cwd, ".collaboration", "tasks"));
|
|
43
|
-
const kenazYaml = path.join(cwd, ".kenaz", "project.yaml");
|
|
44
|
-
const hasKenaz = fs.existsSync(kenazYaml);
|
|
45
|
-
// Read .kenaz/project.yaml if it exists
|
|
46
|
-
let config = null;
|
|
47
|
-
if (hasKenaz) {
|
|
48
|
-
const raw = fs.readFileSync(kenazYaml, "utf-8");
|
|
49
|
-
config = yaml.parse(raw);
|
|
50
|
-
}
|
|
51
|
-
// Core project (has .collaboration/tasks)
|
|
52
|
-
if (isCore) {
|
|
53
|
-
return {
|
|
54
|
-
mode: "core",
|
|
55
|
-
name: config?.project_name || path.basename(cwd),
|
|
56
|
-
path: cwd,
|
|
57
|
-
core_path: cwd,
|
|
58
|
-
config,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
// Sub-project (has .kenaz/project.yaml but no .collaboration/tasks)
|
|
62
|
-
if (hasKenaz && config) {
|
|
63
|
-
const corePath = path.resolve(config.core_path || cwd);
|
|
64
|
-
return {
|
|
65
|
-
mode: "sub-project",
|
|
66
|
-
name: config.project_name || path.basename(cwd),
|
|
67
|
-
path: cwd,
|
|
68
|
-
core_path: corePath,
|
|
69
|
-
config,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
// Unknown — no detection, no guessing
|
|
73
|
-
return {
|
|
74
|
-
mode: "unknown",
|
|
75
|
-
name: path.basename(cwd),
|
|
76
|
-
path: cwd,
|
|
77
|
-
core_path: cwd,
|
|
78
|
-
config: null,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.spawnClaude = spawnClaude;
|
|
37
|
-
exports.collectClaudeOutput = collectClaudeOutput;
|
|
38
|
-
exports.streamClaudeOutput = streamClaudeOutput;
|
|
39
|
-
const child_process_1 = require("child_process");
|
|
40
|
-
const path = __importStar(require("path"));
|
|
41
|
-
const fs = __importStar(require("fs"));
|
|
42
|
-
/**
|
|
43
|
-
* Detect git-bash path on Windows.
|
|
44
|
-
* Claude Code requires git-bash to run on Windows.
|
|
45
|
-
*/
|
|
46
|
-
function detectGitBash() {
|
|
47
|
-
try {
|
|
48
|
-
const gitPaths = (0, child_process_1.execSync)("where git", { encoding: "utf8", timeout: 5000, windowsHide: true })
|
|
49
|
-
.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
50
|
-
for (const gitPath of gitPaths) {
|
|
51
|
-
let dir = path.dirname(gitPath);
|
|
52
|
-
for (let i = 0; i < 4; i++) {
|
|
53
|
-
const bashPath = path.join(dir, "bin", "bash.exe");
|
|
54
|
-
if (fs.existsSync(bashPath))
|
|
55
|
-
return bashPath;
|
|
56
|
-
dir = path.dirname(dir);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
catch { }
|
|
61
|
-
const fallbacks = [
|
|
62
|
-
"C:\\Program Files\\Git\\bin\\bash.exe",
|
|
63
|
-
"C:\\Program Files (x86)\\Git\\bin\\bash.exe",
|
|
64
|
-
"D:\\Program Files\\Git\\bin\\bash.exe",
|
|
65
|
-
];
|
|
66
|
-
for (const p of fallbacks) {
|
|
67
|
-
if (fs.existsSync(p))
|
|
68
|
-
return p;
|
|
69
|
-
}
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Detect the claude CLI command path.
|
|
74
|
-
*/
|
|
75
|
-
function detectClaudeCmd() {
|
|
76
|
-
if (process.platform !== "win32")
|
|
77
|
-
return "claude";
|
|
78
|
-
try {
|
|
79
|
-
const result = (0, child_process_1.execSync)("where claude", { encoding: "utf8", timeout: 5000, windowsHide: true })
|
|
80
|
-
.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
81
|
-
if (result.length > 0) {
|
|
82
|
-
return result.find((p) => p.endsWith(".cmd")) || result[0];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch { }
|
|
86
|
-
const homedir = process.env.USERPROFILE || process.env.HOME || "";
|
|
87
|
-
const candidates = [
|
|
88
|
-
path.join(homedir, ".claude", "local", "claude.exe"),
|
|
89
|
-
path.join(homedir, ".claude", "bin", "claude.exe"),
|
|
90
|
-
];
|
|
91
|
-
for (const p of candidates) {
|
|
92
|
-
if (fs.existsSync(p))
|
|
93
|
-
return p;
|
|
94
|
-
}
|
|
95
|
-
return "claude.cmd";
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Build a clean env for Claude subprocesses.
|
|
99
|
-
* Mirrors .formation/tools/utils.js getClaudeEnv()
|
|
100
|
-
*/
|
|
101
|
-
function getClaudeEnv() {
|
|
102
|
-
const env = { ...process.env };
|
|
103
|
-
// Remove CLAUDECODE to avoid nested session error
|
|
104
|
-
delete env.CLAUDECODE;
|
|
105
|
-
// Windows: ensure git-bash path is set
|
|
106
|
-
if (process.platform === "win32" && !env.CLAUDE_CODE_GIT_BASH_PATH) {
|
|
107
|
-
const gitBash = detectGitBash();
|
|
108
|
-
if (gitBash)
|
|
109
|
-
env.CLAUDE_CODE_GIT_BASH_PATH = gitBash;
|
|
110
|
-
}
|
|
111
|
-
return env;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Spawn a Claude CLI subprocess.
|
|
115
|
-
*
|
|
116
|
-
* Returns the ChildProcess. Caller is responsible for
|
|
117
|
-
* listening on stdout/stderr/close events.
|
|
118
|
-
*/
|
|
119
|
-
function spawnClaude(opts) {
|
|
120
|
-
const { prompt, cwd, allowedTools = "Bash,Read,Edit,Write,Glob,Grep", disallowedTools, extraArgs = [], projectPath = null, } = opts;
|
|
121
|
-
const claudeCmd = detectClaudeCmd();
|
|
122
|
-
const args = [
|
|
123
|
-
"-p", "-",
|
|
124
|
-
"--dangerously-skip-permissions",
|
|
125
|
-
"--output-format", "stream-json",
|
|
126
|
-
"--verbose",
|
|
127
|
-
"--allowedTools", allowedTools,
|
|
128
|
-
...(disallowedTools ? ["--disallowedTools", disallowedTools] : []),
|
|
129
|
-
...extraArgs,
|
|
130
|
-
];
|
|
131
|
-
const env = getClaudeEnv();
|
|
132
|
-
// Sub-project git isolation
|
|
133
|
-
if (projectPath && projectPath !== cwd) {
|
|
134
|
-
const parentDir = path.dirname(projectPath);
|
|
135
|
-
env.GIT_CEILING_DIRECTORIES = parentDir;
|
|
136
|
-
}
|
|
137
|
-
const child = (0, child_process_1.spawn)(claudeCmd, args, {
|
|
138
|
-
cwd: projectPath || cwd,
|
|
139
|
-
env,
|
|
140
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
141
|
-
windowsHide: true,
|
|
142
|
-
shell: true,
|
|
143
|
-
});
|
|
144
|
-
child.stdin.write(prompt, "utf8");
|
|
145
|
-
child.stdin.end();
|
|
146
|
-
return child;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Format a tool_use block into a concise one-liner.
|
|
150
|
-
*/
|
|
151
|
-
function formatToolUse(block) {
|
|
152
|
-
const name = block.name || "unknown";
|
|
153
|
-
const input = block.input || {};
|
|
154
|
-
// Extract the most relevant field for each tool type
|
|
155
|
-
if (name === "Bash" && input.command) {
|
|
156
|
-
const cmd = String(input.command);
|
|
157
|
-
const short = cmd.length > 120 ? cmd.slice(0, 120) + "..." : cmd;
|
|
158
|
-
return `[${name}] ${short}`;
|
|
159
|
-
}
|
|
160
|
-
if ((name === "Read" || name === "Write") && input.file_path) {
|
|
161
|
-
return `[${name}] ${input.file_path}`;
|
|
162
|
-
}
|
|
163
|
-
if (name === "Edit" && input.file_path) {
|
|
164
|
-
return `[${name}] ${input.file_path}`;
|
|
165
|
-
}
|
|
166
|
-
if ((name === "Glob" || name === "Grep") && input.pattern) {
|
|
167
|
-
return `[${name}] ${input.pattern}`;
|
|
168
|
-
}
|
|
169
|
-
// Fallback: tool name + first string value
|
|
170
|
-
const firstVal = Object.values(input).find((v) => typeof v === "string");
|
|
171
|
-
return firstVal ? `[${name}] ${String(firstVal).slice(0, 80)}` : `[${name}]`;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Collect Claude stream-json stdout as a string (no console output).
|
|
175
|
-
* Used when the caller needs to parse the result programmatically.
|
|
176
|
-
*/
|
|
177
|
-
function collectClaudeOutput(child) {
|
|
178
|
-
return new Promise((resolve, reject) => {
|
|
179
|
-
let stderr = "";
|
|
180
|
-
let result = "";
|
|
181
|
-
child.stdout.on("data", (d) => {
|
|
182
|
-
const lines = d.toString().split("\n").filter((l) => l.trim());
|
|
183
|
-
for (const line of lines) {
|
|
184
|
-
try {
|
|
185
|
-
const evt = JSON.parse(line);
|
|
186
|
-
if (evt.type === "assistant" && evt.message?.content) {
|
|
187
|
-
for (const block of evt.message.content) {
|
|
188
|
-
if (block.type === "text" && block.text) {
|
|
189
|
-
result += block.text;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else if (evt.type === "result" && typeof evt.result === "string") {
|
|
194
|
-
result += evt.result;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch {
|
|
198
|
-
// not JSON — skip
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
child.stderr.on("data", (d) => (stderr += d));
|
|
203
|
-
child.on("close", (code) => {
|
|
204
|
-
if (code !== 0) {
|
|
205
|
-
reject(new Error(`Claude exited with code ${code}${stderr ? `: ${stderr.slice(0, 500)}` : ""}`));
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
resolve(result);
|
|
209
|
-
});
|
|
210
|
-
child.on("error", (e) => reject(e));
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Parse Claude stream-json stdout and output formatted content.
|
|
215
|
-
* - text blocks: output as-is
|
|
216
|
-
* - tool_use blocks: formatted one-liner showing what the agent is doing
|
|
217
|
-
* - thinking, raw JSON: filtered out
|
|
218
|
-
*/
|
|
219
|
-
function streamClaudeOutput(child) {
|
|
220
|
-
return new Promise((resolve, reject) => {
|
|
221
|
-
let stderr = "";
|
|
222
|
-
let hasOutput = false;
|
|
223
|
-
child.stdout.on("data", (d) => {
|
|
224
|
-
const lines = d.toString().split("\n").filter((l) => l.trim());
|
|
225
|
-
for (const line of lines) {
|
|
226
|
-
try {
|
|
227
|
-
const evt = JSON.parse(line);
|
|
228
|
-
if (evt.type === "assistant" && evt.message?.content) {
|
|
229
|
-
for (const block of evt.message.content) {
|
|
230
|
-
if (block.type === "text" && block.text) {
|
|
231
|
-
hasOutput = true;
|
|
232
|
-
process.stdout.write(block.text);
|
|
233
|
-
}
|
|
234
|
-
else if (block.type === "tool_use") {
|
|
235
|
-
hasOutput = true;
|
|
236
|
-
console.log(formatToolUse(block));
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
else if (evt.type === "result" && evt.result) {
|
|
241
|
-
hasOutput = true;
|
|
242
|
-
console.log(evt.result);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
catch {
|
|
246
|
-
// not JSON — skip
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
child.stderr.on("data", (d) => (stderr += d));
|
|
251
|
-
child.on("close", (code) => {
|
|
252
|
-
if (code !== 0) {
|
|
253
|
-
console.error(`\nError: Claude exited with code ${code}`);
|
|
254
|
-
if (stderr)
|
|
255
|
-
console.error(stderr);
|
|
256
|
-
process.exit(1);
|
|
257
|
-
}
|
|
258
|
-
if (!hasOutput) {
|
|
259
|
-
console.error("\nWarning: Claude exited successfully but produced no output.", "\nThis may indicate nested session detection.", stderr ? `\nStderr: ${stderr.slice(0, 500)}` : "");
|
|
260
|
-
}
|
|
261
|
-
resolve();
|
|
262
|
-
});
|
|
263
|
-
child.on("error", (e) => {
|
|
264
|
-
console.error(`Error spawning Claude: ${e.message}`);
|
|
265
|
-
reject(e);
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
}
|