kenaz 0.0.0-stage → 0.3.2
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/bin/kenaz.js +3 -0
- package/core/.agents/skills/remotion-best-practices/SKILL.md +61 -0
- package/core/.agents/skills/remotion-best-practices/rules/3d.md +86 -0
- package/core/.agents/skills/remotion-best-practices/rules/animations.md +27 -0
- package/core/.agents/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/core/.agents/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/core/.agents/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
- package/core/.agents/skills/remotion-best-practices/rules/assets.md +78 -0
- package/core/.agents/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
- package/core/.agents/skills/remotion-best-practices/rules/audio.md +169 -0
- package/core/.agents/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
- package/core/.agents/skills/remotion-best-practices/rules/can-decode.md +81 -0
- package/core/.agents/skills/remotion-best-practices/rules/charts.md +120 -0
- package/core/.agents/skills/remotion-best-practices/rules/compositions.md +154 -0
- package/core/.agents/skills/remotion-best-practices/rules/display-captions.md +184 -0
- package/core/.agents/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/core/.agents/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
- package/core/.agents/skills/remotion-best-practices/rules/fonts.md +152 -0
- package/core/.agents/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/core/.agents/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/core/.agents/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
- package/core/.agents/skills/remotion-best-practices/rules/gifs.md +141 -0
- package/core/.agents/skills/remotion-best-practices/rules/images.md +134 -0
- package/core/.agents/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/core/.agents/skills/remotion-best-practices/rules/light-leaks.md +73 -0
- package/core/.agents/skills/remotion-best-practices/rules/lottie.md +70 -0
- package/core/.agents/skills/remotion-best-practices/rules/maps.md +412 -0
- package/core/.agents/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/core/.agents/skills/remotion-best-practices/rules/measuring-text.md +140 -0
- package/core/.agents/skills/remotion-best-practices/rules/parameters.md +109 -0
- package/core/.agents/skills/remotion-best-practices/rules/sequencing.md +118 -0
- package/core/.agents/skills/remotion-best-practices/rules/sfx.md +30 -0
- package/core/.agents/skills/remotion-best-practices/rules/subtitles.md +36 -0
- package/core/.agents/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/core/.agents/skills/remotion-best-practices/rules/text-animations.md +20 -0
- package/core/.agents/skills/remotion-best-practices/rules/timing.md +179 -0
- package/core/.agents/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/core/.agents/skills/remotion-best-practices/rules/transitions.md +197 -0
- package/core/.agents/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/core/.agents/skills/remotion-best-practices/rules/trimming.md +51 -0
- package/core/.agents/skills/remotion-best-practices/rules/videos.md +171 -0
- package/core/.agents/skills/remotion-best-practices/rules/voiceover.md +99 -0
- package/core/.agents/skills/supabase-postgres-best-practices/AGENTS.md +90 -0
- package/core/.agents/skills/supabase-postgres-best-practices/CLAUDE.md +1 -0
- package/core/.agents/skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/query-index-types.md +45 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/core/.agents/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
- package/core/.agents/skills/typesafe-ai/LICENSE +21 -0
- package/core/.agents/skills/typesafe-ai/SKILL.md +149 -0
- package/core/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/core/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/core/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/core/.claude/agents/pcb-reviewer.md +146 -0
- package/core/.claude/commands/Amelia.md +5 -0
- package/core/.claude/commands/Ansuz.md +38 -0
- package/core/.claude/commands/Huginn.md +25 -0
- package/core/.claude/commands/agent-worker.md +168 -0
- package/core/.claude/commands/architect.md +24 -0
- package/core/.claude/commands/archive.md +24 -0
- package/core/.claude/commands/canary.md +17 -0
- package/core/.claude/commands/incident.md +15 -0
- package/core/.claude/commands/init.md +112 -0
- package/core/.claude/commands/legacy_dev.md +18 -0
- package/core/.claude/commands/product-review.md +131 -0
- package/core/.claude/commands/review.md +14 -0
- package/core/.claude/commands/security.md +15 -0
- package/core/.claude/commands/spec.md +22 -0
- package/core/.claude/commands/strategy.md +141 -0
- package/core/.claude/commands/sunny.md +1 -0
- package/core/.claude/commands//347/224/242/345/223/201.md +15 -0
- package/core/.claude/commands//347/224/242/345/223/201/346/252/242/350/246/226.md +129 -0
- package/core/.claude/commands//350/250/255/350/250/210.md +14 -0
- package/core/.claude/commands//350/251/225/344/274/260.md +16 -0
- package/core/.claude/commands//351/200/262/345/272/246.md +15 -0
- package/core/.claude/hooks/__tests__/substrate.test.js +122 -0
- package/core/.claude/hooks/__tests__/task-1866-cli-guard.test.js +193 -0
- package/core/.claude/hooks/__tests__/task-1977-dedupe-guard.test.js +125 -0
- package/core/.claude/hooks/__tests__/task-2087-mark-landed-idempotent.test.js +128 -0
- package/core/.claude/hooks/__tests__/task-2253-null-tip-marker-reuse.test.js +84 -0
- package/core/.claude/hooks/__tests__/task-2381-project-guard-walkup.test.js +53 -0
- package/core/.claude/hooks/_ansuz-conversation.js +183 -0
- package/core/.claude/hooks/_ansuz-conversation.test.js +90 -0
- package/core/.claude/hooks/_dedupe-guard.js +75 -0
- package/core/.claude/hooks/_peer-project-root.js +113 -0
- package/core/.claude/hooks/_peer-project-root.test.js +121 -0
- package/core/.claude/hooks/_peer-waiting-line.js +27 -0
- package/core/.claude/hooks/_project-guard.js +45 -0
- package/core/.claude/hooks/_run-user-prompt.js +134 -0
- package/core/.claude/hooks/_run-user-prompt.test.js +80 -0
- package/core/.claude/hooks/_session-identity.js +62 -0
- package/core/.claude/hooks/_session-pin.js +34 -0
- package/core/.claude/hooks/_session-pin.test.js +89 -0
- package/core/.claude/hooks/_signal-fence.js +17 -0
- package/core/.claude/hooks/_substrate-paths.js +95 -0
- package/core/.claude/hooks/_user-scope.js +23 -0
- package/core/.claude/hooks/ansuz-session-pin-via-turn-context.test.js +52 -0
- package/core/.claude/hooks/ansuz-session-pin.js +171 -0
- package/core/.claude/hooks/ansuz-session-pin.test.js +140 -0
- package/core/.claude/hooks/context-check.js +51 -0
- package/core/.claude/hooks/core-resolve.js +230 -0
- package/core/.claude/hooks/daemon-outbox-hook.js +139 -0
- package/core/.claude/hooks/fatigue-check.js +52 -0
- package/core/.claude/hooks/handoff-snapshot-on-commit.js +154 -0
- package/core/.claude/hooks/handoff-snapshot-on-decision.js +188 -0
- package/core/.claude/hooks/handoff-snapshot-on-question.js +158 -0
- package/core/.claude/hooks/handoff-staleness.js +197 -0
- package/core/.claude/hooks/jev-thalamus-context.js +17 -0
- package/core/.claude/hooks/jev-thalamus-context.test.js +41 -0
- package/core/.claude/hooks/lease-release.js +119 -0
- package/core/.claude/hooks/lease-touch.js +96 -0
- package/core/.claude/hooks/memory-guard.js +723 -0
- package/core/.claude/hooks/memory-guard.test.js +574 -0
- package/core/.claude/hooks/reflex-feedback.js +5 -0
- package/core/.claude/hooks/session-init.ps1 +49 -0
- package/core/.claude/hooks/sound-event.js +70 -0
- package/core/.claude/hooks/sound-event.sh +37 -0
- package/core/.claude/hooks/stream-delta.js +169 -0
- package/core/.claude/hooks/synapse-first-investigation.js +326 -0
- package/core/.claude/hooks/synapse-first-investigation.test.js +126 -0
- package/core/.claude/hooks/task-bridge.js +33 -0
- package/core/.claude/hooks/turn-context-peer.test.js +115 -0
- package/core/.claude/hooks/turn-context-session-line.test.js +69 -0
- package/core/.claude/hooks/turn-context.js +215 -0
- package/core/.claude/hooks/worktree-create.js +1232 -0
- package/core/.claude/hooks/worktree-remove.js +181 -0
- package/core/.claude/no-hooks.settings.json +3 -0
- package/core/.claude/settings.json +180 -0
- package/core/.claude/skills/adapt/SKILL.md +199 -0
- package/core/.claude/skills/animate/SKILL.md +190 -0
- package/core/.claude/skills/architect_agent/SKILL.md +408 -0
- package/core/.claude/skills/assessment_agent/SKILL.md +289 -0
- package/core/.claude/skills/audit/SKILL.md +129 -0
- package/core/.claude/skills/backend_agent/SKILL.md +407 -0
- package/core/.claude/skills/backend_engineer/SKILL.md +788 -0
- package/core/.claude/skills/bolder/SKILL.md +132 -0
- package/core/.claude/skills/clarify/SKILL.md +180 -0
- package/core/.claude/skills/code_reviewer/SKILL.md +305 -0
- package/core/.claude/skills/code_reviewer/patterns.yaml +85 -0
- package/core/.claude/skills/colorize/SKILL.md +158 -0
- package/core/.claude/skills/critique/SKILL.md +118 -0
- package/core/.claude/skills/delight/SKILL.md +317 -0
- package/core/.claude/skills/designer/SKILL.md +845 -0
- package/core/.claude/skills/dev_agent/SKILL.md +503 -0
- package/core/.claude/skills/developer/SKILL.md +792 -0
- package/core/.claude/skills/distill/SKILL.md +137 -0
- package/core/.claude/skills/extract/SKILL.md +95 -0
- package/core/.claude/skills/feature_agent/SKILL.md +303 -0
- package/core/.claude/skills/frontend-design/SKILL.md +127 -0
- package/core/.claude/skills/frontend-design/reference/color-and-contrast.md +132 -0
- package/core/.claude/skills/frontend-design/reference/interaction-design.md +123 -0
- package/core/.claude/skills/frontend-design/reference/motion-design.md +99 -0
- package/core/.claude/skills/frontend-design/reference/responsive-design.md +114 -0
- package/core/.claude/skills/frontend-design/reference/spatial-design.md +100 -0
- package/core/.claude/skills/frontend-design/reference/typography.md +131 -0
- package/core/.claude/skills/frontend-design/reference/ux-writing.md +107 -0
- package/core/.claude/skills/frontend_agent/SKILL.md +327 -0
- package/core/.claude/skills/harden/SKILL.md +358 -0
- package/core/.claude/skills/heimdall/SKILL.md +84 -0
- package/core/.claude/skills/huginn/SKILL.md +208 -0
- package/core/.claude/skills/incident_response/SKILL.md +315 -0
- package/core/.claude/skills/legacy_dev/SKILL.md +202 -0
- package/core/.claude/skills/normalize/SKILL.md +67 -0
- package/core/.claude/skills/onboard/SKILL.md +243 -0
- package/core/.claude/skills/optimization_agent/SKILL.md +340 -0
- package/core/.claude/skills/optimize/SKILL.md +269 -0
- package/core/.claude/skills/pcb-review/SKILL.md +39 -0
- package/core/.claude/skills/polish/SKILL.md +202 -0
- package/core/.claude/skills/product_manager/SKILL.md +1091 -0
- package/core/.claude/skills/qa_engineer/SKILL.md +1269 -0
- package/core/.claude/skills/quieter/SKILL.md +118 -0
- package/core/.claude/skills/remotion-best-practices/SKILL.md +61 -0
- package/core/.claude/skills/remotion-best-practices/rules/3d.md +86 -0
- package/core/.claude/skills/remotion-best-practices/rules/animations.md +27 -0
- package/core/.claude/skills/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
- package/core/.claude/skills/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
- package/core/.claude/skills/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
- package/core/.claude/skills/remotion-best-practices/rules/assets.md +78 -0
- package/core/.claude/skills/remotion-best-practices/rules/audio-visualization.md +198 -0
- package/core/.claude/skills/remotion-best-practices/rules/audio.md +169 -0
- package/core/.claude/skills/remotion-best-practices/rules/calculate-metadata.md +134 -0
- package/core/.claude/skills/remotion-best-practices/rules/can-decode.md +81 -0
- package/core/.claude/skills/remotion-best-practices/rules/charts.md +120 -0
- package/core/.claude/skills/remotion-best-practices/rules/compositions.md +154 -0
- package/core/.claude/skills/remotion-best-practices/rules/display-captions.md +184 -0
- package/core/.claude/skills/remotion-best-practices/rules/extract-frames.md +229 -0
- package/core/.claude/skills/remotion-best-practices/rules/ffmpeg.md +38 -0
- package/core/.claude/skills/remotion-best-practices/rules/fonts.md +152 -0
- package/core/.claude/skills/remotion-best-practices/rules/get-audio-duration.md +58 -0
- package/core/.claude/skills/remotion-best-practices/rules/get-video-dimensions.md +68 -0
- package/core/.claude/skills/remotion-best-practices/rules/get-video-duration.md +60 -0
- package/core/.claude/skills/remotion-best-practices/rules/gifs.md +141 -0
- package/core/.claude/skills/remotion-best-practices/rules/images.md +134 -0
- package/core/.claude/skills/remotion-best-practices/rules/import-srt-captions.md +69 -0
- package/core/.claude/skills/remotion-best-practices/rules/light-leaks.md +73 -0
- package/core/.claude/skills/remotion-best-practices/rules/lottie.md +70 -0
- package/core/.claude/skills/remotion-best-practices/rules/maps.md +412 -0
- package/core/.claude/skills/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
- package/core/.claude/skills/remotion-best-practices/rules/measuring-text.md +140 -0
- package/core/.claude/skills/remotion-best-practices/rules/parameters.md +109 -0
- package/core/.claude/skills/remotion-best-practices/rules/sequencing.md +118 -0
- package/core/.claude/skills/remotion-best-practices/rules/sfx.md +30 -0
- package/core/.claude/skills/remotion-best-practices/rules/subtitles.md +36 -0
- package/core/.claude/skills/remotion-best-practices/rules/tailwind.md +11 -0
- package/core/.claude/skills/remotion-best-practices/rules/text-animations.md +20 -0
- package/core/.claude/skills/remotion-best-practices/rules/timing.md +179 -0
- package/core/.claude/skills/remotion-best-practices/rules/transcribe-captions.md +70 -0
- package/core/.claude/skills/remotion-best-practices/rules/transitions.md +197 -0
- package/core/.claude/skills/remotion-best-practices/rules/transparent-videos.md +106 -0
- package/core/.claude/skills/remotion-best-practices/rules/trimming.md +51 -0
- package/core/.claude/skills/remotion-best-practices/rules/videos.md +171 -0
- package/core/.claude/skills/remotion-best-practices/rules/voiceover.md +99 -0
- package/core/.claude/skills/security_agent/SKILL.md +312 -0
- package/core/.claude/skills/spec_optimizer/SKILL.md +299 -0
- package/core/.claude/skills/sre_agent/SKILL.md +1347 -0
- package/core/.claude/skills/sunny/SKILL.md +74 -0
- package/core/.claude/skills/supabase-postgres-best-practices/AGENTS.md +90 -0
- package/core/.claude/skills/supabase-postgres-best-practices/CLAUDE.md +1 -0
- package/core/.claude/skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/query-index-types.md +45 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/core/.claude/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
- package/core/.claude/skills/synapse_maintain/SKILL.md +84 -0
- package/core/.claude/skills/ui-ux-pro-max/SKILL.md +377 -0
- package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/core/.claude/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -0
- package/core/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/core/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/core/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/core/.collaboration/README.md +258 -0
- package/core/.collaboration/cli/commands/assign.js +39 -0
- package/core/.collaboration/cli/commands/claim.js +33 -0
- package/core/.collaboration/cli/commands/complete.js +44 -0
- package/core/.collaboration/cli/commands/create.js +110 -0
- package/core/.collaboration/cli/commands/get.js +83 -0
- package/core/.collaboration/cli/commands/index.js +52 -0
- package/core/.collaboration/cli/commands/list.js +51 -0
- package/core/.collaboration/cli/commands/lock.js +45 -0
- package/core/.collaboration/cli/commands/rebuild.js +39 -0
- package/core/.collaboration/cli/commands/search.js +61 -0
- package/core/.collaboration/cli/commands/stats.js +61 -0
- package/core/.collaboration/cli/commands/transfer.js +41 -0
- package/core/.collaboration/cli/commands/unlock.js +48 -0
- package/core/.collaboration/cli/formatters/help-formatter.js +70 -0
- package/core/.collaboration/cli/formatters/index.js +7 -0
- package/core/.collaboration/cli/task-cli.js +46 -0
- package/core/.collaboration/cli/utils/arg-parser.js +74 -0
- package/core/.collaboration/cli/utils/git-user.js +25 -0
- package/core/.collaboration/cli/utils/index.js +9 -0
- package/core/.collaboration/cli/utils/output.js +10 -0
- package/core/.collaboration/config/default.yaml +189 -0
- package/core/.collaboration/core/conflict-resolver.js +461 -0
- package/core/.collaboration/core/conflict-resolver.test.js +389 -0
- package/core/.collaboration/core/id-generator.js +303 -0
- package/core/.collaboration/core/migrate-legacy.js +260 -0
- package/core/.collaboration/core/package.json +1 -0
- package/core/.collaboration/core/task-2257-estimated-hours.test.js +72 -0
- package/core/.collaboration/core/task-2260-dir-layout-move.test.js +60 -0
- package/core/.collaboration/core/task-2264-single-after-capture.test.js +61 -0
- package/core/.collaboration/core/task-2288-followups.test.js +121 -0
- package/core/.collaboration/core/task-api-json.js +211 -0
- package/core/.collaboration/core/task-api.js +3729 -0
- package/core/.collaboration/core/task-api.test.js +1268 -0
- package/core/.collaboration/docs/API.md +787 -0
- package/core/.collaboration/docs/ARCHITECTURE.md +596 -0
- package/core/.collaboration/docs/CLI.md +821 -0
- package/core/.collaboration/docs/FAQ.md +695 -0
- package/core/.collaboration/docs/MIGRATION.md +804 -0
- package/core/.collaboration/docs/examples/README.md +320 -0
- package/core/.collaboration/docs/examples/advanced-queries.js +261 -0
- package/core/.collaboration/docs/examples/basic-usage.js +184 -0
- package/core/.collaboration/docs/examples/team-workflow.js +352 -0
- package/core/.collaboration/hooks/README.md +70 -0
- package/core/.collaboration/hooks/config.json +10 -0
- package/core/.collaboration/hooks/install.js +400 -0
- package/core/.collaboration/hooks/post-merge.js +163 -0
- package/core/.collaboration/hooks/pre-commit.js +264 -0
- package/core/.collaboration/hooks/synapse-hook.js +486 -0
- package/core/.collaboration/hooks/synapse-hook.test.js +69 -0
- package/core/.failure/INDEX.yaml +231 -0
- package/core/.failure/agent-execution/FAIL-001-agent-no-output.yaml +391 -0
- package/core/.failure/agent-execution/FAIL-004_agent_platform_specific_commands.md +194 -0
- package/core/.failure/agent-execution/FAIL-005_background_agent_permission_denied.md +204 -0
- package/core/.failure/agent-execution/FAIL-007-pm-lead-wrong-team-invocation.yaml +0 -0
- package/core/.failure/agent-execution/FAIL-008-bypass-api-direct-yaml-write.yaml +94 -0
- package/core/.failure/agent-execution/FAIL-010-phase0-poem-format-skipped.yaml +28 -0
- package/core/.failure/agent-execution/FAIL-010-skipping-cognitive-checkpoint-after-verification.yaml +59 -0
- package/core/.failure/agent-execution/FAIL-012-grep-shortcut-during-investigation.yaml +85 -0
- package/core/.failure/agent-execution/FAIL-013-search-cwd-drift-and-case-mismatch.yaml +103 -0
- package/core/.failure/agent-execution/FAIL-014-shared-worktree-premature-death-verdict.yaml +35 -0
- package/core/.failure/agent-execution/FAIL-AUTO-TASK_1413.yaml +31 -0
- package/core/.failure/agent-execution/FAIL-AUTO-TASK_1427.yaml +41 -0
- package/core/.failure/agent-execution/FAIL-AUTO-TASK_904.yaml +30 -0
- package/core/.failure/agent-execution/README.md +68 -0
- package/core/.failure/architecture/FAIL-004_session_based_skill_recognition.md +128 -0
- package/core/.failure/architecture/FAIL-006-python-version-compatibility.yaml +445 -0
- package/core/.failure/architecture/README.md +87 -0
- package/core/.failure/code-quality/README.md +89 -0
- package/core/.failure/data-integrity/FAIL-002-json-bom.yaml +220 -0
- package/core/.failure/data-integrity/README.md +141 -0
- package/core/.failure/pipeline/FAIL-003-queue-pollution.yaml +335 -0
- package/core/.failure/pipeline/README.md +95 -0
- package/core/.failure/retired/FAIL-009-skipping-synapse-pulse-before-code-change.yaml +49 -0
- package/core/.failure/tools/README.md +230 -0
- package/core/.failure/tools/USAGE_GUIDE.md +323 -0
- package/core/.failure/tools/check_bom.js +101 -0
- package/core/.failure/tools/check_failures.ps1 +387 -0
- package/core/.failure/tools/fix_json.js +58 -0
- package/core/.failure/tools/log_failure.ps1 +474 -0
- package/core/.failure/tools/remove_bom.js +46 -0
- package/core/.failure/tools/validate_json.js +50 -0
- package/core/.formation/.episode-input.json +10 -0
- package/core/.formation/README.md +188 -0
- package/core/.formation/bifrost/CGDD_hook_lifecycle.js +575 -0
- package/core/.formation/bifrost/HOOK_PARITY_VERIFICATION.md +241 -0
- package/core/.formation/bifrost/README.md +71 -0
- package/core/.formation/bifrost/codex-doctor.js +106 -0
- package/core/.formation/bifrost/codex-doctor.test.js +51 -0
- package/core/.formation/bifrost/launch.js +510 -0
- package/core/.formation/bifrost/launch.test.js +217 -0
- package/core/.formation/bifrost/openai/codex-hook-shim.js +171 -0
- package/core/.formation/bifrost/openai/codex-hook-shim.test.js +107 -0
- package/core/.formation/bifrost/openai/models.json +36 -0
- package/core/.formation/bifrost/openai/relay.js +781 -0
- package/core/.formation/bifrost/openai/relay.test.js +71 -0
- package/core/.formation/bifrost/session.js +382 -0
- package/core/.formation/bifrost/session.test.js +121 -0
- package/core/.formation/bifrost/setup-codex.js +685 -0
- package/core/.formation/bifrost/setup-codex.test.js +102 -0
- package/core/.formation/bifrost/shared/ansuz-boot-policy.js +31 -0
- package/core/.formation/bifrost/shared/ansuz-boot-policy.test.js +40 -0
- package/core/.formation/bifrost/shared/boot-context.js +68 -0
- package/core/.formation/bifrost/shared/boot-context.test.js +67 -0
- package/core/.formation/bifrost/shared/codex-appserver.js +191 -0
- package/core/.formation/bifrost/shared/codex-injection.js +126 -0
- package/core/.formation/bifrost/shared/codex-session-registry.js +105 -0
- package/core/.formation/bifrost/shared/codex-session-registry.test.js +126 -0
- package/core/.formation/bifrost/shared/consolidate.js +286 -0
- package/core/.formation/bifrost/shared/stream-json.js +103 -0
- package/core/.formation/bifrost/shared/tools.js +278 -0
- package/core/.formation/bifrost/sync.js +142 -0
- package/core/.formation/briefs/scheduler-evolution.md +209 -0
- package/core/.formation/lead.yaml +118 -0
- package/core/.formation/legacy.bak/designer.yaml +57 -0
- package/core/.formation/legacy.bak/pm.yaml +57 -0
- package/core/.formation/legacy.bak/qa.yaml +57 -0
- package/core/.formation/legacy.bak/review.yaml +62 -0
- package/core/.formation/legacy.bak/scheduler.yaml +129 -0
- package/core/.formation/legacy.bak/sre.yaml +57 -0
- package/core/.formation/legion/forge.yaml +299 -0
- package/core/.formation/legion/hive.yaml +238 -0
- package/core/.formation/native/claude/README.md +61 -0
- package/core/.formation/native/claude/models.json +42 -0
- package/core/.formation/role-map.yaml +274 -0
- package/core/.formation/roles/_shared/modules/code_review.yaml +98 -0
- package/core/.formation/roles/_shared/modules/security.yaml +103 -0
- package/core/.formation/roles/_shared/modules/testing.yaml +14 -0
- package/core/.formation/roles/backend/role.yaml +93 -0
- package/core/.formation/roles/code_reviewer/role.yaml +102 -0
- package/core/.formation/roles/database_optimizer/role.yaml +107 -0
- package/core/.formation/roles/designer/role.yaml +66 -0
- package/core/.formation/roles/developer/role.yaml +75 -0
- package/core/.formation/roles/frontend/role.yaml +134 -0
- package/core/.formation/roles/incident_response/role.yaml +89 -0
- package/core/.formation/roles/qa/role.yaml +89 -0
- package/core/.formation/roles/security/role.yaml +87 -0
- package/core/.formation/roles/sre/role.yaml +66 -0
- package/core/.formation/skills/coordinator.yaml +52 -0
- package/core/.formation/solo/diagnosis.yaml +78 -0
- package/core/.formation/solo/strategy.yaml +121 -0
- package/core/.formation/spec/task_operations.parity.test.js +426 -0
- package/core/.formation/spec/task_operations.yaml +291 -0
- package/core/.formation/squad/blitz.yaml +192 -0
- package/core/.formation/squad/strategy-tribunal.yaml +354 -0
- package/core/.formation/squad/strategy.yaml +349 -0
- package/core/.formation/squad/sweep.yaml +208 -0
- package/core/.formation/tests/hello.txt +2 -0
- package/core/.formation/tools/__tests__/m1-claim-gate.test.js +175 -0
- package/core/.formation/tools/__tests__/m1-hmap-convid.test.js +216 -0
- package/core/.formation/tools/__tests__/release-lock.test.js +176 -0
- package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +234 -0
- package/core/.formation/tools/__tests__/subagent-codex-harness.test.js +96 -0
- package/core/.formation/tools/__tests__/task-1863-claim-late-release.test.js +160 -0
- package/core/.formation/tools/__tests__/task-2265-singleton-identity.test.js +134 -0
- package/core/.formation/tools/__tests__/task-2281-singleton-readers.test.js +64 -0
- package/core/.formation/tools/__tests__/task2030-worktree-node-modules.test.js +221 -0
- package/core/.formation/tools/__tests__/task2067-worktree-branch-reuse.test.js +148 -0
- package/core/.formation/tools/alaya-gate.js +198 -0
- package/core/.formation/tools/analytics.js +172 -0
- package/core/.formation/tools/broadcast.js +103 -0
- package/core/.formation/tools/commit-sync.js +154 -0
- package/core/.formation/tools/coordinator.js +350 -0
- package/core/.formation/tools/dashboard-models-chain.test.js +60 -0
- package/core/.formation/tools/dispatch-cortex-context.test.js +52 -0
- package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +40 -0
- package/core/.formation/tools/dispatch-detail/testing-module.md +53 -0
- package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +72 -0
- package/core/.formation/tools/dispatch-dryrun.test.js +54 -0
- package/core/.formation/tools/dispatch-model-policy.test.js +165 -0
- package/core/.formation/tools/dispatch-notifier.js +84 -0
- package/core/.formation/tools/dispatch-registry.js +346 -0
- package/core/.formation/tools/dispatch.js +1931 -0
- package/core/.formation/tools/formations.js +1203 -0
- package/core/.formation/tools/forseti-verify.js +1170 -0
- package/core/.formation/tools/git-salvage.js +269 -0
- package/core/.formation/tools/guard-attribution.js +224 -0
- package/core/.formation/tools/headless-branch-recovery.test.js +64 -0
- package/core/.formation/tools/headless-dryrun.test.js +79 -0
- package/core/.formation/tools/headless-v2.js +659 -0
- package/core/.formation/tools/headless.js +1071 -0
- package/core/.formation/tools/integration.js +528 -0
- package/core/.formation/tools/jev-correction.js +214 -0
- package/core/.formation/tools/jev-correction.test.js +178 -0
- package/core/.formation/tools/legacy-scheduler.js +1994 -0
- package/core/.formation/tools/lib/exec-tree.js +92 -0
- package/core/.formation/tools/lib/exec-tree.test.js +82 -0
- package/core/.formation/tools/loader.js +190 -0
- package/core/.formation/tools/log-reader.js +232 -0
- package/core/.formation/tools/logger.js +273 -0
- package/core/.formation/tools/mcp-allowlist.test.js +40 -0
- package/core/.formation/tools/memory-loader.js +422 -0
- package/core/.formation/tools/merge-lock-heartbeat.test.js +35 -0
- package/core/.formation/tools/no-hooks.settings.json +3 -0
- package/core/.formation/tools/pool-status-push.js +121 -0
- package/core/.formation/tools/pool-status-push.test.js +165 -0
- package/core/.formation/tools/post-complete/bounded-http.js +102 -0
- package/core/.formation/tools/post-complete/bounded-http.test.js +130 -0
- package/core/.formation/tools/post-complete/cognitive.js +270 -0
- package/core/.formation/tools/post-complete/git-merge.js +2845 -0
- package/core/.formation/tools/post-complete/health.js +464 -0
- package/core/.formation/tools/post-complete/integration-gaps.js +98 -0
- package/core/.formation/tools/post-complete/outcome.js +874 -0
- package/core/.formation/tools/post-complete/staging.js +390 -0
- package/core/.formation/tools/post-complete/subagent-transcript-stats.js +460 -0
- package/core/.formation/tools/post-complete/subagent-transcript-stats.test.js +680 -0
- package/core/.formation/tools/post-complete/task1536.test.js +627 -0
- package/core/.formation/tools/post-complete/task1543.test.js +261 -0
- package/core/.formation/tools/post-complete/task1876.test.js +287 -0
- package/core/.formation/tools/post-complete/task1957.test.js +293 -0
- package/core/.formation/tools/post-complete/task1997.test.js +401 -0
- package/core/.formation/tools/post-complete/task2028.test.js +232 -0
- package/core/.formation/tools/post-complete/task2029.test.js +275 -0
- package/core/.formation/tools/post-complete/task2036.test.js +330 -0
- package/core/.formation/tools/post-complete/task2038.test.js +246 -0
- package/core/.formation/tools/post-complete/task2071.test.js +231 -0
- package/core/.formation/tools/post-complete/task2233.test.js +100 -0
- package/core/.formation/tools/post-complete/task2240.test.js +134 -0
- package/core/.formation/tools/post-complete/task2244.test.js +199 -0
- package/core/.formation/tools/post-complete/task2255.test.js +28 -0
- package/core/.formation/tools/post-complete/task2268.test.js +106 -0
- package/core/.formation/tools/post-complete/task2341.test.js +74 -0
- package/core/.formation/tools/post-complete/task2345.test.js +38 -0
- package/core/.formation/tools/post-complete/testing.js +482 -0
- package/core/.formation/tools/post-complete/wish.js +177 -0
- package/core/.formation/tools/post-complete/worktree-rescue.test.js +283 -0
- package/core/.formation/tools/post-complete.js +3660 -0
- package/core/.formation/tools/post-complete.test.js +1002 -0
- package/core/.formation/tools/pre-dispatch-snapshot.test.js +328 -0
- package/core/.formation/tools/process-state.js +33 -0
- package/core/.formation/tools/prompt.js +2183 -0
- package/core/.formation/tools/prompt.test.js +875 -0
- package/core/.formation/tools/remote-conflict.js +98 -0
- package/core/.formation/tools/revert-daemon-state.js +162 -0
- package/core/.formation/tools/route-audit.test.js +55 -0
- package/core/.formation/tools/runner.js +1332 -0
- package/core/.formation/tools/supabase-client.js +104 -0
- package/core/.formation/tools/task-sync.js +236 -0
- package/core/.formation/tools/task-utils.js +344 -0
- package/core/.formation/tools/task2028-headless-worktree.test.js +112 -0
- package/core/.formation/tools/test-drift.js +148 -0
- package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +123 -0
- package/core/.formation/tools/tests/relay-mcp-overrides.test.js +112 -0
- package/core/.formation/tools/transcript-recorder.js +574 -0
- package/core/.formation/tools/utils-claude-cmd.test.js +28 -0
- package/core/.formation/tools/utils-worktree-config.test.js +44 -0
- package/core/.formation/tools/utils.js +1020 -0
- package/core/.formation/tools/verify-acceptance.js +585 -0
- package/core/.formation/tools/worktree-leak.test.js +162 -0
- package/core/.formation/tools/worktree-reclaim.js +259 -0
- package/core/.formation/tools/worktree-reclaim.test.js +182 -0
- package/core/.formation/tools/yggdrasil-local.js +97 -0
- package/core/.formation/unit/do.yaml +78 -0
- package/core/.formation/unit/heimdall.yaml +96 -0
- package/core/.formation/unit/plan.yaml +67 -0
- package/core/.formation/unit/think.yaml +58 -0
- package/core/.kenaz/MUNINN_SNAPSHOT9_EPISODE.json +32 -0
- package/core/.kenaz/MUNINN_SNAPSHOT9_RUNE.json +23 -0
- package/core/.kenaz/MUNINN_SNAPSHOT9_SUMMARY.md +89 -0
- package/core/.kenaz/ash_TASK_1428-20260507.json +14 -0
- package/core/.kenaz/cache/native-models/claude.json +42 -0
- package/core/.kenaz/claude-hooks-manifest.json +119 -0
- package/core/.kenaz/cortex.yaml +100 -0
- package/core/.kenaz/curator_state.json +7 -0
- package/core/.kenaz/dashboard-quick-prompts.json +9 -0
- package/core/.kenaz/designs/METAPLASTICITY_CONFIDENCE_DESIGN.md +537 -0
- package/core/.kenaz/designs/REFLEX_INITIATOR_DESIGN.md +501 -0
- package/core/.kenaz/designs/TASK_1385_handoff_mcp_design.md +426 -0
- package/core/.kenaz/designs/TASK_932_hippocampus_consolidation.md +103 -0
- package/core/.kenaz/designs/TASK_934_efe_signal_engine.md +97 -0
- package/core/.kenaz/designs/TASK_935_self_evolution_framework.md +154 -0
- package/core/.kenaz/designs/VISION_cognitive_architecture_roadmap.md +159 -0
- package/core/.kenaz/designs/metaplasticity_simulation_results.json +696 -0
- package/core/.kenaz/docs/INDEX.md +214 -0
- package/core/.kenaz/docs/README.md +290 -0
- package/core/.kenaz/docs/registry.json +962 -0
- package/core/.kenaz/docs/schema.json +144 -0
- package/core/.kenaz/docs/tools/GIT_HOOK_GUIDE.md +203 -0
- package/core/.kenaz/docs/tools/RAG_INTEGRATION_GUIDE.md +306 -0
- package/core/.kenaz/docs/tools/README.md +99 -0
- package/core/.kenaz/docs/tools/TIME_ESTIMATION_GUIDE.md +299 -0
- package/core/.kenaz/docs/tools/package-lock.json +618 -0
- package/core/.kenaz/docs/tools/package.json +34 -0
- package/core/.kenaz/docs/tools/src/cli.ts +365 -0
- package/core/.kenaz/docs/tools/src/field-extractor.ts +152 -0
- package/core/.kenaz/docs/tools/src/index.ts +14 -0
- package/core/.kenaz/docs/tools/src/registry.ts +664 -0
- package/core/.kenaz/docs/tools/src/search.ts +195 -0
- package/core/.kenaz/docs/tools/src/types.ts +88 -0
- package/core/.kenaz/docs/tools/test-git-hook.sh +79 -0
- package/core/.kenaz/docs/tools/tsconfig.json +20 -0
- package/core/.kenaz/docs/tools/verify.sh +106 -0
- package/core/.kenaz/episodes/SESSION_ansuz-prompt-1785087304784.yaml +68 -0
- package/core/.kenaz/huginn-exploration.json +8 -0
- package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -0
- package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -0
- package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -0
- package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -0
- package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -0
- package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -0
- package/core/.kenaz/main-memory/README.md +230 -0
- package/core/.kenaz/main-memory/kenaz/cortex/001_cortex_overview.md +168 -0
- package/core/.kenaz/main-memory/kenaz/cortex/001_rag_engine_overview.md +30 -0
- package/core/.kenaz/main-memory/kenaz/memory-system/001_three_tier_architecture.md +361 -0
- package/core/.kenaz/main-memory/kenaz/pipeline/001_task_execution_flow.md +117 -0
- package/core/.kenaz/main-memory/kenaz/pipeline/001_task_granularity.md +154 -0
- package/core/.kenaz/main-memory/kenaz/pipeline/002_team_priority.md +51 -0
- package/core/.kenaz/main-memory/kenaz/pipeline/003_feature_id_system.md +46 -0
- package/core/.kenaz/main-memory/kenaz/rules/001_gen_007_self_containment.md +108 -0
- package/core/.kenaz/main-memory/kenaz/rules/001_rule_priority_system.md +121 -0
- package/core/.kenaz/main-memory/kenaz/rules/002_agt_006_pre_check.md +0 -0
- package/core/.kenaz/main-memory/kenaz/rules/003_ppl_002_task_archival.md +48 -0
- package/core/.kenaz/main-memory/kenaz/system/001_dual_track_task_system.md +197 -0
- package/core/.kenaz/main-memory/knowledge/patterns/001_json_bom_issue.md +78 -0
- package/core/.kenaz/main-memory/knowledge/patterns/001_leader_worker_pattern.md +0 -0
- package/core/.kenaz/main-memory/knowledge/patterns/002_scope_path_conflict.md +115 -0
- package/core/.kenaz/main-memory/knowledge/patterns/002_task_dependency_resolution.md +223 -0
- package/core/.kenaz/main-memory/knowledge/patterns/003_question_protocol.md +242 -0
- package/core/.kenaz/main-memory/knowledge/patterns/004_user_insight_value.md +111 -0
- package/core/.kenaz/main-memory/knowledge/patterns/005_file_lock_pattern.md +274 -0
- package/core/.kenaz/main-memory/knowledge/references/001_ppl_rules.md +28 -0
- package/core/.kenaz/main-memory/knowledge/solutions/001_json_bom_issue.md +137 -0
- package/core/.kenaz/main-memory/knowledge/solutions/001_team_invocation.md +0 -0
- package/core/.kenaz/main-memory/knowledge/solutions/002_passive_monitoring.md +0 -0
- package/core/.kenaz/main-memory/knowledge/solutions/003_windows_file_race_condition.md +239 -0
- package/core/.kenaz/main-memory/registry.json +326 -0
- package/core/.kenaz/main-memory/version.yaml +58 -0
- package/core/.kenaz/muninn_episode_write.ps1 +17 -0
- package/core/.kenaz/muninn_snapshot11_rune_candidates.md +63 -0
- package/core/.kenaz/muninn_snapshot1_rune_candidates.md +49 -0
- package/core/.kenaz/orphan_audit_2026-05.md +181 -0
- package/core/.kenaz/ownership.yaml +155 -0
- package/core/.kenaz/peer.yaml +72 -0
- package/core/.kenaz/project.yaml +62 -0
- package/core/.kenaz/rune_ansuz_literature_validation_strategy.md +40 -0
- package/core/.kenaz/rune_efe_active_inference_validation.md +36 -0
- package/core/.kenaz/rune_yggdrasil_filesystem_scoped_project.md +41 -0
- package/core/.kenaz/rune_yggdrasil_project_identity_folder_name.md +41 -0
- package/core/.kenaz/rune_yggdrasil_relay_protocol_project_mismatch.md +39 -0
- package/core/.kenaz/runes_TASK_1428.json +57 -0
- package/core/.kenaz/specialist/ansuz_motivational_state.schema.json +138 -0
- package/core/.kenaz/specialist/ansuz_rules.yaml +241 -0
- package/core/.kenaz/specialist/ansuz_session_handoff.schema.json +128 -0
- package/core/.kenaz/specialist/chart_TASK_1657.json +50 -0
- package/core/.kenaz/specialist/cognitive-hub-e2e.test.js +494 -0
- package/core/.kenaz/specialist/daemon-manifest.yaml +168 -0
- package/core/.kenaz/specialist/empty_ac_audit_report.md +63 -0
- package/core/.kenaz/specialist/episode_muninn_completion_1785056865691.json +91 -0
- package/core/.kenaz/specialist/field_report_watermark.json +1 -0
- package/core/.kenaz/specialist/gc1826_driver.js +118 -0
- package/core/.kenaz/specialist/heimdall_proposal_1017c07f.json +13 -0
- package/core/.kenaz/specialist/heimdall_proposal_3dfaa8b9.json +12 -0
- package/core/.kenaz/specialist/heimdall_proposal_57af18f9.json +15 -0
- package/core/.kenaz/specialist/heimdall_proposal_57b1aa1b.json +14 -0
- package/core/.kenaz/specialist/heimdall_proposal_5a3c9473.json +13 -0
- package/core/.kenaz/specialist/identity_verdicts/TASK_1073.json +75 -0
- package/core/.kenaz/specialist/identity_verdicts/TASK_TEST.json +77 -0
- package/core/.kenaz/specialist/memory_guard_fired.json +1 -0
- package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -0
- package/core/.kenaz/specialist/memory_source_priority.yaml +260 -0
- package/core/.kenaz/specialist/motivational_state.schema.json +62 -0
- package/core/.kenaz/specialist/prompt_1775.txt +317 -0
- package/core/.kenaz/specialist/prompt_1776.txt +326 -0
- package/core/.kenaz/specialist/prompt_1791.txt +320 -0
- package/core/.kenaz/specialist/prompt_1792.txt +320 -0
- package/core/.kenaz/specialist/prompt_1795.txt +281 -0
- package/core/.kenaz/specialist/prompt_1813.txt +332 -0
- package/core/.kenaz/specialist/prompt_1814.txt +401 -0
- package/core/.kenaz/specialist/prompt_1815.txt +394 -0
- package/core/.kenaz/specialist/prompt_1816.txt +437 -0
- package/core/.kenaz/specialist/prompt_1818.txt +361 -0
- package/core/.kenaz/specialist/prompt_1819.txt +421 -0
- package/core/.kenaz/specialist/prompt_1821.txt +345 -0
- package/core/.kenaz/specialist/prompt_1822.txt +313 -0
- package/core/.kenaz/specialist/prompt_1824.txt +348 -0
- package/core/.kenaz/specialist/prompt_1826.txt +388 -0
- package/core/.kenaz/specialist/retired_organs/README.md +58 -0
- package/core/.kenaz/specialist/rune_calibration_poc.md +175 -0
- package/core/.kenaz/specialist/rune_efe_salience_gap.md +21 -0
- package/core/.kenaz/specialist/rune_ember_autonomous_dispatch_gate.md +24 -0
- package/core/.kenaz/specialist/rune_post_dispatch_verification_pattern.md +31 -0
- package/core/.kenaz/specialist/rune_surprise_proxy_improvement.md +28 -0
- package/core/.kenaz/specialist/rune_worktree_dispatch_pattern.md +31 -0
- package/core/.kenaz/specialist/rune_yaml_filter_desync_fix.md +26 -0
- package/core/.kenaz/specialist/rune_yggdrasil_project_identity_folder_name.md +24 -0
- package/core/.kenaz/specialist/sessions/chart_TASK_1599.json +41 -0
- package/core/.kenaz/specialist/sessions/hmap_028aa781-aad2-48c0-9a61-5540565d4a7f.json +5 -0
- package/core/.kenaz/specialist/sessions/hmap_20210387-0c64-400c-9d0a-53042a0cbd89.json +5 -0
- package/core/.kenaz/specialist/sessions/hmap_c1375c5d-fd9f-44bd-a83e-353ecbb0392f.json +5 -0
- package/core/.kenaz/specialist/sessions/scratch_028aa781-aad2-48c0-9a61-5540565d4a7f.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_0acc0fb3-24f9-453f-9e92-6ef1cdf03a7c.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_20210387-0c64-400c-9d0a-53042a0cbd89.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_2f10623e-b7a1-4647-905e-9dc7c4d99f9c.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_5a38b62d-608a-488c-82f0-7e47e95e0905.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_5d9758ef-d9b6-4ffe-a017-3ed26d0a313b.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_c1375c5d-fd9f-44bd-a83e-353ecbb0392f.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_c9f3c711-b73d-4fcd-ad2a-7b2bc024ee77.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_e72e5274-1c81-4655-a05a-f87d1ecb2917.json +6 -0
- package/core/.kenaz/specialist/sessions/scratch_f740cdbe-f756-41fc-98fb-2b1413d51901.json +6 -0
- package/core/.kenaz/specialist/t1777_probe.txt +1 -0
- package/core/.kenaz/specialist/task1825_update.json +43 -0
- package/core/.kenaz/specialist/task1827_update.json +43 -0
- package/core/.kenaz/specialist/task1828_update.json +43 -0
- package/core/.kenaz/specialist/taskgen/consolidation_i.json +38 -0
- package/core/.kenaz/specialist/taskgen/csharp_a.json +44 -0
- package/core/.kenaz/specialist/taskgen/csharp_b.json +40 -0
- package/core/.kenaz/specialist/taskgen/embedding_e.json +34 -0
- package/core/.kenaz/specialist/taskgen/hygiene_fg.json +39 -0
- package/core/.kenaz/specialist/taskgen/pathology_h.json +36 -0
- package/core/.kenaz/specialist/taskgen/unity_noise_d.json +38 -0
- package/core/.kenaz/specialist/taskgen/visibility_c.json +38 -0
- package/core/.kenaz/specialist/verify_1837.js +302 -0
- package/core/.kenaz/specialist/verify_1838.js +124 -0
- package/core/.kenaz/tmp/heimdall_proposal_fc7e0944.json +10 -0
- package/core/.kenaz/tmp_heimdall_proposal_8d3e392.json +13 -0
- package/core/.kenaz/tmp_props.json +1 -0
- package/core/.kenaz/tmp_sounddrop_t1_prompt.txt +371 -0
- package/core/.kenaz/user_model.schema.json +107 -0
- package/core/.matrix/README.md +257 -0
- package/core/.matrix/index.matrix +5 -0
- package/core/.mcp.json +8 -0
- package/core/.prefrontal/.gitkeep +0 -0
- package/core/.prefrontal/proposals/.gitkeep +0 -0
- package/core/.rule/INDEX.yaml +99 -0
- package/core/.rule/MECHANIZED.md +61 -0
- package/core/.rule/code/README.md +211 -0
- package/core/.rule/code/backend.yaml +294 -0
- package/core/.rule/code/checklist.yaml +258 -0
- package/core/.rule/code/maintainability.yaml +227 -0
- package/core/.rule/code/naming.yaml +106 -0
- package/core/.rule/code/principles.yaml +71 -0
- package/core/.rule/code/reusability.yaml +192 -0
- package/core/.rule/code/structure.yaml +218 -0
- package/core/.rule/code/style.yaml +197 -0
- package/core/.rule/design/ui.yaml +79 -0
- package/core/.rule/general/agent-workflow.yaml +572 -0
- package/core/.rule/general/cortex-memory-recall.yaml +446 -0
- package/core/.rule/general/cortex-tools.yaml +181 -0
- package/core/.rule/general/cross-platform.yaml +107 -0
- package/core/.rule/general/ddx-synapse-stack.yaml +162 -0
- package/core/.rule/general/file-size-threshold.yaml +45 -0
- package/core/.rule/general/identity-contract.schema.yaml +251 -0
- package/core/.rule/general/memory-language.yaml +67 -0
- package/core/.rule/general/memory-source-priority.yaml +207 -0
- package/core/.rule/general/pipeline.yaml +246 -0
- package/core/.rule/general/principles.yaml +77 -0
- package/core/.rule/general/project-self-containment.yaml +253 -0
- package/core/.rule/general/rust-verify-target.yaml +80 -0
- package/core/.rule/general/specialist-identity-contract.yaml +153 -0
- package/core/.rule/general/sunny-access-control.yaml +60 -0
- package/core/.rule/general/synapse-code-intelligence.yaml +375 -0
- package/core/.rule/general/synapse-cognitive-fusion.yaml +301 -0
- package/core/.rule/general/system-invariants.yaml +248 -0
- package/core/.rule/general/task-pool-routing.yaml +102 -0
- package/core/.rule/general/worktree-isolation.yaml +79 -0
- package/core/.rule/pipeline/PPL-002-completed-task-archival.yaml +528 -0
- package/core/.rule/pipeline/auto-update.yaml +282 -0
- package/core/.rule/pipeline/task-execution.yaml +368 -0
- package/core/.rule/tools/check-permissions.js +197 -0
- package/core/.specialist/Amelia/README.md +329 -0
- package/core/.specialist/Amelia/capability.yaml +386 -0
- package/core/.specialist/Amelia/knowledge.yaml +217 -0
- package/core/.specialist/Amelia/principles.yaml +10 -0
- package/core/.specialist/Amelia/rule.yaml +79 -0
- package/core/.specialist/Amelia/workflow.yaml +241 -0
- package/core/.specialist/Ansuz/HEURISTIC_BOOT_ROUTING.md +39 -0
- package/core/.specialist/Ansuz/ROUTING.md +35 -0
- package/core/.specialist/Ansuz/RULES.md +79 -0
- package/core/.specialist/Ansuz/SYSTEM_DOC.md +611 -0
- package/core/.specialist/Ansuz/VERIFY.md +38 -0
- package/core/.specialist/Ansuz/capability.yaml +338 -0
- package/core/.specialist/Ansuz/cognitive_principles.yaml +62 -0
- package/core/.specialist/Ansuz/concepts/agent_types.yaml +22 -0
- package/core/.specialist/Ansuz/concepts/autonomous_agenda.yaml +170 -0
- package/core/.specialist/Ansuz/concepts/autonomy_contract.yaml +126 -0
- package/core/.specialist/Ansuz/concepts/boot_ritual.yaml +107 -0
- package/core/.specialist/Ansuz/concepts/boot_rules_summary.yaml +16 -0
- package/core/.specialist/Ansuz/concepts/capability_pointers.yaml +21 -0
- package/core/.specialist/Ansuz/concepts/cognitive_fluency_contract.yaml +264 -0
- package/core/.specialist/Ansuz/concepts/cognitive_systems_competence_map.yaml +14 -0
- package/core/.specialist/Ansuz/concepts/cognitive_systems_hippocampus.yaml +14 -0
- package/core/.specialist/Ansuz/concepts/cognitive_systems_overview.yaml +27 -0
- package/core/.specialist/Ansuz/concepts/cognitive_systems_serendipity.yaml +14 -0
- package/core/.specialist/Ansuz/concepts/cognitive_systems_turn_context.yaml +13 -0
- package/core/.specialist/Ansuz/concepts/commitment_layer.yaml +150 -0
- package/core/.specialist/Ansuz/concepts/completion_tracking.yaml +29 -0
- package/core/.specialist/Ansuz/concepts/deep_knowledge_pointers.yaml +28 -0
- package/core/.specialist/Ansuz/concepts/evolvable_guardrails.yaml +20 -0
- package/core/.specialist/Ansuz/concepts/fatigue_handoff.yaml +84 -0
- package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +28 -0
- package/core/.specialist/Ansuz/concepts/guardrails_immutable.yaml +31 -0
- package/core/.specialist/Ansuz/concepts/identity.yaml +48 -0
- package/core/.specialist/Ansuz/concepts/interaction_protocol.yaml +42 -0
- package/core/.specialist/Ansuz/concepts/meta_evolvable_tier.yaml +28 -0
- package/core/.specialist/Ansuz/concepts/mindset.yaml +18 -0
- package/core/.specialist/Ansuz/concepts/phase9_verification.yaml +21 -0
- package/core/.specialist/Ansuz/concepts/phase_protocol.yaml +66 -0
- package/core/.specialist/Ansuz/concepts/principles.yaml +65 -0
- package/core/.specialist/Ansuz/concepts/self_evolution_overview.yaml +53 -0
- package/core/.specialist/Ansuz/concepts/task_first_protocol.yaml +7 -0
- package/core/.specialist/Ansuz/concepts/task_pool.yaml +119 -0
- package/core/.specialist/Ansuz/concepts/task_system.yaml +22 -0
- package/core/.specialist/Ansuz/concepts/write_verification.yaml +26 -0
- package/core/.specialist/Ansuz/core.yaml +224 -0
- package/core/.specialist/Ansuz/decisions/ADR-requirement-graph-layer.md +390 -0
- package/core/.specialist/Ansuz/elixir.yaml +70 -0
- package/core/.specialist/Ansuz/exo_cortex_tools.yaml +13 -0
- package/core/.specialist/Ansuz/experiments/boot_ablation_replay.js +197 -0
- package/core/.specialist/Ansuz/guards/blind_spot_guards.yaml +28 -0
- package/core/.specialist/Ansuz/guards/lesson_guards.yaml +203 -0
- package/core/.specialist/Ansuz/identity_contract.yaml +375 -0
- package/core/.specialist/Ansuz/knowledge.yaml +284 -0
- package/core/.specialist/Ansuz/modules/amelia_review.yaml +112 -0
- package/core/.specialist/Ansuz/modules/ddx.yaml +47 -0
- package/core/.specialist/Ansuz/modules/design_checks.yaml +47 -0
- package/core/.specialist/Ansuz/modules/identity_verification.yaml +119 -0
- package/core/.specialist/Ansuz/modules/loop_guard.yaml +36 -0
- package/core/.specialist/Ansuz/modules/prevention.yaml +84 -0
- package/core/.specialist/Ansuz/modules/prophecy.yaml +95 -0
- package/core/.specialist/Ansuz/modules/pulse_empty.yaml +36 -0
- package/core/.specialist/Ansuz/modules/qa_intake.yaml +29 -0
- package/core/.specialist/Ansuz/modules/recall.yaml +45 -0
- package/core/.specialist/Ansuz/principles.yaml +31 -0
- package/core/.specialist/Ansuz/research/EMBER_architecture_comparison.md +142 -0
- package/core/.specialist/Ansuz/rule.yaml +97 -0
- package/core/.specialist/Ansuz/self_model_seed.backup.json +100 -0
- package/core/.specialist/Ansuz/self_model_seed.json +100 -0
- package/core/.specialist/Ansuz/self_model_seed.sha256 +1 -0
- package/core/.specialist/Ansuz/tools/ansuz-handoff-snapshot.js +626 -0
- package/core/.specialist/Ansuz/tools/ansuz-handoff.js +437 -0
- package/core/.specialist/Ansuz/tools/ansuz-sdk-runner.js +1254 -0
- package/core/.specialist/Ansuz/tools/ansuz-sdk-runner.test.js +137 -0
- package/core/.specialist/Ansuz/tools/ansuz-state.js +288 -0
- package/core/.specialist/Ansuz/tools/bootstrap-anchors.js +289 -0
- package/core/.specialist/Ansuz/tools/handoff-freshness-milestone.test.js +73 -0
- package/core/.specialist/Ansuz/tools/handoff-resolver.js +207 -0
- package/core/.specialist/Ansuz/tools/handoff-session-identity.test.js +333 -0
- package/core/.specialist/Ansuz/tools/handoff-snapshot-args.test.js +25 -0
- package/core/.specialist/Ansuz/tools/install-claude-hooks.js +354 -0
- package/core/.specialist/Ansuz/tools/install-claude-hooks.test.js +110 -0
- package/core/.specialist/Ansuz/tools/package.json +16 -0
- package/core/.specialist/Ansuz/tools/preservation-coordinator.js +504 -0
- package/core/.specialist/Ansuz/tools/verify-and-land.js +1012 -0
- package/core/.specialist/Ansuz/tools/verify-and-land.test.js +1099 -0
- package/core/.specialist/Ansuz/workflow.yaml +1273 -0
- package/core/.specialist/Forseti/capability.yaml +210 -0
- package/core/.specialist/Forseti/core.yaml +176 -0
- package/core/.specialist/Forseti/principles.yaml +88 -0
- package/core/.specialist/Forseti/rule.yaml +86 -0
- package/core/.specialist/Heimdall/SKILL.md +65 -0
- package/core/.specialist/Heimdall/capability.yaml +134 -0
- package/core/.specialist/Heimdall/core.yaml +275 -0
- package/core/.specialist/Heimdall/principles.yaml +66 -0
- package/core/.specialist/Heimdall/rule.yaml +68 -0
- package/core/.specialist/Huginn/capability.yaml +234 -0
- package/core/.specialist/Huginn/core.yaml +482 -0
- package/core/.specialist/Huginn/principles.yaml +57 -0
- package/core/.specialist/Huginn/rule.yaml +121 -0
- package/core/.specialist/REFLECTION_TO_CONTROL.md +347 -0
- package/core/.specialist/ansuz_session_handoff.json +96 -0
- package/core/.specialist/experiments/rg_benchmark.js +523 -0
- package/core/.specialist/experiments/rg_benchmark_results.json +27 -0
- package/core/.specialist/shared/cognitive-primer.md +15 -0
- package/core/.specialist/shared/guard_schema.json +290 -0
- package/core/.specialist/shared/principles.yaml +213 -0
- package/core/.specialist/tests/runtime-discovery/README.md +224 -0
- package/core/.specialist/tests/runtime-discovery/active-project-polling.test.js +495 -0
- package/core/.specialist/tests/runtime-discovery/port-binding.test.js +418 -0
- package/core/.specialist/tests/runtime-discovery/resolver-priority.test.js +693 -0
- package/core/.specialist/tests/runtime-discovery/resolver-skip-on-invalid.test.js +467 -0
- package/core/.specialist/tests/runtime-discovery/resolver-symmetry.test.js +679 -0
- package/core/.specialist/tests/runtime-discovery/tail-cli-project-path.test.js +231 -0
- package/core/.specialist/tools/MEMORY_RECALL_TRIGGERS.md +156 -0
- package/core/.specialist/tools/README.md +129 -0
- package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +156 -0
- package/core/.specialist/tools/__tests__/task-1863-boot-lease-reuse.test.js +99 -0
- package/core/.specialist/tools/__tests__/task-1917-orphan-detection.test.js +175 -0
- package/core/.specialist/tools/__tests__/task-1977-banner-cap.test.js +129 -0
- package/core/.specialist/tools/__tests__/task-1983-lease-project-path.test.js +96 -0
- package/core/.specialist/tools/__tests__/task-2218-boot-session-id.test.js +118 -0
- package/core/.specialist/tools/__tests__/task-2222-session-identity-interleave.test.js +203 -0
- package/core/.specialist/tools/__tests__/task-2246-reap-honesty.test.js +96 -0
- package/core/.specialist/tools/__tests__/task-2254-handoff-archive-contract.test.js +60 -0
- package/core/.specialist/tools/__tests__/task-2272-open-card-status-quote.test.js +26 -0
- package/core/.specialist/tools/__tests__/task-2374-usage-counter.test.js +34 -0
- package/core/.specialist/tools/ansuz-boot-fast.js +1120 -0
- package/core/.specialist/tools/ansuz-boot-fast.test.js +705 -0
- package/core/.specialist/tools/canary.js +501 -0
- package/core/.specialist/tools/context-injection.js +395 -0
- package/core/.specialist/tools/design-reasoning.js +493 -0
- package/core/.specialist/tools/discovery-fixtures.js +308 -0
- package/core/.specialist/tools/discovery-runner.js +460 -0
- package/core/.specialist/tools/failure-detector.js +1132 -0
- package/core/.specialist/tools/identity-scorer.js +714 -0
- package/core/.specialist/tools/jev-optional-context.js +107 -0
- package/core/.specialist/tools/jev-optional-context.test.js +152 -0
- package/core/.specialist/tools/lesson-guard.js +1084 -0
- package/core/.specialist/tools/lib/chart-path.js +159 -0
- package/core/.specialist/tools/lib/chart-path.test.js +171 -0
- package/core/.specialist/tools/lib/project-resolver.js +200 -0
- package/core/.specialist/tools/lib/project-resolver.test.js +241 -0
- package/core/.specialist/tools/memory-action-log.js +839 -0
- package/core/.specialist/tools/phase-gate.js +3754 -0
- package/core/.specialist/tools/phase-gate.test.js +85 -0
- package/core/.specialist/tools/phase9-policy.test.js +109 -0
- package/core/.specialist/tools/precompute-runner.js +444 -0
- package/core/.specialist/tools/prompt-files.test.js +169 -0
- package/core/.specialist/tools/replay-detectors.js +290 -0
- package/core/.specialist/tools/rule-engine.js +621 -0
- package/core/.specialist/tools/session-boot-ownership.test.js +117 -0
- package/core/.specialist/tools/session-project-state.test.js +65 -0
- package/core/.specialist/tools/session.js +1866 -0
- package/core/.specialist/tools/stream-lease.js +263 -0
- package/core/.specialist/tools/task-bridge-jev.test.js +170 -0
- package/core/.specialist/tools/task-bridge.js +765 -0
- package/core/.specialist/tools/verify-identity.js +453 -0
- package/core/.specialist/tools/wish-mandate-delivery.test.js +76 -0
- package/core/.system/README.md +555 -0
- package/core/.system/agent-skills/README.md +724 -0
- package/core/.system/archive/README.md +499 -0
- package/core/.system/assessment/README.md +645 -0
- package/core/.system/cli-tools/README.md +724 -0
- package/core/.system/collaboration/KNOWLEDGE.md +65 -0
- package/core/.system/collaboration/README.md +570 -0
- package/core/.system/cortex/MODULES.md +1046 -0
- package/core/.system/dashboard/FRONTEND.md +812 -0
- package/core/.system/dashboard/README.md +737 -0
- package/core/.system/external-skills/README.md +522 -0
- package/core/.system/failure/README.md +723 -0
- package/core/.system/formation/LEGACY_SKILLS.md +972 -0
- package/core/.system/formation/POST_COMPLETE.md +600 -0
- package/core/.system/formation/README.md +1092 -0
- package/core/.system/formation/TOOLS_REFERENCE.md +1145 -0
- package/core/.system/githooks/README.md +846 -0
- package/core/.system/kenaz/README.md +787 -0
- package/core/.system/memory/README.md +716 -0
- package/core/.system/pipeline/README.md +712 -0
- package/core/.system/rule/README.md +794 -0
- package/core/.system/specialist/README.md +669 -0
- package/core/.system/specialist/STRUCTURE.md +262 -0
- package/core/.system/sunny/README.md +476 -0
- package/core/.system/sunny/RULES.json +89 -0
- package/core/.system/sunny/knowledge/INDEX.md +37 -0
- package/core/.system/sunny/knowledge/agent-teams-api.md +0 -0
- package/core/.system/sunny/knowledge/ansuz-specialist.md +500 -0
- package/core/.system/sunny/knowledge/claude-cli-spawn.md +177 -0
- package/core/.system/sunny/knowledge/collaboration-api.md +925 -0
- package/core/.system/sunny/teammates/README.md +107 -0
- package/core/.system/sunny/teammates/how_to_use.yaml +101 -0
- package/core/.system/sunny/teammates/tools/headless/launcher.js +318 -0
- package/core/.system/sunny/teammates/tools/powershell/launcher.js +241 -0
- package/core/.system/sunny/teammates/tools/powershell/start.bat +50 -0
- package/core/.system/sunny/teammates/tools/utils/env.js +96 -0
- package/core/.system/sunny/teammates/tools/utils/format-output.js +329 -0
- package/core/.system/sunny/tools.json +101 -0
- package/core/.vendor/js-yaml.cjs +2795 -0
- package/core/.vendor/require-yaml.cjs +8 -0
- package/core/CLAUDE.md +172 -0
- package/core/KENAZ_CORE_VERSION +1 -0
- package/core/dev/ALAYA_FIELD_FEEDBACK_DESIGN.md +126 -0
- package/core/dev/ANSUZ_SCAFFOLD_DIET_2026-09-20.md +231 -0
- package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -0
- package/core/dev/ANSUZ_WORKFLOW_MODERNIZATION.md +143 -0
- package/core/dev/CORTEX_META_GRAPH_ASSESSMENT.md +99 -0
- package/core/dev/FREYA_DOWNSTREAM_BUGS_2026-09-19.md +44 -0
- package/core/dev/GLOBAL_MEMORY_IDENTITY_CONSOLIDATION.md +263 -0
- package/core/dev/GUARD_EFFECTIVENESS_DESIGN.md +180 -0
- package/core/dev/HEALTH_GATE_VARIANCE_ASSESSMENT.md +271 -0
- package/core/dev/HOOK_DIET_2026-09-21.md +126 -0
- package/core/dev/JEV_INTEGRATION_PLAN.md +189 -0
- package/core/dev/KENAZ_AGENT_CONNECT_v1_SPEC.md +139 -0
- package/core/dev/MOBILE_DESIGN_SPEC.md +569 -0
- package/core/dev/MULTI_ANSUZ_SPEC.md +136 -0
- package/core/dev/MUNINN_RETIREMENT.md +115 -0
- package/core/dev/PHASE3_ATTRIBUTION_POPULATION_DIAGNOSIS.md +211 -0
- package/core/dev/PHASE3_P3-2B_TASKLEVEL_PROBE.md +83 -0
- package/core/dev/PHASE3_P3-2_POPULATION_DISJOINTNESS.md +83 -0
- package/core/dev/PHASE3_P3-2_REMEASURE_REPORT.md +231 -0
- package/core/dev/PREDICTION_GROUNDING_DESIGN.md +376 -0
- package/core/dev/PRODUCT_SPEC.md +317 -0
- package/core/dev/PRODUCT_SPEC_FOR_AI_tepmlate.md +716 -0
- package/core/dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md +86 -0
- package/core/dev/STARTUP_TIMELINE_TASK_1995.md +181 -0
- package/core/dev/SYNAPSE_WORKER_PER_PROJECT.md +881 -0
- package/core/dev/TASK_1680_P3-3_DISPATCH_SPEC.md +96 -0
- package/core/dev/TASK_1684_CALIBRATION_IMPACT_ANALYSIS.md +170 -0
- package/core/dev/TASK_1684_FORK_A_GOODHART_DESIGN.md +171 -0
- package/core/dev/TASK_1684_P3_2_REMEASURE_VALIDATION.md +262 -0
- package/core/dev/TASK_1903_SIGNAL_AUC_MEASUREMENT.md +207 -0
- package/core/dev/TASK_1904_BRANCH_INTEGRITY_AUDIT.md +146 -0
- package/core/dev/ansuz-eval/README.md +38 -0
- package/core/dev/ansuz-eval/build-fixtures.js +87 -0
- package/core/dev/ansuz-eval/grade.js +96 -0
- package/core/dev/ansuz-eval/grader.test.js +117 -0
- package/core/dev/ansuz-eval/tasks.md +32 -0
- package/core/dev/archive/ansuz/BOOT_FULL.md +141 -0
- package/core/dev/archive/ansuz/agents/ansuz-boot.md +176 -0
- package/core/dev/archive/ansuz/designs/alaya-passive-surfacing.md +84 -0
- package/core/dev/archive/ansuz/designs/cc_memory_indexing.md +307 -0
- package/core/dev/archive/ansuz/designs/check_guard.md +322 -0
- package/core/dev/archive/ansuz/designs/consequence_loop.md +227 -0
- package/core/dev/archive/ansuz/designs/mcp_kuzudb_lock_architecture.md +312 -0
- package/core/dev/archive/ansuz/designs/phase0_git_enrichment.md +278 -0
- package/core/dev/archive/ansuz/designs/refactor_mcp_tools_synapse.md +490 -0
- package/core/dev/archive/ansuz/designs/semantic_markdown_extraction.md +167 -0
- package/core/dev/archive/ansuz/designs/task_1372_prompt_injects_into.md +193 -0
- package/core/dev/archive/ansuz/designs/thought_stack.md +286 -0
- package/core/dev/archive/ansuz/investigations/reachability_unified_api_2026-04-11.md +330 -0
- package/core/dev/archive/ansuz/investigations/synapse_orphans_indexing_bug_2026-04-11.md +352 -0
- package/core/dev/archive/ansuz/investigations/synapse_orphans_reindex_verification_2026-04-11.md +48 -0
- package/core/dev/archive/ansuz/investigations/synapse_orphans_verification_2026-04-11.md +170 -0
- package/core/dev/archive/ansuz/legacy/kernel.yaml +399 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_0.yaml +418 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_1.yaml +376 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_10.yaml +35 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_11.yaml +582 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_2.yaml +94 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_3.yaml +274 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_4.yaml +67 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_5.yaml +32 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_6.yaml +91 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_7.yaml +58 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_8.yaml +146 -0
- package/core/dev/archive/ansuz/legacy/phases/phase_9.yaml +424 -0
- package/core/dev/archive/ansuz/specs/INDEX_bifrost_hook_parity.yaml +92 -0
- package/core/dev/archive/ansuz/specs/active-inference-formation.yaml +453 -0
- package/core/dev/archive/ansuz/specs/brief_TASK_1228_userpromptsubmit.yaml +191 -0
- package/core/dev/archive/ansuz/specs/brief_TASK_1229_pretooluse_posttooluse.yaml +250 -0
- package/core/dev/archive/ansuz/specs/brief_TASK_1230_sessionstart_stop.yaml +301 -0
- package/core/dev/archive/ansuz/specs/brief_TASK_1231_verification.yaml +272 -0
- package/core/dev/design/PHASE4_DESIGN.md +559 -0
- package/core/dev/design/dashboard_docs_integration_PLAN.md +388 -0
- package/core/dev/design/matrix_format_ABBREVIATIONS.md +655 -0
- package/core/dev/design/matrix_format_DESIGN_SPEC.md +601 -0
- package/core/dev/design/matrix_format_DISCUSSION_SUMMARY.md +484 -0
- package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -0
- package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -0
- package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -0
- package/core/dev/design/matrix_format_SYNTAX_BNF.md +754 -0
- package/core/dev/design/matrix_format_TOKEN_COMPARISON.md +484 -0
- package/core/dev/design/matrix_v2_COGNITIVE_DESIGN.md +503 -0
- package/core/dev/design/matrix_v2_DISCUSSION_SUMMARY.md +414 -0
- package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -0
- package/core/dev/designs/EXPANDABLE_CARD_DESIGN_SPEC.md +509 -0
- package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -0
- package/core/dev/jev-eval/ANNOTATION_GUIDE.md +68 -0
- package/core/dev/jev-eval/BASELINE_COMPARISON.md +45 -0
- package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -0
- package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -0
- package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -0
- package/core/dev/jev-eval/PACKAGING_VERIFICATION.md +42 -0
- package/core/dev/jev-eval/README.md +101 -0
- package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -0
- package/core/dev/jev-eval/VALIDATION_PROGRESS.md +54 -0
- package/core/dev/jev-eval/cli.mjs +50 -0
- package/core/dev/jev-eval/context.mjs +183 -0
- package/core/dev/jev-eval/corpus.mjs +186 -0
- package/core/dev/jev-eval/fixtures/conversation-review.seed.jsonl +6 -0
- package/core/dev/jev-eval/fixtures/synthetic.jsonl +11 -0
- package/core/dev/jev-eval/metrics.mjs +67 -0
- package/core/dev/jev-eval/muninn-baseline.mjs +119 -0
- package/core/dev/jev-eval/providers.mjs +95 -0
- package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -0
- package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -0
- package/core/dev/jev-eval/reports/conversation-review.pending.json +151 -0
- package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -0
- package/core/dev/jev-eval/reports/length-probe-2026-09-20.json +133 -0
- package/core/dev/jev-eval/reports/live-smoke-2026-09-20.json +616 -0
- package/core/dev/jev-eval/reports/muninn-baseline-2026-09-20.json +52 -0
- package/core/dev/jev-eval/reports/resilience-2026-09-20.json +520 -0
- package/core/dev/jev-eval/reports/rules-baseline.json +197 -0
- package/core/dev/jev-eval/reports/synthetic-review.pending.json +357 -0
- package/core/dev/jev-eval/resilience.mjs +71 -0
- package/core/dev/jev-eval/review.mjs +78 -0
- package/core/dev/jev-eval/schema.mjs +87 -0
- package/core/dev/jev-eval/test/context.test.mjs +95 -0
- package/core/dev/jev-eval/test/corpus.test.mjs +102 -0
- package/core/dev/jev-eval/test/eval.test.mjs +146 -0
- package/core/dev/jev-eval/test/muninn-baseline.test.mjs +71 -0
- package/core/dev/jev-eval/test/resilience.test.mjs +72 -0
- package/core/dev/jev-eval/test/review.test.mjs +61 -0
- package/core/dev/pipeline/LOCK_STATE.json +4 -0
- package/core/dev/pipeline/OPTIMIZATION_PROPOSALS.json +32 -0
- package/core/dev/pipeline/PHASE3_PLANNING_SUMMARY.md +338 -0
- package/core/dev/pipeline/PIPELINE_CONFIG.json +46 -0
- package/core/dev/pipeline/PROGRESS.md +113 -0
- package/core/dev/pipeline/PROGRESS_template.md +860 -0
- package/core/dev/pipeline/QA_REPORT_F008.md +431 -0
- package/core/dev/pipeline/QA_REPORT_LOCAL_CLAUDE_DIAGNOSIS.md +583 -0
- package/core/dev/pipeline/README.md +210 -0
- package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -0
- package/core/dev/pipeline/TASK_QUEUE.json +192 -0
- package/core/dev/pipeline/WORKFLOW_GUIDE.md +824 -0
- package/core/dev/pipeline/archived/TASK_015_tauri_init.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_016_tauri_commands.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_017_rust_pty.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_018_tauri_bundle.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_019_release_workflow.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_020_update_ui.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_021_update_notification_ui.yaml +55 -0
- package/core/dev/pipeline/archived/TASK_022_remove_node_pty.yaml +65 -0
- package/core/dev/pipeline/archived/TASK_023_api_routes_migration.yaml +86 -0
- package/core/dev/pipeline/archived/TASK_024_feature_id_system.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_025_executable_acceptance.yaml +66 -0
- package/core/dev/pipeline/archived/TASK_026_spec_versioning.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_027_drift_detection.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_028_tauri_pty_manager.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_029_tauri_pty_commands.yaml +62 -0
- package/core/dev/pipeline/archived/TASK_030_frontend_session_adapter.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_031_terminal_tauri_events.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_041_scheduler_data_models.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_042_path_lock_manager.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_043_process_manager.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_044_git_integration.yaml +85 -0
- package/core/dev/pipeline/archived/TASK_045_task_queue_manager.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_046_scheduler_dispatcher.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_047_tauri_scheduler_commands.yaml +55 -0
- package/core/dev/pipeline/archived/TASK_048_realtime_status_push.yaml +92 -0
- package/core/dev/pipeline/archived/TASK_049_frontend_scheduler_integration.yaml +58 -0
- package/core/dev/pipeline/archived/TASK_050_error_recovery.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_051_optimization_proposals_backend.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_052_optimization_proposals_ui.yaml +58 -0
- package/core/dev/pipeline/archived/TASK_053_optimization_proposals_diff_view.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_054_multi_project_scheduler_state.yaml +76 -0
- package/core/dev/pipeline/archived/TASK_055_scheduler_api_project_scope.yaml +64 -0
- package/core/dev/pipeline/archived/TASK_056_frontend_scheduler_project_scope.yaml +62 -0
- package/core/dev/pipeline/archived/TASK_057_scheduler_module_structure.yaml +54 -0
- package/core/dev/pipeline/archived/TASK_058_scheduler_models_extract.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_059_scheduler_core_extract.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_060_scheduler_commands_extract.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_061_scheduler_specialized_commands.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_062_process_manager_module_structure.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_063_process_manager_core_extract.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_064_recovery_module_structure.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_065_recovery_core_extract.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_066_self_enhancement_scheduler_models.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_067_agents_section_quick_actions.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_067_self_enhancement_scheduler_core.yaml +65 -0
- package/core/dev/pipeline/archived/TASK_068_agent_workflow_rule_enhancement.yaml +46 -0
- package/core/dev/pipeline/archived/TASK_068_self_enhancement_tauri_commands.yaml +61 -0
- package/core/dev/pipeline/archived/TASK_069_agent_wizard_responsive.yaml +46 -0
- package/core/dev/pipeline/archived/TASK_069_self_enhancement_ui.yaml +62 -0
- package/core/dev/pipeline/archived/TASK_070_preview_panel_redesign.yaml +62 -0
- package/core/dev/pipeline/archived/TASK_070_self_enhancement_integration.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_071_preview_panel_qa.yaml +98 -0
- package/core/dev/pipeline/archived/TASK_071_single_agent_config.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_072_preview_modal_esc_fix.yaml +71 -0
- package/core/dev/pipeline/archived/TASK_072_product_review_module.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_073_agents_page_component_refactor.yaml +68 -0
- package/core/dev/pipeline/archived/TASK_073_rename_single_agent.yaml +64 -0
- package/core/dev/pipeline/archived/TASK_074_preview_mode_ui_diagnosis.yaml +71 -0
- package/core/dev/pipeline/archived/TASK_074_single_agent_ui_toggle.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_075_agents_page_component_refactor.yaml +69 -0
- package/core/dev/pipeline/archived/TASK_075_single_agent_integration_test.yaml +75 -0
- package/core/dev/pipeline/archived/TASK_076_preview_mode_ui_diagnosis.yaml +70 -0
- package/core/dev/pipeline/archived/TASK_076_single_agent_continuous_mode.yaml +65 -0
- package/core/dev/pipeline/archived/TASK_077_failure_directory_structure.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_077_single_agent_typescript_types.yaml +59 -0
- package/core/dev/pipeline/archived/TASK_078_fail_001_agent_no_output.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_078_single_agent_ui_simplify.yaml +74 -0
- package/core/dev/pipeline/archived/TASK_079_dashboard_rwd_responsive.yaml +63 -0
- package/core/dev/pipeline/archived/TASK_079_fail_002_json_bom.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_080_fail_003_queue_pollution.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_080_http_server_module.yaml +55 -0
- package/core/dev/pipeline/archived/TASK_081_failure_logging_tools.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_081_http_api_routes.yaml +62 -0
- package/core/dev/pipeline/archived/TASK_082_frontend_api_adapter.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_082_integrate_failure_to_workflow.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_083_cleanup_nextjs_api.yaml +48 -0
- package/core/dev/pipeline/archived/TASK_083_task_queue_cleanup.yaml +67 -0
- package/core/dev/pipeline/archived/TASK_084_rust_dead_code_cleanup.yaml +66 -0
- package/core/dev/pipeline/archived/TASK_084_scheduler_sync_logic_fix.yaml +68 -0
- package/core/dev/pipeline/archived/TASK_085_http_api_web_mode_fixes.yaml +46 -0
- package/core/dev/pipeline/archived/TASK_085_memory_consolidation_0204_0205.yaml +98 -0
- package/core/dev/pipeline/archived/TASK_086_collapsible_preview_panel.yaml +161 -0
- package/core/dev/pipeline/archived/TASK_086_web_mode_feature_parity.yaml +62 -0
- package/core/dev/pipeline/archived/TASK_087_manual_memory_archival.yaml +163 -0
- package/core/dev/pipeline/archived/TASK_087_mobile_http_control.yaml +68 -0
- package/core/dev/pipeline/archived/TASK_088_fail_003_to_ppl_002_rule.yaml +63 -0
- package/core/dev/pipeline/archived/TASK_088_mobile_http_qa.yaml +121 -0
- package/core/dev/pipeline/archived/TASK_089_agent_collaboration_topic.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_089_web_mode_monitor_fix.yaml +58 -0
- package/core/dev/pipeline/archived/TASK_090_cli_detection_fix.yaml +61 -0
- package/core/dev/pipeline/archived/TASK_090_ui_ux_lessons_topic.yaml +63 -0
- package/core/dev/pipeline/archived/TASK_091_expandable_card_design.yaml +56 -0
- package/core/dev/pipeline/archived/TASK_091_move_agent_section_components.yaml +65 -0
- package/core/dev/pipeline/archived/TASK_092_expandable_card_component.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_092_refactor_agent_create_wizard.yaml +84 -0
- package/core/dev/pipeline/archived/TASK_093_taskcard_detail_integration.yaml +57 -0
- package/core/dev/pipeline/archived/TASK_093_update_barrel_exports_test.yaml +84 -0
- package/core/dev/pipeline/archived/TASK_094_ai_agent_generation_enhancement.yaml +115 -0
- package/core/dev/pipeline/archived/TASK_094_proposalcard_detail_integration.yaml +55 -0
- package/core/dev/pipeline/archived/TASK_095_preview_fixes.yaml +129 -0
- package/core/dev/pipeline/archived/TASK_095_single_agent_task_selector.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_096_agents_page_ux_improvements.yaml +163 -0
- package/core/dev/pipeline/archived/TASK_096_single_agent_status_sync.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_097_local_claude_error_logging.yaml +59 -0
- package/core/dev/pipeline/archived/TASK_097_single_agent_monitor_events.yaml +59 -0
- package/core/dev/pipeline/archived/TASK_098_product_manager_team_phase2.yaml +60 -0
- package/core/dev/pipeline/archived/TASK_098_single_agent_refactor_test.yaml +58 -0
- package/core/dev/pipeline/archived/TASK_099_backend_team_creation.yaml +258 -0
- package/core/dev/pipeline/archived/TASK_100_frontend_team_creation.yaml +61 -0
- package/core/dev/pipeline/archived/TASK_101_orchestrator_system.yaml +403 -0
- package/core/dev/pipeline/archived/TASK_102_designer_sre_teams.yaml +90 -0
- package/core/dev/pipeline/archived/TASK_103_integration_testing.yaml +86 -0
- package/core/dev/pipeline/archived/TASK_128_integration_testing.yaml +83 -0
- package/core/dev/pipeline/archived/TASK_134_cortex_v2_phase3_file_watcher.yaml +65 -0
- package/core/dev/pipeline/archived/TASK_134_team_http_api.yaml +96 -0
- package/core/dev/pipeline/archived/TASK_135_cortex_v2_phase3_git_monitor.yaml +63 -0
- package/core/dev/pipeline/archived/TASK_136_cortex_v2_phase3_change_analyzer.yaml +69 -0
- package/core/dev/pipeline/archived/TASK_137_cortex_v2_phase3_cache_invalidator.yaml +67 -0
- package/core/dev/pipeline/archived/TASK_137_team_orchestrator_integration.yaml +93 -0
- package/core/dev/pipeline/archived/TASK_138_cortex_v2_phase3_distributed_cache.yaml +68 -0
- package/core/dev/pipeline/archived/TASK_138_matrix_folder_structure.yaml +61 -0
- package/core/dev/pipeline/archived/TASK_139_cortex_v2_phase3_cache_prewarming.yaml +65 -0
- package/core/dev/pipeline/archived/TASK_146_unified_documentation.yaml +141 -0
- package/core/dev/pipeline/archived/TASK_147_pipeline_execution_rules.yaml +76 -0
- package/core/dev/pipeline/archived/TASK_148_update_claude_md.yaml +77 -0
- package/core/dev/pipeline/archived/TASK_149_fix_nextjs_mdx_serialization.yaml +63 -0
- package/core/dev/pipeline/archived/TASK_149_update_team_docs.yaml +77 -0
- package/core/dev/pipeline/archived/TASK_150_pipeline_workflow_guide.yaml +82 -0
- package/core/dev/pipeline/archived/TASK_164_fix_smart_context_switch.yaml +49 -0
- package/core/dev/pipeline/archived/TASK_165_ctags_symbol_index.yaml +53 -0
- package/core/dev/pipeline/archived/TASK_166_symbol_search_mcp_tool.yaml +48 -0
- package/core/dev/pipeline/archived/TASK_167_llm_module_summary.yaml +55 -0
- package/core/dev/pipeline/archived/TASK_168_map_reduce_context.yaml +51 -0
- package/core/dev/pipeline/archived/TASK_169_v2_integration_testing.yaml +52 -0
- package/core/dev/pipeline/backups/archive_2026-02-04T22-07-22/TASK_QUEUE_backup.json +95 -0
- package/core/dev/pipeline/docs/multi-agent-coordination.md +446 -0
- package/core/dev/pipeline/docs/overview.md +406 -0
- package/core/dev/pipeline/docs/task-management.md +412 -0
- package/core/dev/pipeline/docs/workflows.md +32 -0
- package/core/dev/pipeline/orchestrator/schemas/task_queue_schema.json +58 -0
- package/core/dev/pipeline/orchestrator/schemas/task_schema.json +139 -0
- package/core/dev/pipeline/plans/PLAN_task_cli_refactor.md +281 -0
- package/core/dev/pipeline/tasks/.gitkeep +1 -0
- package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -0
- package/core/dev/plans/CLI_FIRST_INSTALL_FLOW.md +128 -0
- package/core/dev/plans/FORMATION_RETIREMENT_PLAN.md +313 -0
- package/core/dev/plans/KUZU_REPLACEMENT_PLAN.md +126 -0
- package/core/dev/schemas/PRODUCT_SPEC.example.yaml +382 -0
- package/core/dev/schemas/PRODUCT_SPEC.schema.json +800 -0
- package/core/dev/schemas/README.md +517 -0
- package/core/dev/schemas/TASK.schema.json +226 -0
- package/core/dev/schemas/dataflows_ground_truth.yaml +173 -0
- package/core/dev/schemas/dataflows_spec.yaml +160 -0
- package/core/dev/schemas/extends_ground_truth.yaml +66 -0
- package/core/dev/schemas/extends_spec.yaml +121 -0
- package/core/dev/schemas/implements_ground_truth.yaml +77 -0
- package/core/dev/schemas/implements_spec.yaml +140 -0
- package/core/dev/scripts/CRASH_DIAGNOSIS.md +47 -0
- package/core/dev/scripts/README.md +142 -0
- package/core/dev/scripts/RUN_ONCE.bat +40 -0
- package/core/dev/scripts/START_DEV_AGENT.bat +63 -0
- package/core/dev/scripts/START_MULTI_AGENT.bat +80 -0
- package/core/dev/scripts/check-alaya-report-isolation.js +255 -0
- package/core/dev/scripts/check-file-size.js +268 -0
- package/core/dev/scripts/ci-feedback.js +251 -0
- package/core/dev/scripts/clean-verify-targets.js +132 -0
- package/core/dev/scripts/cleanup-queue.js +184 -0
- package/core/dev/scripts/cleanup_queue.js +86 -0
- package/core/dev/scripts/dev_agent_scheduler.ps1 +536 -0
- package/core/dev/scripts/dispatch-stats.js +384 -0
- package/core/dev/scripts/dispatch-stats.test.js +162 -0
- package/core/dev/scripts/gc-agent-worktrees.js +461 -0
- package/core/dev/scripts/gc-agent-worktrees.test.js +48 -0
- package/core/dev/scripts/hooks/README.md +148 -0
- package/core/dev/scripts/init_git.ps1 +396 -0
- package/core/dev/scripts/init_git.sh +337 -0
- package/core/dev/scripts/init_project.ps1 +851 -0
- package/core/dev/scripts/init_project.sh +477 -0
- package/core/dev/scripts/js-yaml-resolution.test.js +48 -0
- package/core/dev/scripts/kenaz-session.js +354 -0
- package/core/dev/scripts/kenaz-session.test.js +234 -0
- package/core/dev/scripts/legacy/README.md +39 -0
- package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -0
- package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -0
- package/core/dev/scripts/matrix/CLI_README.md +214 -0
- package/core/dev/scripts/matrix/README.md +310 -0
- package/core/dev/scripts/matrix/package-lock.json +4266 -0
- package/core/dev/scripts/matrix/package.json +55 -0
- package/core/dev/scripts/matrix/src/abbreviations.ts +295 -0
- package/core/dev/scripts/matrix/src/cli/commands/convert.ts +211 -0
- package/core/dev/scripts/matrix/src/cli/commands/create.ts +95 -0
- package/core/dev/scripts/matrix/src/cli/commands/delete.ts +102 -0
- package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -0
- package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -0
- package/core/dev/scripts/matrix/src/cli/commands/query.ts +261 -0
- package/core/dev/scripts/matrix/src/cli/commands/read.ts +77 -0
- package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -0
- package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -0
- package/core/dev/scripts/matrix/src/cli/commands/update.ts +147 -0
- package/core/dev/scripts/matrix/src/cli/commands/validate.ts +275 -0
- package/core/dev/scripts/matrix/src/cli/index.ts +350 -0
- package/core/dev/scripts/matrix/src/cli/utils/file-handler.ts +72 -0
- package/core/dev/scripts/matrix/src/cli/utils/logger.ts +65 -0
- package/core/dev/scripts/matrix/src/index.ts +62 -0
- package/core/dev/scripts/matrix/src/indexer/tag-indexer.ts +165 -0
- package/core/dev/scripts/matrix/src/parser.ts +281 -0
- package/core/dev/scripts/matrix/src/serializer.ts +151 -0
- package/core/dev/scripts/matrix/src/validator.ts +301 -0
- package/core/dev/scripts/matrix/tests/abbreviations.test.ts +122 -0
- package/core/dev/scripts/matrix/tests/cli.test.ts +177 -0
- package/core/dev/scripts/matrix/tests/convert.test.ts +143 -0
- package/core/dev/scripts/matrix/tests/parser.test.ts +203 -0
- package/core/dev/scripts/matrix/tests/query.test.ts +85 -0
- package/core/dev/scripts/matrix/tests/serializer.test.ts +197 -0
- package/core/dev/scripts/matrix/tests/validate.test.ts +141 -0
- package/core/dev/scripts/matrix/tests/validator.test.ts +167 -0
- package/core/dev/scripts/matrix/tsconfig.json +20 -0
- package/core/dev/scripts/matrix/types/index.d.ts +111 -0
- package/core/dev/scripts/matrix/types/index.d.ts.map +1 -0
- package/core/dev/scripts/matrix/types/index.js +8 -0
- package/core/dev/scripts/matrix/types/index.js.map +1 -0
- package/core/dev/scripts/matrix/types/index.ts +124 -0
- package/core/dev/scripts/memory-guard-eval.js +330 -0
- package/core/dev/scripts/memory-usage-report.js +152 -0
- package/core/dev/scripts/migrate-task-dependencies.js +198 -0
- package/core/dev/scripts/multi_agent_scheduler.ps1 +2021 -0
- package/core/dev/scripts/multi_agent_scheduler.sh +1344 -0
- package/core/dev/scripts/probe/ansuz-scaffold-ablation.js +579 -0
- package/core/dev/scripts/probe/ansuz-scaffold-ablation.test.js +244 -0
- package/core/dev/scripts/probe/hippocampus-concurrency.js +247 -0
- package/core/dev/scripts/probe/hook-latency-probe.js +315 -0
- package/core/dev/scripts/probe/hook-latency-probe.test.js +105 -0
- package/core/dev/scripts/probe/prediction-signal-auc.js +483 -0
- package/core/dev/scripts/probe/prediction-signal-auc.test.js +200 -0
- package/core/dev/scripts/reset_tasks.js +99 -0
- package/core/dev/scripts/run-rust-tests.js +207 -0
- package/core/dev/scripts/run-rust-tests.test.js +154 -0
- package/core/dev/scripts/run_once.sh +47 -0
- package/core/dev/scripts/rust-verify-worktree.js +591 -0
- package/core/dev/scripts/rust-verify-worktree.test.js +574 -0
- package/core/dev/scripts/seh_probe.rs +26 -0
- package/core/dev/scripts/setup_mcp.ps1 +192 -0
- package/core/dev/scripts/setup_mcp.sh +159 -0
- package/core/dev/scripts/setup_rag.ps1 +304 -0
- package/core/dev/scripts/setup_rag.sh +230 -0
- package/core/dev/scripts/start_dev_agent.sh +137 -0
- package/core/dev/scripts/start_multi_agent.sh +41 -0
- package/core/dev/scripts/sync_task_queue.ps1 +505 -0
- package/core/dev/scripts/sync_task_queue.sh +392 -0
- package/core/dev/scripts/task1961/RUNBOOK.md +300 -0
- package/core/dev/scripts/task1961/fixtures/never-listens.server.js +54 -0
- package/core/dev/scripts/task1961/fixtures/slow-serve.server.js +134 -0
- package/core/dev/scripts/task1961/run-fixture.js +659 -0
- package/core/dev/scripts/task1961/selftest.js +247 -0
- package/core/dev/scripts/test-pty-ws-tunnel.js +229 -0
- package/core/dev/scripts/validate_pipeline.js +197 -0
- package/core/dev/scripts/verify-isbar-capture.js +100 -0
- package/core/dev/scripts/verify-target-dir.js +69 -0
- package/core/dev/scripts/verify-task-1839.js +141 -0
- package/core/dev/specs/agent-connect/PROTOCOL.md +177 -0
- package/core/dev/specs/agent-connect/SDK_GUIDE.md +915 -0
- package/core/dev/specs/agent-connect/examples/minimal-site/README.md +137 -0
- package/core/dev/specs/agent-connect/examples/minimal-site/package.json +12 -0
- package/core/dev/specs/agent-connect/examples/minimal-site/public/index.html +116 -0
- package/core/dev/specs/agent-connect/examples/minimal-site/public/install-redirect.js +73 -0
- package/core/dev/specs/agent-connect/examples/minimal-site/server.js +516 -0
- package/core/dev/specs/agent-connect/examples/minimal-site/test/smoke.test.mjs +263 -0
- package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-empty-prompt-no-first-turn.md +77 -0
- package/core/dev/specs/agent-connect/history/DEFECT_REPORT_kenaz-agent-hub_2026-09-09_v0.4-prompt-mojibake.md +90 -0
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-07.md +61 -0
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-08_relay-v1-conformance.md +76 -0
- package/core/dev/specs/agent-connect/history/FEATURE_REQUEST_kenaz-agent-hub_2026-09-09_v0.4-session-channel.md +87 -0
- package/core/dev/specs/agent-connect/history/FLOWPIX_REPLY_agent-hub_2026-09-08_relay-v1-answers.md +68 -0
- package/core/dev/specs/agent-connect/history/FLOWPIX_bridge_CONTRACT.md +642 -0
- package/core/dev/specs/agent-connect/history/FLOWPIX_spikes_relay_spike_relay.mjs +244 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-07.md +77 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_direction-change-v0.3.md +44 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-answers-ack.md +37 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-08_relay-v1-conformance.md +56 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_annotations-install-coldstart.md +44 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_empty-prompt-first-turn.md +56 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_prompt-mojibake-fixed.md +48 -0
- package/core/dev/specs/agent-connect/history/KENAZ_RESPONSE_agent-hub_2026-09-09_session-channel.md +57 -0
- package/core/dev/specs/agent-connect/history/PROTOCOL_v0.3_snapshot.md +379 -0
- package/core/dev/specs/agent-connect/history/README.md +47 -0
- package/core/dev/specs/peer/CODEX_INTERACTIVE_PUSH.md +65 -0
- package/core/dev/specs/peer/CODEX_PEER_PULL_SPIKE.md +54 -0
- package/core/dev/specs/peer/MODS_SPIKE.md +133 -0
- package/core/dev/specs/peer/PER_PROJECT_ADDRESSING.md +143 -0
- package/core/dev/specs/peer/SWARM_PROTOCOLS.md +256 -0
- package/core/dev/specs/peer/codex-hook-shim-peer.test.js +101 -0
- package/core/dev/specs/peer/codex-push-launcher.test.js +142 -0
- package/core/dev/specs/peer/setup-codex-hooks.test.js +22 -0
- package/core/dev/specs/peer-ansuz/DELIVERY_SPIKE.md +397 -0
- package/core/dev/specs/peer-ansuz/DESIGN.md +109 -0
- package/core/dev/specs/peer-ansuz/spike/claude_poke.js +129 -0
- package/core/dev/specs/peer-ansuz/spike/claude_session_start_hook.js +37 -0
- package/core/dev/specs/peer-ansuz/spike/claude_settings_hook.json +14 -0
- package/core/dev/specs/peer-ansuz/spike/codex_appserver_client.js +105 -0
- package/core/dev/specs/peer-ansuz/spike/codex_appserver_query.js +29 -0
- package/core/dev/specs/peer-ansuz/spike/extract_timeline.js +26 -0
- package/core/dev/specs/synapse/SYMBOL_IDENTITY.md +305 -0
- package/core/dev/spikes/A4-cypher-varlen.md +176 -0
- package/core/dev/spikes/bloat-rounds.sh +25 -0
- package/core/dev/spikes/mods/clean-claude.js +9 -0
- package/core/dev/spikes/mods/drive-probe.js +29 -0
- package/core/dev/spikes/mods/e2e-peer.js +71 -0
- package/core/dev/spikes/mods/evidence/e2e-peer-control.json +17 -0
- package/core/dev/spikes/mods/evidence/e2e-peer-mod.json +17 -0
- package/core/dev/spikes/mods/evidence/probe-006a6e65-d807-4bc1-b648-fd7d1edfe0b4.jsonl +4 -0
- package/core/dev/spikes/mods/evidence/probe-cebdf1f7-f9c4-47a8-83cd-7c0786177404.jsonl +12 -0
- package/core/dev/spikes/mods/evidence/probe-eb21147d-10ce-4c32-93ed-37ca37d88d5a.jsonl +11 -0
- package/core/dev/spikes/mods/evidence/stream-cebdf1f7.jsonl +18 -0
- package/core/dev/spikes/mods/kenaz-mod-probe/.claude-plugin/plugin.json +1 -0
- package/core/dev/spikes/mods/kenaz-mod-probe/hooks/hooks.json +1 -0
- package/core/dev/spikes/mods/kenaz-mod-probe/hooks/register.ts +65 -0
- package/core/dev/spikes/mods/kenaz-mod-probe/tsconfig.json +3 -0
- package/core/k-cli/README.md +423 -0
- package/core/k-cli/package.json +21 -0
- package/core/k-cli/templates/k-cli.md +91 -0
- package/core/k-cli/test/TEST_SPEC.md +134 -0
- package/core/k-cli/test/run.sh +469 -0
- package/core/plugins/kenaz/.claude-plugin/plugin.json +1 -0
- package/core/plugins/kenaz/.mcp.json +5 -0
- package/core/plugins/kenaz/INVENTORY.md +48 -0
- package/core/plugins/kenaz/README.md +55 -0
- package/core/plugins/kenaz/commands/Amelia.md +5 -0
- package/core/plugins/kenaz/commands/Ansuz.md +38 -0
- package/core/plugins/kenaz/commands/architect.md +24 -0
- package/core/plugins/kenaz/commands/incident.md +15 -0
- package/core/plugins/kenaz/commands/kenaz.md +12 -0
- package/core/plugins/kenaz/commands/review.md +14 -0
- package/core/plugins/kenaz/commands/security.md +15 -0
- package/core/plugins/kenaz/commands/spec.md +22 -0
- package/core/plugins/kenaz/commands/strategy.md +141 -0
- package/core/plugins/kenaz/commands//347/224/242/345/223/201.md +15 -0
- package/core/plugins/kenaz/commands//350/250/255/350/250/210.md +14 -0
- package/core/plugins/kenaz/commands//350/251/225/344/274/260.md +16 -0
- package/core/plugins/kenaz/guidance.md +5 -0
- package/core/plugins/kenaz/hooks/core-resolve.js +230 -0
- package/core/plugins/kenaz/hooks/hooks.json +31 -0
- package/core/plugins/kenaz/hooks/kenaz-hook.js +112 -0
- package/core/plugins/kenaz/hooks/mode.js +39 -0
- package/core/plugins/kenaz/scripts/kenaz-mode.js +46 -0
- package/core/plugins/kenaz/scripts/kenaz.test.js +123 -0
- package/core/plugins/kenaz/scripts/sync.js +45 -0
- package/core/plugins/kenaz/scripts/ygg.js +157 -0
- package/core/plugins/kenaz/skills/adapt/SKILL.md +199 -0
- package/core/plugins/kenaz/skills/animate/SKILL.md +190 -0
- package/core/plugins/kenaz/skills/architect_agent/SKILL.md +408 -0
- package/core/plugins/kenaz/skills/assessment_agent/SKILL.md +289 -0
- package/core/plugins/kenaz/skills/audit/SKILL.md +129 -0
- package/core/plugins/kenaz/skills/backend_agent/SKILL.md +407 -0
- package/core/plugins/kenaz/skills/backend_engineer/SKILL.md +788 -0
- package/core/plugins/kenaz/skills/bolder/SKILL.md +132 -0
- package/core/plugins/kenaz/skills/clarify/SKILL.md +180 -0
- package/core/plugins/kenaz/skills/code_reviewer/SKILL.md +305 -0
- package/core/plugins/kenaz/skills/code_reviewer/patterns.yaml +85 -0
- package/core/plugins/kenaz/skills/colorize/SKILL.md +158 -0
- package/core/plugins/kenaz/skills/critique/SKILL.md +118 -0
- package/core/plugins/kenaz/skills/delight/SKILL.md +317 -0
- package/core/plugins/kenaz/skills/designer/SKILL.md +845 -0
- package/core/plugins/kenaz/skills/dev_agent/SKILL.md +503 -0
- package/core/plugins/kenaz/skills/developer/SKILL.md +792 -0
- package/core/plugins/kenaz/skills/distill/SKILL.md +137 -0
- package/core/plugins/kenaz/skills/extract/SKILL.md +95 -0
- package/core/plugins/kenaz/skills/feature_agent/SKILL.md +303 -0
- package/core/plugins/kenaz/skills/frontend-design/SKILL.md +127 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/color-and-contrast.md +132 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/interaction-design.md +123 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/motion-design.md +99 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/responsive-design.md +114 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/spatial-design.md +100 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/typography.md +131 -0
- package/core/plugins/kenaz/skills/frontend-design/reference/ux-writing.md +107 -0
- package/core/plugins/kenaz/skills/frontend_agent/SKILL.md +327 -0
- package/core/plugins/kenaz/skills/harden/SKILL.md +358 -0
- package/core/plugins/kenaz/skills/incident_response/SKILL.md +315 -0
- package/core/plugins/kenaz/skills/normalize/SKILL.md +67 -0
- package/core/plugins/kenaz/skills/onboard/SKILL.md +243 -0
- package/core/plugins/kenaz/skills/optimize/SKILL.md +269 -0
- package/core/plugins/kenaz/skills/polish/SKILL.md +202 -0
- package/core/plugins/kenaz/skills/product_manager/SKILL.md +1091 -0
- package/core/plugins/kenaz/skills/qa_engineer/SKILL.md +1269 -0
- package/core/plugins/kenaz/skills/quieter/SKILL.md +118 -0
- package/core/plugins/kenaz/skills/security_agent/SKILL.md +312 -0
- package/core/plugins/kenaz/skills/spec_optimizer/SKILL.md +299 -0
- package/core/plugins/kenaz/skills/sre_agent/SKILL.md +1347 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/SKILL.md +377 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -0
- package/core/plugins/kenaz-peer/.claude-plugin/plugin.json +1 -0
- package/core/plugins/kenaz-peer/hooks/hooks.json +1 -0
- package/core/plugins/kenaz-peer/hooks/register.test.ts +62 -0
- package/core/plugins/kenaz-peer/hooks/register.ts +146 -0
- package/core/plugins/kenaz-peer/tsconfig.json +3 -0
- package/lib/cli.js +251 -0
- package/lib/cli.test.js +59 -0
- package/lib/dashboard.js +80 -0
- package/lib/dashboard.test.js +59 -0
- package/package.json +28 -4
- package/vendor/install-kenaz-cli.js +268 -0
- package/README.md +0 -3
|
@@ -0,0 +1,1120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Ansuz Fast Boot — gateless Phase 0 for /Ansuz default mode.
|
|
6
|
+
*
|
|
7
|
+
* Replaces the phase-gate ceremony in fast mode. Pure Node, no MCP, no gate.
|
|
8
|
+
* Does only the three things boot actually needs:
|
|
9
|
+
* 1. identity injection — happens in session.js elixir prompt, NOT here
|
|
10
|
+
* 2. gather + print context banner (task stats + last-session handoff + B-001 priming)
|
|
11
|
+
* 3. archive last-session handoff (the one real side-effect from phase-gate enter)
|
|
12
|
+
*
|
|
13
|
+
* Why no gate: in fast mode the main thread does boot itself — there is no
|
|
14
|
+
* untrusted executor to verify, so gate validation would only check the
|
|
15
|
+
* script's own output (bookkeeping). Verified 2026-06-27 that nothing
|
|
16
|
+
* downstream reads the Phase 0 chart (failure-detector / context-injection
|
|
17
|
+
* don't touch it; the phase chain has no prior-phase requirement). The
|
|
18
|
+
* `--full` path keeps the gate for the Haiku sub-agent (untrusted) executor.
|
|
19
|
+
*
|
|
20
|
+
* Usage: node ansuz-boot-fast.js [--project-path PATH]
|
|
21
|
+
* No --project-path → BASE = cwd (core repo, normal case).
|
|
22
|
+
*
|
|
23
|
+
* TASK_1757: register own session lease at boot; print peer awareness when
|
|
24
|
+
* other live sessions exist (single-session zero-noise invariant: no extra
|
|
25
|
+
* output when no peers). Also reads .kenaz/specialist/handoffs/*.json
|
|
26
|
+
* (multi-slot handoff) in addition to legacy ansuz_session_handoff.json.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const fs = require('fs');
|
|
30
|
+
const path = require('path');
|
|
31
|
+
// Shared project identity resolver (TASK_1701): reads pin to find active project.
|
|
32
|
+
const projectResolver = require('./lib/project-resolver');
|
|
33
|
+
const http = require('http');
|
|
34
|
+
const os = require('os');
|
|
35
|
+
const cp = require('child_process');
|
|
36
|
+
// TASK_2057: shared __kenaz_core__ token resolver (established cross-dir
|
|
37
|
+
// require convention -- see .formation/tools/prompt.js/loop.js). Optional:
|
|
38
|
+
// this script must still boot if an older install predates the export.
|
|
39
|
+
let _resolveVirtualPath = null;
|
|
40
|
+
try {
|
|
41
|
+
_resolveVirtualPath = require(path.join(__dirname, '..', '..', '.claude', 'hooks', 'core-resolve.js')).resolveVirtualPath;
|
|
42
|
+
} catch { /* graceful degradation -- older installs without the export */ }
|
|
43
|
+
|
|
44
|
+
// blind_spot.mirror — kept in sync with .specialist/Ansuz/elixir.yaml
|
|
45
|
+
const BLIND_SPOT_B001 =
|
|
46
|
+
'B-001: checkpoint skipping under momentum; verify scope/acceptance match BEFORE creating tasks or dispatching.';
|
|
47
|
+
|
|
48
|
+
// TASK_1701+1702: resolver exposes source so boot banner knows if pinned.
|
|
49
|
+
const resolved = projectResolver.resolveProjectPath({ argv: process.argv.slice(2) });
|
|
50
|
+
const BASE = resolved.projectPath;
|
|
51
|
+
const PIN_SOURCE = resolved.source; // 'cli' | 'pin' | 'pin-heuristic' | 'cwd' | 'base'
|
|
52
|
+
const IS_PINNED = PIN_SOURCE === 'cli' || PIN_SOURCE === 'pin';
|
|
53
|
+
|
|
54
|
+
// Task dir resolution mirrors task-api: prefer .kenaz/tasks, fallback .collaboration/tasks
|
|
55
|
+
function resolveTasksDir() {
|
|
56
|
+
const kenaz = path.join(BASE, '.kenaz', 'tasks');
|
|
57
|
+
if (fs.existsSync(kenaz)) return kenaz;
|
|
58
|
+
return path.join(BASE, '.collaboration', 'tasks');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function countTasks() {
|
|
62
|
+
const dir = resolveTasksDir();
|
|
63
|
+
const statuses = ['backlog', 'active', 'done', 'blocked', 'cancel'];
|
|
64
|
+
const counts = {};
|
|
65
|
+
for (const s of statuses) {
|
|
66
|
+
const d = path.join(dir, s);
|
|
67
|
+
let n = 0;
|
|
68
|
+
try {
|
|
69
|
+
if (fs.existsSync(d)) {
|
|
70
|
+
n = fs.readdirSync(d).filter((f) => f.endsWith('.yaml') || f.endsWith('.yml')).length;
|
|
71
|
+
}
|
|
72
|
+
} catch {
|
|
73
|
+
n = 0;
|
|
74
|
+
}
|
|
75
|
+
counts[s] = n;
|
|
76
|
+
}
|
|
77
|
+
const total = statuses.reduce((a, s) => a + counts[s], 0);
|
|
78
|
+
const cancel_rate = total > 0 ? counts.cancel / total : 0;
|
|
79
|
+
return { dir, counts, total, cancel_rate };
|
|
80
|
+
}
|
|
81
|
+
// -- TASK_1988: open cards inline --------------------------------------------
|
|
82
|
+
//
|
|
83
|
+
// MEASURED 2026-09-21: after the banner, the very first thing every Ansuz
|
|
84
|
+
// session did was one more LLM turn + a task-api list + reading the open
|
|
85
|
+
// cards, just to propose an agenda. With ~3 open cards that is ~300 B of
|
|
86
|
+
// text bought with a whole round trip. Print them here: id, priority,
|
|
87
|
+
// title (truncated), and the newest STATUS note if any, so the agenda can
|
|
88
|
+
// be proposed in the first response. Hard caps keep a large backlog from
|
|
89
|
+
// turning this into a dump: at most OPEN_CARDS_MAX cards, the rest as ids.
|
|
90
|
+
const OPEN_CARDS_MAX = 8;
|
|
91
|
+
const OPEN_CARD_TITLE_LEN = 90;
|
|
92
|
+
const OPEN_CARD_STATUS_LEN = 140;
|
|
93
|
+
|
|
94
|
+
function readCardHeader(file) {
|
|
95
|
+
let txt;
|
|
96
|
+
try { txt = fs.readFileSync(file, 'utf8'); } catch { return null; }
|
|
97
|
+
const pick = (key) => {
|
|
98
|
+
const m = txt.match(new RegExp('^' + key + ':[ \\t]*(.*)$', 'm'));
|
|
99
|
+
return m ? m[1].trim().replace(/^['"]|['"]$/g, '') : '';
|
|
100
|
+
};
|
|
101
|
+
// Newest technical_notes entry that starts with STATUS (progress-note convention).
|
|
102
|
+
let status = '';
|
|
103
|
+
const notes = txt.match(/^ - '?STATUS [^\n]*/gm);
|
|
104
|
+
if (notes && notes.length) {
|
|
105
|
+
// YAML single-quoted scalar: drop the opening quote, drop the closing quote
|
|
106
|
+
// (an ODD trailing run of ' = one closer after any '' escapes), then unescape ''.
|
|
107
|
+
let body = notes[notes.length - 1].replace(/^ - /, '');
|
|
108
|
+
if (body[0] === "'") {
|
|
109
|
+
body = body.slice(1);
|
|
110
|
+
const run = body.match(/'+$/);
|
|
111
|
+
if (run && run[0].length % 2 === 1) body = body.slice(0, -1);
|
|
112
|
+
}
|
|
113
|
+
status = body.replace(/''/g, "'");
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
id: pick('id') || path.basename(file).split('_').slice(0, 2).join('_'),
|
|
117
|
+
priority: pick('priority'),
|
|
118
|
+
title: pick('title'),
|
|
119
|
+
status,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function openCardLines() {
|
|
124
|
+
const dir = resolveTasksDir();
|
|
125
|
+
const lines = [];
|
|
126
|
+
const cards = [];
|
|
127
|
+
for (const st of ['active', 'blocked', 'backlog']) {
|
|
128
|
+
const d = path.join(dir, st);
|
|
129
|
+
let files = [];
|
|
130
|
+
try { files = fs.existsSync(d) ? fs.readdirSync(d).filter((x) => /\.ya?ml$/.test(x)).sort() : []; } catch { files = []; }
|
|
131
|
+
for (const x of files) {
|
|
132
|
+
const h = readCardHeader(path.join(d, x));
|
|
133
|
+
if (h) cards.push({ st, ...h });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (cards.length === 0) return lines;
|
|
137
|
+
const shown = cards.slice(0, OPEN_CARDS_MAX);
|
|
138
|
+
lines.push('📋 Open cards:');
|
|
139
|
+
for (const c of shown) {
|
|
140
|
+
const title = c.title.length > OPEN_CARD_TITLE_LEN ? c.title.slice(0, OPEN_CARD_TITLE_LEN) + '…' : c.title;
|
|
141
|
+
lines.push(' ' + c.id + ' [' + c.st + (c.priority ? ' ' + c.priority : '') + '] ' + title);
|
|
142
|
+
if (c.status) {
|
|
143
|
+
const tail = c.status.length > OPEN_CARD_STATUS_LEN ? c.status.slice(0, OPEN_CARD_STATUS_LEN) + '…' : c.status;
|
|
144
|
+
lines.push(' ↳ ' + tail);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (cards.length > shown.length) {
|
|
148
|
+
lines.push(' +' + (cards.length - shown.length) + ' more: ' + cards.slice(shown.length).map((c) => c.id).join(', '));
|
|
149
|
+
}
|
|
150
|
+
return lines;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// -- TASK_1757: legacy handoff + multi-slot handoffs -------------------------
|
|
154
|
+
|
|
155
|
+
function loadAndArchiveHandoff() {
|
|
156
|
+
const handoffPath = path.join(BASE, '.kenaz', 'specialist', 'ansuz_session_handoff.json');
|
|
157
|
+
if (!fs.existsSync(handoffPath)) return { loaded: false, summary: null };
|
|
158
|
+
let data = null;
|
|
159
|
+
try {
|
|
160
|
+
data = JSON.parse(fs.readFileSync(handoffPath, 'utf8'));
|
|
161
|
+
} catch (e) {
|
|
162
|
+
return { loaded: false, summary: null, error: `parse failed: ${e.message}` };
|
|
163
|
+
}
|
|
164
|
+
let archived = false;
|
|
165
|
+
try {
|
|
166
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
167
|
+
const archiveDir = path.join(BASE, '.kenaz', 'specialist', 'handoff_archive');
|
|
168
|
+
if (!fs.existsSync(archiveDir)) fs.mkdirSync(archiveDir, { recursive: true });
|
|
169
|
+
fs.renameSync(handoffPath, path.join(archiveDir, `ansuz_session_handoff.${stamp}.json`));
|
|
170
|
+
archived = true;
|
|
171
|
+
} catch {
|
|
172
|
+
/* non-fatal: leave handoff in place if archive fails */
|
|
173
|
+
}
|
|
174
|
+
const isbar = (data && data.isbar) || {};
|
|
175
|
+
const sit = isbar.situation || {};
|
|
176
|
+
const rec = isbar.recommendation || {};
|
|
177
|
+
const assess = isbar.assessment || {};
|
|
178
|
+
const flat = (data && data.summary) || {};
|
|
179
|
+
return {
|
|
180
|
+
loaded: true,
|
|
181
|
+
archived,
|
|
182
|
+
summary: {
|
|
183
|
+
topic: sit.current_topic || (data && data.last_milestone) || flat.topic || null,
|
|
184
|
+
first_action: rec.first_action || flat.first_action || flat.next_action || null,
|
|
185
|
+
pending_decisions: sit.pending_decisions || flat.pending_decisions || null,
|
|
186
|
+
unfinished: assess.unfinished || flat.unfinished || null,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Multi-slot handoffs: .kenaz/specialist/handoffs/*.json (TASK_1757)
|
|
192
|
+
// TASK_2254 contract: slots are RENAMED into handoff_archive/ (content intact).
|
|
193
|
+
// Consumers that must survive a boot (post-complete.js readLatestHandoff) fall
|
|
194
|
+
// back to the newest handoff_archive/ slot by generated_at before the legacy slot.
|
|
195
|
+
function loadMultiSlotHandoffs() {
|
|
196
|
+
const hDir = path.join(BASE, '.kenaz', 'specialist', 'handoffs');
|
|
197
|
+
if (!fs.existsSync(hDir)) {
|
|
198
|
+
try { fs.mkdirSync(hDir, { recursive: true }); } catch { /* ignore */ }
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
let files;
|
|
202
|
+
try { files = fs.readdirSync(hDir).filter(function(f) { return f.endsWith('.json'); }); }
|
|
203
|
+
catch { return []; }
|
|
204
|
+
const archiveDir = path.join(BASE, '.kenaz', 'specialist', 'handoff_archive');
|
|
205
|
+
const results = [];
|
|
206
|
+
for (const f of files) {
|
|
207
|
+
const fp = path.join(hDir, f);
|
|
208
|
+
let data = null;
|
|
209
|
+
try { data = JSON.parse(fs.readFileSync(fp, 'utf8')); } catch { continue; }
|
|
210
|
+
// TASK_1977 R3: capture recency BEFORE archiving (renameSync moves the
|
|
211
|
+
// file out from under fp) so the banner can select the newest slots.
|
|
212
|
+
let mtimeMs = 0;
|
|
213
|
+
try { mtimeMs = fs.statSync(fp).mtimeMs; } catch { /* fall back to 0 -- sorts last */ }
|
|
214
|
+
// Archive after reading -- ALL slots are archived regardless of what the
|
|
215
|
+
// banner ends up printing (TASK_1977 R3: archiving is unconditional).
|
|
216
|
+
try {
|
|
217
|
+
if (!fs.existsSync(archiveDir)) fs.mkdirSync(archiveDir, { recursive: true });
|
|
218
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
219
|
+
fs.renameSync(fp, path.join(archiveDir, f.replace('.json', '.' + stamp + '.json')));
|
|
220
|
+
} catch { /* non-fatal */ }
|
|
221
|
+
const isbar = (data && data.isbar) || {};
|
|
222
|
+
const sit = isbar.situation || {};
|
|
223
|
+
const rec = isbar.recommendation || {};
|
|
224
|
+
const assess = isbar.assessment || {};
|
|
225
|
+
const flat = (data && data.summary) || {};
|
|
226
|
+
results.push({
|
|
227
|
+
topic: sit.current_topic || (data && data.last_milestone) || flat.topic || null,
|
|
228
|
+
first_action: rec.first_action || flat.first_action || flat.next_action || null,
|
|
229
|
+
pending_decisions: sit.pending_decisions || flat.pending_decisions || null,
|
|
230
|
+
unfinished: assess.unfinished || flat.unfinished || null,
|
|
231
|
+
slot_file: f,
|
|
232
|
+
generated_at: (data && typeof data.generated_at === 'string') ? data.generated_at : null,
|
|
233
|
+
mtimeMs: mtimeMs,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
return results;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// -- TASK_1977 R3: banner fan-out cap ----------------------------------------
|
|
240
|
+
//
|
|
241
|
+
// MEASURED 2026-09-20: a run of accumulated Codex sessions left 19 handoff
|
|
242
|
+
// slots, most repeating the same pending_decisions text -- 33.8 KB printed
|
|
243
|
+
// into the boot banner, the single largest boot injection. Archiving (above)
|
|
244
|
+
// still processes every slot; this only caps what gets rendered:
|
|
245
|
+
// - sort newest-first (generated_at, falling back to file mtime)
|
|
246
|
+
// - print at most HANDOFF_MAX_FULL_SLOTS slots in full
|
|
247
|
+
// - skip (fold into the summary) any slot whose topic prefix duplicates
|
|
248
|
+
// an already-printed slot's topic prefix
|
|
249
|
+
// - one summary line for everything not printed in full
|
|
250
|
+
|
|
251
|
+
const HANDOFF_MAX_FULL_SLOTS = 3;
|
|
252
|
+
const HANDOFF_TOPIC_PREFIX_LEN = 60;
|
|
253
|
+
|
|
254
|
+
function handoffTopicPrefix(topic) {
|
|
255
|
+
return String(topic == null ? '' : topic).trim().slice(0, HANDOFF_TOPIC_PREFIX_LEN);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function selectHandoffSlotsForBanner(slots) {
|
|
259
|
+
const sorted = [...slots].sort(function (a, b) {
|
|
260
|
+
const ta = a.generated_at ? Date.parse(a.generated_at) : NaN;
|
|
261
|
+
const tb = b.generated_at ? Date.parse(b.generated_at) : NaN;
|
|
262
|
+
const ka = Number.isFinite(ta) ? ta : (a.mtimeMs || 0);
|
|
263
|
+
const kb = Number.isFinite(tb) ? tb : (b.mtimeMs || 0);
|
|
264
|
+
return kb - ka;
|
|
265
|
+
});
|
|
266
|
+
const printed = [];
|
|
267
|
+
const printedPrefixes = new Set();
|
|
268
|
+
const rest = [];
|
|
269
|
+
for (const slot of sorted) {
|
|
270
|
+
const prefix = handoffTopicPrefix(slot.topic);
|
|
271
|
+
if (printed.length < HANDOFF_MAX_FULL_SLOTS && !printedPrefixes.has(prefix)) {
|
|
272
|
+
printed.push(slot);
|
|
273
|
+
printedPrefixes.add(prefix);
|
|
274
|
+
} else {
|
|
275
|
+
rest.push(slot);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
let summaryLine = null;
|
|
279
|
+
if (rest.length > 0) {
|
|
280
|
+
const seen = new Set();
|
|
281
|
+
const restTopics = [];
|
|
282
|
+
for (const slot of rest) {
|
|
283
|
+
const label = fmt(slot.topic);
|
|
284
|
+
if (!seen.has(label)) { seen.add(label); restTopics.push(label); }
|
|
285
|
+
}
|
|
286
|
+
summaryLine = rest.length + ' more handoff slots archived (topics: ' + restTopics.join('; ') + ')';
|
|
287
|
+
}
|
|
288
|
+
return { printed: printed, rest: rest, summaryLine: summaryLine };
|
|
289
|
+
}
|
|
290
|
+
function fmt(v) {
|
|
291
|
+
if (v === null || v === undefined) return '—';
|
|
292
|
+
if (Array.isArray(v)) return v.length ? v.join('; ') : '—';
|
|
293
|
+
const str = String(v).trim();
|
|
294
|
+
return str.length ? str : '—';
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// -- TASK_1702 pin helpers ---------------------------------------------------
|
|
298
|
+
|
|
299
|
+
function getProjectName(projectPath) {
|
|
300
|
+
try {
|
|
301
|
+
var yp = path.join(projectPath, '.kenaz', 'project.yaml');
|
|
302
|
+
if (fs.existsSync(yp)) {
|
|
303
|
+
var raw = fs.readFileSync(yp, 'utf8');
|
|
304
|
+
// TASK_2081: the backslash in \s* was previously missing (matched the
|
|
305
|
+
// literal letter "s", not whitespace) -- worked by accident only
|
|
306
|
+
// because (.+) swallowed a leading space that .trim() then removed.
|
|
307
|
+
var m = raw.match(/^name:\s*(.+)$/m);
|
|
308
|
+
if (m) {
|
|
309
|
+
var name = m[1].trim().replace(/^(['"])(.*)\1$/, '$2');
|
|
310
|
+
if (name) return name;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
} catch (e) { /* ignore */ }
|
|
314
|
+
return path.basename(projectPath);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function readProjectsJsonSync() {
|
|
318
|
+
try {
|
|
319
|
+
var p = path.join(os.homedir(), '.kenaz', 'projects.json');
|
|
320
|
+
if (!fs.existsSync(p)) return null;
|
|
321
|
+
var data = JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
322
|
+
var currentId = data.currentProjectId;
|
|
323
|
+
if (!currentId || !Array.isArray(data.projects)) return null;
|
|
324
|
+
var proj = data.projects.find(function(pr) { return pr.id === currentId; });
|
|
325
|
+
if (!proj) return null;
|
|
326
|
+
// TASK_2057: proj.path for the core entry is the literal token
|
|
327
|
+
// "__kenaz_core__", not a real path -- resolve it, or the pin-mismatch
|
|
328
|
+
// warning above (main()) compares BASE against the unresolved token.
|
|
329
|
+
var resolvedPath = proj.path && _resolveVirtualPath ? _resolveVirtualPath(proj.path) : (proj.path || null);
|
|
330
|
+
return { currentProjectPath: resolvedPath, currentProjectName: proj.name || null };
|
|
331
|
+
} catch (e) { return null; }
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function fetchCurrentProjectHttp() {
|
|
335
|
+
return new Promise(function(resolve) {
|
|
336
|
+
var req;
|
|
337
|
+
var timer = setTimeout(function() { req.destroy(); resolve(null); }, 1500);
|
|
338
|
+
req = require('http').get('http://127.0.0.1:18080/api/projects', function(res) {
|
|
339
|
+
var body = '';
|
|
340
|
+
res.on('data', function(d) { body += d; });
|
|
341
|
+
res.on('end', function() {
|
|
342
|
+
clearTimeout(timer);
|
|
343
|
+
try {
|
|
344
|
+
var data = JSON.parse(body);
|
|
345
|
+
var id = data.current_project_id || data.currentProjectId;
|
|
346
|
+
if (!id || !Array.isArray(data.projects)) { resolve(null); return; }
|
|
347
|
+
var proj = data.projects.find(function(pr) { return pr.id === id; });
|
|
348
|
+
resolve(proj ? { currentProjectPath: proj.path||null, currentProjectName: proj.name||null } : null);
|
|
349
|
+
} catch (e) { resolve(null); }
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
req.on('error', function() { clearTimeout(timer); resolve(null); });
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
async function getDashboardCurrentProject() {
|
|
357
|
+
var r = readProjectsJsonSync();
|
|
358
|
+
return r || fetchCurrentProjectHttp();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function normPath(p) {
|
|
362
|
+
if (!p) return '';
|
|
363
|
+
var r = path.resolve(p);
|
|
364
|
+
return process.platform === 'win32' ? r.toLowerCase() : r;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function readKnowledgeIndex(projectPath, max) {
|
|
368
|
+
max = max || 10;
|
|
369
|
+
var dir = path.join(projectPath, '.kenaz', 'knowledge');
|
|
370
|
+
if (!fs.existsSync(dir)) return [];
|
|
371
|
+
var files;
|
|
372
|
+
try { files = fs.readdirSync(dir).filter(function(f) { return f.endsWith('.md'); }).sort(); }
|
|
373
|
+
catch (e) { return []; }
|
|
374
|
+
var entries = [];
|
|
375
|
+
for (var i = 0; i < files.length && entries.length < max; i++) {
|
|
376
|
+
var h = null;
|
|
377
|
+
try {
|
|
378
|
+
var c = fs.readFileSync(path.join(dir, files[i]), 'utf8');
|
|
379
|
+
var m = c.match(/^[#]+ +(.+)$/m);
|
|
380
|
+
if (m) h = m[1].trim();
|
|
381
|
+
} catch (e) { /* ignore */ }
|
|
382
|
+
entries.push({ filename: files[i], heading: h });
|
|
383
|
+
}
|
|
384
|
+
return entries;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// -- TASK_1742: Huginn advisory section ----------------------------------------
|
|
388
|
+
|
|
389
|
+
function readHuginnAdvisory(projectPath) {
|
|
390
|
+
const ap = path.join(projectPath, '.kenaz', 'specialist', 'huginn_advisory.jsonl');
|
|
391
|
+
if (!fs.existsSync(ap)) return { entries: [], unread: 0 };
|
|
392
|
+
let raw = '';
|
|
393
|
+
try { raw = fs.readFileSync(ap, 'utf8'); } catch (e) { return { entries: [], unread: 0 }; }
|
|
394
|
+
const cutoff = Date.now() - 14 * 24 * 60 * 60 * 1000;
|
|
395
|
+
const entries = [];
|
|
396
|
+
for (const line of raw.split(String.fromCharCode(10))) {
|
|
397
|
+
const t = line.trim(); if (!t) continue;
|
|
398
|
+
try { const obj = JSON.parse(t); if (obj.ts && new Date(obj.ts).getTime() >= cutoff) entries.push(obj); } catch (e) {}
|
|
399
|
+
}
|
|
400
|
+
entries.sort((a, b) => new Date(b.ts) - new Date(a.ts));
|
|
401
|
+
return { entries, unread: entries.filter(e => e.status === 'unread').length };
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// -- TASK_1757: stream-lease registration and peer awareness ------------------
|
|
405
|
+
|
|
406
|
+
function resolveStreamLeaseScript() {
|
|
407
|
+
var candidates = [
|
|
408
|
+
path.join(__dirname, 'stream-lease.js'),
|
|
409
|
+
path.join(BASE, '.specialist', 'tools', 'stream-lease.js'),
|
|
410
|
+
];
|
|
411
|
+
var envSrc = process.env.KENAZ_SOURCE_DIR;
|
|
412
|
+
if (envSrc) candidates.unshift(path.join(envSrc, '.specialist', 'tools', 'stream-lease.js'));
|
|
413
|
+
for (var i = 0; i < candidates.length; i++) { if (fs.existsSync(candidates[i])) return candidates[i]; }
|
|
414
|
+
return null;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function registerOwnLease(slScript, convId) {
|
|
418
|
+
if (!slScript) return null;
|
|
419
|
+
try {
|
|
420
|
+
// Generate a session id: timestamp + pid
|
|
421
|
+
var sid = 'boot-' + Date.now() + '-' + process.pid;
|
|
422
|
+
var regArgs = [slScript, 'register',
|
|
423
|
+
'--session-id=' + sid,
|
|
424
|
+
'--pid=' + process.ppid, // M1.5 (TASK_1761): ppid = parent shell; hook self-heals to harness
|
|
425
|
+
'--phase=boot',
|
|
426
|
+
// TASK_1983 (R1): record which project this session is working on. BASE is
|
|
427
|
+
// already resolved above via projectResolver (CLI --project-path > pin > cwd).
|
|
428
|
+
'--project-path=' + BASE,
|
|
429
|
+
];
|
|
430
|
+
// TASK_1764: pass conversation_id anchor so register writes current_stream.json
|
|
431
|
+
// (register only writes current_stream when --conversation-id is present or --scratch)
|
|
432
|
+
if (convId) regArgs.push('--conversation-id=' + convId);
|
|
433
|
+
var out = cp.execFileSync(process.execPath, regArgs, { timeout: 3000, encoding: 'utf8' });
|
|
434
|
+
// TASK_1863: register REUSES the existing lease when this conversation already
|
|
435
|
+
// holds one (ghost-lease fix) -- the effective session id is whatever register
|
|
436
|
+
// printed, not the boot-<ts>-<pid> we proposed. Parsing it keeps peer-awareness
|
|
437
|
+
// self-filtering correct (otherwise our own reused lease would show as a peer).
|
|
438
|
+
var m = /^registered (\S+) as /m.exec(out || '');
|
|
439
|
+
return (m && m[1]) || sid;
|
|
440
|
+
} catch { return null; }
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function getPeerAwareness(slScript, ownSid) {
|
|
444
|
+
if (!slScript) return null;
|
|
445
|
+
try {
|
|
446
|
+
var sl = require(slScript);
|
|
447
|
+
var allLeases = sl.readAllLeases();
|
|
448
|
+
// Filter to OTHER live sessions
|
|
449
|
+
var peers = allLeases.filter(function(l) {
|
|
450
|
+
if (ownSid && l.session_id === ownSid) return false;
|
|
451
|
+
return sl.isSessionLive(l);
|
|
452
|
+
});
|
|
453
|
+
var orphans = allLeases.filter(function(l) {
|
|
454
|
+
if (ownSid && l.session_id === ownSid) return false;
|
|
455
|
+
return !sl.isSessionLive(l);
|
|
456
|
+
});
|
|
457
|
+
if (peers.length === 0 && orphans.length === 0) return null;
|
|
458
|
+
return { peers, orphans, sl };
|
|
459
|
+
} catch { return null; }
|
|
460
|
+
}
|
|
461
|
+
// The running harness's own session id when it exports one (Codex/Bifrost:
|
|
462
|
+
// CODEX_SESSION_ID). null when absent or blank, so Claude sessions keep the
|
|
463
|
+
// hook-hint chain unchanged.
|
|
464
|
+
function harnessSessionIdFromEnv(env) {
|
|
465
|
+
var v = env && typeof env.CODEX_SESSION_ID === 'string' ? env.CODEX_SESSION_ID.trim() : '';
|
|
466
|
+
return v || null;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// TASK_2381: last_prompt_session.json is a single slot any session in the dir
|
|
470
|
+
// overwrites. Adopt it only if it names THIS session: same id as the harness
|
|
471
|
+
// env id, or (no env id) a transcript for that id exists under this cwd's
|
|
472
|
+
// own transcript dir. Otherwise print no id rather than a foreign one.
|
|
473
|
+
function hintNamesThisSession(hintId, env, cwd, home) {
|
|
474
|
+
if (!hintId) return false;
|
|
475
|
+
var own = env && typeof env.CLAUDE_CODE_SESSION_ID === 'string' ? env.CLAUDE_CODE_SESSION_ID.trim() : '';
|
|
476
|
+
if (own) return own === String(hintId);
|
|
477
|
+
try {
|
|
478
|
+
// Claude Code names the dir by replacing every non-alphanumeric char with '-'.
|
|
479
|
+
var dirName = path.resolve(cwd).replace(/[^a-zA-Z0-9]/g, '-');
|
|
480
|
+
return fs.existsSync(path.join(home || os.homedir(), '.claude', 'projects', dirName, String(hintId) + '.jsonl'));
|
|
481
|
+
} catch (_e) { return false; }
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function parseArgValue(argv, name) {
|
|
485
|
+
for (const a of argv) {
|
|
486
|
+
if (a.indexOf(name + '=') === 0) return a.slice(name.length + 1);
|
|
487
|
+
}
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// -- TASK_1997 R4: Wishing Well open-wish count on the boot banner -----------
|
|
492
|
+
//
|
|
493
|
+
// GET /api/wishes/list?status=pending -> {success, data: Wish[]}. 1 s
|
|
494
|
+
// timeout — this must never meaningfully delay boot. On any failure
|
|
495
|
+
// (Dashboard down, timeout, malformed body) resolve null so the banner
|
|
496
|
+
// omits the line entirely; a successful-but-empty answer resolves [] so
|
|
497
|
+
// the banner can print "0 open".
|
|
498
|
+
|
|
499
|
+
const WISH_TIMEOUT_MS = 1000;
|
|
500
|
+
const WISH_CONTENT_PREVIEW_LEN = 60;
|
|
501
|
+
|
|
502
|
+
function fetchOpenWishes(baseUrl, timeoutMs, projectPath) {
|
|
503
|
+
return new Promise(function (resolve) {
|
|
504
|
+
let url;
|
|
505
|
+
try { url = new URL('/api/wishes/list?status=pending', baseUrl); } catch { resolve(null); return; }
|
|
506
|
+
// TASK_2063: when a --project-path pin is active, scope the query to it —
|
|
507
|
+
// otherwise resolve_wishes_path() (dashboard/src-tauri routes/wishes.rs)
|
|
508
|
+
// falls back to get_project_root(), i.e. whatever project the Dashboard
|
|
509
|
+
// currently has selected, not the pinned sub-project.
|
|
510
|
+
if (projectPath) {
|
|
511
|
+
const params = new URLSearchParams(url.search);
|
|
512
|
+
params.set('project_path', projectPath);
|
|
513
|
+
url.search = params.toString();
|
|
514
|
+
}
|
|
515
|
+
const req = http.request(
|
|
516
|
+
{
|
|
517
|
+
hostname: url.hostname,
|
|
518
|
+
port: url.port || 80,
|
|
519
|
+
path: url.pathname + url.search,
|
|
520
|
+
method: 'GET',
|
|
521
|
+
timeout: timeoutMs,
|
|
522
|
+
},
|
|
523
|
+
function (res) {
|
|
524
|
+
let data = '';
|
|
525
|
+
res.on('data', function (d) { data += d; });
|
|
526
|
+
res.on('end', function () {
|
|
527
|
+
try {
|
|
528
|
+
const parsed = JSON.parse(data);
|
|
529
|
+
if (!parsed || parsed.success === false || !Array.isArray(parsed.data)) { resolve(null); return; }
|
|
530
|
+
resolve(parsed.data);
|
|
531
|
+
} catch { resolve(null); }
|
|
532
|
+
});
|
|
533
|
+
},
|
|
534
|
+
);
|
|
535
|
+
req.on('timeout', function () { req.destroy(); });
|
|
536
|
+
req.on('error', function () { resolve(null); });
|
|
537
|
+
req.end();
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Pure formatter, split out from fetchOpenWishes for direct unit testing.
|
|
542
|
+
// wishes === null (fetch failed / Dashboard down) -> null (banner omits the
|
|
543
|
+
// line). wishes === [] (API answered with none) -> "0 open" line.
|
|
544
|
+
function formatWishesLine(wishes) {
|
|
545
|
+
if (!Array.isArray(wishes)) return null;
|
|
546
|
+
if (wishes.length === 0) return '🪄 Wishes: 0 open';
|
|
547
|
+
const sorted = wishes.slice().sort(function (a, b) {
|
|
548
|
+
const ta = a && a.created_at ? Date.parse(a.created_at) : 0;
|
|
549
|
+
const tb = b && b.created_at ? Date.parse(b.created_at) : 0;
|
|
550
|
+
return (Number.isFinite(tb) ? tb : 0) - (Number.isFinite(ta) ? ta : 0);
|
|
551
|
+
});
|
|
552
|
+
const newest = sorted[0];
|
|
553
|
+
const content = newest && typeof newest.content === 'string' ? newest.content : '';
|
|
554
|
+
const preview = content.length > WISH_CONTENT_PREVIEW_LEN
|
|
555
|
+
? content.slice(0, WISH_CONTENT_PREVIEW_LEN) + '…'
|
|
556
|
+
: content;
|
|
557
|
+
return '🪄 Wishes: ' + wishes.length + ' open (newest: ' + preview + ')';
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// -- TASK_2006 R4: field-report auto-triage boot banner ----------------------
|
|
561
|
+
//
|
|
562
|
+
// Read-only over the task store (per-status YAML files) + a small boot-only
|
|
563
|
+
// watermark file -- never touches field_reports.db directly (that's the
|
|
564
|
+
// Rust mother's store; the task cards it writes via card_uncarded_reports
|
|
565
|
+
// are the only thing this banner needs). "New since last boot" is tracked
|
|
566
|
+
// by the highest TASK_NNN number already seen, not by timestamp: card ids
|
|
567
|
+
// are assigned monotonically by the same auto-triage code, so a plain
|
|
568
|
+
// numeric watermark is simpler and cheaper than parsing/parsing timestamps
|
|
569
|
+
// out of YAML, and just as correct.
|
|
570
|
+
|
|
571
|
+
const FIELD_REPORT_TASK_STATUSES = ['backlog', 'active', 'done', 'blocked', 'cancel'];
|
|
572
|
+
const FIELD_REPORT_CARD_TAG = 'field-report';
|
|
573
|
+
|
|
574
|
+
function fieldReportWatermarkPath() {
|
|
575
|
+
return path.join(BASE, '.kenaz', 'specialist', 'field_report_watermark.json');
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
// Scan every status dir for field-report cards (title prefix written by
|
|
579
|
+
// inbox.rs's place_field_report_card: "[field-report:<kind>] ..."), return
|
|
580
|
+
// their numeric TASK_NNN ids. A plain substring check on the tag is enough
|
|
581
|
+
// here (cosmetic banner count, not a security boundary) -- exercised via
|
|
582
|
+
// this pure function so the FS-scanning and counting logic are each
|
|
583
|
+
// independently testable.
|
|
584
|
+
function scanFieldReportCardIds(tasksDir) {
|
|
585
|
+
const ids = [];
|
|
586
|
+
for (const st of FIELD_REPORT_TASK_STATUSES) {
|
|
587
|
+
const d = path.join(tasksDir, st);
|
|
588
|
+
let files = [];
|
|
589
|
+
try { files = fs.existsSync(d) ? fs.readdirSync(d).filter((f) => /\.ya?ml$/.test(f)) : []; } catch { files = []; }
|
|
590
|
+
for (const f of files) {
|
|
591
|
+
let txt;
|
|
592
|
+
try { txt = fs.readFileSync(path.join(d, f), 'utf8'); } catch { continue; }
|
|
593
|
+
if (!txt.includes(FIELD_REPORT_CARD_TAG)) continue;
|
|
594
|
+
const idMatch = txt.match(/^id:\s*['"]?(TASK_\d+)/m) || f.match(/^(TASK_\d+)/);
|
|
595
|
+
if (!idMatch) continue;
|
|
596
|
+
const num = parseInt(idMatch[1].replace('TASK_', ''), 10);
|
|
597
|
+
if (Number.isFinite(num)) ids.push(num);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
return ids;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// Pure counting logic, split out for unit testing (mirrors formatWishesLine's
|
|
604
|
+
// split from fetchOpenWishes). `watermark === null` means "no prior boot
|
|
605
|
+
// recorded" -- establish a baseline instead of reporting every existing card
|
|
606
|
+
// as new (avoids a flood on the very first boot after this feature ships,
|
|
607
|
+
// when backfill (R3) may have just carded many pre-existing reports at once).
|
|
608
|
+
function computeNewFieldReportCount(ids, watermark) {
|
|
609
|
+
const max = ids.length ? Math.max(...ids) : (typeof watermark === 'number' ? watermark : 0);
|
|
610
|
+
if (watermark === null || watermark === undefined) {
|
|
611
|
+
return { newCount: 0, nextWatermark: max };
|
|
612
|
+
}
|
|
613
|
+
const newCount = ids.filter((n) => n > watermark).length;
|
|
614
|
+
return { newCount, nextWatermark: Math.max(watermark, max) };
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
function readFieldReportWatermark() {
|
|
618
|
+
try {
|
|
619
|
+
const data = JSON.parse(fs.readFileSync(fieldReportWatermarkPath(), 'utf8'));
|
|
620
|
+
return typeof data.last_seen_max_id === 'number' ? data.last_seen_max_id : null;
|
|
621
|
+
} catch {
|
|
622
|
+
return null;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
function writeFieldReportWatermark(value) {
|
|
627
|
+
try {
|
|
628
|
+
const p = fieldReportWatermarkPath();
|
|
629
|
+
const dir = path.dirname(p);
|
|
630
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
631
|
+
fs.writeFileSync(p, JSON.stringify({ last_seen_max_id: value }));
|
|
632
|
+
} catch {
|
|
633
|
+
/* non-fatal: banner just won't advance the watermark this boot */
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// TASK_2040: mother-side triage duty (WISHING WELL mandate) — field-report
|
|
638
|
+
// cards (blockers, project-scope wishes, feature proposals alike) tagged
|
|
639
|
+
// `needs-triage` by the companion Rust routing are judged at boot: adopt
|
|
640
|
+
// or decline, never left to accumulate silently. This counts currently
|
|
641
|
+
// OPEN (unresolved) needs-triage cards, not "new since last boot" like
|
|
642
|
+
// scanFieldReportCardIds/computeNewFieldReportCount above -- a card stays
|
|
643
|
+
// counted every boot until it is triaged (moved to done/cancel), which is
|
|
644
|
+
// the point: it is a standing worklist, not a one-time notification.
|
|
645
|
+
const NEEDS_TRIAGE_TAG = 'needs-triage';
|
|
646
|
+
const OPEN_TASK_STATUSES = ['backlog', 'active', 'blocked'];
|
|
647
|
+
|
|
648
|
+
// Same substring-match convention as scanFieldReportCardIds (cosmetic
|
|
649
|
+
// banner count, not a security boundary): matches the tag whether it lands
|
|
650
|
+
// in a YAML `tags:` list entry or a title prefix.
|
|
651
|
+
function countOpenNeedsTriageCards(tasksDir, { heimdall = false } = {}) {
|
|
652
|
+
let count = 0;
|
|
653
|
+
for (const st of OPEN_TASK_STATUSES) {
|
|
654
|
+
const d = path.join(tasksDir, st);
|
|
655
|
+
let files = [];
|
|
656
|
+
try { files = fs.existsSync(d) ? fs.readdirSync(d).filter((f) => /\.ya?ml$/.test(f)) : []; } catch { files = []; }
|
|
657
|
+
for (const f of files) {
|
|
658
|
+
let txt;
|
|
659
|
+
try { txt = fs.readFileSync(path.join(d, f), 'utf8'); } catch { continue; }
|
|
660
|
+
if (!txt.includes(NEEDS_TRIAGE_TAG)) continue;
|
|
661
|
+
// TASK_2245: heimdall cards have their own banner line; keep them out of
|
|
662
|
+
// the field-report count (heimdall=false) and count only them (true).
|
|
663
|
+
if (hasYamlTag(txt, 'heimdall') === heimdall) count++;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
return count;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// Tag membership in a task YAML (block list or inline list), not a substring
|
|
670
|
+
// match -- a description mentioning "heimdall" must not count.
|
|
671
|
+
function hasYamlTag(txt, tag) {
|
|
672
|
+
return new RegExp('^\\s*-\\s*[\'"]?' + tag + '[\'"]?\\s*$', 'm').test(txt)
|
|
673
|
+
|| new RegExp('^tags:.*[\\[,\\s\'"]' + tag + '[\\],\\s\'"]', 'm').test(txt);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// TASK_2245: Heimdall findings land as needs-triage cards; one banner line
|
|
677
|
+
// with the open count, omitted at 0 (pure, mirrors formatFieldReportLine).
|
|
678
|
+
function formatHeimdallTriageLine(count) {
|
|
679
|
+
if (!(count > 0)) return null;
|
|
680
|
+
return '🔭 Heimdall: ' + count + ' finding(s) awaiting triage (tag needs-triage,heimdall)';
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// TASK_2363: the post-commit hook only appends one JSON line per commit to
|
|
684
|
+
// .kenaz/specialist/heimdall_commits.jsonl ({"sha":..,"at":<unix secs>}); the
|
|
685
|
+
// heimdall skill writes heimdall_last_scan.json ({"at":<unix secs>}) when an
|
|
686
|
+
// in-session scan finishes. Commits since the last scan = records newer than it.
|
|
687
|
+
function countCommitsSinceHeimdallScan(base) {
|
|
688
|
+
const dir = path.join(base, '.kenaz', 'specialist');
|
|
689
|
+
let lastAt = 0;
|
|
690
|
+
try { lastAt = Number(JSON.parse(fs.readFileSync(path.join(dir, 'heimdall_last_scan.json'), 'utf8')).at) || 0; } catch { /* no scan yet */ }
|
|
691
|
+
let txt;
|
|
692
|
+
try { txt = fs.readFileSync(path.join(dir, 'heimdall_commits.jsonl'), 'utf8'); } catch { return 0; }
|
|
693
|
+
let n = 0;
|
|
694
|
+
for (const l of txt.split('\n')) {
|
|
695
|
+
if (!l.trim()) continue;
|
|
696
|
+
try { if (Number(JSON.parse(l).at) > lastAt) n++; } catch { /* skip torn line */ }
|
|
697
|
+
}
|
|
698
|
+
return n;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
function formatHeimdallScanLine(count) {
|
|
702
|
+
if (!(count > 0)) return null;
|
|
703
|
+
return '🔭 ' + count + ' commits since last Heimdall scan (run the heimdall skill in-session to scan)';
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Pure formatter, split out for direct unit testing (mirrors
|
|
707
|
+
// formatWishesLine). Omitted (null) only when BOTH counts are 0 -- the
|
|
708
|
+
// existing "new field-report cards" zero-noise convention, extended to
|
|
709
|
+
// also cover the needs-triage count.
|
|
710
|
+
function formatFieldReportLine(newCount, needsTriageCount) {
|
|
711
|
+
if (newCount <= 0 && needsTriageCount <= 0) return null;
|
|
712
|
+
const parts = [];
|
|
713
|
+
if (newCount > 0) parts.push(newCount + ' new card(s) since last boot');
|
|
714
|
+
if (needsTriageCount > 0) parts.push(needsTriageCount + ' needing triage');
|
|
715
|
+
return '📥 Field reports: ' + parts.join(', ');
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// Omitted when both counts are 0 (banner zero-noise convention -- see
|
|
719
|
+
// wishesLine/openCardLines).
|
|
720
|
+
function fieldReportBannerLine() {
|
|
721
|
+
const tasksDir = resolveTasksDir();
|
|
722
|
+
const ids = scanFieldReportCardIds(tasksDir);
|
|
723
|
+
const watermark = readFieldReportWatermark();
|
|
724
|
+
const { newCount, nextWatermark } = computeNewFieldReportCount(ids, watermark);
|
|
725
|
+
writeFieldReportWatermark(nextWatermark);
|
|
726
|
+
const needsTriageCount = countOpenNeedsTriageCards(tasksDir);
|
|
727
|
+
return formatFieldReportLine(newCount, needsTriageCount);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// -- TASK_2044: surface dead graph DBs loudly ---------------------------------
|
|
731
|
+
//
|
|
732
|
+
// Incident 2026-09-26: the KenazAI Synapse graph was unopenable from 08:13Z
|
|
733
|
+
// and only surfaced when a new tool was smoke-tested; Cortex meta_graph
|
|
734
|
+
// (~/.kenaz/cortex/meta_graph/graph) failed to open with "invalid
|
|
735
|
+
// unordered_map<K, T> key" since 2026-09-03 (1008 WARN lines) and nothing
|
|
736
|
+
// surfaced it for 23+ days. Both logged only as WARN. This is the one
|
|
737
|
+
// surface every /Ansuz session reads, so both failures get a loud
|
|
738
|
+
// ANOMALY-style line here. File reads only -- no MCP, no DB open -- boot
|
|
739
|
+
// must stay cheap and must never throw.
|
|
740
|
+
//
|
|
741
|
+
// TASK_2048: meta_graph itself has been retired (dev/CORTEX_META_GRAPH_ASSESSMENT.md
|
|
742
|
+
// -- dead since 2026-04-13, zero live consumers, ~4k lines removed). The
|
|
743
|
+
// "Cortex auto-sync failed/panicked" detector below is KEPT as-is (renamed
|
|
744
|
+
// CORTEX_SYNC_ERROR, was CORTEX_META_GRAPH_ERROR) because Cortex auto-sync
|
|
745
|
+
// still runs -- it now only syncs global_memory.db, but that sync can still
|
|
746
|
+
// fail (e.g. a locked/corrupt global_memory.db) and this is still the
|
|
747
|
+
// cheapest place to surface it. The dbPath shown is whatever the failure
|
|
748
|
+
// line itself names, not necessarily meta_graph anymore.
|
|
749
|
+
|
|
750
|
+
// Bounded tail read (last ~256 KB) so boot never pays for a multi-MB log.
|
|
751
|
+
const CORTEX_LOG_TAIL_BYTES = 256 * 1024;
|
|
752
|
+
// TERMINAL outcomes only ("completed" / "failed:" / "task panicked:") --
|
|
753
|
+
// deliberately excludes the non-terminal lines the Rust side also logs under
|
|
754
|
+
// "Cortex auto-sync" (features/synapse/index.rs: "Triggering Cortex
|
|
755
|
+
// auto-sync for <path>" at the START of every sync; features/cortex/sync.rs:
|
|
756
|
+
// "Cortex auto-sync already in progress, skipping" / "...skipped: no tokio
|
|
757
|
+
// runtime..."). Matching those would let a trigger/in-progress/skipped line
|
|
758
|
+
// that lands AFTER a real failure (e.g. boot polling between the next
|
|
759
|
+
// reindex's trigger and its result) falsely read as "not a failure" and
|
|
760
|
+
// clear a still-broken sync.
|
|
761
|
+
const CORTEX_SYNC_LINE_RE = /Cortex auto-sync (completed|failed:|task panicked:)/;
|
|
762
|
+
const CORTEX_DB_OPEN_FAILED_RE = /DB open failed \(([^)]*)\)/;
|
|
763
|
+
|
|
764
|
+
// GEN-008/009: path resolved per-platform via env, never hard-coded. Mirrors
|
|
765
|
+
// backend_log_dir() (dashboard/src-tauri/src/infrastructure/logging.rs),
|
|
766
|
+
// which resolves via the Rust `dirs` crate's data_local_dir(): %LOCALAPPDATA%
|
|
767
|
+
// on Windows, ~/Library/Application Support on macOS, $XDG_DATA_HOME (else
|
|
768
|
+
// ~/.local/share) on Linux.
|
|
769
|
+
function resolveBackendLogPath() {
|
|
770
|
+
try {
|
|
771
|
+
if (process.platform === 'win32') {
|
|
772
|
+
const base = process.env.LOCALAPPDATA;
|
|
773
|
+
return base ? path.join(base, 'Kenaz Dashboard', 'backend.log') : null;
|
|
774
|
+
}
|
|
775
|
+
if (process.platform === 'darwin') {
|
|
776
|
+
const home = os.homedir();
|
|
777
|
+
return home ? path.join(home, 'Library', 'Application Support', 'Kenaz Dashboard', 'backend.log') : null;
|
|
778
|
+
}
|
|
779
|
+
const xdg = process.env.XDG_DATA_HOME;
|
|
780
|
+
if (xdg) return path.join(xdg, 'Kenaz Dashboard', 'backend.log');
|
|
781
|
+
const home = os.homedir();
|
|
782
|
+
return home ? path.join(home, '.local', 'share', 'Kenaz Dashboard', 'backend.log') : null;
|
|
783
|
+
} catch {
|
|
784
|
+
return null;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
// Reads only the last `maxBytes` of `logPath`. Missing file / any read error
|
|
789
|
+
// -> null. Split out from the caller so it's directly unit-testable against
|
|
790
|
+
// a temp file without touching the real backend.log (GEN-007/008).
|
|
791
|
+
function readBackendLogTailSync(logPath, maxBytes) {
|
|
792
|
+
let stat;
|
|
793
|
+
try { stat = fs.statSync(logPath); } catch { return null; }
|
|
794
|
+
const size = stat.size;
|
|
795
|
+
const start = size > maxBytes ? size - maxBytes : 0;
|
|
796
|
+
let fd;
|
|
797
|
+
try { fd = fs.openSync(logPath, 'r'); } catch { return null; }
|
|
798
|
+
try {
|
|
799
|
+
const len = size - start;
|
|
800
|
+
if (len <= 0) return '';
|
|
801
|
+
const buf = Buffer.alloc(len);
|
|
802
|
+
fs.readSync(fd, buf, 0, len, start);
|
|
803
|
+
return buf.toString('utf8');
|
|
804
|
+
} catch {
|
|
805
|
+
return null;
|
|
806
|
+
} finally {
|
|
807
|
+
try { fs.closeSync(fd); } catch { /* ignore */ }
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
// Pure formatter over an already-read log tail -- split out for direct unit
|
|
812
|
+
// testing. Looks only at TERMINAL "Cortex auto-sync" outcome lines (the
|
|
813
|
+
// wrapper in dashboard/src-tauri/src/features/cortex/sync.rs::trigger_auto_sync,
|
|
814
|
+
// which logs "Cortex auto-sync completed" on success, or "Cortex auto-sync
|
|
815
|
+
// failed: <err>" / "Cortex auto-sync task panicked: <err>" on failure, where
|
|
816
|
+
// <err> is "DB open failed (<path>): ..." when the DB the sync touches
|
|
817
|
+
// (TASK_2048: global_memory.db -- meta_graph has been retired) won't open)
|
|
818
|
+
// -- see CORTEX_SYNC_LINE_RE for why non-terminal lines
|
|
819
|
+
// (trigger/in-progress/skipped) are deliberately excluded. The MOST RECENT
|
|
820
|
+
// such terminal line decides the verdict, so a later success line clears a
|
|
821
|
+
// prior failure.
|
|
822
|
+
function formatCortexSyncAnomaly(tailText) {
|
|
823
|
+
if (typeof tailText !== 'string' || tailText.length === 0) return null;
|
|
824
|
+
const lines = tailText.split(/\r?\n/).filter((l) => CORTEX_SYNC_LINE_RE.test(l));
|
|
825
|
+
if (lines.length === 0) return null;
|
|
826
|
+
const mostRecent = lines[lines.length - 1];
|
|
827
|
+
const m = CORTEX_DB_OPEN_FAILED_RE.exec(mostRecent);
|
|
828
|
+
if (!m) return null;
|
|
829
|
+
const dbPath = m[1];
|
|
830
|
+
const failureCount = lines.filter((l) => CORTEX_DB_OPEN_FAILED_RE.test(l)).length;
|
|
831
|
+
return '⚠️ ANOMALY: CORTEX_SYNC_ERROR — DB open failed: ' + dbPath +
|
|
832
|
+
' (' + failureCount + ' failure(s) in backend.log tail) — check backend.log';
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
// logPathOverride lets tests point this at a fixture file instead of the
|
|
836
|
+
// real backend.log. Any failure (unresolvable path, missing file, read
|
|
837
|
+
// error) -> null, never throws.
|
|
838
|
+
function cortexSyncAnomalyLine(logPathOverride) {
|
|
839
|
+
try {
|
|
840
|
+
const logPath = logPathOverride || resolveBackendLogPath();
|
|
841
|
+
if (!logPath) return null;
|
|
842
|
+
const tail = readBackendLogTailSync(logPath, CORTEX_LOG_TAIL_BYTES);
|
|
843
|
+
if (tail === null) return null;
|
|
844
|
+
return formatCortexSyncAnomaly(tail);
|
|
845
|
+
} catch {
|
|
846
|
+
return null;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// TASK_2388: cwd is not a Kenaz project and nothing is pinned/passed -> the resolver fell back to
|
|
851
|
+
// the install's own BASE_DIR. Printing that project's streams/tasks here is another project's data.
|
|
852
|
+
function isOutsideAnyProject(source, cwd, base) {
|
|
853
|
+
if (source !== 'base') return false;
|
|
854
|
+
const rel = path.relative(path.resolve(base), path.resolve(cwd));
|
|
855
|
+
return rel.startsWith('..') || path.isAbsolute(rel);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
async function main() {
|
|
859
|
+
if (isOutsideAnyProject(PIN_SOURCE, process.cwd(), BASE)) {
|
|
860
|
+
process.stdout.write('ᚨ Ansuz: not inside a Kenaz project (cwd=' + process.cwd() + ').' + String.fromCharCode(10) +
|
|
861
|
+
'cd into a project, or run /kenaz init to set this directory up.' + String.fromCharCode(10));
|
|
862
|
+
return;
|
|
863
|
+
}
|
|
864
|
+
const tasks = countTasks();
|
|
865
|
+
const handoff = loadAndArchiveHandoff();
|
|
866
|
+
const multiHandoffs = loadMultiSlotHandoffs();
|
|
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();
|
|
872
|
+
// TASK_1764: derive stable conversation_id from transcript_path basename (stable across resume).
|
|
873
|
+
// TASK_1863: --conversation-id= overrides the transcript-derived id (same injectable-seam
|
|
874
|
+
// pattern as --mcp-base-url) so the lease-reuse behavior is testable in a sandbox
|
|
875
|
+
// where no transcript exists.
|
|
876
|
+
var _convId = parseArgValue(process.argv.slice(2), '--conversation-id');
|
|
877
|
+
// Codex (Bifrost) exports its own session id; every hint file below is written
|
|
878
|
+
// by CLAUDE hooks and belongs to some Claude session, so inside Codex they
|
|
879
|
+
// returned the wrong id (peer report 2026-10-05: replies bound to the boot id
|
|
880
|
+
// were lost). The harness's own id wins over any hint.
|
|
881
|
+
if (!_convId) _convId = harnessSessionIdFromEnv(process.env);
|
|
882
|
+
if (!_convId && process.env.CLAUDE_CODE_SESSION_ID && process.env.CLAUDE_CODE_SESSION_ID.trim()) _convId = process.env.CLAUDE_CODE_SESSION_ID.trim();
|
|
883
|
+
// TASK_2218: prefer the REAL hook-provided session id over guessing -- the
|
|
884
|
+
// newest-*.jsonl-mtime-in-cwd guess below silently resolves to ANOTHER
|
|
885
|
+
// session's transcript whenever two sessions share a cwd (field report:
|
|
886
|
+
// installed user, every session's cwd = kenaz-core; boot mis-derived
|
|
887
|
+
// conversation_id, so ansuz_handoff_snapshot wrote to the OTHER session's
|
|
888
|
+
// slot). .claude/hooks/ansuz-session-pin.js writes this sidecar on every
|
|
889
|
+
// UserPromptSubmit with THIS turn's real {session_id, written_at} -- read
|
|
890
|
+
// here moments later, same turn, via the model's own Bash tool call. Same
|
|
891
|
+
// dir .claude/hooks/ reads CLAUDE_PROJECT_DIR from (not BASE, which may
|
|
892
|
+
// already be pin-resolved to a sub-project the hook's cwd-keyed sidecar
|
|
893
|
+
// never saw) -- see that hook's own module doc.
|
|
894
|
+
var HOOK_HINT_FRESH_MS = 5 * 60 * 1000; // 5 min: same-turn hook write -> this read
|
|
895
|
+
// TASK_2222: the single-slot hint below is overwritten by EVERY session's
|
|
896
|
+
// EVERY turn -- a second live session prompting in the same cwd between
|
|
897
|
+
// this hook's write and this Bash call's read clobbers it, handing boot
|
|
898
|
+
// the WRONG session id (the actual bug this task fixes; real fix is the
|
|
899
|
+
// caller passing --conversation-id explicitly, sourced from THIS session's
|
|
900
|
+
// own turn-context output, which cannot be clobbered). Before trusting the
|
|
901
|
+
// single slot, check the keyed-per-session hints
|
|
902
|
+
// (.kenaz/specialist/prompt_hints/<session_id>.json, written alongside the
|
|
903
|
+
// single slot by the same hook) -- each session writes only its own file,
|
|
904
|
+
// so they cannot clobber each other. Exactly one fresh keyed hint is as
|
|
905
|
+
// trustworthy as the single slot used to assume it always was; more than
|
|
906
|
+
// one is genuine ambiguity (two sessions both just prompted) that must NOT
|
|
907
|
+
// be guessed away, so it falls through instead of picking either one.
|
|
908
|
+
if (!_convId) try {
|
|
909
|
+
var _hintsDir = path.join(process.env.CLAUDE_PROJECT_DIR || process.cwd(), '.kenaz', 'specialist', 'prompt_hints');
|
|
910
|
+
if (fs.existsSync(_hintsDir)) {
|
|
911
|
+
var _freshHints = [];
|
|
912
|
+
for (const _f of fs.readdirSync(_hintsDir)) {
|
|
913
|
+
if (!_f.endsWith('.json')) continue;
|
|
914
|
+
try {
|
|
915
|
+
var _kh = JSON.parse(fs.readFileSync(path.join(_hintsDir, _f), 'utf8'));
|
|
916
|
+
if (_kh && _kh.session_id && Date.now() - (_kh.written_at || 0) < HOOK_HINT_FRESH_MS) {
|
|
917
|
+
_freshHints.push(String(_kh.session_id));
|
|
918
|
+
}
|
|
919
|
+
} catch (_khe) { /* ignore unreadable/corrupt entry */ }
|
|
920
|
+
}
|
|
921
|
+
if (_freshHints.length === 1) _convId = _freshHints[0];
|
|
922
|
+
// length 0 -> nothing to use yet, fall through. length > 1 -> ambiguous
|
|
923
|
+
// (another session is also live) -- fall through rather than guess.
|
|
924
|
+
}
|
|
925
|
+
} catch (_phe) {}
|
|
926
|
+
if (!_convId) try {
|
|
927
|
+
var _hookProjectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
928
|
+
var _hintPath = path.join(_hookProjectDir, '.kenaz', 'specialist', 'last_prompt_session.json');
|
|
929
|
+
if (fs.existsSync(_hintPath)) {
|
|
930
|
+
var _hint = JSON.parse(fs.readFileSync(_hintPath, 'utf8'));
|
|
931
|
+
if (_hint && _hint.session_id && Date.now() - (_hint.written_at || 0) < HOOK_HINT_FRESH_MS &&
|
|
932
|
+
hintNamesThisSession(_hint.session_id, process.env, process.cwd())) {
|
|
933
|
+
_convId = String(_hint.session_id);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
} catch (_he) {}
|
|
937
|
+
if (!_convId) try {
|
|
938
|
+
var _sessionMod = require('./session.js');
|
|
939
|
+
// Claude Code files the transcript under the directory the session was
|
|
940
|
+
// started in (this script's cwd), not under the pinned project. Looking
|
|
941
|
+
// only under BASE found nothing for a pinned sub-project, so the lease had
|
|
942
|
+
// no conversation id and every handoff snapshot opened a new slot
|
|
943
|
+
// (field reports e787bb45 / 10ee9c09, TASK_2012).
|
|
944
|
+
//
|
|
945
|
+
// TASK_2218: last-resort fallback only -- a GUESS (newest mtime among
|
|
946
|
+
// potentially several live *.jsonl files in the same project dir), kept
|
|
947
|
+
// for non-hook-driven invocations (manual CLI run, headless dispatch, a
|
|
948
|
+
// non-Claude driver) where no hook ever wrote the sidecar above.
|
|
949
|
+
var _txPath = null;
|
|
950
|
+
if (_sessionMod.findConversationLog) {
|
|
951
|
+
_txPath = _sessionMod.findConversationLog(process.cwd());
|
|
952
|
+
if (!_txPath && path.resolve(BASE) !== path.resolve(process.cwd())) _txPath = _sessionMod.findConversationLog(BASE);
|
|
953
|
+
}
|
|
954
|
+
if (_txPath) _convId = path.basename(_txPath, '.jsonl');
|
|
955
|
+
} 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
|
+
|
|
960
|
+
const lines = [];
|
|
961
|
+
lines.push('═══ ᚨ Ansuz · 快速 Boot (gateless) ═══');
|
|
962
|
+
// The MCP handoff tool cannot tell which session called it; current_stream.json
|
|
963
|
+
// is a single global slot, so it mints a new ansuz-prompt-<ts> slot whenever that
|
|
964
|
+
// pointer is missing or belongs to another session. Ansuz passes this id
|
|
965
|
+
// explicitly as session_id instead (elixir HANDOFF mandate).
|
|
966
|
+
if (_convId) lines.push('[session] conversation_id=' + _convId + ' (pass as session_id to ansuz_handoff_snapshot)');
|
|
967
|
+
|
|
968
|
+
// -- TASK_1702 R2: pin banner -------------------------------------------
|
|
969
|
+
if (IS_PINNED) {
|
|
970
|
+
const projName = getProjectName(BASE);
|
|
971
|
+
const srcLabel = PIN_SOURCE === 'cli' ? 'cli' : 'pin';
|
|
972
|
+
lines.push('[pin:' + srcLabel + '] Session bound: ' + projName + ' ' + BASE);
|
|
973
|
+
|
|
974
|
+
// mismatch warning (async, offline-safe)
|
|
975
|
+
let dashProj = null;
|
|
976
|
+
try { dashProj = await getDashboardCurrentProject(); } catch (e) { /* silent */ }
|
|
977
|
+
if (dashProj && dashProj.currentProjectPath) {
|
|
978
|
+
if (normPath(dashProj.currentProjectPath) !== normPath(BASE)) {
|
|
979
|
+
lines.push('[warn] Dashboard current project (' +
|
|
980
|
+
(dashProj.currentProjectName || dashProj.currentProjectPath) +
|
|
981
|
+
') != pinned project -- pass projectPath on all MCP calls');
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
|
|
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
|
+
}
|
|
994
|
+
|
|
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
|
+
// TASK_1997 R4: open-wish count. mcpBase reuses the same override seam as
|
|
1036
|
+
// the --mcp-base-url= / KENAZ_MCP_BASE_URL seam.
|
|
1037
|
+
const mcpBase =
|
|
1038
|
+
parseArgValue(process.argv.slice(2), '--mcp-base-url') ||
|
|
1039
|
+
process.env.KENAZ_MCP_BASE_URL ||
|
|
1040
|
+
'http://127.0.0.1:18080';
|
|
1041
|
+
// TASK_2063: pass the resolved pin (same value used for the pin banner
|
|
1042
|
+
// line above) so the query is scoped to the bound project when pinned.
|
|
1043
|
+
const wishesLine = formatWishesLine(await fetchOpenWishes(mcpBase, WISH_TIMEOUT_MS, IS_PINNED ? BASE : null));
|
|
1044
|
+
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
|
+
for (const l of openCardLines()) lines.push(l);
|
|
1053
|
+
if (handoff.loaded) {
|
|
1054
|
+
const s = handoff.summary;
|
|
1055
|
+
// TASK_1988 banner cut: topic + unfinished only. first_action is derived
|
|
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)');
|
|
1086
|
+
process.stdout.write(lines.join(String.fromCharCode(10)) + String.fromCharCode(10));
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
// TASK_1997: guarded so this module can be require()'d for unit testing
|
|
1090
|
+
// (fetchOpenWishes / formatWishesLine) without running the full boot
|
|
1091
|
+
// sequence as a side effect. Always run as `node ansuz-boot-fast.js` in
|
|
1092
|
+
// production, so require.main === module there and behavior is unchanged.
|
|
1093
|
+
if (require.main === module) {
|
|
1094
|
+
main().catch(function() {
|
|
1095
|
+
// Catastrophic failure: still emit basic banner
|
|
1096
|
+
process.stdout.write('=== Ansuz * Quick Boot (gateless) ===' + String.fromCharCode(10) + '[boot error -- see stderr]' + String.fromCharCode(10));
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
module.exports = {
|
|
1101
|
+
isOutsideAnyProject,
|
|
1102
|
+
harnessSessionIdFromEnv,
|
|
1103
|
+
hintNamesThisSession,
|
|
1104
|
+
fetchOpenWishes,
|
|
1105
|
+
formatWishesLine,
|
|
1106
|
+
scanFieldReportCardIds,
|
|
1107
|
+
computeNewFieldReportCount,
|
|
1108
|
+
countOpenNeedsTriageCards,
|
|
1109
|
+
formatFieldReportLine,
|
|
1110
|
+
formatHeimdallTriageLine,
|
|
1111
|
+
countCommitsSinceHeimdallScan,
|
|
1112
|
+
formatHeimdallScanLine,
|
|
1113
|
+
resolveBackendLogPath,
|
|
1114
|
+
readBackendLogTailSync,
|
|
1115
|
+
formatCortexSyncAnomaly,
|
|
1116
|
+
cortexSyncAnomalyLine,
|
|
1117
|
+
readProjectsJsonSync, // TASK_2057: exported for __kenaz_core__ resolution tests
|
|
1118
|
+
readCardHeader, // TASK_2272: exported for quoted-STATUS tests
|
|
1119
|
+
getProjectName, // TASK_2081: exported for regex/quote-stripping tests
|
|
1120
|
+
};
|