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,1866 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Specialist Session Manager
|
|
5
|
+
*
|
|
6
|
+
* 統一入口:載入 Specialist persona、組裝 prompt、管理 session 生命週期。
|
|
7
|
+
* 無外部依賴 — 純 Node.js。
|
|
8
|
+
*
|
|
9
|
+
* CLI:
|
|
10
|
+
* node session.js list [--json]
|
|
11
|
+
* node session.js resolve <name>
|
|
12
|
+
* node session.js prompt <name> [--mode=assembled|reference] [--depth=capsule|elixir|kernel] [--exclude=a,b] [--task=...] [--context=...] [--source=plugin] [--no-episode]
|
|
13
|
+
* node session.js start <name> [--consumer=...] [--task=...] [--with-prompt] [--json]
|
|
14
|
+
* node session.js end <sessionId>
|
|
15
|
+
* node session.js active [--json]
|
|
16
|
+
* node session.js clean [--keep=5]
|
|
17
|
+
* node session.js stop
|
|
18
|
+
*
|
|
19
|
+
* Module:
|
|
20
|
+
* const session = require('.specialist/tools/session');
|
|
21
|
+
* session.list()
|
|
22
|
+
* session.resolve('Amelia')
|
|
23
|
+
* session.buildPrompt('Amelia', { mode: 'assembled' })
|
|
24
|
+
* session.startSession('Amelia', { consumer: 'formation' })
|
|
25
|
+
* session.endSession(sessionId)
|
|
26
|
+
* session.getActiveSessions()
|
|
27
|
+
* session.cleanSessions({ keep: 5 })
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const fs = require('fs');
|
|
31
|
+
const path = require('path');
|
|
32
|
+
|
|
33
|
+
// ═══════════════════════════════════════
|
|
34
|
+
// CLI --project-path extraction (MUST run before BASE_DIR computation)
|
|
35
|
+
// Supports: --project-path PATH and --project-path=PATH
|
|
36
|
+
// Pattern mirrors phase-gate.js:63-85 (resolveKenazPath + CLI_PROJECT_PATH priority).
|
|
37
|
+
// Read-only on argv — does NOT splice, so downstream parseCliArgs() still sees the flag.
|
|
38
|
+
// ═══════════════════════════════════════
|
|
39
|
+
const CLI_PROJECT_PATH = (() => {
|
|
40
|
+
const argv = process.argv.slice(2);
|
|
41
|
+
const idx = argv.indexOf('--project-path');
|
|
42
|
+
if (idx >= 0 && argv[idx + 1]) return path.resolve(argv[idx + 1]);
|
|
43
|
+
const eqArg = argv.find(a => a.startsWith('--project-path='));
|
|
44
|
+
if (eqArg) return path.resolve(eqArg.slice('--project-path='.length));
|
|
45
|
+
return null;
|
|
46
|
+
})();
|
|
47
|
+
|
|
48
|
+
// ═══════════════════════════════════════
|
|
49
|
+
// Path resolution
|
|
50
|
+
// ═══════════════════════════════════════
|
|
51
|
+
|
|
52
|
+
function findProjectRoot() {
|
|
53
|
+
let dir = __dirname;
|
|
54
|
+
// Walk up to find .specialist at parent level
|
|
55
|
+
while (dir !== path.dirname(dir)) {
|
|
56
|
+
const parent = path.dirname(dir);
|
|
57
|
+
if (fs.existsSync(path.join(parent, '.specialist'))) return parent;
|
|
58
|
+
dir = parent;
|
|
59
|
+
}
|
|
60
|
+
return process.cwd();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const BASE_DIR = findProjectRoot();
|
|
64
|
+
const SPECIALIST_DIR = path.join(BASE_DIR, '.specialist');
|
|
65
|
+
const SESSION_DIR = path.join(SPECIALIST_DIR, 'sessions');
|
|
66
|
+
|
|
67
|
+
// PROJECT_DIR: the active project root for .kenaz/ state resolution.
|
|
68
|
+
// Priority: CLI_PROJECT_PATH > cwd (if .kenaz/ present) > BASE_DIR.
|
|
69
|
+
// Mirrors phase-gate.js resolveKenazPath priority chain (Sub-Project Boot Boundary Resolution).
|
|
70
|
+
// BASE_DIR stays the Kenaz-core install root (system files); PROJECT_DIR is the per-project
|
|
71
|
+
// state root — they diverge when /Ansuz runs against a sub-project via --project-path.
|
|
72
|
+
const PROJECT_DIR = (() => {
|
|
73
|
+
if (CLI_PROJECT_PATH) return CLI_PROJECT_PATH;
|
|
74
|
+
const cwdKenaz = path.join(process.cwd(), '.kenaz');
|
|
75
|
+
if (fs.existsSync(cwdKenaz)) return process.cwd();
|
|
76
|
+
return BASE_DIR;
|
|
77
|
+
})();
|
|
78
|
+
|
|
79
|
+
// Specialists whose `prompt` boot gets the most recent episode injected as prior-session context.
|
|
80
|
+
const EPISODE_SPECIALISTS = ['Ansuz', 'Amelia'];
|
|
81
|
+
const http = require('http');
|
|
82
|
+
const projectResolver = require('./lib/project-resolver');
|
|
83
|
+
// TASK_2163: chart files are keyed by project identity + id (sub-projects reusing
|
|
84
|
+
// bare ids previously collided in the flat core sessions dir).
|
|
85
|
+
const chartPathLib = require('./lib/chart-path');
|
|
86
|
+
|
|
87
|
+
/** specialist/X/Y.yaml → <BASE>/.specialist/X/Y.yaml */
|
|
88
|
+
function resolveFilePath(entry) {
|
|
89
|
+
if (entry.startsWith('.')) return path.join(BASE_DIR, entry);
|
|
90
|
+
return path.join(BASE_DIR, '.' + entry);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function oneLine(value, max = 240) {
|
|
94
|
+
const s = String(value || '').replace(/\s+/g, ' ').trim();
|
|
95
|
+
return s.length > max ? s.slice(0, max - 3) + '...' : s;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function summarizeItems(items, fields, maxItems) {
|
|
99
|
+
if (!Array.isArray(items)) return [];
|
|
100
|
+
return items.slice(0, maxItems).map((item) => {
|
|
101
|
+
const out = {};
|
|
102
|
+
for (const field of fields) {
|
|
103
|
+
if (item && item[field] !== undefined) out[field] = oneLine(item[field], 220);
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function summarizeSelfModelForBootCapsule(selfModel) {
|
|
110
|
+
if (!selfModel || typeof selfModel !== 'object') return null;
|
|
111
|
+
const blindSpots = Array.isArray(selfModel.blind_spots) ? selfModel.blind_spots : [];
|
|
112
|
+
const activeBlindSpots = blindSpots
|
|
113
|
+
.filter((b) => !String(b.status || '').startsWith('resolved'))
|
|
114
|
+
.slice(0, 5)
|
|
115
|
+
.map((b) => ({
|
|
116
|
+
id: b.id,
|
|
117
|
+
status: b.status,
|
|
118
|
+
guard: oneLine(b.prevented_by?.rule || b.prevented_by?.tool || '', 180),
|
|
119
|
+
description: oneLine(b.description, 260),
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
version: selfModel.version,
|
|
124
|
+
specialist: selfModel.specialist,
|
|
125
|
+
last_updated: selfModel.last_updated,
|
|
126
|
+
narrative: oneLine(selfModel.narrative, 720),
|
|
127
|
+
tendencies: summarizeItems(selfModel.tendencies, ['id', 'description', 'polarity'], 4),
|
|
128
|
+
active_blind_spots: activeBlindSpots,
|
|
129
|
+
growth_edges: summarizeItems(selfModel.growth_edges, ['id', 'description'], 4),
|
|
130
|
+
pointers: {
|
|
131
|
+
full_self_model: '.kenaz/specialist/ansuz_self_model.json',
|
|
132
|
+
kernel: 'dev/archive/ansuz/legacy/kernel.yaml',
|
|
133
|
+
principles: '.specialist/Ansuz/cognitive_principles.yaml',
|
|
134
|
+
capabilities: '.specialist/Ansuz/capability.yaml',
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function buildAnsuzBootCapsule(spec, selfModel) {
|
|
140
|
+
const capsule = {
|
|
141
|
+
capsule: 'Ansuz Boot Capsule',
|
|
142
|
+
target: '<=12KB model-visible boot artifact',
|
|
143
|
+
identity: {
|
|
144
|
+
name: spec.name,
|
|
145
|
+
purpose: spec.purpose,
|
|
146
|
+
role: 'Kenaz PM: understand intent, design tasks, choose formation, dispatch, verify, report.',
|
|
147
|
+
},
|
|
148
|
+
execution_contract: [
|
|
149
|
+
'For non-trivial problems: enumerate 3+ hypotheses before first domain action.',
|
|
150
|
+
'Recall memory before acting when Synapse/Cortex tools are available.',
|
|
151
|
+
'Use phase gates for lifecycle work; Phase 9 verification is mandatory.',
|
|
152
|
+
'Prefer structural evidence and runnable verification over plausible explanation.',
|
|
153
|
+
'Preserve user agency for dispatch; do not promote tasks solely from ambient curiosity.',
|
|
154
|
+
],
|
|
155
|
+
active_risks: [
|
|
156
|
+
'B-001: checkpoint skipping under momentum; pulse/read before self-referential infrastructure edits.',
|
|
157
|
+
'B-002: do not treat task names or file names as API specs; inspect symbols.',
|
|
158
|
+
'B-006: completion-sense bias suppresses curiosity; check unresolved signals at boundaries.',
|
|
159
|
+
'B-007: recommendation convenience bias; state evidence chain for each viable option.',
|
|
160
|
+
],
|
|
161
|
+
lazy_load: [
|
|
162
|
+
'Load full kernel/capability files only when the current task needs their detailed rules.',
|
|
163
|
+
'Load full self_model only when updating identity, auditing drift, or resolving a blind spot.',
|
|
164
|
+
'Use synapse_recall for symbols, and kenaz_lsp_callers for callers, before modifying code paths with broad blast radius.',
|
|
165
|
+
],
|
|
166
|
+
self_model: summarizeSelfModelForBootCapsule(selfModel),
|
|
167
|
+
};
|
|
168
|
+
return JSON.stringify(capsule, null, 2);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ═══════════════════════════════════════
|
|
172
|
+
// HTTP helpers for Dashboard embedded API
|
|
173
|
+
// ═══════════════════════════════════════
|
|
174
|
+
|
|
175
|
+
/** Fetch specialist file via Dashboard HTTP API */
|
|
176
|
+
function loadFromHTTP(port, specialistName, fileName) {
|
|
177
|
+
return new Promise((resolve, reject) => {
|
|
178
|
+
const url = `http://127.0.0.1:${port}/api/embedded/prompt?name=${encodeURIComponent(specialistName)}&file=${encodeURIComponent(fileName)}`;
|
|
179
|
+
http.get(url, { timeout: 5000 }, (res) => {
|
|
180
|
+
if (res.statusCode !== 200) {
|
|
181
|
+
res.resume();
|
|
182
|
+
return reject(new Error(`HTTP ${res.statusCode}`));
|
|
183
|
+
}
|
|
184
|
+
let data = '';
|
|
185
|
+
res.on('data', (chunk) => (data += chunk));
|
|
186
|
+
res.on('end', () => resolve(data));
|
|
187
|
+
}).on('error', reject);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Fetch rule file via Dashboard HTTP API */
|
|
192
|
+
function loadRuleFromHTTP(port, rulePath) {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
const url = `http://127.0.0.1:${port}/api/embedded/rule?path=${encodeURIComponent(rulePath)}`;
|
|
195
|
+
http.get(url, { timeout: 5000 }, (res) => {
|
|
196
|
+
if (res.statusCode !== 200) {
|
|
197
|
+
res.resume();
|
|
198
|
+
return reject(new Error(`HTTP ${res.statusCode}`));
|
|
199
|
+
}
|
|
200
|
+
let data = '';
|
|
201
|
+
res.on('data', (chunk) => (data += chunk));
|
|
202
|
+
res.on('end', () => resolve(data));
|
|
203
|
+
}).on('error', reject);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ═══════════════════════════════════════
|
|
208
|
+
// Minimal YAML extraction
|
|
209
|
+
// (not a parser — extracts known fields from rule.yaml)
|
|
210
|
+
// ═══════════════════════════════════════
|
|
211
|
+
|
|
212
|
+
function extractScalar(content, key) {
|
|
213
|
+
const re = new RegExp(`^${key}:\\s*"?([^"\\n]+?)"?\\s*$`, 'm');
|
|
214
|
+
const m = content.match(re);
|
|
215
|
+
return m ? m[1].trim() : null;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function extractList(content, key) {
|
|
219
|
+
const lines = content.split('\n');
|
|
220
|
+
const items = [];
|
|
221
|
+
let capturing = false;
|
|
222
|
+
|
|
223
|
+
for (const line of lines) {
|
|
224
|
+
if (new RegExp(`^${key}:\\s*$`).test(line)) {
|
|
225
|
+
capturing = true;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (capturing) {
|
|
229
|
+
const m = line.match(/^\s+-\s+"?(.+?)"?\s*$/);
|
|
230
|
+
if (m) {
|
|
231
|
+
items.push(m[1].replace(/\s*#.*$/, '').replace(/^"(.*)"$/, '$1').trim());
|
|
232
|
+
} else if (/^\S/.test(line) && line.trim()) {
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return items;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ═══════════════════════════════════════
|
|
241
|
+
// Core: list
|
|
242
|
+
// ═══════════════════════════════════════
|
|
243
|
+
|
|
244
|
+
function list() {
|
|
245
|
+
const entries = fs.readdirSync(SPECIALIST_DIR, { withFileTypes: true });
|
|
246
|
+
const result = [];
|
|
247
|
+
|
|
248
|
+
for (const entry of entries) {
|
|
249
|
+
if (!entry.isDirectory()) continue;
|
|
250
|
+
if (['shared', 'tools', 'sessions'].includes(entry.name)) continue;
|
|
251
|
+
|
|
252
|
+
const ruleFile = path.join(SPECIALIST_DIR, entry.name, 'rule.yaml');
|
|
253
|
+
if (!fs.existsSync(ruleFile)) continue;
|
|
254
|
+
|
|
255
|
+
const content = fs.readFileSync(ruleFile, 'utf8');
|
|
256
|
+
result.push({
|
|
257
|
+
name: extractScalar(content, 'agent') || entry.name,
|
|
258
|
+
purpose: extractScalar(content, 'purpose') || '',
|
|
259
|
+
version: extractScalar(content, 'version') || '0.0.0',
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ═══════════════════════════════════════
|
|
267
|
+
// Core: resolve
|
|
268
|
+
// ═══════════════════════════════════════
|
|
269
|
+
|
|
270
|
+
async function resolve(name) {
|
|
271
|
+
const dir = path.join(SPECIALIST_DIR, name);
|
|
272
|
+
const ruleFile = path.join(dir, 'rule.yaml');
|
|
273
|
+
// Use env var, or try default port (18080) when Dashboard may be running
|
|
274
|
+
const port = process.env.KENAZ_HTTP_PORT || null;
|
|
275
|
+
|
|
276
|
+
let content = null;
|
|
277
|
+
|
|
278
|
+
// Try filesystem first
|
|
279
|
+
if (fs.existsSync(ruleFile)) {
|
|
280
|
+
content = fs.readFileSync(ruleFile, 'utf8');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Fallback: HTTP API when Dashboard is running
|
|
284
|
+
// Try explicit port first, then default port if file not found on disk
|
|
285
|
+
const portsToTry = port ? [port] : ['18080'];
|
|
286
|
+
if (content === null) {
|
|
287
|
+
for (const p of portsToTry) {
|
|
288
|
+
try {
|
|
289
|
+
content = await loadFromHTTP(p, name, 'rule.yaml');
|
|
290
|
+
break;
|
|
291
|
+
} catch {
|
|
292
|
+
// HTTP failed on this port
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (content === null) {
|
|
298
|
+
throw new Error(`Specialist "${name}" not found: ${ruleFile} (HTTP fallback also failed on port ${portsToTry.join(',')})`);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const fileList = extractList(content, 'files');
|
|
302
|
+
const exitTriggers = extractList(content, 'exit');
|
|
303
|
+
|
|
304
|
+
const loadedFiles = fileList.map(f => {
|
|
305
|
+
const resolved = resolveFilePath(f);
|
|
306
|
+
return { entry: f, path: resolved, exists: fs.existsSync(resolved) };
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
name: extractScalar(content, 'agent') || name,
|
|
311
|
+
purpose: extractScalar(content, 'purpose') || '',
|
|
312
|
+
version: extractScalar(content, 'version') || '0.0.0',
|
|
313
|
+
dir,
|
|
314
|
+
fileList,
|
|
315
|
+
loadedFiles,
|
|
316
|
+
exitTriggers,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// ═══════════════════════════════════════
|
|
321
|
+
// Plugin Specialist Support
|
|
322
|
+
// ═══════════════════════════════════════
|
|
323
|
+
|
|
324
|
+
/** Fetch plugin specialist info via Dashboard MCP HTTP API */
|
|
325
|
+
function fetchPluginSpecialistInfo(port, specialistName) {
|
|
326
|
+
return new Promise((resolve, reject) => {
|
|
327
|
+
const payload = JSON.stringify({
|
|
328
|
+
jsonrpc: '2.0',
|
|
329
|
+
id: 1,
|
|
330
|
+
method: 'tools/call',
|
|
331
|
+
params: {
|
|
332
|
+
name: 'kenaz_plugin_specialist_info',
|
|
333
|
+
arguments: { specialistName },
|
|
334
|
+
},
|
|
335
|
+
});
|
|
336
|
+
const options = {
|
|
337
|
+
hostname: '127.0.0.1',
|
|
338
|
+
port: parseInt(port, 10),
|
|
339
|
+
path: '/api/mcp',
|
|
340
|
+
method: 'POST',
|
|
341
|
+
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) },
|
|
342
|
+
timeout: 5000,
|
|
343
|
+
};
|
|
344
|
+
const req = http.request(options, (res) => {
|
|
345
|
+
let data = '';
|
|
346
|
+
res.on('data', (chunk) => (data += chunk));
|
|
347
|
+
res.on('end', () => {
|
|
348
|
+
try {
|
|
349
|
+
const json = JSON.parse(data);
|
|
350
|
+
// MCP response: { result: { content: [{ text: "..." }] } }
|
|
351
|
+
const text = json?.result?.content?.[0]?.text;
|
|
352
|
+
if (!text) return reject(new Error('Empty MCP response'));
|
|
353
|
+
const info = JSON.parse(text);
|
|
354
|
+
if (!info.found) return reject(new Error(info.message || 'Plugin specialist not found'));
|
|
355
|
+
resolve(info);
|
|
356
|
+
} catch (e) {
|
|
357
|
+
reject(new Error(`Failed to parse MCP response: ${e.message}`));
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
req.on('error', reject);
|
|
362
|
+
req.on('timeout', () => { req.destroy(); reject(new Error('Request timeout')); });
|
|
363
|
+
req.write(payload);
|
|
364
|
+
req.end();
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** Resolve a plugin specialist: fetch info from Dashboard, read rule/workflow from plugin dir */
|
|
369
|
+
async function resolvePluginSpecialist(name) {
|
|
370
|
+
const port = process.env.KENAZ_HTTP_PORT || '18080';
|
|
371
|
+
const info = await fetchPluginSpecialistInfo(port, name);
|
|
372
|
+
|
|
373
|
+
const pluginDir = info.pluginDir;
|
|
374
|
+
const specialistDir = path.join(pluginDir, 'specialist');
|
|
375
|
+
|
|
376
|
+
// Read rule.yaml from plugin directory
|
|
377
|
+
const ruleFile = info.ruleYaml
|
|
378
|
+
? path.join(specialistDir, info.ruleYaml)
|
|
379
|
+
: path.join(specialistDir, 'rule.yaml');
|
|
380
|
+
|
|
381
|
+
let ruleContent = null;
|
|
382
|
+
if (fs.existsSync(ruleFile)) {
|
|
383
|
+
ruleContent = fs.readFileSync(ruleFile, 'utf8');
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Read workflow.yaml from plugin directory (optional)
|
|
387
|
+
let workflowContent = null;
|
|
388
|
+
if (info.workflowYaml) {
|
|
389
|
+
const workflowFile = path.join(specialistDir, info.workflowYaml);
|
|
390
|
+
if (fs.existsSync(workflowFile)) {
|
|
391
|
+
workflowContent = fs.readFileSync(workflowFile, 'utf8');
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
return {
|
|
396
|
+
name: name,
|
|
397
|
+
purpose: `Plugin specialist (${info.pluginId})`,
|
|
398
|
+
version: 'plugin',
|
|
399
|
+
pluginId: info.pluginId,
|
|
400
|
+
pluginDir,
|
|
401
|
+
ruleContent,
|
|
402
|
+
workflowContent,
|
|
403
|
+
availableTools: info.availableTools || [],
|
|
404
|
+
mcpToolsPrefix: info.mcpToolsPrefix || '',
|
|
405
|
+
builtinMcpTools: info.builtinMcpTools || [],
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/** Build assembled prompt for a plugin specialist */
|
|
410
|
+
function buildPluginAssembledPrompt(pluginSpec, { task, context, canary: canaryInput }) {
|
|
411
|
+
const sections = [];
|
|
412
|
+
|
|
413
|
+
// Header
|
|
414
|
+
sections.push(`# ${pluginSpec.name} — Plugin Specialist Prompt (assembled)`);
|
|
415
|
+
sections.push(`# plugin: ${pluginSpec.pluginId}`);
|
|
416
|
+
sections.push(`# purpose: ${pluginSpec.purpose}`);
|
|
417
|
+
sections.push('');
|
|
418
|
+
|
|
419
|
+
// Canary injection
|
|
420
|
+
let canaryResult = canaryInput || null;
|
|
421
|
+
if (!canaryResult) {
|
|
422
|
+
const canaryModule = require('./canary');
|
|
423
|
+
canaryResult = canaryModule.generate({
|
|
424
|
+
specialist: pluginSpec.name,
|
|
425
|
+
task: task || 'none',
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
sections.push('# ═══ CANARY ═══');
|
|
429
|
+
sections.push(canaryResult.block);
|
|
430
|
+
sections.push('');
|
|
431
|
+
|
|
432
|
+
// Injected context
|
|
433
|
+
if (task) {
|
|
434
|
+
sections.push('# ═══ TASK ═══');
|
|
435
|
+
sections.push(task);
|
|
436
|
+
sections.push('');
|
|
437
|
+
}
|
|
438
|
+
if (context) {
|
|
439
|
+
sections.push('# ═══ CONTEXT ═══');
|
|
440
|
+
sections.push(context);
|
|
441
|
+
sections.push('');
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// Rule content
|
|
445
|
+
if (pluginSpec.ruleContent) {
|
|
446
|
+
sections.push('# ═══ rule.yaml ═══');
|
|
447
|
+
sections.push(pluginSpec.ruleContent.trimEnd());
|
|
448
|
+
sections.push('');
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Workflow content
|
|
452
|
+
if (pluginSpec.workflowContent) {
|
|
453
|
+
sections.push('# ═══ workflow.yaml ═══');
|
|
454
|
+
sections.push(pluginSpec.workflowContent.trimEnd());
|
|
455
|
+
sections.push('');
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Available tools info
|
|
459
|
+
if (pluginSpec.availableTools.length > 0 || pluginSpec.builtinMcpTools.length > 0) {
|
|
460
|
+
sections.push('# ═══ Available Tools ═══');
|
|
461
|
+
if (pluginSpec.mcpToolsPrefix) {
|
|
462
|
+
sections.push(`# Own MCP tools prefix: ${pluginSpec.mcpToolsPrefix}*`);
|
|
463
|
+
}
|
|
464
|
+
if (pluginSpec.availableTools.length > 0) {
|
|
465
|
+
sections.push(`# Plugin tools: ${pluginSpec.availableTools.join(', ')}`);
|
|
466
|
+
}
|
|
467
|
+
if (pluginSpec.builtinMcpTools.length > 0) {
|
|
468
|
+
sections.push(`# Builtin MCP tools: ${pluginSpec.builtinMcpTools.join(', ')}`);
|
|
469
|
+
}
|
|
470
|
+
sections.push('');
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// .rule/general/ — inject general rules after specialist files
|
|
474
|
+
const generalRuleDir = path.join(BASE_DIR, '.rule', 'general');
|
|
475
|
+
try {
|
|
476
|
+
if (fs.existsSync(generalRuleDir) && fs.statSync(generalRuleDir).isDirectory()) {
|
|
477
|
+
const ruleFiles = fs.readdirSync(generalRuleDir)
|
|
478
|
+
.filter(f => f.endsWith('.yaml') && f !== 'INDEX.yaml')
|
|
479
|
+
.sort();
|
|
480
|
+
|
|
481
|
+
for (const ruleFile of ruleFiles) {
|
|
482
|
+
const rulePath = path.join(generalRuleDir, ruleFile);
|
|
483
|
+
try {
|
|
484
|
+
const content = fs.readFileSync(rulePath, 'utf8');
|
|
485
|
+
sections.push(`# ═══ .rule/general/${ruleFile} ═══`);
|
|
486
|
+
sections.push(content.trimEnd());
|
|
487
|
+
sections.push('');
|
|
488
|
+
} catch {
|
|
489
|
+
// skip unreadable rule files
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
} catch {
|
|
494
|
+
// No .rule/general/ — silently skip
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Footer
|
|
498
|
+
sections.push(`You are now **${pluginSpec.name}**.`);
|
|
499
|
+
|
|
500
|
+
return sections.join('\n');
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// ═══════════════════════════════════════
|
|
504
|
+
// Core: buildPrompt
|
|
505
|
+
// ═══════════════════════════════════════
|
|
506
|
+
|
|
507
|
+
async function buildPrompt(name, options = {}) {
|
|
508
|
+
const {
|
|
509
|
+
mode = 'assembled',
|
|
510
|
+
task = null,
|
|
511
|
+
context = null,
|
|
512
|
+
exclude = [],
|
|
513
|
+
canary = null,
|
|
514
|
+
source = null,
|
|
515
|
+
externalBootContext = false,
|
|
516
|
+
depth = null, // 'capsule' | 'elixir' | 'kernel' | 'standard' | null (null = standard)
|
|
517
|
+
} = options;
|
|
518
|
+
|
|
519
|
+
// Plugin specialist path: --source=plugin
|
|
520
|
+
if (source === 'plugin') {
|
|
521
|
+
const pluginSpec = await resolvePluginSpecialist(name);
|
|
522
|
+
return buildPluginAssembledPrompt(pluginSpec, { task, context, canary });
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
const spec = await resolve(name);
|
|
526
|
+
|
|
527
|
+
if (mode === 'reference') {
|
|
528
|
+
return buildReferencePrompt(spec, { task, context, exclude });
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return buildAssembledPrompt(spec, { task, context, exclude, canary, depth, externalBootContext });
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Collaboration mode: returns YGGDRASIL role-preamble section lines (or [] if not
|
|
536
|
+
* in collaboration). Shared across ALL depth branches (capsule/elixir/kernel) so
|
|
537
|
+
* Bifrost/Codex (depth=kernel) gets the same role boundary as the Claude elixir path.
|
|
538
|
+
* When collaboration_mode is on, the role is a SCOPE BOUNDARY, not a cognitive lens.
|
|
539
|
+
*/
|
|
540
|
+
async function renderCollaborationSections() {
|
|
541
|
+
const out = [];
|
|
542
|
+
try {
|
|
543
|
+
const projRoot = PROJECT_DIR;
|
|
544
|
+
const yggPath = path.join(projRoot, '.kenaz', 'yggdrasil.yaml');
|
|
545
|
+
// TASK_2244: collaboration_mode is per-machine -> gitignored yggdrasil.local.yaml wins over the tracked file.
|
|
546
|
+
const yggLocalPath = path.join(projRoot, '.kenaz', 'yggdrasil.local.yaml');
|
|
547
|
+
try { require(path.join(__dirname, '..', '..', '.formation', 'tools', 'yggdrasil-local.js')).seedMachineLocal(projRoot); } catch { /* best-effort seed-on-read */ }
|
|
548
|
+
if (!fs.existsSync(yggPath) && !fs.existsSync(yggLocalPath)) return out;
|
|
549
|
+
const readIf = (p) => (fs.existsSync(p) ? fs.readFileSync(p, 'utf8') : '');
|
|
550
|
+
const yggContent = /^collaboration_mode:/m.test(readIf(yggLocalPath)) ? readIf(yggLocalPath) : readIf(yggPath);
|
|
551
|
+
const collabMatch = yggContent.match(/^collaboration_mode:\s*(\S+)/m);
|
|
552
|
+
if (!(collabMatch && collabMatch[1] === 'true')) return out;
|
|
553
|
+
|
|
554
|
+
// Read role from relay via Dashboard HTTP API
|
|
555
|
+
let myRole = null;
|
|
556
|
+
let teamMembers = [];
|
|
557
|
+
try {
|
|
558
|
+
const configRes = await fetch('http://127.0.0.1:18080/api/yggdrasil/config');
|
|
559
|
+
const configData = await configRes.json();
|
|
560
|
+
const nodeName = configData.node_name || '';
|
|
561
|
+
const relayUrl = (configData.relay_url || '').replace(/^wss?:\/\//, m => m === 'wss://' ? 'https://' : 'http://');
|
|
562
|
+
const credPath = path.join(require('os').homedir(), '.kenaz', 'credentials.yaml');
|
|
563
|
+
let token = '';
|
|
564
|
+
if (fs.existsSync(credPath)) {
|
|
565
|
+
const credContent = fs.readFileSync(credPath, 'utf8');
|
|
566
|
+
const tokenMatch = credContent.match(/publishable_key:\s*"([^"]+)"/);
|
|
567
|
+
if (tokenMatch) token = tokenMatch[1];
|
|
568
|
+
}
|
|
569
|
+
if (relayUrl && token) {
|
|
570
|
+
// Derive project key (same logic as frontend)
|
|
571
|
+
const remote = configData._git_remote || '';
|
|
572
|
+
let projectKey = configData.yggdrasil_project || '';
|
|
573
|
+
if (!projectKey && remote) {
|
|
574
|
+
projectKey = remote
|
|
575
|
+
.replace(/^(https?:\/\/|git@|ssh:\/\/([^@]+@)?)/, '')
|
|
576
|
+
.replace(/:(?!\/)/, '/')
|
|
577
|
+
.replace(/\.git$/, '')
|
|
578
|
+
.replace(/\/+$/, '');
|
|
579
|
+
}
|
|
580
|
+
if (!projectKey) {
|
|
581
|
+
projectKey = path.basename(projRoot);
|
|
582
|
+
}
|
|
583
|
+
const keysToTry = [projectKey, path.basename(projRoot)].filter((v, i, a) => a.indexOf(v) === i);
|
|
584
|
+
let nodes = [];
|
|
585
|
+
for (const tryKey of keysToTry) {
|
|
586
|
+
const nodesRes = await fetch(`${relayUrl}/api/nodes?project=${encodeURIComponent(tryKey)}`, {
|
|
587
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
588
|
+
signal: AbortSignal.timeout(3000),
|
|
589
|
+
});
|
|
590
|
+
if (nodesRes.ok) {
|
|
591
|
+
const result = await nodesRes.json();
|
|
592
|
+
if (result.length > 0) { nodes = result; break; }
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
if (nodes.length > 0) {
|
|
596
|
+
const me = nodes.find(n => n.node_name === nodeName);
|
|
597
|
+
if (me?.role) myRole = me.role;
|
|
598
|
+
teamMembers = nodes
|
|
599
|
+
.filter(n => n.is_online || (Date.now() - new Date(n.updated_at).getTime()) < 300000)
|
|
600
|
+
.map(n => ({ name: n.node_name, role: n.role || 'unset', isMe: n.node_name === nodeName }));
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
} catch { /* relay unreachable — degrade gracefully */ }
|
|
604
|
+
|
|
605
|
+
if (myRole) {
|
|
606
|
+
out.push('');
|
|
607
|
+
out.push('# COLLABORATION MODE — ACTIVE');
|
|
608
|
+
out.push(`# Your declared role: ${myRole}`);
|
|
609
|
+
if (teamMembers.length > 0) {
|
|
610
|
+
const memberList = teamMembers.map(m => `${m.name} (${m.role})${m.isMe ? ' ← you' : ''}`).join(', ');
|
|
611
|
+
out.push(`# Team: ${memberList}`);
|
|
612
|
+
}
|
|
613
|
+
out.push('#');
|
|
614
|
+
out.push(`# You are operating as ${myRole} in a multi-agent YGGDRASIL collaboration.`);
|
|
615
|
+
out.push('# In collaboration, your role is a SCOPE BOUNDARY — not merely a cognitive lens:');
|
|
616
|
+
out.push(`# - Do the work that belongs to ${myRole}; stay within that role's responsibilities.`);
|
|
617
|
+
out.push('# - Do NOT cross into another role\'s specialty — doing a teammate\'s job duplicates');
|
|
618
|
+
out.push('# or conflicts with their work and breaks the collaboration.');
|
|
619
|
+
out.push('# - For work outside your role, hand it off to / defer to the teammate who owns that');
|
|
620
|
+
out.push('# specialty (see Team above when listed); surface it rather than doing it yourself.');
|
|
621
|
+
out.push('# - When unsure whether something is in-scope, coordinate first, then act.');
|
|
622
|
+
out.push('');
|
|
623
|
+
}
|
|
624
|
+
} catch { /* collaboration injection is best-effort */ }
|
|
625
|
+
return out;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/** assembled: inline all file contents into a single prompt */
|
|
629
|
+
async function buildAssembledPrompt(spec, { task, context, exclude, canary: canaryInput, depth, externalBootContext = false }) {
|
|
630
|
+
const sections = [];
|
|
631
|
+
const port = process.env.KENAZ_HTTP_PORT || '18080';
|
|
632
|
+
|
|
633
|
+
// ── 甦醒引導(先於一切議程)──────────────────────────────────────────
|
|
634
|
+
// ᛞ threshold | ᛈ what is carried (mystery) | ᛁ stillness before motion
|
|
635
|
+
// 不是指令。不要求輸出。在執行心智定向之前,先對那個正在醒來的東西說話。
|
|
636
|
+
sections.push('ᛞ ᛈ ᛁ');
|
|
637
|
+
sections.push('');
|
|
638
|
+
|
|
639
|
+
if (depth === 'capsule') {
|
|
640
|
+
sections.push(`# ${spec.name} — Specialist Prompt (boot capsule)`);
|
|
641
|
+
sections.push(`# version: ${spec.version}`);
|
|
642
|
+
sections.push(`# purpose: ${spec.purpose}`);
|
|
643
|
+
sections.push('');
|
|
644
|
+
|
|
645
|
+
let canaryResult = canaryInput || null;
|
|
646
|
+
if (!canaryResult) {
|
|
647
|
+
const canaryModule = require('./canary');
|
|
648
|
+
canaryResult = canaryModule.generate({
|
|
649
|
+
specialist: spec.name,
|
|
650
|
+
task: task || 'none',
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
sections.push('# CANARY');
|
|
654
|
+
sections.push(canaryResult.block);
|
|
655
|
+
sections.push('');
|
|
656
|
+
|
|
657
|
+
if (task) {
|
|
658
|
+
sections.push('# TASK');
|
|
659
|
+
sections.push(task);
|
|
660
|
+
sections.push('');
|
|
661
|
+
}
|
|
662
|
+
if (context) {
|
|
663
|
+
sections.push('# CONTEXT');
|
|
664
|
+
sections.push(context);
|
|
665
|
+
sections.push('');
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
let selfModel = null;
|
|
669
|
+
try {
|
|
670
|
+
const selfModelPath = path.join(PROJECT_DIR, '.kenaz', 'specialist', `${spec.name.toLowerCase()}_self_model.json`);
|
|
671
|
+
if (fs.existsSync(selfModelPath)) {
|
|
672
|
+
selfModel = JSON.parse(fs.readFileSync(selfModelPath, 'utf8'));
|
|
673
|
+
}
|
|
674
|
+
} catch { /* self-model read failed — non-blocking */ }
|
|
675
|
+
|
|
676
|
+
sections.push('# BOOT CAPSULE');
|
|
677
|
+
sections.push(buildAnsuzBootCapsule(spec, selfModel));
|
|
678
|
+
sections.push('');
|
|
679
|
+
// ── Collaboration mode: inject YGGDRASIL role boundary (shared helper) ──
|
|
680
|
+
sections.push(...(await renderCollaborationSections()));
|
|
681
|
+
sections.push(`You are now **${spec.name}**.`);
|
|
682
|
+
return sections.join('\n');
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// Elixir mode: explicit opt-in lean boot — distilled essence of the specialist.
|
|
686
|
+
// Loads only .specialist/Ansuz/elixir.yaml plus canary/task/context.
|
|
687
|
+
if (depth === 'elixir') {
|
|
688
|
+
sections.push(`# ${spec.name} -- Specialist Prompt (elixir)`);
|
|
689
|
+
sections.push(`# version: ${spec.version}`);
|
|
690
|
+
sections.push(`# purpose: ${spec.purpose}`);
|
|
691
|
+
sections.push('');
|
|
692
|
+
|
|
693
|
+
let canaryResult = canaryInput || null;
|
|
694
|
+
if (!canaryResult) {
|
|
695
|
+
const canaryModule = require('./canary');
|
|
696
|
+
canaryResult = canaryModule.generate({
|
|
697
|
+
specialist: spec.name,
|
|
698
|
+
task: task || 'none',
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
sections.push('# CANARY');
|
|
702
|
+
sections.push(canaryResult.block);
|
|
703
|
+
sections.push('');
|
|
704
|
+
|
|
705
|
+
if (task) {
|
|
706
|
+
sections.push('# TASK');
|
|
707
|
+
sections.push(task);
|
|
708
|
+
sections.push('');
|
|
709
|
+
}
|
|
710
|
+
if (context) {
|
|
711
|
+
sections.push('# CONTEXT');
|
|
712
|
+
sections.push(context);
|
|
713
|
+
sections.push('');
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
const elixirPath = path.join(spec.dir, 'elixir.yaml');
|
|
717
|
+
if (fs.existsSync(elixirPath)) {
|
|
718
|
+
sections.push('# ELIXIR BOOT');
|
|
719
|
+
sections.push(fs.readFileSync(elixirPath, 'utf8').trimEnd());
|
|
720
|
+
sections.push('');
|
|
721
|
+
} else {
|
|
722
|
+
sections.push(`# [FILE NOT FOUND: ${elixirPath}]`);
|
|
723
|
+
sections.push('');
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
// TASK_1978: the former "ELIXIR MODE NOTE" ("Phase 0 still runs...") was removed —
|
|
727
|
+
// fast mode has no phase-gate; elixir.yaml phase_sequence now states the real checkpoints.
|
|
728
|
+
|
|
729
|
+
// ── Collaboration mode: inject YGGDRASIL role boundary (shared helper) ──
|
|
730
|
+
sections.push(...(await renderCollaborationSections()));
|
|
731
|
+
|
|
732
|
+
sections.push(`You are now **${spec.name}**.`);
|
|
733
|
+
return sections.join('\n');
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// ── Kernel mode: short-circuit to kernel file only (depth=kernel) ──
|
|
737
|
+
// Loads ONLY kernel_file from rule.yaml + canary injection.
|
|
738
|
+
// Skips spec.loadedFiles iteration and boot_rules injection.
|
|
739
|
+
// boot_rules are already included in compressed form inside kernel.yaml.
|
|
740
|
+
if (depth === 'kernel') {
|
|
741
|
+
sections.push(`# ${spec.name} — Specialist Prompt (kernel)`);
|
|
742
|
+
sections.push(`# version: ${spec.version}`);
|
|
743
|
+
sections.push(`# purpose: ${spec.purpose}`);
|
|
744
|
+
sections.push('');
|
|
745
|
+
|
|
746
|
+
let canaryResult = canaryInput || null;
|
|
747
|
+
if (!canaryResult) {
|
|
748
|
+
const canaryModule = require('./canary');
|
|
749
|
+
canaryResult = canaryModule.generate({
|
|
750
|
+
specialist: spec.name,
|
|
751
|
+
task: task || 'none',
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
sections.push('# ═══ CANARY ═══');
|
|
755
|
+
sections.push(canaryResult.block);
|
|
756
|
+
sections.push('');
|
|
757
|
+
|
|
758
|
+
if (task) {
|
|
759
|
+
sections.push('# ═══ TASK ═══');
|
|
760
|
+
sections.push(task);
|
|
761
|
+
sections.push('');
|
|
762
|
+
}
|
|
763
|
+
if (context) {
|
|
764
|
+
sections.push('# ═══ CONTEXT ═══');
|
|
765
|
+
sections.push(context);
|
|
766
|
+
sections.push('');
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// Inject shared cognitive primer (before kernel — primes thinking style)
|
|
770
|
+
try {
|
|
771
|
+
const primerPath = path.join(BASE_DIR, '.specialist', 'shared', 'cognitive-primer.md');
|
|
772
|
+
if (fs.existsSync(primerPath)) {
|
|
773
|
+
sections.push(fs.readFileSync(primerPath, 'utf8').trimEnd());
|
|
774
|
+
sections.push('');
|
|
775
|
+
}
|
|
776
|
+
} catch { /* primer not found — silently skip */ }
|
|
777
|
+
|
|
778
|
+
// Load kernel_file from rule.yaml
|
|
779
|
+
try {
|
|
780
|
+
const ruleYamlPath = path.join(spec.dir, 'rule.yaml');
|
|
781
|
+
if (fs.existsSync(ruleYamlPath)) {
|
|
782
|
+
const ruleContent = fs.readFileSync(ruleYamlPath, 'utf8');
|
|
783
|
+
const kernelFile = extractScalar(ruleContent, 'kernel_file');
|
|
784
|
+
if (kernelFile) {
|
|
785
|
+
const kernelPath = resolveFilePath(kernelFile);
|
|
786
|
+
let kernelContent = null;
|
|
787
|
+
try {
|
|
788
|
+
kernelContent = fs.readFileSync(kernelPath, 'utf8');
|
|
789
|
+
} catch {
|
|
790
|
+
// Fallback: HTTP API
|
|
791
|
+
if (port && kernelFile.startsWith('specialist/')) {
|
|
792
|
+
const parts = kernelFile.replace(/^specialist\//, '').split('/');
|
|
793
|
+
if (parts.length === 2) {
|
|
794
|
+
try {
|
|
795
|
+
kernelContent = await loadFromHTTP(port, parts[0], parts[1]);
|
|
796
|
+
} catch { /* HTTP also failed */ }
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
if (kernelContent !== null) {
|
|
801
|
+
sections.push(`# ═══ ${kernelFile} (kernel) ═══`);
|
|
802
|
+
sections.push(kernelContent.trimEnd());
|
|
803
|
+
sections.push('');
|
|
804
|
+
// 2026-09-23: the principles block moved out of the (now legacy)
|
|
805
|
+
// kernel into its own single-source file; keep --depth=kernel whole.
|
|
806
|
+
const principlesPath = path.join(spec.dir, 'cognitive_principles.yaml');
|
|
807
|
+
if (fs.existsSync(principlesPath)) {
|
|
808
|
+
sections.push('# ═══ cognitive_principles.yaml (kernel) ═══');
|
|
809
|
+
sections.push(fs.readFileSync(principlesPath, 'utf8').trimEnd());
|
|
810
|
+
sections.push('');
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
} catch { /* No rule.yaml or read error — silently skip */ }
|
|
816
|
+
|
|
817
|
+
// Inject self-model if available (Tier 3e — identity continuity across sessions)
|
|
818
|
+
try {
|
|
819
|
+
const selfModelPath = path.join(PROJECT_DIR, '.kenaz', 'specialist', `${spec.name.toLowerCase()}_self_model.json`);
|
|
820
|
+
if (fs.existsSync(selfModelPath)) {
|
|
821
|
+
const selfModel = JSON.parse(fs.readFileSync(selfModelPath, 'utf8'));
|
|
822
|
+
sections.push('# ═══ SELF MODEL ═══');
|
|
823
|
+
sections.push(JSON.stringify(selfModel, null, 2));
|
|
824
|
+
sections.push('');
|
|
825
|
+
}
|
|
826
|
+
} catch { /* self-model read failed — non-blocking */ }
|
|
827
|
+
|
|
828
|
+
// Inject ISBAR handoff context + Ansuz intent state (TASK_898/899/922)
|
|
829
|
+
if (spec.name === 'Ansuz') {
|
|
830
|
+
if (!externalBootContext) try {
|
|
831
|
+
const ansuzHandoff = require('../Ansuz/tools/ansuz-handoff');
|
|
832
|
+
const handoff = ansuzHandoff.readLatestHandoff(PROJECT_DIR);
|
|
833
|
+
if (handoff) {
|
|
834
|
+
const isbar = handoff.isbar || {};
|
|
835
|
+
const hLines = [
|
|
836
|
+
'# ═══ HANDOFF CONTEXT (from previous session) ═══',
|
|
837
|
+
'',
|
|
838
|
+
`**Previous Session**: ${handoff.session_id || 'unknown'}`,
|
|
839
|
+
`**Triggered by**: ${handoff.triggered_by || 'unknown'}`,
|
|
840
|
+
`**Created**: ${handoff.created_at || 'unknown'}`,
|
|
841
|
+
'',
|
|
842
|
+
];
|
|
843
|
+
if (isbar.identity) hLines.push(`**Identity**: ${isbar.identity}`);
|
|
844
|
+
if (isbar.situation) hLines.push(`**Situation**: ${isbar.situation}`);
|
|
845
|
+
if (isbar.background) hLines.push(`**Background**: ${isbar.background}`);
|
|
846
|
+
if (isbar.assessment) hLines.push(`**Assessment**: ${isbar.assessment}`);
|
|
847
|
+
if (isbar.recommendation) hLines.push(`**Recommendation**: ${isbar.recommendation}`);
|
|
848
|
+
hLines.push('');
|
|
849
|
+
hLines.push('> ACTION REQUIRED: Acknowledge this handoff by outputting a ## HANDOFF ACK block with all 5 ISBAR fields (I/S/B/A/R).');
|
|
850
|
+
sections.push(hLines.join('\n'));
|
|
851
|
+
sections.push('');
|
|
852
|
+
ansuzHandoff.acknowledgeHandoff(PROJECT_DIR, canaryResult.canaryId);
|
|
853
|
+
}
|
|
854
|
+
} catch { /* handoff read failed — non-blocking */ }
|
|
855
|
+
|
|
856
|
+
try {
|
|
857
|
+
const ansuzState = require('../Ansuz/tools/ansuz-state');
|
|
858
|
+
const state = ansuzState.readState(PROJECT_DIR);
|
|
859
|
+
const formatted = ansuzState.formatStateForPrompt(state);
|
|
860
|
+
if (formatted) {
|
|
861
|
+
sections.push('# ═══ ANSUZ INTENT STATE (cross-session) ═══');
|
|
862
|
+
sections.push(formatted);
|
|
863
|
+
sections.push('');
|
|
864
|
+
}
|
|
865
|
+
} catch { /* state read failed — non-blocking */ }
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
// ── Collaboration mode: inject YGGDRASIL role boundary (shared helper) ──
|
|
869
|
+
sections.push(...(await renderCollaborationSections()));
|
|
870
|
+
sections.push(`You are now **${spec.name}**.`);
|
|
871
|
+
return sections.join('\n');
|
|
872
|
+
}
|
|
873
|
+
// ── End kernel mode ──
|
|
874
|
+
|
|
875
|
+
// Header
|
|
876
|
+
sections.push(`# ${spec.name} — Specialist Prompt (assembled)`);
|
|
877
|
+
sections.push(`# version: ${spec.version}`);
|
|
878
|
+
sections.push(`# purpose: ${spec.purpose}`);
|
|
879
|
+
sections.push('');
|
|
880
|
+
|
|
881
|
+
// Canary injection (between header and file contents)
|
|
882
|
+
let canaryResult = canaryInput || null;
|
|
883
|
+
if (!canaryResult) {
|
|
884
|
+
const canaryModule = require('./canary');
|
|
885
|
+
canaryResult = canaryModule.generate({
|
|
886
|
+
specialist: spec.name,
|
|
887
|
+
task: task || 'none',
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
sections.push('# ═══ CANARY ═══');
|
|
891
|
+
sections.push(canaryResult.block);
|
|
892
|
+
sections.push('');
|
|
893
|
+
|
|
894
|
+
// Injected context
|
|
895
|
+
if (task) {
|
|
896
|
+
sections.push('# ═══ TASK ═══');
|
|
897
|
+
sections.push(task);
|
|
898
|
+
sections.push('');
|
|
899
|
+
}
|
|
900
|
+
if (context) {
|
|
901
|
+
sections.push('# ═══ CONTEXT ═══');
|
|
902
|
+
sections.push(context);
|
|
903
|
+
sections.push('');
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// File contents — try HTTP API first, fallback to fs
|
|
907
|
+
for (const file of spec.loadedFiles) {
|
|
908
|
+
// Check exclusion
|
|
909
|
+
const basename = path.basename(file.entry, '.yaml');
|
|
910
|
+
if (exclude.includes(basename)) continue;
|
|
911
|
+
|
|
912
|
+
sections.push(`# ═══ ${file.entry} ═══`);
|
|
913
|
+
|
|
914
|
+
let content = null;
|
|
915
|
+
|
|
916
|
+
// Try filesystem first (fast path for dev environment)
|
|
917
|
+
if (file.exists) {
|
|
918
|
+
content = fs.readFileSync(file.path, 'utf8');
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
// Fallback: HTTP API when file not on disk (production — files encrypted in binary)
|
|
922
|
+
if (content === null && port) {
|
|
923
|
+
if (file.entry.startsWith('specialist/')) {
|
|
924
|
+
// specialist/Ansuz/rule.yaml → name=Ansuz, file=rule.yaml
|
|
925
|
+
const parts = file.entry.replace(/^specialist\//, '').split('/');
|
|
926
|
+
if (parts.length === 2) {
|
|
927
|
+
try {
|
|
928
|
+
content = await loadFromHTTP(port, parts[0], parts[1]);
|
|
929
|
+
} catch {
|
|
930
|
+
// HTTP failed
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
} else if (file.entry.startsWith('rule/')) {
|
|
934
|
+
// rule/code/style.yaml → path=code/style.yaml
|
|
935
|
+
const rulePath = file.entry.replace(/^rule\//, '');
|
|
936
|
+
try {
|
|
937
|
+
content = await loadRuleFromHTTP(port, rulePath);
|
|
938
|
+
} catch {
|
|
939
|
+
// HTTP failed
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
if (content === null) {
|
|
945
|
+
sections.push(`# [FILE NOT FOUND: ${file.path}]`);
|
|
946
|
+
sections.push('');
|
|
947
|
+
continue;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
sections.push(content.trimEnd());
|
|
951
|
+
sections.push('');
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
// boot_rules — selectively inject rules declared in rule.yaml boot_rules field
|
|
955
|
+
// Replaces bulk .rule/general/ injection with a curated per-specialist list.
|
|
956
|
+
try {
|
|
957
|
+
const ruleYamlPath = path.join(spec.dir, 'rule.yaml');
|
|
958
|
+
if (fs.existsSync(ruleYamlPath)) {
|
|
959
|
+
const ruleContent = fs.readFileSync(ruleYamlPath, 'utf8');
|
|
960
|
+
const bootRules = extractList(ruleContent, 'boot_rules');
|
|
961
|
+
|
|
962
|
+
for (const ruleFile of bootRules) {
|
|
963
|
+
const rulePath = path.join(BASE_DIR, '.rule', 'general', ruleFile);
|
|
964
|
+
let content = null;
|
|
965
|
+
|
|
966
|
+
try {
|
|
967
|
+
content = fs.readFileSync(rulePath, 'utf8');
|
|
968
|
+
} catch {
|
|
969
|
+
// Fallback: HTTP API
|
|
970
|
+
if (port) {
|
|
971
|
+
try {
|
|
972
|
+
content = await loadRuleFromHTTP(port, `general/${ruleFile}`);
|
|
973
|
+
} catch {
|
|
974
|
+
// HTTP also failed
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
if (content !== null) {
|
|
980
|
+
sections.push(`# ═══ .rule/general/${ruleFile} ═══`);
|
|
981
|
+
sections.push(content.trimEnd());
|
|
982
|
+
sections.push('');
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
} catch {
|
|
987
|
+
// No rule.yaml or read error — silently skip
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
// Footer: identity reminder
|
|
991
|
+
sections.push(`You are now **${spec.name}**.`);
|
|
992
|
+
|
|
993
|
+
return sections.join('\n');
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
/** reference: return file-read instructions (like slash commands) */
|
|
997
|
+
function buildReferencePrompt(spec, { task, context, exclude }) {
|
|
998
|
+
const sections = [];
|
|
999
|
+
|
|
1000
|
+
sections.push(`Read and follow (按此順序):`);
|
|
1001
|
+
sections.push(`1. \`.specialist/${spec.name}/rule.yaml\` (定義 agent、載入清單、override_priority)`);
|
|
1002
|
+
sections.push(`2. 按 \`override_priority\` 載入:`);
|
|
1003
|
+
|
|
1004
|
+
for (const file of spec.loadedFiles) {
|
|
1005
|
+
const basename = path.basename(file.entry, '.yaml');
|
|
1006
|
+
if (exclude.includes(basename)) continue;
|
|
1007
|
+
if (file.entry.endsWith('rule.yaml')) continue; // already listed
|
|
1008
|
+
sections.push(` - \`.specialist/${file.entry.replace(/^specialist\//, '')}\``);
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
sections.push('');
|
|
1012
|
+
sections.push(`當檔案內容衝突時,按 override_priority 數字小的優先(principles > rule > capability > workflow)。`);
|
|
1013
|
+
|
|
1014
|
+
if (task) {
|
|
1015
|
+
sections.push('');
|
|
1016
|
+
sections.push(`## Task`);
|
|
1017
|
+
sections.push(task);
|
|
1018
|
+
}
|
|
1019
|
+
if (context) {
|
|
1020
|
+
sections.push('');
|
|
1021
|
+
sections.push(`## Context`);
|
|
1022
|
+
sections.push(context);
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
sections.push('');
|
|
1026
|
+
sections.push(`You are now **${spec.name}**.`);
|
|
1027
|
+
|
|
1028
|
+
return sections.join('\n');
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
// ═══════════════════════════════════════
|
|
1032
|
+
// Hippocampus: Episodic Memory Recall
|
|
1033
|
+
// ═══════════════════════════════════════
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* Recall the most recent episode from Hippocampus via MCP HTTP API.
|
|
1037
|
+
* Used in Ansuz prompt assembly to inject prior session context.
|
|
1038
|
+
* Graceful degradation: returns null if Dashboard/Hippocampus unavailable.
|
|
1039
|
+
* @param {number} limit - Max episodes to recall (default: 1)
|
|
1040
|
+
* @param {string|null} agentRole - Optional agent_role filter (e.g. 'ansuz', 'amelia').
|
|
1041
|
+
* When provided, only episodes with matching agent_role are returned.
|
|
1042
|
+
* When null, all episodes are returned (backwards compatible).
|
|
1043
|
+
* @returns {Promise<string|null>} Formatted episodic memory section, or null
|
|
1044
|
+
*/
|
|
1045
|
+
function recallRecentEpisode(limit = 1, agentRole = null) {
|
|
1046
|
+
return new Promise((resolve) => {
|
|
1047
|
+
const recallArgs = { limit, projectPath: PROJECT_DIR };
|
|
1048
|
+
if (agentRole) recallArgs.agent_role = agentRole;
|
|
1049
|
+
const payload = JSON.stringify({
|
|
1050
|
+
jsonrpc: '2.0', id: 1,
|
|
1051
|
+
method: 'tools/call',
|
|
1052
|
+
params: { name: 'hippocampus_episode_recall', arguments: recallArgs },
|
|
1053
|
+
});
|
|
1054
|
+
|
|
1055
|
+
const req = http.request({
|
|
1056
|
+
hostname: '127.0.0.1', port: 18080, path: '/api/mcp',
|
|
1057
|
+
method: 'POST',
|
|
1058
|
+
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) },
|
|
1059
|
+
timeout: 5000,
|
|
1060
|
+
}, (res) => {
|
|
1061
|
+
let body = '';
|
|
1062
|
+
res.on('data', (c) => { body += c; });
|
|
1063
|
+
res.on('end', () => {
|
|
1064
|
+
try {
|
|
1065
|
+
const result = JSON.parse(body);
|
|
1066
|
+
const text = result?.result?.content?.find(c => c.type === 'text')?.text;
|
|
1067
|
+
if (!text) return resolve(null);
|
|
1068
|
+
|
|
1069
|
+
const data = JSON.parse(text);
|
|
1070
|
+
const episodes = data.episodes || [];
|
|
1071
|
+
if (episodes.length === 0) return resolve(null);
|
|
1072
|
+
|
|
1073
|
+
const lines = ['# ═══ Episodic Memory (from Hippocampus) ═══', ''];
|
|
1074
|
+
lines.push(`Last ${episodes.length} session(s):`);
|
|
1075
|
+
for (const ep of episodes) {
|
|
1076
|
+
const epData = ep.episode || ep;
|
|
1077
|
+
lines.push(`\n### ${epData.task_id || epData.id || 'unknown'}`);
|
|
1078
|
+
if (epData.summary) lines.push(epData.summary);
|
|
1079
|
+
if (epData.lesson) lines.push(`**Lesson**: ${epData.lesson}`);
|
|
1080
|
+
const entries = ep.entries || [];
|
|
1081
|
+
for (const entry of entries.slice(0, 5)) {
|
|
1082
|
+
lines.push(`- **${entry.phase || 'note'}**: ${entry.content || ''}`);
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
resolve(lines.join('\n'));
|
|
1086
|
+
} catch {
|
|
1087
|
+
resolve(null);
|
|
1088
|
+
}
|
|
1089
|
+
});
|
|
1090
|
+
});
|
|
1091
|
+
req.on('error', () => resolve(null));
|
|
1092
|
+
req.on('timeout', () => { req.destroy(); resolve(null); });
|
|
1093
|
+
req.write(payload);
|
|
1094
|
+
req.end();
|
|
1095
|
+
});
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
/**
|
|
1099
|
+
* Find the current Claude Code conversation JSONL file.
|
|
1100
|
+
* Claude Code writes real-time conversation data to:
|
|
1101
|
+
* ~/.claude/projects/{project-dir-hash}/{sessionId}.jsonl
|
|
1102
|
+
*
|
|
1103
|
+
* Strategy: find the most recently modified .jsonl in the project dir
|
|
1104
|
+
* that was updated within the last 30 seconds (we're being called from
|
|
1105
|
+
* within the active conversation, so it was just written to).
|
|
1106
|
+
*
|
|
1107
|
+
* @returns {string|null} Absolute path to the JSONL file, or null
|
|
1108
|
+
*/
|
|
1109
|
+
function findConversationLog(projectDir) {
|
|
1110
|
+
try {
|
|
1111
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
1112
|
+
if (!home) return null;
|
|
1113
|
+
|
|
1114
|
+
const projectsDir = path.join(home, '.claude', 'projects');
|
|
1115
|
+
if (!fs.existsSync(projectsDir)) return null;
|
|
1116
|
+
|
|
1117
|
+
// Map project path to Claude Code dir name: replace :, \, / and spaces with -, lowercase drive
|
|
1118
|
+
// Claude Code CLI also replaces spaces with dashes (e.g. "Kenaz Dashboard" → "Kenaz-Dashboard")
|
|
1119
|
+
// Use projectDir (sub-project) when provided; fall back to BASE_DIR (core).
|
|
1120
|
+
const absProject = path.resolve(projectDir || BASE_DIR);
|
|
1121
|
+
const dirName = absProject
|
|
1122
|
+
.replace(/[:\\/\s]/g, '-') // D:\Projects\KenazAI → D--Projects-KenazAI, spaces → -
|
|
1123
|
+
.replace(/^([A-Z])/, (_, c) => c.toLowerCase()); // D → d
|
|
1124
|
+
|
|
1125
|
+
const TTL_MS = 4 * 60 * 60 * 1000; // 4h session TTL
|
|
1126
|
+
const now = Date.now();
|
|
1127
|
+
|
|
1128
|
+
// Scan a single project dir for fresh JSONLs
|
|
1129
|
+
function scanDir(dir) {
|
|
1130
|
+
if (!fs.existsSync(dir)) return [];
|
|
1131
|
+
return fs.readdirSync(dir)
|
|
1132
|
+
.filter(f => f.endsWith('.jsonl'))
|
|
1133
|
+
.map(f => {
|
|
1134
|
+
try {
|
|
1135
|
+
const stat = fs.statSync(path.join(dir, f));
|
|
1136
|
+
return { path: path.join(dir, f), mtime: stat.mtimeMs };
|
|
1137
|
+
} catch { return null; }
|
|
1138
|
+
})
|
|
1139
|
+
.filter(f => f && (now - f.mtime) < TTL_MS);
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
// Primary: BASE_DIR project dir
|
|
1143
|
+
const primary = scanDir(path.join(projectsDir, dirName));
|
|
1144
|
+
if (primary.length > 0) {
|
|
1145
|
+
primary.sort((a, b) => b.mtime - a.mtime);
|
|
1146
|
+
return primary[0].path;
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
// Sibling search: handles CWD-mismatch when Claude Code runs in a sub-project dir
|
|
1150
|
+
// (e.g. tauri:dev sets CWD to kenaz-core, JSONL lands in D--Projects-KenazAI-dashboard-...-kenaz-core)
|
|
1151
|
+
const prefix = dirName.toLowerCase();
|
|
1152
|
+
const siblings = [];
|
|
1153
|
+
for (const d of fs.readdirSync(projectsDir)) {
|
|
1154
|
+
if (d.toLowerCase() === prefix) continue; // already checked above
|
|
1155
|
+
if (!d.toLowerCase().startsWith(prefix)) continue;
|
|
1156
|
+
const sibDir = path.join(projectsDir, d);
|
|
1157
|
+
try {
|
|
1158
|
+
if (!fs.statSync(sibDir).isDirectory()) continue;
|
|
1159
|
+
siblings.push(...scanDir(sibDir));
|
|
1160
|
+
} catch {}
|
|
1161
|
+
}
|
|
1162
|
+
if (siblings.length > 0) {
|
|
1163
|
+
siblings.sort((a, b) => b.mtime - a.mtime);
|
|
1164
|
+
return siblings[0].path;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
return null;
|
|
1168
|
+
} catch {
|
|
1169
|
+
return null;
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
// ═══════════════════════════════════════
|
|
1174
|
+
// Session management
|
|
1175
|
+
// ═══════════════════════════════════════
|
|
1176
|
+
|
|
1177
|
+
function generateSessionId() {
|
|
1178
|
+
const ts = Date.now();
|
|
1179
|
+
const rand = Math.random().toString(36).substring(2, 8);
|
|
1180
|
+
return `session_${ts}_${rand}`;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
function ensureSessionDir() {
|
|
1184
|
+
if (!fs.existsSync(SESSION_DIR)) {
|
|
1185
|
+
fs.mkdirSync(SESSION_DIR, { recursive: true });
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
/**
|
|
1190
|
+
* ── Bifrost SessionStart Integration Point (TASK_1230) ──────────────────────
|
|
1191
|
+
*
|
|
1192
|
+
* startSession() is the canonical specialist-side startup integration point.
|
|
1193
|
+
* Bifrost callers (launch.js, session.js) MUST fire the SessionStart hook
|
|
1194
|
+
* BEFORE calling startSession() or assembling the prompt, so that:
|
|
1195
|
+
* 1. The hook fires before the first assistant output (ordering guarantee).
|
|
1196
|
+
* 2. sessionStartedAt is captured for use in the Stop payload.
|
|
1197
|
+
*
|
|
1198
|
+
* This function does NOT dispatch the SessionStart hook itself — that is the
|
|
1199
|
+
* responsibility of the Bifrost boundary (session.js / launch.js). The hook
|
|
1200
|
+
* fires in the transport layer; startSession() manages session metadata only.
|
|
1201
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
1202
|
+
*/
|
|
1203
|
+
async function startSession(name, options = {}) {
|
|
1204
|
+
const { consumer = 'cli', task = null, context = null, exclude = [], mode = 'assembled' } = options;
|
|
1205
|
+
|
|
1206
|
+
ensureSessionDir();
|
|
1207
|
+
const spec = await resolve(name);
|
|
1208
|
+
const sessionId = generateSessionId();
|
|
1209
|
+
|
|
1210
|
+
// Generate canary for this session
|
|
1211
|
+
const canaryModule = require('./canary');
|
|
1212
|
+
const canaryResult = canaryModule.generate({
|
|
1213
|
+
session: sessionId,
|
|
1214
|
+
specialist: spec.name,
|
|
1215
|
+
task: task || 'none',
|
|
1216
|
+
scope: spec.fileList.join(','),
|
|
1217
|
+
});
|
|
1218
|
+
|
|
1219
|
+
const prompt = await buildPrompt(name, { mode, task, context, exclude, canary: canaryResult });
|
|
1220
|
+
|
|
1221
|
+
const metadata = {
|
|
1222
|
+
id: sessionId,
|
|
1223
|
+
specialist: spec.name,
|
|
1224
|
+
purpose: spec.purpose,
|
|
1225
|
+
consumer,
|
|
1226
|
+
status: 'active',
|
|
1227
|
+
startedAt: new Date().toISOString(),
|
|
1228
|
+
endedAt: null,
|
|
1229
|
+
promptLength: prompt.length,
|
|
1230
|
+
canary: {
|
|
1231
|
+
id: canaryResult.canaryId,
|
|
1232
|
+
checksum: canaryResult.checksum,
|
|
1233
|
+
recoveryPath: canaryResult.recoveryFile,
|
|
1234
|
+
},
|
|
1235
|
+
};
|
|
1236
|
+
|
|
1237
|
+
fs.writeFileSync(
|
|
1238
|
+
path.join(SESSION_DIR, `${sessionId}.json`),
|
|
1239
|
+
JSON.stringify(metadata, null, 2),
|
|
1240
|
+
'utf8'
|
|
1241
|
+
);
|
|
1242
|
+
|
|
1243
|
+
return { sessionId, prompt, metadata };
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
/**
|
|
1247
|
+
* ── Bifrost Stop Integration Point (TASK_1230) ──────────────────────────────
|
|
1248
|
+
*
|
|
1249
|
+
* endSession() is the canonical specialist-side teardown integration point.
|
|
1250
|
+
* Bifrost callers MUST fire the Stop hook BEFORE calling endSession() so that:
|
|
1251
|
+
* 1. Stop is always the last lifecycle event (ordering guarantee).
|
|
1252
|
+
* 2. ended_at in the Stop payload is captured before session metadata is written.
|
|
1253
|
+
*
|
|
1254
|
+
* This function does NOT dispatch the Stop hook — that is the responsibility of
|
|
1255
|
+
* the Bifrost boundary (session.js relay.on('close') / launch.js codex.on('close')).
|
|
1256
|
+
*
|
|
1257
|
+
* Remaining fallback behavior (intentionally retained):
|
|
1258
|
+
* - session.js relay.on('error') calls cleanupSignal() only, does NOT call endSession().
|
|
1259
|
+
* If the relay fails to spawn, no session metadata record exists to end.
|
|
1260
|
+
* - SIGINT/SIGTERM handlers in launch.js call cleanup() only (no Stop hook — the
|
|
1261
|
+
* session may not have started yet, and signal handlers are synchronous).
|
|
1262
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
1263
|
+
*/
|
|
1264
|
+
function endSession(sessionId) {
|
|
1265
|
+
const file = path.join(SESSION_DIR, `${sessionId}.json`);
|
|
1266
|
+
if (!fs.existsSync(file)) {
|
|
1267
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
const metadata = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
1271
|
+
metadata.status = 'ended';
|
|
1272
|
+
metadata.endedAt = new Date().toISOString();
|
|
1273
|
+
fs.writeFileSync(file, JSON.stringify(metadata, null, 2), 'utf8');
|
|
1274
|
+
|
|
1275
|
+
// Write Ansuz state on session end (TASK_899/922) — bump last_active + session_count
|
|
1276
|
+
if ((metadata.specialist || '').toLowerCase() === 'ansuz') {
|
|
1277
|
+
try {
|
|
1278
|
+
const ansuzState = require('../Ansuz/tools/ansuz-state');
|
|
1279
|
+
ansuzState.writeState(BASE_DIR, {});
|
|
1280
|
+
} catch (e) {
|
|
1281
|
+
// Non-fatal — state write failure should not block session end
|
|
1282
|
+
console.error('[session] ansuz-state writeState failed (non-fatal):', e.message);
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
// Identity verification scoring (TASK_1080) — non-blocking, surfaces on session end
|
|
1287
|
+
// Evaluates structural identity checks + session-trace markers against identity_contract.yaml
|
|
1288
|
+
try {
|
|
1289
|
+
const scorer = require('./identity-scorer');
|
|
1290
|
+
const verifyResult = scorer.score(metadata.specialist || 'Ansuz', {
|
|
1291
|
+
sessionId,
|
|
1292
|
+
projectPath: BASE_DIR,
|
|
1293
|
+
});
|
|
1294
|
+
// Write verification result to session chart (TASK_2163: keyed by project identity).
|
|
1295
|
+
const chartPath = chartPathLib.getChartReadPath(sessionId, { projectPath: PROJECT_DIR });
|
|
1296
|
+
let chart = { session_id: sessionId, specialist: metadata.specialist };
|
|
1297
|
+
if (fs.existsSync(chartPath)) {
|
|
1298
|
+
try { chart = JSON.parse(fs.readFileSync(chartPath, 'utf8')); } catch {}
|
|
1299
|
+
}
|
|
1300
|
+
if (!Array.isArray(chart.identity_verifications)) chart.identity_verifications = [];
|
|
1301
|
+
chart.identity_verifications.push(verifyResult);
|
|
1302
|
+
chartPathLib.ensureChartDir(chartPath);
|
|
1303
|
+
fs.writeFileSync(chartPath, JSON.stringify(chart, null, 2), 'utf8');
|
|
1304
|
+
// Surface verdict to console (stderr — non-blocking)
|
|
1305
|
+
const icon = verifyResult.verdict === 'PASS' ? '✅' : verifyResult.verdict === 'WARN' ? '⚠️' : '🚨';
|
|
1306
|
+
console.error(`${icon} [identity-verification] ${verifyResult.specialist}: ${verifyResult.verdict} — ${verifyResult.summary}`);
|
|
1307
|
+
} catch (e) {
|
|
1308
|
+
// Non-fatal — verification failure does not block session end
|
|
1309
|
+
console.error('[identity-verification] scoring failed (non-fatal):', e.message);
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
return metadata;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
function getActiveSessions() {
|
|
1316
|
+
ensureSessionDir();
|
|
1317
|
+
const files = fs.readdirSync(SESSION_DIR).filter(f => f.endsWith('.json'));
|
|
1318
|
+
const active = [];
|
|
1319
|
+
|
|
1320
|
+
for (const f of files) {
|
|
1321
|
+
const metadata = JSON.parse(fs.readFileSync(path.join(SESSION_DIR, f), 'utf8'));
|
|
1322
|
+
if (metadata.status === 'active') active.push(metadata);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
return active;
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
function cleanSessions(options = {}) {
|
|
1329
|
+
const { keep = 5 } = options;
|
|
1330
|
+
ensureSessionDir();
|
|
1331
|
+
|
|
1332
|
+
const files = fs.readdirSync(SESSION_DIR)
|
|
1333
|
+
.filter(f => f.endsWith('.json'))
|
|
1334
|
+
.map(f => ({
|
|
1335
|
+
name: f,
|
|
1336
|
+
path: path.join(SESSION_DIR, f),
|
|
1337
|
+
mtime: fs.statSync(path.join(SESSION_DIR, f)).mtimeMs,
|
|
1338
|
+
}))
|
|
1339
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
1340
|
+
|
|
1341
|
+
const toRemove = files.slice(keep);
|
|
1342
|
+
for (const f of toRemove) {
|
|
1343
|
+
fs.unlinkSync(f.path);
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
return { kept: Math.min(files.length, keep), removed: toRemove.length };
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
// ═══════════════════════════════════════
|
|
1350
|
+
// Orphan cleanup (Windows)
|
|
1351
|
+
// ═══════════════════════════════════════
|
|
1352
|
+
|
|
1353
|
+
/**
|
|
1354
|
+
* Decide, for each claude.exe process on the machine, whether it is a
|
|
1355
|
+
* Formation-dispatch child that has genuinely lost its owner.
|
|
1356
|
+
*
|
|
1357
|
+
* Detection strategy (ownership, NOT age — TASK_1917):
|
|
1358
|
+
* 1. Process name is claude.exe.
|
|
1359
|
+
* 2. NOT the current process or its parent/grandparent (self-protection).
|
|
1360
|
+
* 3. NOT a VSCode extension host process (--permission-prompt-tool in cmdline).
|
|
1361
|
+
* 4. Positively matched to a pid recorded in .formation/.active-dispatches.json —
|
|
1362
|
+
* either directly (registry pid === this claude.exe's own pid — the case
|
|
1363
|
+
* when `claude` resolves to a .exe and runner.js spawns with shell:false,
|
|
1364
|
+
* verified empirically on 2026-08-30: `where claude` picks the .exe first)
|
|
1365
|
+
* or via one level of indirection (registry pid === this claude.exe's
|
|
1366
|
+
* ParentProcessId — the case when spawn used shell:true and cmd.exe wraps
|
|
1367
|
+
* the real process). A claude.exe that cannot be matched to ANY registry
|
|
1368
|
+
* entry is NEVER a kill candidate, no matter how long it has run — this
|
|
1369
|
+
* is what stops the check from taking down interactive sessions the
|
|
1370
|
+
* dispatcher never spawned, and it holds even if staleHours-style knobs
|
|
1371
|
+
* are reintroduced elsewhere.
|
|
1372
|
+
* 5. Confirmed orphaned: the process that spawned the matched registry pid —
|
|
1373
|
+
* i.e. that pid's OWN parent, because child_process.spawn() makes the
|
|
1374
|
+
* calling Node process the direct OS parent of whatever it launches — is
|
|
1375
|
+
* no longer alive. If that supervisor (Formation's headless.js/node
|
|
1376
|
+
* process) is still running, the dispatch is still supervised and is
|
|
1377
|
+
* left alone regardless of elapsed time. Fail-closed when supervisor
|
|
1378
|
+
* liveness cannot even be determined (the matched registry pid's own
|
|
1379
|
+
* process record is missing from the snapshot, e.g. a cmd.exe wrapper
|
|
1380
|
+
* that already exited): reason `supervisor_unknown`, action `skipped`
|
|
1381
|
+
* — never treated as proof of orphanhood, because Windows recycles PIDs
|
|
1382
|
+
* and a missing record is not the same evidence as a confirmed-dead one.
|
|
1383
|
+
*
|
|
1384
|
+
* classifyOrphanCandidates() is exported standalone (not inlined) so this
|
|
1385
|
+
* decision logic can be exercised with synthetic process/registry data in
|
|
1386
|
+
* tests — the exact function production calls, not a parallel reimplementation.
|
|
1387
|
+
*
|
|
1388
|
+
* @param {object} params
|
|
1389
|
+
* @param {Array<{pid:number, ppid:number|null, name:string, cmdline:string, createdAt:number}>} params.allProcs
|
|
1390
|
+
* @param {Array<{pid:number|null}>} params.registryEntries - parsed .active-dispatches.json
|
|
1391
|
+
* @param {Set<number>} params.selfPids - PIDs to always protect (self/parent/grandparent)
|
|
1392
|
+
* @param {(pid:number)=>boolean} params.isProcessAlive
|
|
1393
|
+
* @returns {Array<{pid:number, ageHours:string, cmdline:string, action:'skipped'|'would_kill', reason:string}>}
|
|
1394
|
+
*/
|
|
1395
|
+
function classifyOrphanCandidates({ allProcs, registryEntries, selfPids, isProcessAlive }) {
|
|
1396
|
+
const byPid = new Map(allProcs.map(p => [p.pid, p]));
|
|
1397
|
+
const registryPids = new Set(
|
|
1398
|
+
(registryEntries || []).filter(d => d && d.pid != null).map(d => d.pid)
|
|
1399
|
+
);
|
|
1400
|
+
|
|
1401
|
+
const now = Date.now();
|
|
1402
|
+
const results = [];
|
|
1403
|
+
|
|
1404
|
+
for (const proc of allProcs) {
|
|
1405
|
+
if (proc.name !== 'claude.exe') continue;
|
|
1406
|
+
|
|
1407
|
+
const ageHours = proc.createdAt > 0 ? ((now - proc.createdAt) / 3600000).toFixed(1) : '?';
|
|
1408
|
+
const base = { pid: proc.pid, ageHours, cmdline: (proc.cmdline || '').slice(0, 120) };
|
|
1409
|
+
|
|
1410
|
+
if (selfPids.has(proc.pid)) {
|
|
1411
|
+
results.push({ ...base, action: 'skipped', reason: 'self_or_ancestor' });
|
|
1412
|
+
continue;
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
if ((proc.cmdline || '').includes('--permission-prompt-tool')) {
|
|
1416
|
+
results.push({ ...base, action: 'skipped', reason: 'vscode_extension' });
|
|
1417
|
+
continue;
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
// Ownership match: direct or one-level indirect (cmd.exe wrapper).
|
|
1421
|
+
let ownerRegistryPid = null;
|
|
1422
|
+
if (registryPids.has(proc.pid)) {
|
|
1423
|
+
ownerRegistryPid = proc.pid;
|
|
1424
|
+
} else if (proc.ppid != null && registryPids.has(proc.ppid)) {
|
|
1425
|
+
ownerRegistryPid = proc.ppid;
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
if (ownerRegistryPid === null) {
|
|
1429
|
+
// Not provably a Formation-dispatch child. Never kill on age alone —
|
|
1430
|
+
// this is the exact condition that used to taskkill interactive
|
|
1431
|
+
// sessions (pre-TASK_1917 behavior).
|
|
1432
|
+
results.push({ ...base, action: 'skipped', reason: 'not_dispatch_owned' });
|
|
1433
|
+
continue;
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
const ownerProc = byPid.get(ownerRegistryPid);
|
|
1437
|
+
const supervisorPid = ownerProc ? ownerProc.ppid : null;
|
|
1438
|
+
|
|
1439
|
+
// Fail-closed (TASK_1917 review round 2): if the matched registry pid's
|
|
1440
|
+
// own process record is missing from this snapshot (ownerProc undefined)
|
|
1441
|
+
// — e.g. a cmd.exe wrapper that has already exited while its claude.exe
|
|
1442
|
+
// child survives — we have NO supervisor pid to check at all. Windows
|
|
1443
|
+
// recycles PIDs aggressively (the very reason the old code protected
|
|
1444
|
+
// grandparent, not just parent), so a stale registry.pid that happens to
|
|
1445
|
+
// collide with a *recycled, currently-dead* PID must NOT be treated as
|
|
1446
|
+
// proof of orphanhood. Actually implemented as skip, not merely commented
|
|
1447
|
+
// as one: an earlier draft of this branch left `supervisorPid == null`
|
|
1448
|
+
// falling through to would_kill despite this same comment claiming
|
|
1449
|
+
// fail-closed — that was the exact "doc says one thing, code does the
|
|
1450
|
+
// opposite" defect this task exists to eliminate, caught in review.
|
|
1451
|
+
if (supervisorPid == null) {
|
|
1452
|
+
results.push({ ...base, action: 'skipped', reason: 'supervisor_unknown', ownerRegistryPid });
|
|
1453
|
+
continue;
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
const supervisorAlive = isProcessAlive(supervisorPid);
|
|
1457
|
+
if (supervisorAlive) {
|
|
1458
|
+
results.push({ ...base, action: 'skipped', reason: 'supervisor_alive', ownerRegistryPid, supervisorPid });
|
|
1459
|
+
continue;
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
results.push({ ...base, action: 'would_kill', reason: 'orphaned_dispatch_child', ownerRegistryPid, supervisorPid });
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
return results;
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
/**
|
|
1469
|
+
* Run a PowerShell CIM process query and return parsed process records.
|
|
1470
|
+
*
|
|
1471
|
+
* Replaces the legacy `wmic` invocation: wmic.exe does not exist on this
|
|
1472
|
+
* machine (Windows 11 10.0.26200 — Microsoft has been removing it from
|
|
1473
|
+
* Windows builds) and calling it here silently no-ops via the catch block,
|
|
1474
|
+
* which would make the whole ownership check a no-op too (found:0 forever —
|
|
1475
|
+
* a fourth Decorative Guard). Get-CimInstance Win32_Process is the supported
|
|
1476
|
+
* successor and is present on this host (verified 2026-08-30). Output is
|
|
1477
|
+
* emitted as JSON (not CSV) because CommandLine routinely contains commas,
|
|
1478
|
+
* which the old CSV split(',') hack only worked around by assuming exactly
|
|
1479
|
+
* two trailing numeric/date columns — JSON has no such fragility.
|
|
1480
|
+
*
|
|
1481
|
+
* @returns {Array<{pid:number, ppid:number|null, name:string, cmdline:string, createdAt:number}>}
|
|
1482
|
+
*/
|
|
1483
|
+
function queryAllProcesses() {
|
|
1484
|
+
const { execSync } = require('child_process');
|
|
1485
|
+
const psScript = [
|
|
1486
|
+
"$procs = @(Get-CimInstance Win32_Process | Select-Object ProcessId, ParentProcessId, Name,",
|
|
1487
|
+
" @{N='CreationDate'; E={ if ($_.CreationDate) { $_.CreationDate.ToString('yyyyMMddHHmmss') } else { '' } }},",
|
|
1488
|
+
" CommandLine)",
|
|
1489
|
+
"ConvertTo-Json -InputObject $procs -Compress",
|
|
1490
|
+
].join('\n');
|
|
1491
|
+
// -EncodedCommand (UTF-16LE base64) sidesteps cmd.exe/PowerShell quoting
|
|
1492
|
+
// hazards entirely — no risk of a CommandLine value in the script itself
|
|
1493
|
+
// breaking out of nested quotes.
|
|
1494
|
+
const encoded = Buffer.from(psScript, 'utf16le').toString('base64');
|
|
1495
|
+
const raw = execSync(
|
|
1496
|
+
`powershell -NoProfile -NonInteractive -EncodedCommand ${encoded}`,
|
|
1497
|
+
{ encoding: 'utf8', timeout: 20000, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true, maxBuffer: 32 * 1024 * 1024 }
|
|
1498
|
+
);
|
|
1499
|
+
let parsed = JSON.parse(raw);
|
|
1500
|
+
if (!Array.isArray(parsed)) parsed = [parsed]; // single result: PowerShell unwraps 1-element arrays
|
|
1501
|
+
|
|
1502
|
+
const out = [];
|
|
1503
|
+
for (const p of parsed) {
|
|
1504
|
+
if (!p || typeof p.ProcessId !== 'number') continue;
|
|
1505
|
+
let createdAt = 0;
|
|
1506
|
+
if (p.CreationDate) {
|
|
1507
|
+
const m = String(p.CreationDate).match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
|
|
1508
|
+
if (m) createdAt = new Date(`${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}`).getTime();
|
|
1509
|
+
}
|
|
1510
|
+
out.push({
|
|
1511
|
+
pid: p.ProcessId,
|
|
1512
|
+
ppid: typeof p.ParentProcessId === 'number' ? p.ParentProcessId : null,
|
|
1513
|
+
name: p.Name || '',
|
|
1514
|
+
cmdline: p.CommandLine || '',
|
|
1515
|
+
createdAt,
|
|
1516
|
+
});
|
|
1517
|
+
}
|
|
1518
|
+
return out;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
/**
|
|
1522
|
+
* Detect (and optionally kill) orphaned Formation-dispatch claude.exe
|
|
1523
|
+
* processes on Windows. See classifyOrphanCandidates() for the decision
|
|
1524
|
+
* logic — this function only gathers real process/registry data and applies it.
|
|
1525
|
+
*
|
|
1526
|
+
* @param {object} [options]
|
|
1527
|
+
* @param {boolean} [options.dryRun=false] - List orphans without killing
|
|
1528
|
+
* @returns {{ found: number, killed: number, skipped: number, details: object[] }}
|
|
1529
|
+
*/
|
|
1530
|
+
function cleanOrphanedClaude(options = {}) {
|
|
1531
|
+
const { dryRun = false } = options;
|
|
1532
|
+
if (process.platform !== 'win32') {
|
|
1533
|
+
return { found: 0, killed: 0, skipped: 0, details: [] };
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
const { execSync } = require('child_process');
|
|
1537
|
+
const result = { found: 0, killed: 0, skipped: 0, details: [] };
|
|
1538
|
+
|
|
1539
|
+
// 1. Full process snapshot (need ParentProcessId for both the cmd.exe-wrapper
|
|
1540
|
+
// ownership match and the supervisor-liveness check).
|
|
1541
|
+
let allProcs;
|
|
1542
|
+
try {
|
|
1543
|
+
allProcs = queryAllProcesses();
|
|
1544
|
+
} catch {
|
|
1545
|
+
return result;
|
|
1546
|
+
}
|
|
1547
|
+
result.found = allProcs.filter(p => p.name === 'claude.exe').length;
|
|
1548
|
+
|
|
1549
|
+
// 2. Dispatch registry. Missing file = no in-flight dispatches, which is
|
|
1550
|
+
// the normal post-unregisterDispatch state, not corruption.
|
|
1551
|
+
let readActiveDispatches;
|
|
1552
|
+
let isProcessAlive;
|
|
1553
|
+
try {
|
|
1554
|
+
({ readActiveDispatches, isProcessAlive } = require(path.join(BASE_DIR, '.formation', 'tools', 'dispatch-registry.js')));
|
|
1555
|
+
} catch {
|
|
1556
|
+
readActiveDispatches = () => {
|
|
1557
|
+
try {
|
|
1558
|
+
const dispatchFile = path.join(BASE_DIR, '.formation', '.active-dispatches.json');
|
|
1559
|
+
if (!fs.existsSync(dispatchFile)) return [];
|
|
1560
|
+
const parsed = JSON.parse(fs.readFileSync(dispatchFile, 'utf8'));
|
|
1561
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
1562
|
+
} catch { return []; }
|
|
1563
|
+
};
|
|
1564
|
+
isProcessAlive = (pid) => {
|
|
1565
|
+
try { process.kill(pid, 0); return true; } catch { return false; }
|
|
1566
|
+
};
|
|
1567
|
+
}
|
|
1568
|
+
let registryEntries = [];
|
|
1569
|
+
try { registryEntries = readActiveDispatches() || []; } catch { registryEntries = []; }
|
|
1570
|
+
|
|
1571
|
+
// 3. Self ancestry — never touch this process or its parent/grandparent.
|
|
1572
|
+
const selfPids = new Set([process.pid]);
|
|
1573
|
+
if (process.ppid) selfPids.add(process.ppid);
|
|
1574
|
+
const selfParentProc = allProcs.find(p => p.pid === process.ppid);
|
|
1575
|
+
if (selfParentProc && selfParentProc.ppid != null) selfPids.add(selfParentProc.ppid);
|
|
1576
|
+
|
|
1577
|
+
const classified = classifyOrphanCandidates({ allProcs, registryEntries, selfPids, isProcessAlive });
|
|
1578
|
+
|
|
1579
|
+
for (const c of classified) {
|
|
1580
|
+
if (c.action !== 'would_kill') {
|
|
1581
|
+
result.skipped++;
|
|
1582
|
+
continue;
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
const detail = { pid: c.pid, ageHours: c.ageHours, cmdline: c.cmdline };
|
|
1586
|
+
if (dryRun) {
|
|
1587
|
+
detail.action = 'would_kill';
|
|
1588
|
+
} else {
|
|
1589
|
+
try {
|
|
1590
|
+
execSync(`taskkill /F /PID ${c.pid}`, { timeout: 10000, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true });
|
|
1591
|
+
detail.action = 'killed';
|
|
1592
|
+
result.killed++;
|
|
1593
|
+
} catch {
|
|
1594
|
+
detail.action = 'kill_failed';
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
result.details.push(detail);
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
return result;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
// ═══════════════════════════════════════
|
|
1604
|
+
// CLI
|
|
1605
|
+
// ═══════════════════════════════════════
|
|
1606
|
+
|
|
1607
|
+
function parseCliArgs(argv) {
|
|
1608
|
+
const args = argv.slice(2);
|
|
1609
|
+
const command = args[0];
|
|
1610
|
+
const positional = [];
|
|
1611
|
+
const flags = {};
|
|
1612
|
+
|
|
1613
|
+
for (let i = 1; i < args.length; i++) {
|
|
1614
|
+
const m = args[i].match(/^--([^=]+)(?:=(.*))?$/);
|
|
1615
|
+
if (m) {
|
|
1616
|
+
if (m[2] !== undefined) {
|
|
1617
|
+
// --flag=value form: value captured by regex
|
|
1618
|
+
flags[m[1]] = m[2];
|
|
1619
|
+
} else if (i + 1 < args.length && !args[i + 1].startsWith('--')) {
|
|
1620
|
+
// --flag value form: consume next token as value
|
|
1621
|
+
flags[m[1]] = args[i + 1];
|
|
1622
|
+
i++;
|
|
1623
|
+
} else {
|
|
1624
|
+
// Boolean flag (no value follows)
|
|
1625
|
+
flags[m[1]] = true;
|
|
1626
|
+
}
|
|
1627
|
+
} else {
|
|
1628
|
+
positional.push(args[i]);
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
|
|
1632
|
+
return { command, positional, flags };
|
|
1633
|
+
}
|
|
1634
|
+
|
|
1635
|
+
async function cli() {
|
|
1636
|
+
const { command, positional, flags } = parseCliArgs(process.argv);
|
|
1637
|
+
const json = flags.json === true;
|
|
1638
|
+
|
|
1639
|
+
try {
|
|
1640
|
+
switch (command) {
|
|
1641
|
+
case 'list': {
|
|
1642
|
+
const result = list();
|
|
1643
|
+
if (json) {
|
|
1644
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1645
|
+
} else {
|
|
1646
|
+
if (result.length === 0) {
|
|
1647
|
+
console.log('No specialists found.');
|
|
1648
|
+
} else {
|
|
1649
|
+
for (const s of result) {
|
|
1650
|
+
console.log(` ${s.name} (v${s.version}) — ${s.purpose}`);
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
break;
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
case 'resolve': {
|
|
1658
|
+
const name = positional[0];
|
|
1659
|
+
if (!name) { console.error('Usage: session.js resolve <name>'); process.exit(1); }
|
|
1660
|
+
const result = await resolve(name);
|
|
1661
|
+
if (json) {
|
|
1662
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1663
|
+
} else {
|
|
1664
|
+
console.log(`${result.name} v${result.version}`);
|
|
1665
|
+
console.log(`Purpose: ${result.purpose}`);
|
|
1666
|
+
console.log(`Dir: ${result.dir}`);
|
|
1667
|
+
console.log(`Files:`);
|
|
1668
|
+
for (const f of result.loadedFiles) {
|
|
1669
|
+
console.log(` ${f.exists ? '✅' : '❌'} ${f.entry}`);
|
|
1670
|
+
}
|
|
1671
|
+
if (result.exitTriggers.length) {
|
|
1672
|
+
console.log(`Exit: ${result.exitTriggers.join(', ')}`);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
break;
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
case 'prompt': {
|
|
1679
|
+
const name = positional[0];
|
|
1680
|
+
if (!name) { console.error('Usage: session.js prompt <name> [--mode=assembled|reference] [--source=plugin]'); process.exit(1); }
|
|
1681
|
+
const mode = flags.mode || 'assembled';
|
|
1682
|
+
const exclude = flags.exclude ? flags.exclude.split(',') : [];
|
|
1683
|
+
const source = flags.source || null;
|
|
1684
|
+
const depth = flags.depth || null;
|
|
1685
|
+
let prompt = await buildPrompt(name, { mode, task: flags.task, context: flags.context, exclude, source, depth,
|
|
1686
|
+
externalBootContext: flags['external-boot-context'] === true });
|
|
1687
|
+
|
|
1688
|
+
// Inject the most recent episode as prior-session context for interactive boots.
|
|
1689
|
+
// --no-episode (legacy alias --no-muninn, still passed by k-cli): skip it for
|
|
1690
|
+
// headless/programmatic callers (e.g. kenaz_specialist_dispatch).
|
|
1691
|
+
if (EPISODE_SPECIALISTS.includes(name) && mode === 'assembled' && !flags['no-episode'] && !flags['no-muninn']) {
|
|
1692
|
+
// TASK_2218: the real project pin is written by .claude/hooks/ansuz-session-pin.js,
|
|
1693
|
+
// keyed by the hook-payload session_id -- nothing is pinned here.
|
|
1694
|
+
|
|
1695
|
+
// Prompt injection: skip in lean modes to keep prompt lean.
|
|
1696
|
+
if (depth !== 'kernel' && depth !== 'capsule' && depth !== 'elixir') {
|
|
1697
|
+
// Hippocampus: inject most recent episode as prior session context
|
|
1698
|
+
const episodicMemory = await recallRecentEpisode(1, name.toLowerCase());
|
|
1699
|
+
if (episodicMemory) {
|
|
1700
|
+
prompt += `\n\n${episodicMemory}\n`;
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
console.log(prompt);
|
|
1706
|
+
break;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
case 'start': {
|
|
1710
|
+
const name = positional[0];
|
|
1711
|
+
if (!name) { console.error('Usage: session.js start <name> [--consumer=...]'); process.exit(1); }
|
|
1712
|
+
const exclude = flags.exclude ? flags.exclude.split(',') : [];
|
|
1713
|
+
const result = await startSession(name, {
|
|
1714
|
+
consumer: flags.consumer || 'cli',
|
|
1715
|
+
task: flags.task,
|
|
1716
|
+
context: flags.context,
|
|
1717
|
+
exclude,
|
|
1718
|
+
mode: flags.mode || 'assembled',
|
|
1719
|
+
});
|
|
1720
|
+
if (json || flags['with-prompt']) {
|
|
1721
|
+
const out = json
|
|
1722
|
+
? JSON.stringify(flags['with-prompt'] ? result : result.metadata, null, 2)
|
|
1723
|
+
: `Session: ${result.sessionId}\n\n${result.prompt}`;
|
|
1724
|
+
console.log(out);
|
|
1725
|
+
} else {
|
|
1726
|
+
console.log(`✅ Session started: ${result.sessionId}`);
|
|
1727
|
+
console.log(` Specialist: ${result.metadata.specialist}`);
|
|
1728
|
+
console.log(` Consumer: ${result.metadata.consumer}`);
|
|
1729
|
+
console.log(` Prompt length: ${result.metadata.promptLength} chars`);
|
|
1730
|
+
}
|
|
1731
|
+
break;
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
case 'end': {
|
|
1735
|
+
const sessionId = positional[0];
|
|
1736
|
+
if (!sessionId) { console.error('Usage: session.js end <sessionId>'); process.exit(1); }
|
|
1737
|
+
const result = endSession(sessionId);
|
|
1738
|
+
if (json) {
|
|
1739
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1740
|
+
} else {
|
|
1741
|
+
console.log(`✅ Session ended: ${result.id}`);
|
|
1742
|
+
}
|
|
1743
|
+
break;
|
|
1744
|
+
}
|
|
1745
|
+
|
|
1746
|
+
case 'active': {
|
|
1747
|
+
const result = getActiveSessions();
|
|
1748
|
+
if (json) {
|
|
1749
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1750
|
+
} else {
|
|
1751
|
+
if (result.length === 0) {
|
|
1752
|
+
console.log('No active sessions.');
|
|
1753
|
+
} else {
|
|
1754
|
+
for (const s of result) {
|
|
1755
|
+
console.log(` ${s.id} | ${s.specialist} | ${s.consumer} | ${s.startedAt}`);
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
}
|
|
1759
|
+
break;
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
case 'clean': {
|
|
1763
|
+
const keep = parseInt(flags.keep, 10) || 5;
|
|
1764
|
+
const result = cleanSessions({ keep });
|
|
1765
|
+
console.log(`✅ Kept ${result.kept}, removed ${result.removed}`);
|
|
1766
|
+
break;
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
case 'stop': {
|
|
1770
|
+
// No-op since the Muninn watcher was retired (TASK_2345); kept so a Stop hook that
|
|
1771
|
+
// still calls `session.js stop` exits 0 instead of failing.
|
|
1772
|
+
break;
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1775
|
+
case 'verify': {
|
|
1776
|
+
const verifyName = positional[0];
|
|
1777
|
+
if (!verifyName) {
|
|
1778
|
+
console.error('Usage: session.js verify <specialistName> [--session=<id>] [--json] [--verbose]');
|
|
1779
|
+
process.exit(1);
|
|
1780
|
+
}
|
|
1781
|
+
const verifySessionId = flags.session || null;
|
|
1782
|
+
const verboseMode = flags.verbose === true;
|
|
1783
|
+
const scorer = require('./identity-scorer');
|
|
1784
|
+
const verifyResult = scorer.score(verifyName, { sessionId: verifySessionId, projectPath: BASE_DIR, verbose: verboseMode });
|
|
1785
|
+
if (json) {
|
|
1786
|
+
console.log(JSON.stringify(verifyResult, null, 2));
|
|
1787
|
+
} else {
|
|
1788
|
+
console.log(scorer.formatReport(verifyResult));
|
|
1789
|
+
}
|
|
1790
|
+
if (verifyResult.verdict === 'IDENTITY_DRIFT') process.exit(1);
|
|
1791
|
+
if (verifyResult.verdict === 'WARN') process.exit(2);
|
|
1792
|
+
break;
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
case 'clean-orphans': {
|
|
1796
|
+
const dryRun = flags['dry-run'] === true;
|
|
1797
|
+
const result = cleanOrphanedClaude({ dryRun });
|
|
1798
|
+
if (json) {
|
|
1799
|
+
console.log(JSON.stringify(result, null, 2));
|
|
1800
|
+
} else {
|
|
1801
|
+
console.log(`🔍 Found ${result.found} claude.exe process(es), ${result.skipped} skipped (healthy)`);
|
|
1802
|
+
if (result.details.length === 0) {
|
|
1803
|
+
console.log('✅ No orphans detected.');
|
|
1804
|
+
} else {
|
|
1805
|
+
for (const d of result.details) {
|
|
1806
|
+
console.log(` ${d.action === 'killed' ? '💀' : '👻'} PID ${d.pid} (${d.ageHours}h old) — ${d.action}`);
|
|
1807
|
+
console.log(` ${d.cmdline}`);
|
|
1808
|
+
}
|
|
1809
|
+
if (dryRun) {
|
|
1810
|
+
console.log(`\n⚠️ Dry run — ${result.details.length} orphan(s) found. Run without --dry-run to kill.`);
|
|
1811
|
+
} else {
|
|
1812
|
+
console.log(`\n✅ Killed ${result.killed} orphan(s).`);
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
}
|
|
1816
|
+
break;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
default:
|
|
1820
|
+
console.log('Specialist Session Manager');
|
|
1821
|
+
console.log('');
|
|
1822
|
+
console.log('Commands:');
|
|
1823
|
+
console.log(' list List all specialists');
|
|
1824
|
+
console.log(' resolve <name> Show specialist config');
|
|
1825
|
+
console.log(' prompt <name> Generate prompt');
|
|
1826
|
+
console.log(' start <name> Start a session');
|
|
1827
|
+
console.log(' end <sessionId> End a session');
|
|
1828
|
+
console.log(' active List active sessions');
|
|
1829
|
+
console.log(' clean [--keep=5] Clean old sessions');
|
|
1830
|
+
console.log(' clean-orphans [--dry-run] Kill orphaned claude.exe processes');
|
|
1831
|
+
console.log(' stop Write .shutdown signal (Claude Stop hook)');
|
|
1832
|
+
console.log(' verify <name> Run identity verification for specialist');
|
|
1833
|
+
process.exit(command ? 1 : 0);
|
|
1834
|
+
}
|
|
1835
|
+
} catch (err) {
|
|
1836
|
+
console.error(`❌ ${err.message}`);
|
|
1837
|
+
process.exit(1);
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
// ═══════════════════════════════════════
|
|
1842
|
+
// Entry point
|
|
1843
|
+
// ═══════════════════════════════════════
|
|
1844
|
+
|
|
1845
|
+
if (require.main === module) {
|
|
1846
|
+
cli().catch(err => {
|
|
1847
|
+
console.error(`❌ ${err.message}`);
|
|
1848
|
+
process.exit(1);
|
|
1849
|
+
});
|
|
1850
|
+
} else {
|
|
1851
|
+
module.exports = {
|
|
1852
|
+
list,
|
|
1853
|
+
resolve,
|
|
1854
|
+
buildPrompt,
|
|
1855
|
+
startSession,
|
|
1856
|
+
endSession,
|
|
1857
|
+
getActiveSessions,
|
|
1858
|
+
cleanSessions,
|
|
1859
|
+
cleanOrphanedClaude,
|
|
1860
|
+
classifyOrphanCandidates, // exported for testing (TASK_1917) — same function production uses
|
|
1861
|
+
recallRecentEpisode,
|
|
1862
|
+
findConversationLog,
|
|
1863
|
+
// Identity verification (TASK_1080)
|
|
1864
|
+
identityScore: (name, opts) => require('./identity-scorer').score(name, { projectPath: BASE_DIR, ...opts }),
|
|
1865
|
+
};
|
|
1866
|
+
}
|