kenaz 0.3.2 → 0.3.3
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 +19 -30
- package/core/.claude/hooks/_ansuz-conversation.js +1 -0
- package/core/.claude/hooks/_ansuz-conversation.test.js +6 -0
- package/core/.claude/hooks/_run-user-prompt.js +0 -4
- package/core/.claude/hooks/_run-user-prompt.test.js +2 -3
- package/core/.claude/hooks/session-init.ps1 +49 -49
- package/core/.claude/settings.json +0 -37
- 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 +3 -8
- package/core/.formation/tests/hello.txt +2 -2
- package/core/.formation/tools/prompt.js +58 -5
- package/core/.formation/tools/prompt.test.js +29 -0
- package/core/.kenaz/claude-hooks-manifest.json +16 -16
- 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/Ansuz/RULES.md +6 -10
- package/core/.specialist/tools/__tests__/task-2218-boot-session-id.test.js +17 -1
- package/core/.specialist/tools/__tests__/task-2222-session-identity-interleave.test.js +17 -1
- package/core/.specialist/tools/__tests__/task-2254-handoff-archive-contract.test.js +6 -5
- package/core/.specialist/tools/ansuz-boot-fast.js +44 -100
- package/core/.specialist/tools/ansuz-boot-fast.test.js +45 -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/plans/ANSUZ_SLIM_PLAN.md +68 -0
- 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/dist/alaya/run.js +91 -0
- package/core/k-cli/dist/core/output.js +24 -0
- package/core/k-cli/dist/core/process.js +38 -0
- package/core/k-cli/dist/core/project.js +80 -0
- package/core/k-cli/dist/core/spawn.js +268 -0
- package/core/k-cli/dist/core/types.js +2 -0
- package/core/k-cli/dist/dashboard/update.js +53 -0
- package/core/k-cli/dist/dashboard/version.js +20 -0
- package/core/k-cli/dist/dispatch/run.js +241 -0
- package/core/k-cli/dist/dispatch/status.js +103 -0
- package/core/k-cli/dist/index.js +283 -0
- package/core/k-cli/dist/project/initialize.js +301 -0
- package/core/k-cli/dist/project/install.js +89 -0
- package/core/k-cli/dist/project/status.js +138 -0
- package/core/k-cli/dist/specialist/list.js +100 -0
- package/core/k-cli/dist/specialist/run.js +93 -0
- package/core/k-cli/dist/task/create.js +194 -0
- package/core/k-cli/dist/task/delete.js +98 -0
- package/core/k-cli/dist/task/get.js +55 -0
- package/core/k-cli/dist/task/list.js +58 -0
- package/core/k-cli/dist/task/submit.js +156 -0
- package/core/k-cli/dist/ygg/run.js +51 -0
- package/core/k-cli/node_modules/.bin/yaml +16 -0
- package/core/k-cli/node_modules/.bin/yaml.cmd +17 -0
- package/core/k-cli/node_modules/.bin/yaml.ps1 +28 -0
- package/core/k-cli/node_modules/.package-lock.json +23 -0
- package/core/k-cli/node_modules/yaml/LICENSE +13 -0
- package/core/k-cli/node_modules/yaml/README.md +172 -0
- package/core/k-cli/node_modules/yaml/bin.mjs +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +217 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/core/k-cli/node_modules/yaml/browser/dist/errors.js +57 -0
- package/core/k-cli/node_modules/yaml/browser/dist/index.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/log.js +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +114 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +717 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +967 -0
- package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/core/k-cli/node_modules/yaml/browser/dist/util.js +11 -0
- package/core/k-cli/node_modules/yaml/browser/dist/visit.js +233 -0
- package/core/k-cli/node_modules/yaml/browser/index.js +5 -0
- package/core/k-cli/node_modules/yaml/browser/package.json +3 -0
- package/core/k-cli/node_modules/yaml/dist/cli.d.ts +8 -0
- package/core/k-cli/node_modules/yaml/dist/cli.mjs +201 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/core/k-cli/node_modules/yaml/dist/compose/composer.js +222 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +225 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/core/k-cli/node_modules/yaml/dist/doc/Document.js +337 -0
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/core/k-cli/node_modules/yaml/dist/doc/directives.js +178 -0
- package/core/k-cli/node_modules/yaml/dist/errors.d.ts +21 -0
- package/core/k-cli/node_modules/yaml/dist/errors.js +62 -0
- package/core/k-cli/node_modules/yaml/dist/index.d.ts +25 -0
- package/core/k-cli/node_modules/yaml/dist/index.js +50 -0
- package/core/k-cli/node_modules/yaml/dist/log.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/log.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +116 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +43 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/options.d.ts +350 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/core/k-cli/node_modules/yaml/dist/parse/cst.js +112 -0
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +719 -0
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/core/k-cli/node_modules/yaml/dist/parse/parser.js +972 -0
- package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/core/k-cli/node_modules/yaml/dist/public-api.js +107 -0
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/core/k-cli/node_modules/yaml/dist/schema/tags.js +99 -0
- package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +26 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/core/k-cli/node_modules/yaml/dist/test-events.js +134 -0
- package/core/k-cli/node_modules/yaml/dist/util.d.ts +16 -0
- package/core/k-cli/node_modules/yaml/dist/util.js +28 -0
- package/core/k-cli/node_modules/yaml/dist/visit.d.ts +102 -0
- package/core/k-cli/node_modules/yaml/dist/visit.js +236 -0
- package/core/k-cli/node_modules/yaml/package.json +97 -0
- package/core/k-cli/node_modules/yaml/util.js +2 -0
- package/core/plugins/kenaz/commands/Ansuz.md +19 -30
- package/core/plugins/kenaz/hooks/hooks.json +1 -5
- package/core/plugins/kenaz/hooks/kenaz-hook.js +0 -4
- package/core/plugins/kenaz/scripts/kenaz.test.js +1 -1
- 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 +36 -2
- package/lib/cli.test.js +24 -0
- package/lib/dashboard.js +10 -0
- package/package.json +6 -6
- package/core/.specialist/tools/__tests__/task-1863-boot-lease-reuse.test.js +0 -99
- package/core/.specialist/tools/__tests__/task-1977-banner-cap.test.js +0 -129
|
@@ -55,6 +55,21 @@ const check = (name, cond, detail) => {
|
|
|
55
55
|
cond ? pass++ : fail++;
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
// TASK_2381: boot only adopts a hint that names THIS session (a transcript for that id under this
|
|
59
|
+
// cwd's ~/.claude/projects dir) and prefers CLAUDE_CODE_SESSION_ID. Tests run inside Claude Code,
|
|
60
|
+
// so the child gets a sandbox HOME and no inherited session id.
|
|
61
|
+
function sandboxHome(sandbox) { return path.join(sandbox, '_home'); }
|
|
62
|
+
function ownTranscript(sandbox, id) {
|
|
63
|
+
const dir = path.join(sandboxHome(sandbox), '.claude', 'projects', path.resolve(sandbox).replace(/[^a-zA-Z0-9]/g, '-'));
|
|
64
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
65
|
+
fs.writeFileSync(path.join(dir, id + '.jsonl'), '');
|
|
66
|
+
}
|
|
67
|
+
function bootEnv(sandbox) {
|
|
68
|
+
const env = { ...process.env, CLAUDE_PROJECT_DIR: sandbox, HOME: sandboxHome(sandbox), USERPROFILE: sandboxHome(sandbox) };
|
|
69
|
+
delete env.CLAUDE_CODE_SESSION_ID;
|
|
70
|
+
return env;
|
|
71
|
+
}
|
|
72
|
+
|
|
58
73
|
function freshSandbox(tag) {
|
|
59
74
|
const dir = path.join(os.tmpdir(), 'kenaz_t2222_' + tag + '_' + process.pid);
|
|
60
75
|
for (const d of [
|
|
@@ -78,10 +93,11 @@ function fireHook(sandbox, sessionId, transcriptPath) {
|
|
|
78
93
|
timeout: 10000,
|
|
79
94
|
});
|
|
80
95
|
if (r.status !== 0) throw new Error('hook failed: ' + r.stderr);
|
|
96
|
+
ownTranscript(sandbox, sessionId); // the hooked session really exists in this cwd (TASK_2381 hint gate)
|
|
81
97
|
}
|
|
82
98
|
|
|
83
99
|
function boot(sandbox, extraArgs) {
|
|
84
|
-
const env =
|
|
100
|
+
const env = bootEnv(sandbox);
|
|
85
101
|
return spawnSync(process.execPath, [
|
|
86
102
|
BOOT,
|
|
87
103
|
'--project-path=' + sandbox,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// TASK_2254
|
|
1
|
+
// TASK_2254 (amended TASK_2392: boot no longer archives; handoff is frozen) -- readLatestHandoff contract;
|
|
2
2
|
// post-complete readLatestHandoff must still find the newest one afterwards.
|
|
3
3
|
// Drives the REAL ansuz-boot-fast.js (subprocess) and the REAL exported
|
|
4
4
|
// post-complete.readLatestHandoff against a temp project root.
|
|
@@ -31,17 +31,18 @@ function boot(sb) {
|
|
|
31
31
|
{ encoding: 'utf8', env: { ...process.env, CLAUDE_PROJECT_DIR: sb }, windowsHide: true, cwd: sb, timeout: 30000 });
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
test('boot archives slots
|
|
34
|
+
test('TASK_2392: boot no longer archives slots (handoff frozen); readLatestHandoff still finds the newest live one', () => {
|
|
35
35
|
const sb = sandbox();
|
|
36
36
|
try {
|
|
37
37
|
slot(sb, 'a.json', 'OLD', '2026-10-01T00:00:00.000Z');
|
|
38
38
|
slot(sb, 'b.json', 'NEWEST', '2026-10-03T00:00:00.000Z');
|
|
39
39
|
slot(sb, 'c.json', 'MID', '2026-10-02T00:00:00.000Z');
|
|
40
40
|
assert.strictEqual(readLatestHandoff(sb).isbar.situation.current_topic, 'NEWEST');
|
|
41
|
-
boot(sb);
|
|
42
|
-
assert.
|
|
41
|
+
const r = boot(sb);
|
|
42
|
+
assert.ok(!/Handoff/.test(r.stdout), 'banner must not print handoff lines: ' + r.stdout);
|
|
43
|
+
assert.strictEqual(fs.readdirSync(path.join(sb, '.kenaz/specialist/handoffs')).length, 3);
|
|
43
44
|
const h = readLatestHandoff(sb);
|
|
44
|
-
assert.ok(h, 'handoff lost
|
|
45
|
+
assert.ok(h, 'handoff lost');
|
|
45
46
|
assert.strictEqual(h.isbar.situation.current_topic, 'NEWEST');
|
|
46
47
|
} finally { fs.rmSync(sb, { recursive: true, force: true }); }
|
|
47
48
|
});
|
|
@@ -855,20 +855,50 @@ function isOutsideAnyProject(source, cwd, base) {
|
|
|
855
855
|
return rel.startsWith('..') || path.isAbsolute(rel);
|
|
856
856
|
}
|
|
857
857
|
|
|
858
|
+
// TASK_2392: pending peer mail for the banner. Read-only GET /api/peer/status (counts only, never
|
|
859
|
+
// bodies, nothing is marked delivered -- turn-context.js still does the real pull). Fail-open: [] when
|
|
860
|
+
// the Dashboard is down. statusJson is injectable for tests.
|
|
861
|
+
function formatPeerMailLines(status) {
|
|
862
|
+
if (!status || typeof status !== 'object') return [];
|
|
863
|
+
const out = [];
|
|
864
|
+
const n = Number(status.pending_count);
|
|
865
|
+
if (Number.isFinite(n) && n > 0) out.push('📨 Peer mail: ' + n + ' pending (delivered on your next prompt)');
|
|
866
|
+
try {
|
|
867
|
+
const { formatWaitingLines } = require(path.join(__dirname, '..', '..', '.claude', 'hooks', '_peer-waiting-line.js'));
|
|
868
|
+
for (const l of formatWaitingLines(status)) out.push(l);
|
|
869
|
+
} catch (_) { /* hook helper absent in this install layout */ }
|
|
870
|
+
return out;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
function fetchPendingPeerLines(baseUrl, timeoutMs, projectDir) {
|
|
874
|
+
return new Promise(function (resolve) {
|
|
875
|
+
let root = projectDir;
|
|
876
|
+
try { root = require(path.join(__dirname, '..', '..', '.claude', 'hooks', '_peer-project-root.js')).resolvePeerProjectRoot(projectDir) || projectDir; } catch (_) {}
|
|
877
|
+
let url;
|
|
878
|
+
try { url = new URL('/api/peer/status?limit=1&projectPath=' + encodeURIComponent(root), baseUrl); } catch (_) { resolve([]); return; }
|
|
879
|
+
const req = http.request(
|
|
880
|
+
{ hostname: url.hostname, port: url.port || 80, path: url.pathname + url.search, method: 'GET', timeout: timeoutMs },
|
|
881
|
+
function (res) {
|
|
882
|
+
let data = '';
|
|
883
|
+
res.on('data', function (d) { data += d; });
|
|
884
|
+
res.on('end', function () { try { resolve(formatPeerMailLines(JSON.parse(data))); } catch (_) { resolve([]); } });
|
|
885
|
+
},
|
|
886
|
+
);
|
|
887
|
+
req.on('timeout', function () { req.destroy(); resolve([]); });
|
|
888
|
+
req.on('error', function () { resolve([]); });
|
|
889
|
+
req.end();
|
|
890
|
+
});
|
|
891
|
+
}
|
|
892
|
+
|
|
858
893
|
async function main() {
|
|
859
894
|
if (isOutsideAnyProject(PIN_SOURCE, process.cwd(), BASE)) {
|
|
860
895
|
process.stdout.write('ᚨ Ansuz: not inside a Kenaz project (cwd=' + process.cwd() + ').' + String.fromCharCode(10) +
|
|
861
896
|
'cd into a project, or run /kenaz init to set this directory up.' + String.fromCharCode(10));
|
|
862
897
|
return;
|
|
863
898
|
}
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
const c = tasks.counts;
|
|
868
|
-
const pct = Math.round(tasks.cancel_rate * 100);
|
|
869
|
-
|
|
870
|
-
// TASK_1757: register own lease (side-effect; silent on failure)
|
|
871
|
-
var slScript = resolveStreamLeaseScript();
|
|
899
|
+
// TASK_2392 (Ansuz slim step 3): the handoff archive, the stream lease registration, the Multi-Ansuz list,
|
|
900
|
+
// the ANOMALY block and the extra info lines are frozen. Their functions stay below and stay callable;
|
|
901
|
+
// only the call sites are gone. Banner = session id, pin, open cards, wishes, pending peer mail.
|
|
872
902
|
// TASK_1764: derive stable conversation_id from transcript_path basename (stable across resume).
|
|
873
903
|
// TASK_1863: --conversation-id= overrides the transcript-derived id (same injectable-seam
|
|
874
904
|
// pattern as --mcp-base-url) so the lease-reuse behavior is testable in a sandbox
|
|
@@ -953,9 +983,6 @@ async function main() {
|
|
|
953
983
|
}
|
|
954
984
|
if (_txPath) _convId = path.basename(_txPath, '.jsonl');
|
|
955
985
|
} catch (_ce) {}
|
|
956
|
-
var ownSid = registerOwnLease(slScript, _convId);
|
|
957
|
-
// Peer awareness: only computed if registration succeeded or slScript found
|
|
958
|
-
var peerData = slScript ? getPeerAwareness(slScript, ownSid) : null;
|
|
959
986
|
|
|
960
987
|
const lines = [];
|
|
961
988
|
lines.push('═══ ᚨ Ansuz · 快速 Boot (gateless) ═══');
|
|
@@ -963,7 +990,7 @@ async function main() {
|
|
|
963
990
|
// is a single global slot, so it mints a new ansuz-prompt-<ts> slot whenever that
|
|
964
991
|
// pointer is missing or belongs to another session. Ansuz passes this id
|
|
965
992
|
// explicitly as session_id instead (elixir HANDOFF mandate).
|
|
966
|
-
if (_convId) lines.push('[session] conversation_id=' + _convId + '
|
|
993
|
+
if (_convId) lines.push('[session] conversation_id=' + _convId + '');
|
|
967
994
|
|
|
968
995
|
// -- TASK_1702 R2: pin banner -------------------------------------------
|
|
969
996
|
if (IS_PINNED) {
|
|
@@ -982,56 +1009,8 @@ async function main() {
|
|
|
982
1009
|
}
|
|
983
1010
|
}
|
|
984
1011
|
|
|
985
|
-
// knowledge index
|
|
986
|
-
const knowledge = readKnowledgeIndex(BASE, 10);
|
|
987
|
-
if (knowledge.length > 0) {
|
|
988
|
-
lines.push('[knowledge] ' + projName + ' .kenaz/knowledge/:');
|
|
989
|
-
for (const k of knowledge) {
|
|
990
|
-
lines.push(' ' + k.filename + (k.heading ? ' -- ' + k.heading : ''));
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
1012
|
}
|
|
994
1013
|
|
|
995
|
-
// TASK_1757: peer awareness banner (zero-noise when no peers)
|
|
996
|
-
if (peerData && (peerData.peers.length > 0 || peerData.orphans.length > 0)) {
|
|
997
|
-
lines.push('[Multi-Ansuz] Other sessions detected:');
|
|
998
|
-
for (const peer of peerData.peers) {
|
|
999
|
-
var ageMs = peerData.sl.heartbeatAgeMs(peer);
|
|
1000
|
-
var ageSec = ageMs === Infinity ? 'inf' : Math.round(ageMs / 1000) + 's';
|
|
1001
|
-
var tasks_s = (peer.claimed_tasks && peer.claimed_tasks.length) ? ' tasks=' + peer.claimed_tasks.join(',') : '';
|
|
1002
|
-
var scope_s = (peer.scope_leases && peer.scope_leases.length) ? ' scope=' + peer.scope_leases.join(',') : '';
|
|
1003
|
-
lines.push(' [live] ' + (peer.label || peer.session_id) + ' pid=' + peer.pid + ' heartbeat=' + ageSec + ' ago' + tasks_s + scope_s);
|
|
1004
|
-
}
|
|
1005
|
-
for (const orphan of peerData.orphans) {
|
|
1006
|
-
var oAge = peerData.sl.heartbeatAgeMs(orphan);
|
|
1007
|
-
// TASK_1791: classification basis is heartbeat freshness, NOT pid liveness -- the
|
|
1008
|
-
// registered pid exits by design (lease-touch.js renews the heartbeat). Suggest
|
|
1009
|
-
// targeted reap (reap --session-id): bulk `reap` only acts at >=24h heartbeat age.
|
|
1010
|
-
// TASK_1792: stale threshold raised 45min -> 8h (stream-lease LIVENESS_THRESHOLD_MS,
|
|
1011
|
-
// rendered dynamically below). Heartbeats only advance on UserPromptSubmit, so a live
|
|
1012
|
-
// peer running long dispatch chains can idle for hours without a prompt; at 45min this
|
|
1013
|
-
// banner printed an executable clear command against live sessions. Only leases idle
|
|
1014
|
-
// beyond 8h -- far past any realistic no-prompt working stretch -- get a clear
|
|
1015
|
-
// suggestion now. isSessionLive is also heartbeat-only since TASK_1792 (pid recycling
|
|
1016
|
-
// made dead sessions probe live forever), so [stale] here == reapable, no dead zone.
|
|
1017
|
-
var oAgeStr = peerData.sl.fmtAge ? peerData.sl.fmtAge(oAge) : (oAge === Infinity ? 'inf' : Math.round(oAge / 1000) + 's');
|
|
1018
|
-
var oThrStr = (peerData.sl.fmtAge && peerData.sl.LIVENESS_THRESHOLD_MS) ? peerData.sl.fmtAge(peerData.sl.LIVENESS_THRESHOLD_MS) : '8.0h';
|
|
1019
|
-
lines.push(' [stale] ' + (orphan.label || orphan.session_id) + ' last-heartbeat=' + oAgeStr + ' ago (no heartbeat within ' + oThrStr + ') -- clear: node .specialist/tools/stream-lease.js reap --session-id=' + orphan.session_id);
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
lines.push(
|
|
1023
|
-
`📊 任務 — total ${tasks.total} | active ${c.active} | backlog ${c.backlog} | ` +
|
|
1024
|
-
`blocked ${c.blocked} | done ${c.done} | cancelled ${c.cancel} (${pct}%)`,
|
|
1025
|
-
);
|
|
1026
|
-
if (tasks.cancel_rate >= 0.7 && tasks.total >= 50) {
|
|
1027
|
-
lines.push(
|
|
1028
|
-
`⚠️ ANOMALY: HIGH_CANCEL_RATE — ${pct}% of ${tasks.total} tasks cancelled (${c.cancel}/${tasks.total})`,
|
|
1029
|
-
);
|
|
1030
|
-
}
|
|
1031
|
-
// TASK_2044: Cortex auto-sync failure (TASK_2048: global_memory.db only, meta_graph retired).
|
|
1032
|
-
// Both omitted when healthy (zero-noise).
|
|
1033
|
-
const cortexAnomaly = cortexSyncAnomalyLine();
|
|
1034
|
-
if (cortexAnomaly) lines.push(cortexAnomaly);
|
|
1035
1014
|
// TASK_1997 R4: open-wish count. mcpBase reuses the same override seam as
|
|
1036
1015
|
// the --mcp-base-url= / KENAZ_MCP_BASE_URL seam.
|
|
1037
1016
|
const mcpBase =
|
|
@@ -1042,47 +1021,10 @@ async function main() {
|
|
|
1042
1021
|
// line above) so the query is scoped to the bound project when pinned.
|
|
1043
1022
|
const wishesLine = formatWishesLine(await fetchOpenWishes(mcpBase, WISH_TIMEOUT_MS, IS_PINNED ? BASE : null));
|
|
1044
1023
|
if (wishesLine) lines.push(wishesLine);
|
|
1045
|
-
// TASK_2006 R4: field-report auto-triage banner (omitted when N=0).
|
|
1046
|
-
const fieldReportLine = fieldReportBannerLine();
|
|
1047
|
-
if (fieldReportLine) lines.push(fieldReportLine);
|
|
1048
|
-
const heimdallLine = formatHeimdallTriageLine(countOpenNeedsTriageCards(resolveTasksDir(), { heimdall: true }));
|
|
1049
|
-
if (heimdallLine) lines.push(heimdallLine);
|
|
1050
|
-
const heimdallScanLine = formatHeimdallScanLine(countCommitsSinceHeimdallScan(BASE));
|
|
1051
|
-
if (heimdallScanLine) lines.push(heimdallScanLine);
|
|
1052
1024
|
for (const l of openCardLines()) lines.push(l);
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
// from the same commit line as topic ("Continue from: <topic>") and
|
|
1057
|
-
// pending_decisions repeats the open task's title -- both were pure bytes.
|
|
1058
|
-
lines.push(`📜 上一世 Handoff${handoff.archived ? ' (已歸檔)' : ''}: ${fmt(s.topic)}`);
|
|
1059
|
-
if (s.unfinished) lines.push(` unfinished: ${fmt(s.unfinished)}`);
|
|
1060
|
-
} else if (multiHandoffs.length === 0) {
|
|
1061
|
-
// TASK_1837: "無" only when BOTH the (retired) legacy slot and the multi-slot
|
|
1062
|
-
// directory are empty — previously this printed "上一世 Handoff: 無" from the
|
|
1063
|
-
// legacy file alone and then listed N per-session slots right below it.
|
|
1064
|
-
lines.push('📜 上一世 Handoff: 無');
|
|
1065
|
-
}
|
|
1066
|
-
// TASK_1757: multi-slot handoffs -- TASK_1977 R3: cap fan-out to at most
|
|
1067
|
-
// HANDOFF_MAX_FULL_SLOTS full slots (newest first, topic-deduped); fold
|
|
1068
|
-
// the rest into one summary line. All slots were already archived above
|
|
1069
|
-
// regardless of this selection.
|
|
1070
|
-
const handoffSelection = selectHandoffSlotsForBanner(multiHandoffs);
|
|
1071
|
-
for (const mh of handoffSelection.printed) {
|
|
1072
|
-
// TASK_1988: one line per slot (topic; unfinished when it adds something).
|
|
1073
|
-
const unf = mh.unfinished && fmt(mh.unfinished) !== fmt(mh.topic) ? ' — unfinished: ' + fmt(mh.unfinished) : '';
|
|
1074
|
-
lines.push(`📜 Handoff [${String(mh.slot_file).slice(0, 8)}]: ${fmt(mh.topic)}${unf}`);
|
|
1075
|
-
}
|
|
1076
|
-
if (handoffSelection.summaryLine) lines.push(`📜 ${handoffSelection.summaryLine}`);
|
|
1077
|
-
// -- TASK_1742 advisory banner --
|
|
1078
|
-
const adv = readHuginnAdvisory(BASE);
|
|
1079
|
-
if (adv.entries.length > 0) {
|
|
1080
|
-
lines.push('[Huginn Advisory] ' + adv.unread + '/' + adv.entries.length + ' unread (last 14d) -- advisory->task requires live baseline verification');
|
|
1081
|
-
for (const e of adv.entries.slice(0, 3)) {
|
|
1082
|
-
lines.push(' ' + e.ts.slice(0, 10) + ' ' + (e.title || '(untitled)'));
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
lines.push('(快速 boot · 無 gate · 完整 ceremony 用 /Ansuz --full)');
|
|
1025
|
+
const peerLines = await fetchPendingPeerLines(mcpBase, WISH_TIMEOUT_MS, IS_PINNED ? BASE : process.env.CLAUDE_PROJECT_DIR || process.cwd());
|
|
1026
|
+
for (const l of peerLines) lines.push(l);
|
|
1027
|
+
lines.push('(boot 完成:依 Open cards 提議程;小修正直接做,中型工作開卡派工)');
|
|
1086
1028
|
process.stdout.write(lines.join(String.fromCharCode(10)) + String.fromCharCode(10));
|
|
1087
1029
|
}
|
|
1088
1030
|
|
|
@@ -1103,6 +1045,8 @@ module.exports = {
|
|
|
1103
1045
|
hintNamesThisSession,
|
|
1104
1046
|
fetchOpenWishes,
|
|
1105
1047
|
formatWishesLine,
|
|
1048
|
+
formatPeerMailLines,
|
|
1049
|
+
fetchPendingPeerLines,
|
|
1106
1050
|
scanFieldReportCardIds,
|
|
1107
1051
|
computeNewFieldReportCount,
|
|
1108
1052
|
countOpenNeedsTriageCards,
|
|
@@ -30,7 +30,7 @@ const {
|
|
|
30
30
|
resolveBackendLogPath, readBackendLogTailSync,
|
|
31
31
|
formatCortexSyncAnomaly, cortexSyncAnomalyLine,
|
|
32
32
|
readProjectsJsonSync,
|
|
33
|
-
getProjectName,
|
|
33
|
+
getProjectName, formatPeerMailLines, fetchPendingPeerLines,
|
|
34
34
|
} = require('./ansuz-boot-fast');
|
|
35
35
|
|
|
36
36
|
async function server(t, handler) {
|
|
@@ -703,3 +703,47 @@ test('countCommitsSinceHeimdallScan counts records newer than the last scan', ()
|
|
|
703
703
|
assert.equal(formatHeimdallScanLine(0), null);
|
|
704
704
|
} finally { fs.rmSync(dir, { recursive: true, force: true }); }
|
|
705
705
|
});
|
|
706
|
+
|
|
707
|
+
// ── TASK_2392: slim banner (session id, open cards, wishes, pending peer mail) ──
|
|
708
|
+
|
|
709
|
+
test('formatPeerMailLines: pending_count > 0 -> one line; 0 / missing -> none', () => {
|
|
710
|
+
assert.deepEqual(formatPeerMailLines({ pending_count: 0 }), []);
|
|
711
|
+
assert.deepEqual(formatPeerMailLines(null), []);
|
|
712
|
+
const l = formatPeerMailLines({ pending_count: 2 });
|
|
713
|
+
assert.equal(l.length, 1);
|
|
714
|
+
assert.match(l[0], /Peer mail: 2 pending/);
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
test('formatPeerMailLines: waiting_roots from another room are appended (counts only)', () => {
|
|
718
|
+
const l = formatPeerMailLines({ pending_count: 0, waiting_roots: [{ label: 'Room', project_id: 'p1', path: 'C:/x', count: 3 }] });
|
|
719
|
+
assert.equal(l.length, 1);
|
|
720
|
+
assert.match(l[0], /\[peer\] 3 message\(s\)/);
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
test('fetchPendingPeerLines: reads /api/peer/status; unreachable -> []', async (t) => {
|
|
724
|
+
let seen = '';
|
|
725
|
+
const base = await server(t, (req, res) => { seen = req.url; res.end(JSON.stringify({ pending_count: 4 })); });
|
|
726
|
+
const lines = await fetchPendingPeerLines(base, 1000, os.tmpdir());
|
|
727
|
+
assert.match(seen, /^\/api\/peer\/status\?limit=1&projectPath=/);
|
|
728
|
+
assert.match(lines[0], /4 pending/);
|
|
729
|
+
assert.deepEqual(await fetchPendingPeerLines('http://127.0.0.1:1', 300, os.tmpdir()), []);
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
test('boot subprocess prints the slim banner: no handoff / Multi-Ansuz / ANOMALY / lease side effects', (t) => {
|
|
733
|
+
const { spawnSync } = require('node:child_process');
|
|
734
|
+
const sb = fs.mkdtempSync(path.join(os.tmpdir(), 't2392_'));
|
|
735
|
+
t.after(() => fs.rmSync(sb, { recursive: true, force: true }));
|
|
736
|
+
for (const d of ['backlog', 'active', 'done', 'blocked', 'cancel']) fs.mkdirSync(path.join(sb, '.kenaz', 'tasks', d), { recursive: true });
|
|
737
|
+
fs.mkdirSync(path.join(sb, '.kenaz', 'specialist', 'handoffs'), { recursive: true });
|
|
738
|
+
fs.writeFileSync(path.join(sb, '.kenaz', 'tasks', 'backlog', 'TASK_9_demo.yaml'), 'id: TASK_9\ntitle: demo card\nstatus: backlog\npriority: P1\n');
|
|
739
|
+
fs.writeFileSync(path.join(sb, '.kenaz', 'specialist', 'handoffs', 'a.json'), JSON.stringify({ topic: 'T', generated_at: '2026-10-01T00:00:00Z' }));
|
|
740
|
+
const r = spawnSync(process.execPath, [path.join(__dirname, 'ansuz-boot-fast.js'), '--project-path=' + sb, '--conversation-id=sess-2392', '--mcp-base-url=http://127.0.0.1:1'],
|
|
741
|
+
{ encoding: 'utf8', cwd: sb, env: { ...process.env, CLAUDE_PROJECT_DIR: sb }, timeout: 30000 });
|
|
742
|
+
assert.equal(r.status, 0, r.stderr);
|
|
743
|
+
assert.match(r.stdout, /\[session\] conversation_id=sess-2392/);
|
|
744
|
+
assert.match(r.stdout, /Open cards:/);
|
|
745
|
+
assert.match(r.stdout, /TASK_9 \[backlog P1\] demo card/);
|
|
746
|
+
assert.doesNotMatch(r.stdout, /Handoff|Multi-Ansuz|ANOMALY|📊/);
|
|
747
|
+
assert.equal(fs.readdirSync(path.join(sb, '.kenaz', 'specialist', 'handoffs')).length, 1, 'handoff slot not archived');
|
|
748
|
+
assert.equal(fs.existsSync(path.join(sb, '.kenaz', 'specialist', 'sessions', 'leases')), false, 'no lease registered');
|
|
749
|
+
});
|
package/core/KENAZ_CORE_VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.3
|