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,1020 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formation Utils
|
|
3
|
+
* 共用工具函數
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { execSync, spawnSync } = require('child_process');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const crypto = require('crypto');
|
|
10
|
+
|
|
11
|
+
// 路徑常數
|
|
12
|
+
const ROOT = path.resolve(__dirname, '..', '..');
|
|
13
|
+
const FORMATION_DIR = path.resolve(__dirname, '..');
|
|
14
|
+
const COLLABORATION_API = path.join(ROOT, '.collaboration', 'core', 'task-api.js');
|
|
15
|
+
|
|
16
|
+
// Legacy constant — maintained for backward compatibility
|
|
17
|
+
const LOG_DIR = path.join(FORMATION_DIR, 'logs');
|
|
18
|
+
|
|
19
|
+
// ── TASK_2030: node_modules provisioning for Formation/cross-project worktrees ──
|
|
20
|
+
// TASK_1844 built junction/symlink node_modules provisioning (linkNodeModules)
|
|
21
|
+
// and the matching pre-remove guard (unlinkNodeModulesLinks) into the Agent-tool
|
|
22
|
+
// WorktreeCreate hook (.claude/hooks/worktree-create.js) ONLY. Formation unit
|
|
23
|
+
// worktrees and dispatch.js's cross-project target_repo_worktree both go through
|
|
24
|
+
// utils.createWorktree/removeWorktree below, which never called either helper —
|
|
25
|
+
// measured result: those worktrees get ZERO node_modules, and (worse) any
|
|
26
|
+
// hand-built junction an agent adds is unprotected against the TASK_1844
|
|
27
|
+
// traversal hazard (git worktree remove --force on Windows recurses THROUGH a
|
|
28
|
+
// junction and empties the MAIN checkout's node_modules).
|
|
29
|
+
// Fix: require the hook's exports lazily (GEN-008: path resolved from ROOT, not
|
|
30
|
+
// hard-coded) and reuse them here — never copy the implementation. Requiring the
|
|
31
|
+
// hook as a library is safe: require.main here is the caller's entry module
|
|
32
|
+
// (headless.js/formations.js/a test file), never `undefined` and never the hook
|
|
33
|
+
// module itself, so the hook's `require.main === undefined` WorktreeCreate-mode
|
|
34
|
+
// branch never fires (see worktree-create.js's own entry-dispatch comment).
|
|
35
|
+
let _wtCreateHook = undefined;
|
|
36
|
+
function _loadWorktreeCreateHook() {
|
|
37
|
+
if (_wtCreateHook !== undefined) return _wtCreateHook;
|
|
38
|
+
try {
|
|
39
|
+
_wtCreateHook = require(path.join(ROOT, '.claude', 'hooks', 'worktree-create.js'));
|
|
40
|
+
} catch {
|
|
41
|
+
_wtCreateHook = null; // missing/broken hook file -> degrade to no linking, never crash dispatch
|
|
42
|
+
}
|
|
43
|
+
return _wtCreateHook;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Best-effort: link the main checkout's node_modules into `worktreePath`
|
|
48
|
+
* (see .claude/hooks/worktree-create.js linkNodeModules). Never throws —
|
|
49
|
+
* a bare worktree beats a failed dispatch.
|
|
50
|
+
*/
|
|
51
|
+
function linkNodeModulesBestEffort(projectRoot, worktreePath) {
|
|
52
|
+
const hook = _loadWorktreeCreateHook();
|
|
53
|
+
if (!hook || typeof hook.linkNodeModules !== 'function') return;
|
|
54
|
+
try { hook.linkNodeModules(projectRoot, worktreePath); }
|
|
55
|
+
catch (e) { console.warn(` ⚠️ node_modules linking failed: ${(e && e.message) || 'unknown'}`); }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Best-effort: drop node_modules junctions/symlinks inside `worktreePath`
|
|
60
|
+
* BEFORE any `git worktree remove` (see .claude/hooks/worktree-create.js
|
|
61
|
+
* unlinkNodeModulesLinks). MANDATORY ahead of `git worktree remove --force` —
|
|
62
|
+
* Git for Windows recurses through a junction on removal and empties the link
|
|
63
|
+
* target (the main checkout's node_modules). Never throws.
|
|
64
|
+
*/
|
|
65
|
+
function unlinkNodeModulesBestEffort(worktreePath) {
|
|
66
|
+
const hook = _loadWorktreeCreateHook();
|
|
67
|
+
if (!hook || typeof hook.unlinkNodeModulesLinks !== 'function') return;
|
|
68
|
+
try { hook.unlinkNodeModulesLinks(worktreePath); }
|
|
69
|
+
catch (e) { console.warn(` ⚠️ node_modules unlink failed: ${(e && e.message) || 'unknown'}`); }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get the log directory for a given project.
|
|
74
|
+
* All projects (including KenazAI core) use .kenaz/logs/ when available.
|
|
75
|
+
* This eliminates the core vs sub-project distinction for path selection.
|
|
76
|
+
*
|
|
77
|
+
* @param {string} [projectPath] - Absolute path to project root
|
|
78
|
+
* @returns {string} Absolute path to log directory
|
|
79
|
+
*/
|
|
80
|
+
function getLogDir(projectPath) {
|
|
81
|
+
if (!projectPath) return LOG_DIR;
|
|
82
|
+
|
|
83
|
+
// .kenaz/logs/ takes priority for ALL projects (core included)
|
|
84
|
+
const kenazLogsDir = path.join(projectPath, '.kenaz', 'logs');
|
|
85
|
+
if (fs.existsSync(kenazLogsDir)) return kenazLogsDir;
|
|
86
|
+
|
|
87
|
+
// Fallback: default LOG_DIR
|
|
88
|
+
return LOG_DIR;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function generateSessionId() {
|
|
92
|
+
const injected = process.env.KENAZ_SESSION_ID?.trim();
|
|
93
|
+
if (injected) return injected;
|
|
94
|
+
const now = new Date();
|
|
95
|
+
const ts = now.toISOString().replace(/[-:T]/g, '').slice(0, 14);
|
|
96
|
+
const rand = crypto.randomBytes(2).toString('hex');
|
|
97
|
+
return `${ts.slice(0, 8)}-${ts.slice(8, 14)}-${rand}`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let _gitBashCache = undefined;
|
|
101
|
+
function detectGitBash() {
|
|
102
|
+
if (_gitBashCache !== undefined) return _gitBashCache;
|
|
103
|
+
try {
|
|
104
|
+
const gitPaths = execSync('where git', { encoding: 'utf8', windowsHide: true }).split('\n').map(l => l.trim()).filter(Boolean);
|
|
105
|
+
for (const gitPath of gitPaths) {
|
|
106
|
+
// 嘗試從每個 git.exe 路徑推導 bash.exe
|
|
107
|
+
// git.exe 可能在 cmd/git.exe 或 mingw64/bin/git.exe
|
|
108
|
+
// bash.exe 固定在 Git/bin/bash.exe
|
|
109
|
+
let dir = path.dirname(gitPath);
|
|
110
|
+
// 往上找到包含 bin/bash.exe 的 Git 根目錄
|
|
111
|
+
for (let i = 0; i < 4; i++) {
|
|
112
|
+
const bashPath = path.join(dir, 'bin', 'bash.exe');
|
|
113
|
+
if (fs.existsSync(bashPath)) { _gitBashCache = bashPath; return _gitBashCache; }
|
|
114
|
+
dir = path.dirname(dir);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
} catch (e) {}
|
|
118
|
+
|
|
119
|
+
const fallbacks = [
|
|
120
|
+
'C:\\Program Files\\Git\\bin\\bash.exe',
|
|
121
|
+
'C:\\Program Files (x86)\\Git\\bin\\bash.exe',
|
|
122
|
+
'D:\\Program Files\\Git\\bin\\bash.exe'
|
|
123
|
+
];
|
|
124
|
+
for (const p of fallbacks) {
|
|
125
|
+
if (fs.existsSync(p)) { _gitBashCache = p; return _gitBashCache; }
|
|
126
|
+
}
|
|
127
|
+
_gitBashCache = null;
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 偵測 claude 可執行檔路徑
|
|
133
|
+
* 優先順序:where/which → 獨立安裝(~/.claude/local/) → fallback
|
|
134
|
+
* 結果 memoize — 每個進程只呼叫一次 where claude
|
|
135
|
+
*/
|
|
136
|
+
let _claudeCmdCache = null;
|
|
137
|
+
/**
|
|
138
|
+
* Choose the claude binary from `where claude` output (PATH order). The first
|
|
139
|
+
* hit is what the user's terminal runs. An npm shim (claude / claude.cmd) maps
|
|
140
|
+
* to the package's native bin/claude.exe, so no cmd.exe is spawned. The old
|
|
141
|
+
* rule "first .exe anywhere in the list" picked a stale WinGet install
|
|
142
|
+
* (2.1.248) over the npm one the user had updated (2.1.288), so every
|
|
143
|
+
* formation dispatch ran an older CLI than the terminal.
|
|
144
|
+
* @param {string[]} wherePaths `where claude` lines, in PATH order
|
|
145
|
+
* @param {(p: string) => boolean} exists
|
|
146
|
+
* @returns {string}
|
|
147
|
+
*/
|
|
148
|
+
function pickClaudeFromWhere(wherePaths, exists) {
|
|
149
|
+
for (const p of wherePaths) {
|
|
150
|
+
if (/\.exe$/i.test(p)) return p;
|
|
151
|
+
const nativeExe = path.join(path.dirname(p), 'node_modules', '@anthropic-ai', 'claude-code', 'bin', 'claude.exe');
|
|
152
|
+
if (exists(nativeExe)) return nativeExe;
|
|
153
|
+
if (/\.cmd$/i.test(p)) return p;
|
|
154
|
+
}
|
|
155
|
+
return wherePaths.find(p => /\.exe$/i.test(p)) || wherePaths[0];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function detectClaudeCmd() {
|
|
159
|
+
if (_claudeCmdCache) return _claudeCmdCache;
|
|
160
|
+
if (process.platform !== 'win32') { _claudeCmdCache = 'claude'; return _claudeCmdCache; }
|
|
161
|
+
|
|
162
|
+
// 1. 嘗試 where claude(npm 安裝的 claude.cmd 或 PATH 中的 claude.exe)
|
|
163
|
+
// windowsHide:true 防止 cmd.exe 視窗閃現
|
|
164
|
+
try {
|
|
165
|
+
const result = execSync('where claude', { encoding: 'utf8', timeout: 5000, windowsHide: true })
|
|
166
|
+
.split('\n').map(l => l.trim()).filter(Boolean);
|
|
167
|
+
if (result.length > 0) {
|
|
168
|
+
_claudeCmdCache = pickClaudeFromWhere(result, fs.existsSync);
|
|
169
|
+
return _claudeCmdCache;
|
|
170
|
+
}
|
|
171
|
+
} catch (e) {}
|
|
172
|
+
|
|
173
|
+
// 2. 獨立安裝:~/.claude/local/claude.exe
|
|
174
|
+
const homedir = process.env.USERPROFILE || process.env.HOME || '';
|
|
175
|
+
const standalonePaths = [
|
|
176
|
+
path.join(homedir, '.claude', 'local', 'claude.exe'),
|
|
177
|
+
path.join(homedir, '.claude', 'bin', 'claude.exe'),
|
|
178
|
+
];
|
|
179
|
+
for (const p of standalonePaths) {
|
|
180
|
+
if (fs.existsSync(p)) { _claudeCmdCache = p; return _claudeCmdCache; }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// 3. Fallback
|
|
184
|
+
_claudeCmdCache = 'claude.cmd';
|
|
185
|
+
return _claudeCmdCache;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function getClaudeEnv() {
|
|
189
|
+
const env = { ...process.env };
|
|
190
|
+
|
|
191
|
+
// 啟用 agent teams(與 Sunny 一致)
|
|
192
|
+
env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = '1';
|
|
193
|
+
|
|
194
|
+
// 移除 CLAUDECODE 避免 nested session 錯誤
|
|
195
|
+
delete env.CLAUDECODE;
|
|
196
|
+
|
|
197
|
+
// Windows: 設定 git-bash 路徑
|
|
198
|
+
if (process.platform === 'win32' && !env.CLAUDE_CODE_GIT_BASH_PATH) {
|
|
199
|
+
const gitBash = detectGitBash();
|
|
200
|
+
if (gitBash) env.CLAUDE_CODE_GIT_BASH_PATH = gitBash;
|
|
201
|
+
}
|
|
202
|
+
return env;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* 確保子專案的 git 已就緒(有 .git/ + 至少一個 commit)
|
|
207
|
+
* 在 dispatch / headless 啟動 agent 前呼叫,避免 post-complete 時才補救。
|
|
208
|
+
*
|
|
209
|
+
* @param {string|null} projectPath - 子專案路徑(null = core,跳過)
|
|
210
|
+
*/
|
|
211
|
+
function ensureGitReady(projectPath) {
|
|
212
|
+
if (!projectPath) return;
|
|
213
|
+
|
|
214
|
+
// GIT_CEILING_DIRECTORIES:防止 git 向上遍歷到 Core 專案
|
|
215
|
+
const env = { ...process.env };
|
|
216
|
+
const parentDir = path.dirname(projectPath);
|
|
217
|
+
env.GIT_CEILING_DIRECTORIES = parentDir;
|
|
218
|
+
|
|
219
|
+
const gitDir = path.join(projectPath, '.git');
|
|
220
|
+
const execOpts = { cwd: projectPath, encoding: 'utf8', timeout: 15000, env, windowsHide: true };
|
|
221
|
+
|
|
222
|
+
// 1. 沒有 .git/ → git init
|
|
223
|
+
if (!fs.existsSync(gitDir)) {
|
|
224
|
+
console.log(` 📦 Sub-project has no .git/ — initializing...`);
|
|
225
|
+
try {
|
|
226
|
+
execSync('git init --initial-branch=main', execOpts);
|
|
227
|
+
console.log(` ✅ git init completed`);
|
|
228
|
+
} catch {
|
|
229
|
+
try {
|
|
230
|
+
execSync('git init', execOpts);
|
|
231
|
+
execSync('git checkout -b main', execOpts);
|
|
232
|
+
console.log(` ✅ git init completed (legacy git)`);
|
|
233
|
+
} catch (e) {
|
|
234
|
+
console.error(` ❌ git init failed: ${e.message}`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// 建立基礎 .gitignore(如果不存在)
|
|
240
|
+
const gitignorePath = path.join(projectPath, '.gitignore');
|
|
241
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
242
|
+
fs.writeFileSync(gitignorePath, [
|
|
243
|
+
'node_modules/', '__pycache__/', '*.pyc', 'venv/',
|
|
244
|
+
'.env', '.env.local', '*.db', '.chroma/',
|
|
245
|
+
].join('\n') + '\n');
|
|
246
|
+
console.log(` ✅ .gitignore created`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// 2. 沒有 commit → initial commit
|
|
251
|
+
try {
|
|
252
|
+
execSync('git rev-parse HEAD', { ...execOpts, stdio: 'pipe', windowsHide: true });
|
|
253
|
+
} catch {
|
|
254
|
+
console.log(` 📦 Sub-project has no commits — creating initial commit...`);
|
|
255
|
+
try {
|
|
256
|
+
execSync('git add -A', execOpts);
|
|
257
|
+
// F3: Use -c flags to supply fallback identity when user has no global git config.
|
|
258
|
+
// This prevents "Author identity unknown" error that causes HEAD to not exist,
|
|
259
|
+
// which in turn makes git worktree add fail with "not a valid object name: HEAD".
|
|
260
|
+
execSync(
|
|
261
|
+
'git -c user.name="Kenaz AI" -c user.email="kenaz-ai@local" commit -m "Initial commit: Kenaz AI project setup" --allow-empty',
|
|
262
|
+
execOpts
|
|
263
|
+
);
|
|
264
|
+
console.log(` ✅ Initial commit created`);
|
|
265
|
+
} catch (e) {
|
|
266
|
+
console.error(` ❌ Initial commit failed: ${e.message}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Rewrite stash commands so merge/recovery flows preserve untracked workspace
|
|
273
|
+
* artifacts written outside the task diff (audit reports, notes, design docs).
|
|
274
|
+
* We only remove the explicit include-untracked flag; tracked edits still stash.
|
|
275
|
+
*
|
|
276
|
+
* @param {string} command
|
|
277
|
+
* @returns {string}
|
|
278
|
+
*/
|
|
279
|
+
function preserveUntrackedStashCommand(command) {
|
|
280
|
+
const raw = String(command || '');
|
|
281
|
+
if (!/\bstash\s+push\b/.test(raw)) return raw;
|
|
282
|
+
return raw
|
|
283
|
+
.replace(/\s--include-untracked(?=\s|$)/g, '')
|
|
284
|
+
.replace(/\s-u(?=\s|$)/g, '')
|
|
285
|
+
.replace(/\s{2,}/g, ' ')
|
|
286
|
+
.trim();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* TASK_1775: Read worktree dispatch config for a project.
|
|
291
|
+
* Sources (later wins): defaults -> .kenaz/project.yaml -> env
|
|
292
|
+
* (FORMATION_WORKTREE_TIMEOUT_MS, FORMATION_USE_WORKTREE).
|
|
293
|
+
* project.yaml keys:
|
|
294
|
+
* use_worktree: false # top-level -- opt out of worktree isolation entirely
|
|
295
|
+
* worktree:
|
|
296
|
+
* timeout_ms: 120000 # git worktree add timeout (default 30000)
|
|
297
|
+
* @param {string|null} projectDir - Project root containing .kenaz/project.yaml
|
|
298
|
+
* useWorktreeSource records WHICH lever produced useWorktree, because the caller
|
|
299
|
+
* (resolveWorktreeDecision) reports it as diagnostics and folding env into the
|
|
300
|
+
* project-config label made an env-driven decision read as if project.yaml had
|
|
301
|
+
* said it — sending an operator to edit a file that already disagrees. The
|
|
302
|
+
* provenance is tracked here, at the single place each lever is read, rather
|
|
303
|
+
* than re-read by the caller (that would be the copy-the-check pattern).
|
|
304
|
+
* @returns {{ useWorktree: boolean, timeoutMs: number, useWorktreeSource: 'default'|'project-config'|'env' }}
|
|
305
|
+
*/
|
|
306
|
+
function readWorktreeConfig(projectDir) {
|
|
307
|
+
const cfg = { useWorktree: true, timeoutMs: 30000, useWorktreeSource: 'default' };
|
|
308
|
+
try {
|
|
309
|
+
const yamlPath = path.join(projectDir || ROOT, '.kenaz', 'project.yaml');
|
|
310
|
+
if (fs.existsSync(yamlPath)) {
|
|
311
|
+
const content = fs.readFileSync(yamlPath, 'utf-8');
|
|
312
|
+
// TASK_2259: explicit true is also project-config provenance (boolean unchanged: default is true).
|
|
313
|
+
const uwMatch = content.match(/^use_worktree:\s*(true|false)\b/m);
|
|
314
|
+
if (uwMatch) {
|
|
315
|
+
cfg.useWorktree = uwMatch[1] === 'true';
|
|
316
|
+
cfg.useWorktreeSource = 'project-config';
|
|
317
|
+
}
|
|
318
|
+
const lines = content.split(/\r?\n/);
|
|
319
|
+
const wIdx = lines.findIndex(l => /^worktree:\s*$/.test(l));
|
|
320
|
+
if (wIdx !== -1) {
|
|
321
|
+
for (let i = wIdx + 1; i < lines.length; i++) {
|
|
322
|
+
if (lines[i].trim() === '') continue;
|
|
323
|
+
if (!/^[ \t]/.test(lines[i])) break; // dedent -- worktree block ended
|
|
324
|
+
const m = lines[i].match(/^[ \t]+timeout_ms:\s*(\d+)\s*$/);
|
|
325
|
+
if (m) { cfg.timeoutMs = parseInt(m[1], 10); break; }
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
} catch { /* unreadable project.yaml -- keep defaults */ }
|
|
330
|
+
const envMs = parseInt(process.env.FORMATION_WORKTREE_TIMEOUT_MS || '', 10);
|
|
331
|
+
if (Number.isFinite(envMs) && envMs > 0) cfg.timeoutMs = envMs;
|
|
332
|
+
// TASK_1833: dispatch-time worktree toggle -- env wins over project.yaml
|
|
333
|
+
// (mirrors FORMATION_WORKTREE_TIMEOUT_MS). Set by `dispatch.js --use-worktree=...`
|
|
334
|
+
// or by the operator for headless launches:
|
|
335
|
+
// FORMATION_USE_WORKTREE=false node .formation/tools/headless.js ...
|
|
336
|
+
const envUW = String(process.env.FORMATION_USE_WORKTREE || '').trim().toLowerCase();
|
|
337
|
+
if (envUW === 'false' || envUW === '0') { cfg.useWorktree = false; cfg.useWorktreeSource = 'env'; }
|
|
338
|
+
else if (envUW === 'true' || envUW === '1') { cfg.useWorktree = true; cfg.useWorktreeSource = 'env'; }
|
|
339
|
+
return cfg;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* TASK_2176: pure parser for the top-level `verify_offline: <command>` key in
|
|
344
|
+
* project.yaml. Separated from the fs read (getVerifyOfflineCommand below) so
|
|
345
|
+
* verify-and-land.js's injectable-deps unit tests can exercise the exact same
|
|
346
|
+
* parsing logic through a fake fs without touching the real filesystem —
|
|
347
|
+
* single format authority shared by both consumers, not a second copy
|
|
348
|
+
* (same reasoning as dispatchLockStaleness above). A quoted value has its
|
|
349
|
+
* surrounding quotes stripped; the rest of the line is taken verbatim as the
|
|
350
|
+
* shell command (no inline-comment stripping — keep the command on one line,
|
|
351
|
+
* same convention as use_worktree/timeout_ms).
|
|
352
|
+
* @param {string} content - raw project.yaml text
|
|
353
|
+
* @returns {string|null} the command, or null when the key is absent/empty
|
|
354
|
+
*/
|
|
355
|
+
function parseVerifyOfflineFromYaml(content) {
|
|
356
|
+
const m = /^verify_offline:\s*(.+?)\s*$/m.exec(String(content || ''));
|
|
357
|
+
if (!m) return null;
|
|
358
|
+
const raw = m[1].trim();
|
|
359
|
+
if (!raw) return null;
|
|
360
|
+
return raw.replace(/^["']|["']$/g, '');
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* TASK_2176: reads `verify_offline` from a project's .kenaz/project.yaml.
|
|
365
|
+
* Per-project opt-in for a SINGLE heavyweight, offline (no network/service
|
|
366
|
+
* dependency) verification command, for projects whose authoritative check
|
|
367
|
+
* needs one shared tool a worktree agent cannot run concurrently (Unity/
|
|
368
|
+
* Unreal editor domain reload, a mobile build chain). dispatch.js surfaces
|
|
369
|
+
* this to the worktree agent as a non-authoritative self-check (see
|
|
370
|
+
* resolveDispatchIsolation); verify-and-land.js runs it as the authoritative,
|
|
371
|
+
* serialized gate on the main tree before merge (see stepVerifyOffline).
|
|
372
|
+
* Projects without the key are unaffected — returns null, today's behaviour.
|
|
373
|
+
* @param {string|null} projectDir - project root containing .kenaz/project.yaml
|
|
374
|
+
* @returns {string|null}
|
|
375
|
+
*/
|
|
376
|
+
function getVerifyOfflineCommand(projectDir) {
|
|
377
|
+
try {
|
|
378
|
+
const yamlPath = path.join(projectDir || ROOT, '.kenaz', 'project.yaml');
|
|
379
|
+
if (!fs.existsSync(yamlPath)) return null;
|
|
380
|
+
return parseVerifyOfflineFromYaml(fs.readFileSync(yamlPath, 'utf-8'));
|
|
381
|
+
} catch {
|
|
382
|
+
return null; // unreadable/corrupt project.yaml -- treat as "no key" (today's behaviour)
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* TASK_1833: THE worktree on/off decision for a dispatch. Single source of
|
|
388
|
+
* truth consumed by BOTH dispatch paths (formations.setupUnitWorktree on the
|
|
389
|
+
* Formation path, dispatch.js resolveDispatchIsolation on the sub-agent path).
|
|
390
|
+
* Do NOT copy this logic into a new call site -- the copy-the-check pattern has
|
|
391
|
+
* recurred twice already (rune_eb53038640e246dea32764f89b18bfa1); call it.
|
|
392
|
+
* Precedence: explicit dispatch-time override (CLI/MCP param) >
|
|
393
|
+
* env FORMATION_USE_WORKTREE > project .kenaz/project.yaml use_worktree > default true.
|
|
394
|
+
* NOTE the default: a project WITHOUT .kenaz/project.yaml defaults INTO worktree
|
|
395
|
+
* mode. Single-editor-bound projects (e.g. Unity: Library/, huge assets, one
|
|
396
|
+
* editor instance) must opt out via any of the three levers above.
|
|
397
|
+
* @param {string|null} projectDir - target project root
|
|
398
|
+
* @param {boolean|null} [override] - dispatch-time override (true/false); null = no override
|
|
399
|
+
* The three documented levers get three distinct source labels — a two-value
|
|
400
|
+
* provenance field for a three-lever decision misattributed every env override
|
|
401
|
+
* to project.yaml (measured 2026-07-31: project.yaml said false,
|
|
402
|
+
* FORMATION_USE_WORKTREE=true won, and source still read 'project-config').
|
|
403
|
+
* 'default' means no lever fired and the project simply inherited worktree mode,
|
|
404
|
+
* which is the case Unity-style single-editor projects most need to SEE.
|
|
405
|
+
* @returns {{ useWorktree: boolean, source: 'dispatch-param'|'env'|'project-config'|'default' }}
|
|
406
|
+
*/
|
|
407
|
+
function resolveWorktreeDecision(projectDir, override = null) {
|
|
408
|
+
if (override === true || override === false) {
|
|
409
|
+
return { useWorktree: override, source: 'dispatch-param' };
|
|
410
|
+
}
|
|
411
|
+
const cfg = readWorktreeConfig(projectDir);
|
|
412
|
+
return { useWorktree: cfg.useWorktree, source: cfg.useWorktreeSource };
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* TASK_1833: canonical dispatch-lock file path for a target project -- ONE
|
|
417
|
+
* naming scheme so Formation serial dispatches, sub-agent shared-tree
|
|
418
|
+
* dispatches, and forseti-verify L1 all serialize against the SAME lock.
|
|
419
|
+
* Formula is byte-compatible with the historical inline computation in
|
|
420
|
+
* formations.js setupUnitWorktree AND forseti-verify.js (line ~714) -- if you
|
|
421
|
+
* change it here, forseti-verify must move with it or the two stop excluding
|
|
422
|
+
* each other.
|
|
423
|
+
* @param {string|null} projectPath - target project root (null = core)
|
|
424
|
+
* @returns {string} absolute lock file path (lives in CORE .formation/)
|
|
425
|
+
*/
|
|
426
|
+
function dispatchLockPath(projectPath) {
|
|
427
|
+
const projectKey = (projectPath || 'default').replace(/[\\/:]/g, '_').toLowerCase();
|
|
428
|
+
return path.join(ROOT, '.formation', `.dispatch-lock-${projectKey}`);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function _pidAlive(pid) {
|
|
432
|
+
if (!pid || pid <= 0) return false;
|
|
433
|
+
try { process.kill(pid, 0); return true; }
|
|
434
|
+
catch (e) { return e.code === 'EPERM'; }
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// TASK_1838: single staleness threshold for .dispatch-lock-* files, shared by
|
|
438
|
+
// tryAcquireDispatchLock (break-on-acquire) and dispatch-registry
|
|
439
|
+
// cleanupStaleLocks (sweep at dispatch start). Do NOT reintroduce a second
|
|
440
|
+
// threshold: the 10min sweep threshold vs this 60min hold semantics was the
|
|
441
|
+
// TTL-authority split that made a live TASK_1833 serial lock deletable.
|
|
442
|
+
const DISPATCH_LOCK_STALE_MS = 3600000; // 60 minutes
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* TASK_1838: THE staleness verdict for a dispatch-lock holder. Consumed by
|
|
446
|
+
* BOTH tryAcquireDispatchLock and dispatch-registry.cleanupStaleLocks -- do
|
|
447
|
+
* not inline a second age/pid check at a new call site (copy-the-check has
|
|
448
|
+
* recurred four times; see Decorative Guard sigil).
|
|
449
|
+
* pid:null holders (TASK_1833 sub-agent serial locks -- the dispatch CLI exits
|
|
450
|
+
* right after emitting params, so its pid proves nothing about the agent's
|
|
451
|
+
* liveness) are NEVER pidDead; only >=60min staleness or explicit post-merge
|
|
452
|
+
* release clears them.
|
|
453
|
+
* @param {object|null} holder - parsed lock-file JSON (null/corrupt => stale)
|
|
454
|
+
* @returns {{ stale: boolean, pidDead: boolean, ageMs: number }}
|
|
455
|
+
*/
|
|
456
|
+
function dispatchLockStaleness(holder) {
|
|
457
|
+
const ageMs = holder && holder.startedAt ? Date.now() - new Date(holder.startedAt).getTime() : Infinity;
|
|
458
|
+
const stale = !(ageMs < DISPATCH_LOCK_STALE_MS); // NaN/Infinity (corrupted/unreadable) => stale
|
|
459
|
+
const pidDead = !!(holder && holder.pid && !_pidAlive(holder.pid));
|
|
460
|
+
return { stale, pidDead, ageMs };
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* TASK_1833: single-attempt dispatch-lock acquisition shared by BOTH dispatch
|
|
465
|
+
* paths (formations.setupUnitWorktree serial loop + dispatch.js sub-agent
|
|
466
|
+
* serial_lock mode). Atomic create via wx flag; breaks stale (>60min),
|
|
467
|
+
* dead-pid, and corrupted-holder locks. Holders with pid:null (sub-agent
|
|
468
|
+
* locks -- the dispatch CLI exits immediately after emitting params, so its
|
|
469
|
+
* own pid proves nothing about the agent's liveness) are broken ONLY by
|
|
470
|
+
* staleness or explicit release (delete the lock file after merge).
|
|
471
|
+
* @param {string} lockFile - absolute lock file path (see dispatchLockPath)
|
|
472
|
+
* @param {object} meta - { sessionId, taskId, pid, holder? } -- startedAt is added here
|
|
473
|
+
* @returns {{ acquired: boolean, holder: object|null, broke?: object, brokeReason?: string, error?: Error }}
|
|
474
|
+
*/
|
|
475
|
+
function tryAcquireDispatchLock(lockFile, meta) {
|
|
476
|
+
const write = () => fs.writeFileSync(lockFile, JSON.stringify({
|
|
477
|
+
...meta,
|
|
478
|
+
startedAt: new Date().toISOString(),
|
|
479
|
+
}), { flag: 'wx' });
|
|
480
|
+
try { fs.mkdirSync(path.dirname(lockFile), { recursive: true }); } catch { /* exists */ }
|
|
481
|
+
try { write(); return { acquired: true, holder: null }; }
|
|
482
|
+
catch (e) {
|
|
483
|
+
if (e.code !== 'EEXIST') return { acquired: false, holder: null, error: e };
|
|
484
|
+
}
|
|
485
|
+
let holder = null;
|
|
486
|
+
try { holder = JSON.parse(fs.readFileSync(lockFile, 'utf8')); } catch { /* corrupted -- treated as stale below */ }
|
|
487
|
+
const { stale, pidDead } = dispatchLockStaleness(holder);
|
|
488
|
+
if (stale || pidDead) {
|
|
489
|
+
try { fs.unlinkSync(lockFile); } catch { /* racing breaker */ }
|
|
490
|
+
try {
|
|
491
|
+
write();
|
|
492
|
+
return { acquired: true, holder: null, broke: holder || {}, brokeReason: pidDead ? 'dead-holder' : 'stale' };
|
|
493
|
+
} catch { /* lost the re-acquire race -- report as held */ }
|
|
494
|
+
}
|
|
495
|
+
return { acquired: false, holder };
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* TASK_1775: Kill a spawned git process AND its children.
|
|
500
|
+
* On Windows, execSync/spawnSync timeout only closes pipes / kills the direct
|
|
501
|
+
* child; `git worktree add` checkout work can keep running in the background.
|
|
502
|
+
* taskkill /T /F takes the whole tree down by PID.
|
|
503
|
+
* @param {number|undefined} pid
|
|
504
|
+
*/
|
|
505
|
+
function killGitProcessTree(pid) {
|
|
506
|
+
if (!pid) return;
|
|
507
|
+
try {
|
|
508
|
+
if (process.platform === 'win32') {
|
|
509
|
+
spawnSync('taskkill', ['/T', '/F', '/PID', String(pid)], {
|
|
510
|
+
windowsHide: true, timeout: 10000, stdio: 'ignore',
|
|
511
|
+
});
|
|
512
|
+
} else {
|
|
513
|
+
process.kill(pid, 'SIGKILL');
|
|
514
|
+
}
|
|
515
|
+
} catch { /* already dead -- nothing to kill */ }
|
|
516
|
+
// Wait for the process to actually die and release file handles (max 3s).
|
|
517
|
+
// taskkill returns before handles are released; cleaning up immediately
|
|
518
|
+
// races the dying checkout and rmSync fails EBUSY, leaving the branch
|
|
519
|
+
// "checked out" in a half-deleted worktree.
|
|
520
|
+
const deadline = Date.now() + 3000;
|
|
521
|
+
while (Date.now() < deadline) {
|
|
522
|
+
try { process.kill(pid, 0); } catch { return; /* ESRCH -- gone */ }
|
|
523
|
+
const w = Date.now() + 100; while (Date.now() < w) {}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* TASK_1775: Delete a local branch ONLY if it has no unique commits vs baseRef.
|
|
529
|
+
* Never destroys a pre-existing user branch (or unmerged task work).
|
|
530
|
+
* @returns {boolean} true when the branch is gone (deleted or never existed)
|
|
531
|
+
*/
|
|
532
|
+
function deleteBranchIfSafe(projectRoot, branchName, baseRef) {
|
|
533
|
+
const opts = {
|
|
534
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
535
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
536
|
+
};
|
|
537
|
+
try {
|
|
538
|
+
execSync(`git rev-parse --verify --quiet "refs/heads/${branchName}"`, opts);
|
|
539
|
+
} catch { return true; /* branch doesn't exist -- nothing to delete */ }
|
|
540
|
+
try {
|
|
541
|
+
const unique = execSync(`git rev-list --count "${baseRef}..${branchName}"`, opts).trim();
|
|
542
|
+
if (unique !== '0') {
|
|
543
|
+
console.warn(` ⚠️ Branch ${branchName} has ${unique} unique commit(s) vs ${baseRef} — NOT deleting`);
|
|
544
|
+
return false;
|
|
545
|
+
}
|
|
546
|
+
execSync(`git branch -D "${branchName}"`, opts);
|
|
547
|
+
return true;
|
|
548
|
+
} catch { return false; /* verification/delete failed -- leave the branch alone */ }
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* TASK_2175: is `worktreePath` currently a REGISTERED git worktree of
|
|
553
|
+
* `projectRoot` (i.e. `git worktree list` knows about it right now)?
|
|
554
|
+
* This is the one signal that actually distinguishes "a live worktree
|
|
555
|
+
* something else may depend on" from "an orphaned directory nothing has
|
|
556
|
+
* registered" — directory existence (`fs.existsSync`) cannot tell the two
|
|
557
|
+
* apart, which is what let cleanupFailedWorktreeAttempt wrongly treat a
|
|
558
|
+
* dirty/abandoned leftover the same as a concurrent sibling's live worktree
|
|
559
|
+
* (TASK_1610/1611 guard) and refuse to ever reclaim it.
|
|
560
|
+
* Fails safe: any error (git missing, not a repo, etc.) returns true so the
|
|
561
|
+
* caller's destructive path stays closed rather than opening on uncertainty.
|
|
562
|
+
*/
|
|
563
|
+
function isRegisteredWorktree(projectRoot, worktreePath) {
|
|
564
|
+
try {
|
|
565
|
+
const out = execSync('git worktree list --porcelain', {
|
|
566
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
567
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
568
|
+
});
|
|
569
|
+
const targetKey = path.resolve(worktreePath);
|
|
570
|
+
const norm = (p) => process.platform === 'win32' ? p.toLowerCase() : p;
|
|
571
|
+
for (const line of out.split('\n')) {
|
|
572
|
+
if (!line.startsWith('worktree ')) continue;
|
|
573
|
+
const wt = path.resolve(line.slice('worktree '.length).trim());
|
|
574
|
+
if (norm(wt) === norm(targetKey)) return true;
|
|
575
|
+
}
|
|
576
|
+
return false;
|
|
577
|
+
} catch { return true; /* can't verify -- assume registered, stay conservative */ }
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/**
|
|
581
|
+
* TASK_1775: Clean the residue of a failed `git worktree add` attempt so the
|
|
582
|
+
* next retry doesn't die on 'branch already exists' or a stale partial dir.
|
|
583
|
+
* Order matters: rm partial dir -> prune metadata (releases the branch
|
|
584
|
+
* checkout claim) -> delete branch (guarded).
|
|
585
|
+
*/
|
|
586
|
+
function cleanupFailedWorktreeAttempt(projectRoot, worktreePath, branchName, baseRef, dirExistedBefore) {
|
|
587
|
+
// TASK_2175: `dirExistedBefore` alone used to gate this entirely ("only
|
|
588
|
+
// remove it when THIS attempt created it") — but that flag just means "did
|
|
589
|
+
// the path exist a moment ago", which is equally true for (a) a dirty
|
|
590
|
+
// leftover from an earlier, abandoned attempt at this SAME task_<id> path
|
|
591
|
+
// (ours to reclaim — nothing else uses this naming convention) and (b) a
|
|
592
|
+
// live sibling's worktree someone else may be mid-task on (never touch).
|
|
593
|
+
// `dirExistedBefore` cannot tell those apart; whether git itself still
|
|
594
|
+
// REGISTERS the path as a worktree can: an unregistered directory cannot be
|
|
595
|
+
// anyone's live worktree (git doesn't think anything is checked out there),
|
|
596
|
+
// so it is always safe to reclaim regardless of dirExistedBefore. A
|
|
597
|
+
// registered worktree is left untouched either way (TASK_1610/1611 guard).
|
|
598
|
+
const registered = isRegisteredWorktree(projectRoot, worktreePath);
|
|
599
|
+
// A killed-mid-add registration is LOCKED (.git/worktrees/<name>/locked) and
|
|
600
|
+
// git worktree prune NEVER prunes locked entries even with the dir gone --
|
|
601
|
+
// the branch stays "used by worktree". Unlock first; safe unconditionally
|
|
602
|
+
// since this exact path/branch naming convention (task_<id> / task/<id>)
|
|
603
|
+
// is ours alone -- no foreign process locks a path we constructed.
|
|
604
|
+
try {
|
|
605
|
+
execSync(`git worktree unlock "${worktreePath}"`, {
|
|
606
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
607
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
608
|
+
});
|
|
609
|
+
} catch { /* not locked / not registered */ }
|
|
610
|
+
if (!registered && fs.existsSync(worktreePath)) {
|
|
611
|
+
removeWorktree(projectRoot, worktreePath);
|
|
612
|
+
for (let i = 0; i < 5 && fs.existsSync(worktreePath); i++) {
|
|
613
|
+
try { fs.rmSync(worktreePath, { recursive: true, force: true }); } catch {}
|
|
614
|
+
if (fs.existsSync(worktreePath)) { const w = Date.now() + 400; while (Date.now() < w) {} }
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
try {
|
|
618
|
+
execSync('git worktree prune', {
|
|
619
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
620
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
621
|
+
});
|
|
622
|
+
} catch { /* prune failure is non-fatal */ }
|
|
623
|
+
deleteBranchIfSafe(projectRoot, branchName, baseRef);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Create a git worktree at the given path with a new branch.
|
|
628
|
+
* Deletes a stale same-named branch first (guarded -- see deleteBranchIfSafe).
|
|
629
|
+
* Includes .git/index.lock detection and retry with exponential backoff for Windows
|
|
630
|
+
* parallel-load resilience (ETIMEDOUT from competing git processes).
|
|
631
|
+
* TASK_1775: on timeout the spawned git process tree is killed, leftover
|
|
632
|
+
* branch/partial dir are cleaned between attempts, and the timeout is
|
|
633
|
+
* configurable (FORMATION_WORKTREE_TIMEOUT_MS / project.yaml worktree.timeout_ms).
|
|
634
|
+
* @param {string} projectRoot - Root of the git repo
|
|
635
|
+
* @param {string} worktreePath - Absolute path for the new worktree directory
|
|
636
|
+
* @param {string} branchName - New branch name for this worktree
|
|
637
|
+
*/
|
|
638
|
+
function createWorktree(projectRoot, worktreePath, branchName) {
|
|
639
|
+
const ts_start = Date.now();
|
|
640
|
+
const indexLock = path.join(projectRoot, '.git', 'index.lock');
|
|
641
|
+
const worktreeBranchCmd = 'git rev-parse --abbrev-ref HEAD';
|
|
642
|
+
const worktreeStatusCmd = 'git status --porcelain';
|
|
643
|
+
// TASK_1165: base from current branch HEAD, NOT origin/main.
|
|
644
|
+
// TASK_1180 verification: post-fix formation:feature dispatches TASK_1166..1172
|
|
645
|
+
// completed without reintroducing the stale-base worktree conflict pattern.
|
|
646
|
+
// origin/main may be 100+ commits behind the working branch (e.g. xyz951610)
|
|
647
|
+
// because we don't push feature work to main. Worktrees built from origin/main
|
|
648
|
+
// miss recent commits and produce massive rebase conflicts on completion.
|
|
649
|
+
// Detect current branch dynamically for cross-project safety.
|
|
650
|
+
let baseRef;
|
|
651
|
+
try {
|
|
652
|
+
baseRef = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
653
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 5000, windowsHide: true,
|
|
654
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
655
|
+
}).trim() || 'HEAD';
|
|
656
|
+
} catch {
|
|
657
|
+
baseRef = 'HEAD';
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
// Wait for .git/index.lock to clear (Windows parallel git lock contention)
|
|
661
|
+
const waitForIndexLock = (maxMs) => {
|
|
662
|
+
const deadline = Date.now() + maxMs;
|
|
663
|
+
while (fs.existsSync(indexLock) && Date.now() < deadline) {
|
|
664
|
+
const w = Date.now() + 200; while (Date.now() < w) {}
|
|
665
|
+
}
|
|
666
|
+
if (fs.existsSync(indexLock)) {
|
|
667
|
+
console.warn(` ⚠️ .git/index.lock still held after ${maxMs}ms — proceeding anyway`);
|
|
668
|
+
}
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
// Wait for any existing lock before branch cleanup
|
|
672
|
+
waitForIndexLock(15000);
|
|
673
|
+
|
|
674
|
+
if (fs.existsSync(worktreePath)) {
|
|
675
|
+
try {
|
|
676
|
+
const existingBranch = execSync(worktreeBranchCmd, {
|
|
677
|
+
cwd: worktreePath, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
678
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
679
|
+
}).trim();
|
|
680
|
+
const existingStatus = execSync(worktreeStatusCmd, {
|
|
681
|
+
cwd: worktreePath, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
682
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
683
|
+
}).trim();
|
|
684
|
+
if (existingBranch === branchName && !existingStatus) {
|
|
685
|
+
const duration = Date.now() - ts_start;
|
|
686
|
+
console.log(` Reusing clean worktree: ${worktreePath} (${duration}ms)`);
|
|
687
|
+
// TASK_2030: idempotent -- linkNodeModules skips links that already exist.
|
|
688
|
+
linkNodeModulesBestEffort(projectRoot, worktreePath);
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
} catch { /* existing path is not a reusable git worktree */ }
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// TASK_1775: a previous process crashed/killed mid-add can leave a LOCKED
|
|
695
|
+
// registration (.git/worktrees/<name>/locked) claiming branchName; prune
|
|
696
|
+
// skips locked entries, so unlock first or the branch stays undeletable.
|
|
697
|
+
try {
|
|
698
|
+
execSync(`git worktree unlock "${worktreePath}"`, {
|
|
699
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
700
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
701
|
+
});
|
|
702
|
+
} catch { /* not locked / not registered */ }
|
|
703
|
+
try {
|
|
704
|
+
execSync('git worktree prune', {
|
|
705
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
706
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
707
|
+
});
|
|
708
|
+
} catch { /* prune failure is non-fatal */ }
|
|
709
|
+
|
|
710
|
+
// Clean up stale branch from a previous failed attempt.
|
|
711
|
+
// TASK_1775: guarded -- a branch with unique commits vs baseRef (unmerged
|
|
712
|
+
// work or a pre-existing user branch) is never force-deleted.
|
|
713
|
+
const branchDeleted = deleteBranchIfSafe(projectRoot, branchName, baseRef);
|
|
714
|
+
|
|
715
|
+
// TASK_2067: the branch survived the guard above (it has unique commits vs
|
|
716
|
+
// baseRef -- e.g. a cancelled cross-project task resumed: its worktree dir
|
|
717
|
+
// was removed but the branch with its committed work was correctly left
|
|
718
|
+
// alone) while the worktree PATH itself does not exist (checked above --
|
|
719
|
+
// if it existed we would have returned via the reuse-clean-worktree path).
|
|
720
|
+
// Without this, `git worktree add -b branchName` below dies on "a branch
|
|
721
|
+
// named '<branchName>' already exists" on every retry, and the caller
|
|
722
|
+
// (dispatch.js) degrades to serial_lock -- exactly the unserialized
|
|
723
|
+
// shared-tree risk this isolation path exists to prevent (field report
|
|
724
|
+
// ce1d12b6, TASK_1055). Attach the worktree to the EXISTING branch instead
|
|
725
|
+
// (no -b). Decision: never auto-merge baseRef into the reused branch --
|
|
726
|
+
// only report divergence -- so a resumed task's history is never rewritten
|
|
727
|
+
// without the operator seeing it. A branch genuinely checked out in another
|
|
728
|
+
// worktree still fails here (git surfaces "already checked out") and falls
|
|
729
|
+
// through to the normal create/retry loop below, whose existing error
|
|
730
|
+
// propagation is the correct outcome for that genuine failure.
|
|
731
|
+
if (!branchDeleted && !fs.existsSync(worktreePath)) {
|
|
732
|
+
const reuseTimeoutMs = readWorktreeConfig(projectRoot).timeoutMs;
|
|
733
|
+
const r = spawnSync('git', ['worktree', 'add', worktreePath, branchName], {
|
|
734
|
+
cwd: projectRoot, encoding: 'utf8', timeout: reuseTimeoutMs, windowsHide: true,
|
|
735
|
+
});
|
|
736
|
+
if (!r.error && r.status === 0) {
|
|
737
|
+
const duration = Date.now() - ts_start;
|
|
738
|
+
console.log(` ♻️ Reused existing branch '${branchName}' for worktree (${duration}ms)`);
|
|
739
|
+
let divergence = null;
|
|
740
|
+
try {
|
|
741
|
+
const counts = execSync(`git rev-list --left-right --count "${baseRef}...${branchName}"`, {
|
|
742
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
743
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
744
|
+
}).trim().split(/\s+/).map(Number);
|
|
745
|
+
divergence = { behind: counts[0] || 0, ahead: counts[1] || 0 };
|
|
746
|
+
if (divergence.behind > 0) {
|
|
747
|
+
console.warn(` ⚠️ Reused branch '${branchName}' is ${divergence.behind} commit(s) behind ${baseRef} (${divergence.ahead} ahead of it) -- NOT auto-merged; merge manually if needed.`);
|
|
748
|
+
}
|
|
749
|
+
} catch { /* best-effort divergence report only -- never fails the reuse */ }
|
|
750
|
+
linkNodeModulesBestEffort(projectRoot, worktreePath);
|
|
751
|
+
return { reusedBranch: true, divergence };
|
|
752
|
+
}
|
|
753
|
+
const errLines = (r.error ? r.error.message : (r.stderr || `git exited ${r.status}`))
|
|
754
|
+
.toString().trim().split('\n');
|
|
755
|
+
const errLine = errLines.find(l => l.includes('fatal:')) || errLines[0];
|
|
756
|
+
console.warn(` ⚠️ Could not attach worktree to existing branch '${branchName}' (${errLine}) — falling back to normal creation, which will surface this as a genuine failure.`);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
// F1: Remove stale worktree directory if it exists and is empty (or only has a .git pointer file).
|
|
760
|
+
// git worktree add refuses to create a worktree into a pre-existing directory, even if empty.
|
|
761
|
+
if (fs.existsSync(worktreePath)) {
|
|
762
|
+
const entries = fs.readdirSync(worktreePath).filter(e => e !== '.git');
|
|
763
|
+
if (entries.length === 0) {
|
|
764
|
+
fs.rmSync(worktreePath, { recursive: true, force: true });
|
|
765
|
+
console.log(` 🗑️ Removed stale empty worktree directory: ${worktreePath}`);
|
|
766
|
+
} else {
|
|
767
|
+
console.warn(` ⚠️ Worktree directory exists and has files — skipping removal: ${worktreePath}`);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
// Retry with exponential backoff: 3 retries at 2s, 4s, 8s
|
|
772
|
+
// TASK_1775: configurable timeout + orphan-git kill + per-attempt cleanup.
|
|
773
|
+
const timeoutMs = readWorktreeConfig(projectRoot).timeoutMs;
|
|
774
|
+
const retryDelays = [2000, 4000, 8000];
|
|
775
|
+
// TASK_2175: captured ONCE, before attempt 0 — NOT re-read every iteration.
|
|
776
|
+
// Bug this fixes: the old code re-ran `fs.existsSync(worktreePath)` inside
|
|
777
|
+
// the loop on every attempt, so if attempt 0's own cleanup left residue
|
|
778
|
+
// behind (a Windows file-lock stopping `removeWorktree`/`fs.rmSync` from
|
|
779
|
+
// fully clearing the dir — routine on this platform, see the retry/backoff
|
|
780
|
+
// scaffolding throughout this file), attempt 1 saw an "existing" dir and
|
|
781
|
+
// treated it as a pre-existing foreign worktree to leave alone, permanently
|
|
782
|
+
// poisoning cleanupFailedWorktreeAttempt for every remaining retry with the
|
|
783
|
+
// SAME "already exists" / "branch already exists" failure (measured,
|
|
784
|
+
// TASK_2175 repro: a single dirty leftover worktree dir makes all 4 attempts
|
|
785
|
+
// fail identically with zero progress). "Did this call start from a clean
|
|
786
|
+
// target" is decided once, from the state before we did anything.
|
|
787
|
+
const dirExistedBefore = fs.existsSync(worktreePath);
|
|
788
|
+
let lastErr;
|
|
789
|
+
for (let attempt = 0; attempt <= retryDelays.length; attempt++) {
|
|
790
|
+
if (attempt > 0) waitForIndexLock(10000);
|
|
791
|
+
// F2: Prune zombie .git/worktrees/ metadata before each attempt.
|
|
792
|
+
// If a previous worktree dir was deleted without `git worktree remove`, its metadata
|
|
793
|
+
// remains in .git/worktrees/ and causes "already checked out" errors on re-creation.
|
|
794
|
+
// git worktree prune is idempotent and fast (<100ms).
|
|
795
|
+
try {
|
|
796
|
+
execSync('git worktree prune', {
|
|
797
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
798
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
799
|
+
});
|
|
800
|
+
} catch { /* prune failure is non-fatal */ }
|
|
801
|
+
// TASK_1165: no fetch needed — base from local current branch HEAD.
|
|
802
|
+
// Removed `git fetch origin main` block from TASK_1152 since baseRef is no
|
|
803
|
+
// longer origin/main. Local current branch is always up to date.
|
|
804
|
+
// TASK_1775: spawnSync (not execSync) so the child PID is available — on
|
|
805
|
+
// ETIMEDOUT Windows only closes the pipes while the orphan git keeps
|
|
806
|
+
// checking out in the background; we must taskkill the tree by PID.
|
|
807
|
+
const r = spawnSync('git', ['worktree', 'add', worktreePath, '-b', branchName, baseRef], {
|
|
808
|
+
cwd: projectRoot, encoding: 'utf8', timeout: timeoutMs, windowsHide: true,
|
|
809
|
+
});
|
|
810
|
+
if (!r.error && r.status === 0) {
|
|
811
|
+
const duration = Date.now() - ts_start;
|
|
812
|
+
console.log(` ⏱️ Worktree created in ${duration}ms (attempt ${attempt + 1}, timeout ${timeoutMs}ms)`);
|
|
813
|
+
// TASK_2030: provision node_modules so the dispatched agent doesn't hand-junction it.
|
|
814
|
+
linkNodeModulesBestEffort(projectRoot, worktreePath);
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
const errLines = (r.error ? r.error.message : (r.stderr || `git exited ${r.status}`))
|
|
818
|
+
.toString().trim().split('\n');
|
|
819
|
+
const errLine = errLines.find(l => l.includes('fatal:')) || errLines[0];
|
|
820
|
+
lastErr = r.error || new Error(`git worktree add failed: ${errLine}`);
|
|
821
|
+
// Timeout / spawn error -> the git process tree may still be alive
|
|
822
|
+
if (r.error) killGitProcessTree(r.pid);
|
|
823
|
+
// Clean leftover branch + partial dir so the next attempt starts fresh
|
|
824
|
+
// instead of dying on 'branch already exists'.
|
|
825
|
+
cleanupFailedWorktreeAttempt(projectRoot, worktreePath, branchName, baseRef, dirExistedBefore);
|
|
826
|
+
if (attempt < retryDelays.length) {
|
|
827
|
+
const delay = retryDelays[attempt];
|
|
828
|
+
console.warn(` ⚠️ Worktree attempt ${attempt + 1} failed: ${errLine}`);
|
|
829
|
+
console.warn(` Retrying in ${delay / 1000}s...`);
|
|
830
|
+
const w = Date.now() + delay; while (Date.now() < w) {}
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
const duration = Date.now() - ts_start;
|
|
835
|
+
console.warn(` ❌ Worktree creation failed after ${retryDelays.length + 1} attempts (${duration}ms)`);
|
|
836
|
+
throw lastErr;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* Remove a git worktree with retry logic (Windows PDB/lock contention).
|
|
841
|
+
* Falls back to `git worktree prune` on total failure.
|
|
842
|
+
* @param {string} projectRoot
|
|
843
|
+
* @param {string} worktreePath
|
|
844
|
+
* @param {number} [maxRetries=3]
|
|
845
|
+
* @returns {boolean} true if removed successfully
|
|
846
|
+
*/
|
|
847
|
+
function removeWorktree(projectRoot, worktreePath, maxRetries = 3) {
|
|
848
|
+
// TASK_1844/TASK_2030: MUST run before any `git worktree remove` -- Git for
|
|
849
|
+
// Windows recurses through a node_modules junction/symlink on removal and
|
|
850
|
+
// empties the link target (the main checkout's node_modules).
|
|
851
|
+
unlinkNodeModulesBestEffort(worktreePath);
|
|
852
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
853
|
+
try {
|
|
854
|
+
execSync(`git worktree remove --force "${worktreePath}"`, {
|
|
855
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 30000, windowsHide: true,
|
|
856
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
857
|
+
});
|
|
858
|
+
return true;
|
|
859
|
+
} catch {
|
|
860
|
+
if (i < maxRetries - 1) {
|
|
861
|
+
// Wait 1s before retry — Windows PDB lock typically releases within 1-2s
|
|
862
|
+
const wait = Date.now() + 1000;
|
|
863
|
+
while (Date.now() < wait) {}
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
// Last resort: prune stale .git/worktrees/ entries
|
|
868
|
+
try {
|
|
869
|
+
execSync('git worktree prune', {
|
|
870
|
+
cwd: projectRoot, encoding: 'utf8', timeout: 10000, windowsHide: true,
|
|
871
|
+
stdio: 'ignore'
|
|
872
|
+
});
|
|
873
|
+
} catch {}
|
|
874
|
+
return false;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Ensure `.formation/worktrees/` is listed in .gitignore.
|
|
879
|
+
* Prevents orphaned worktree files from appearing in `git status`.
|
|
880
|
+
* Idempotent — no-op if the entry already exists.
|
|
881
|
+
* @param {string} projectRoot
|
|
882
|
+
*/
|
|
883
|
+
function ensureWorktreeDirIgnored(projectRoot) {
|
|
884
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
885
|
+
const worktreeLine = '.formation/worktrees/';
|
|
886
|
+
try {
|
|
887
|
+
const content = fs.existsSync(gitignorePath) ? fs.readFileSync(gitignorePath, 'utf8') : '';
|
|
888
|
+
if (!content.includes(worktreeLine)) {
|
|
889
|
+
fs.appendFileSync(gitignorePath, `\n# Formation worktrees (parallel agent isolation)\n${worktreeLine}\n`, 'utf8');
|
|
890
|
+
}
|
|
891
|
+
} catch { /* best-effort — non-fatal */ }
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
/**
|
|
895
|
+
* Read and parse .kenaz/dashboard-models.json for the given project.
|
|
896
|
+
* Returns null if the file is absent or unparseable.
|
|
897
|
+
* @param {string|null} projectPath
|
|
898
|
+
* @returns {object|null}
|
|
899
|
+
*/
|
|
900
|
+
function readDashboardModels(projectPath) {
|
|
901
|
+
const modelsPath = path.join(projectPath || ROOT, '.kenaz', 'dashboard-models.json');
|
|
902
|
+
try {
|
|
903
|
+
if (!fs.existsSync(modelsPath)) return null;
|
|
904
|
+
return JSON.parse(fs.readFileSync(modelsPath, 'utf-8'));
|
|
905
|
+
} catch { return null; }
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* TASK_2249: candidate-chain loader — project file first, then core (ROOT);
|
|
910
|
+
* the FIRST parseable file wins and is returned whole, so no field is ever
|
|
911
|
+
* mixed across two dashboard-models.json files. Null when none parses.
|
|
912
|
+
* @param {string|null} projectPath
|
|
913
|
+
* @returns {object|null}
|
|
914
|
+
*/
|
|
915
|
+
function loadDashboardModels(projectPath) {
|
|
916
|
+
const candidates = projectPath ? [projectPath, ROOT] : [ROOT];
|
|
917
|
+
for (const candidate of candidates) {
|
|
918
|
+
const parsed = readDashboardModels(candidate);
|
|
919
|
+
if (parsed) return parsed;
|
|
920
|
+
}
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
// TASK_1957: telemetry/daemon-noise paths that must never be swept into a task
|
|
925
|
+
// commit by a blanket `git add -A` run inside an isolated worktree (Formation
|
|
926
|
+
// unit worktree OR cross-project target_repo_worktree — dispatch.js). Root
|
|
927
|
+
// cause of esp32 TASK_82/83: the sub-project's .kenaz/ and .formation/ are
|
|
928
|
+
// tracked (only .kenaz/tasks + .kenaz/logs are gitignored), so `git add -A`
|
|
929
|
+
// staged canary session files, progress notes, daemon state, and dispatch
|
|
930
|
+
// telemetry into the task branch. Merging that branch into the sub-project's
|
|
931
|
+
// main then collided with main's own LIVE copies of those same paths
|
|
932
|
+
// ("local changes would be overwritten" / "untracked working tree files
|
|
933
|
+
// would be overwritten").
|
|
934
|
+
//
|
|
935
|
+
// This list runs CLIENT-SIDE, at staging time, before any commit exists —
|
|
936
|
+
// excluding here is strictly stronger than the post-merge unstage/revert
|
|
937
|
+
// defenses in post-complete.js (daemon-manifest.yaml + getDaemonPathsToUnstage
|
|
938
|
+
// + revertDaemonManagedFiles), which only clean up AFTER the noise is already
|
|
939
|
+
// staged/committed and only cover paths enumerated in that manifest. Kept
|
|
940
|
+
// deliberately coarse (whole directories, not the manifest's per-file list)
|
|
941
|
+
// since it has to be a short, readable pathspec embedded in a dispatch
|
|
942
|
+
// prompt's shell command line, not a manifest lookup.
|
|
943
|
+
// A task that legitimately needs to edit a file under one of these
|
|
944
|
+
// directories (e.g. daemon-manifest.yaml itself) must stage it explicitly
|
|
945
|
+
// (`git add <path>`) rather than relying on the blanket `-A` step.
|
|
946
|
+
const WORKTREE_COMMIT_EXCLUDE_PATHSPECS = [
|
|
947
|
+
':!.kenaz/sessions',
|
|
948
|
+
':!.kenaz/specialist',
|
|
949
|
+
':!.formation/.dispatch-branch',
|
|
950
|
+
':!.formation/analytics',
|
|
951
|
+
// Live channel heartbeat writer appends here continuously; swept into
|
|
952
|
+
// TASK_1977 and TASK_1979 commits before this exclusion was added.
|
|
953
|
+
':!.kenaz/channel_heartbeats.jsonl',
|
|
954
|
+
];
|
|
955
|
+
|
|
956
|
+
/**
|
|
957
|
+
* Args (without the leading `git `) for an `add -A` that stages everything
|
|
958
|
+
* EXCEPT the telemetry paths in WORKTREE_COMMIT_EXCLUDE_PATHSPECS, using
|
|
959
|
+
* git's pathspec-exclude magic (`add -A -- . ":!path"`). Use this form when
|
|
960
|
+
* invoking through a wrapper that already prepends `git ` (e.g. git-merge.js's
|
|
961
|
+
* `git(cmd, opts)`).
|
|
962
|
+
*
|
|
963
|
+
* Double quotes, not single quotes (GEN-009 cross-platform): this string is
|
|
964
|
+
* embedded verbatim in a dispatch prompt's shell command line (POSIX sh/bash
|
|
965
|
+
* on the agent side) AND passed straight to Node's execSync (cmd.exe argv
|
|
966
|
+
* parsing on Windows — post-complete.js's own recovery-commit path runs this
|
|
967
|
+
* way). Double quotes are honored as a single argv token by both; a bare
|
|
968
|
+
* single quote is not special to cmd.exe and would reach git literally.
|
|
969
|
+
* @returns {string}
|
|
970
|
+
*/
|
|
971
|
+
function buildWorktreeGitAddArgs() {
|
|
972
|
+
const excludes = WORKTREE_COMMIT_EXCLUDE_PATHSPECS.map((p) => `"${p}"`).join(' ');
|
|
973
|
+
return `add -A -- . ${excludes}`;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* Build a full `git add -A` shell command line that stages everything EXCEPT
|
|
978
|
+
* the telemetry paths in WORKTREE_COMMIT_EXCLUDE_PATHSPECS. Intended for use
|
|
979
|
+
* inside an ISOLATED worktree only (Formation unit worktree / cross-project
|
|
980
|
+
* target_repo_worktree) — a shared working tree must keep using explicit-paths
|
|
981
|
+
* staging instead.
|
|
982
|
+
* @returns {string} shell command line (no trailing `&&`/`;`)
|
|
983
|
+
*/
|
|
984
|
+
function buildWorktreeGitAddCommand() {
|
|
985
|
+
return `git ${buildWorktreeGitAddArgs()}`;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
module.exports = {
|
|
989
|
+
ROOT,
|
|
990
|
+
FORMATION_DIR,
|
|
991
|
+
COLLABORATION_API,
|
|
992
|
+
LOG_DIR,
|
|
993
|
+
getLogDir,
|
|
994
|
+
generateSessionId,
|
|
995
|
+
detectGitBash,
|
|
996
|
+
detectClaudeCmd,
|
|
997
|
+
pickClaudeFromWhere,
|
|
998
|
+
getClaudeEnv,
|
|
999
|
+
ensureGitReady,
|
|
1000
|
+
preserveUntrackedStashCommand,
|
|
1001
|
+
createWorktree,
|
|
1002
|
+
removeWorktree,
|
|
1003
|
+
isRegisteredWorktree,
|
|
1004
|
+
ensureWorktreeDirIgnored,
|
|
1005
|
+
readWorktreeConfig,
|
|
1006
|
+
resolveWorktreeDecision,
|
|
1007
|
+
parseVerifyOfflineFromYaml,
|
|
1008
|
+
getVerifyOfflineCommand,
|
|
1009
|
+
dispatchLockPath,
|
|
1010
|
+
DISPATCH_LOCK_STALE_MS,
|
|
1011
|
+
dispatchLockStaleness,
|
|
1012
|
+
tryAcquireDispatchLock,
|
|
1013
|
+
readDashboardModels,
|
|
1014
|
+
loadDashboardModels,
|
|
1015
|
+
linkNodeModulesBestEffort,
|
|
1016
|
+
unlinkNodeModulesBestEffort,
|
|
1017
|
+
WORKTREE_COMMIT_EXCLUDE_PATHSPECS,
|
|
1018
|
+
buildWorktreeGitAddCommand,
|
|
1019
|
+
buildWorktreeGitAddArgs,
|
|
1020
|
+
};
|