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,1232 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* worktree-create.js — Claude Code `WorktreeCreate` hook.
|
|
6
|
+
*
|
|
7
|
+
* PROBLEM (TASK_1586): The Agent/Task tool's `isolation: "worktree"` creates the
|
|
8
|
+
* isolated worktree from the SESSION cwd's git repo. In production the Kenaz
|
|
9
|
+
* dashboard launches the interactive session with cwd = kenaz-core (a bundled
|
|
10
|
+
* file COPY — NOT a git checkout), while the user's actual project is a separate
|
|
11
|
+
* git repo. The harness then fails: "not in a git repository".
|
|
12
|
+
*
|
|
13
|
+
* FIX: when configured as a WorktreeCreate hook, the harness DELEGATES worktree
|
|
14
|
+
* creation entirely to this script (it no longer runs `git worktree add` itself).
|
|
15
|
+
* This script:
|
|
16
|
+
* - Branch 1 (dev / same-repo): session cwd IS a git repo → create the worktree
|
|
17
|
+
* in that repo at the harness-proposed path (faithful passthrough).
|
|
18
|
+
* - Branch 2 (production): session cwd is NOT a git repo → resolve the active
|
|
19
|
+
* project from ~/.kenaz/projects.json (same source as Rust get_current_project)
|
|
20
|
+
* and create the worktree inside THAT git repo.
|
|
21
|
+
* - No git target resolvable → exit non-zero with a readable message so the
|
|
22
|
+
* dispatch degrades cleanly instead of surfacing a raw harness error.
|
|
23
|
+
*
|
|
24
|
+
* Contract (code.claude.com/docs hooks.md):
|
|
25
|
+
* stdin JSON: { session_id, transcript_path, cwd, hook_event_name,
|
|
26
|
+
* worktree_path (proposed, ignorable), isolation_reason }
|
|
27
|
+
* env: CLAUDE_PROJECT_DIR, CLAUDE_SESSION_ID
|
|
28
|
+
* stdout: the chosen worktree path (exit 0). Path is fully hook-controlled
|
|
29
|
+
* and MAY live in a different git repo than cwd.
|
|
30
|
+
* non-zero: blocks worktree creation.
|
|
31
|
+
*
|
|
32
|
+
* Cross-platform (GEN-009): pure node + git CLI, path.join, no shell.
|
|
33
|
+
*
|
|
34
|
+
* Hardening history:
|
|
35
|
+
* TASK_1586 -- Branch 2 production redirect (non-git cwd -> projects.json target)
|
|
36
|
+
* TASK_1639 -- remove --force idempotency removed; uniquify loop added
|
|
37
|
+
* TASK_1647 -- longpaths flag; failed-add rollback; lock-resilient GC; shorter paths
|
|
38
|
+
* TASK_1777 -- sibling placement OUTSIDE the repo tree: the harness worktree-
|
|
39
|
+
* isolation guard denies Edit/Write on any path under the shared
|
|
40
|
+
* checkout; a worktree nested at <repo>/.formation/worktrees/wt-*
|
|
41
|
+
* is entirely inside the shared checkout, so isolated agents could
|
|
42
|
+
* not use Edit/Write at all (absolute fwd/back-slash AND relative
|
|
43
|
+
* path forms all denied — verified empirically in TASK_1777).
|
|
44
|
+
* TASK_1827 -- landed-marker GC: ancestry / patch-equivalence inference is
|
|
45
|
+
* PROVEN WRONG on a known-answer control (ansuz-wt-68ed9c57-12936
|
|
46
|
+
* was file-scoped-checkout merged and fully verified, yet both
|
|
47
|
+
* `git cherry` and `merge-base --is-ancestor` still reported it
|
|
48
|
+
* unmerged — file-scoped checkout + fresh commit changes the
|
|
49
|
+
* patch-id parent context, and ancestry never held to begin
|
|
50
|
+
* with). The merger is the only party that KNOWS the work landed,
|
|
51
|
+
* so the merger records it: post-complete writes a landed marker
|
|
52
|
+
* on verified merge success, and the main thread's manual
|
|
53
|
+
* file-scoped merges use `mark-landed` (CLI below). GC reclaims
|
|
54
|
+
* ONLY worktrees with a landed marker — no inference, no bypass.
|
|
55
|
+
*
|
|
56
|
+
* CLI subcommands (TASK_1827/TASK_1876; no args = normal WorktreeCreate hook mode):
|
|
57
|
+
* node .claude/hooks/worktree-create.js mark-landed <wt-name|path|branch> [--task TASK_X] [--repo <path>] [--by <who>]
|
|
58
|
+
* node .claude/hooks/worktree-create.js gc [--dry-run] [--repo <path>]
|
|
59
|
+
* node .claude/hooks/worktree-create.js gc --review [--repo <path>]
|
|
60
|
+
* node .claude/hooks/worktree-create.js gc --approve <wt-name...> | --approve --all [--repo <path>]
|
|
61
|
+
*
|
|
62
|
+
* TASK_1876 — the automatic half of the contract above now actually runs:
|
|
63
|
+
* post-complete's direct-commit fast-path (the dominant merge-confirmation
|
|
64
|
+
* point under subagent-default dispatch) calls appendLandedMarker with
|
|
65
|
+
* via=post-complete-direct-commit; gc reports a `marker-starved: N` stderr
|
|
66
|
+
* count on every run; gc --review/--approve give the backlog an
|
|
67
|
+
* evidence-based batch path that reclaims through this same GC (never a
|
|
68
|
+
* second deletion implementation).
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
const fs = require('fs');
|
|
72
|
+
const path = require('path');
|
|
73
|
+
const os = require('os');
|
|
74
|
+
const { execFileSync } = require('child_process');
|
|
75
|
+
// TASK_2057: shared __kenaz_core__ token resolver (same file, no cross-dir
|
|
76
|
+
// require needed here -- ansuz-boot-fast.js reaches this same module from
|
|
77
|
+
// .specialist/tools/).
|
|
78
|
+
const { resolveVirtualPath } = require('./core-resolve.js');
|
|
79
|
+
// TASK_2163: chart files are keyed by project identity + task id. Loaded
|
|
80
|
+
// lazily and guarded (Ansuz review): this hook also runs from the installed
|
|
81
|
+
// kenaz-core copy, and a load failure at module scope would break EVERY
|
|
82
|
+
// worktree creation over a cleanup heuristic.
|
|
83
|
+
function chartReadPath(repo, id) {
|
|
84
|
+
try {
|
|
85
|
+
return require('../../.specialist/tools/lib/chart-path.js').getChartReadPath(id, { projectPath: repo });
|
|
86
|
+
} catch {
|
|
87
|
+
return path.join(repo, '.specialist', 'sessions', 'chart_' + id + '.json');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function readStdin() {
|
|
92
|
+
try { return fs.readFileSync(0, 'utf8'); } catch { return ''; }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Run a git command in `repo`.
|
|
97
|
+
* Always passes `-c core.longpaths=true` so Windows long-path checkouts work
|
|
98
|
+
* on repos that have not set core.longpaths globally. On macOS/Linux the flag is
|
|
99
|
+
* a no-op (GEN-009). We do NOT write to any git config file here.
|
|
100
|
+
*/
|
|
101
|
+
function git(repo, args) {
|
|
102
|
+
return execFileSync('git', ['-C', repo, '-c', 'core.longpaths=true', ...args], {
|
|
103
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
104
|
+
}).toString().trim();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function isGitRepo(dir) {
|
|
108
|
+
if (!dir) return false;
|
|
109
|
+
try {
|
|
110
|
+
return execFileSync('git', ['-C', dir, 'rev-parse', '--is-inside-work-tree'], {
|
|
111
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
112
|
+
}).toString().trim() === 'true';
|
|
113
|
+
} catch { return false; }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function gitTopLevel(dir) {
|
|
117
|
+
try { return git(dir, ['rev-parse', '--show-toplevel']); } catch { return null; }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Resolve the active project's git repo from ~/.kenaz/projects.json (mirrors Rust get_current_project). */
|
|
121
|
+
function resolveTargetRepo() {
|
|
122
|
+
try {
|
|
123
|
+
const home = process.env.HOME || os.homedir();
|
|
124
|
+
const raw = fs.readFileSync(path.join(home, '.kenaz', 'projects.json'), 'utf8');
|
|
125
|
+
const pj = JSON.parse(raw);
|
|
126
|
+
const proj = (pj.projects || []).find((p) => p.id === pj.currentProjectId);
|
|
127
|
+
// TASK_2057: the core entry's path is the literal token "__kenaz_core__",
|
|
128
|
+
// not a real path (dev/PROJECT_REGISTRY_DUPLICATE_ASSESSMENT.md) --
|
|
129
|
+
// resolve it before probing isGitRepo, or this always failed for core.
|
|
130
|
+
const resolvedPath = proj && proj.path ? resolveVirtualPath(proj.path) : null;
|
|
131
|
+
if (resolvedPath && isGitRepo(resolvedPath)) return gitTopLevel(resolvedPath);
|
|
132
|
+
} catch { /* fall through */ }
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Garbage-collect stale sibling agent worktrees in BOTH base dirs:
|
|
138
|
+
* - sibling (current, TASK_1777): <repoParent>/.kenaz-worktrees/<repoName>
|
|
139
|
+
* - legacy in-repo (pre-TASK_1777 husks): <repo>/.formation/worktrees
|
|
140
|
+
*
|
|
141
|
+
* The harness does NOT reliably fire WorktreeRemove on subagent completion when a
|
|
142
|
+
* WorktreeCreate hook is configured (observed: worktree persists post-completion),
|
|
143
|
+
* so worktrees would otherwise accumulate across sessions. This sweep bounds that.
|
|
144
|
+
*
|
|
145
|
+
* TASK_1826: two GC-eligible naming families (anything else — e.g. squad
|
|
146
|
+
* `<sessionId>-<memberId>` detached worktrees — is never touched):
|
|
147
|
+
* wt-<sid8>-<pid> → branch ansuz-wt-<sid8>-<pid> (Agent tool, this hook)
|
|
148
|
+
* task_<taskid> → branch task/<taskid> (Formation setupUnitWorktree)
|
|
149
|
+
* Branch derivation differs per family; never apply one family's string
|
|
150
|
+
* surgery to the other.
|
|
151
|
+
*
|
|
152
|
+
* SAFETY (TASK_1827 — reclaim is a strict CONJUNCTION, no bypass):
|
|
153
|
+
* A sibling is removed ONLY when ALL hold:
|
|
154
|
+
* - it is not the worktree we are about to (re)create (keepPath),
|
|
155
|
+
* - its directory mtime is older than GC_MIN_AGE_MS (won't touch a concurrently
|
|
156
|
+
* live session's fresh worktree). NEVER shorten this — it is the only guard
|
|
157
|
+
* against deleting a live concurrent session's worktree,
|
|
158
|
+
* - it has a LANDED MARKER in the ledger (written by post-complete on verified
|
|
159
|
+
* merge success, or by the `mark-landed` CLI after a manual file-scoped
|
|
160
|
+
* merge). Missing marker → ALWAYS kept, with a diagnostic. Ancestry /
|
|
161
|
+
* patch-equivalence inference is NOT used: both were disproven on a
|
|
162
|
+
* known-answer control (see file header),
|
|
163
|
+
* - if the branch still exists, its tip matches the tip recorded in the
|
|
164
|
+
* marker (commits made AFTER the landing were never verified → keep),
|
|
165
|
+
* - it has no uncommitted change outside the daemon-noise allowlist —
|
|
166
|
+
* evaluated ONLY when the directory is a FUNCTIONING standalone worktree
|
|
167
|
+
* (its `rev-parse --show-toplevel` resolves to itself). A husk whose .git
|
|
168
|
+
* link is already gone resolves to the PARENT repo (or errors on a pruned
|
|
169
|
+
* gitdir), so its porcelain would describe the wrong tree entirely
|
|
170
|
+
* (TASK_1826); a husk cannot host a live agent, so with a landed marker it
|
|
171
|
+
* is reclaimable as-is.
|
|
172
|
+
* Every keep decision emits a stderr diagnostic naming the condition and the
|
|
173
|
+
* file(s) responsible — silent retention left users unable to see why 19 of
|
|
174
|
+
* 21 worktrees never collected.
|
|
175
|
+
*/
|
|
176
|
+
const GC_MIN_AGE_MS = 2 * 60 * 60 * 1000; // 2h
|
|
177
|
+
|
|
178
|
+
// ── TASK_1827: landed-marker ledger ─────────────────────────────────────────
|
|
179
|
+
// Format: append-only JSONL, one entry per landing event:
|
|
180
|
+
// { v:1, branch, worktree, task, tip, via, by, at }
|
|
181
|
+
// WHY THIS FORM (over the alternatives):
|
|
182
|
+
// - vs in-worktree marker file: dies with the worktree (no audit trail),
|
|
183
|
+
// dirties the worktree's porcelain, and is unreachable on husks / the
|
|
184
|
+
// worktree_missing post-complete path.
|
|
185
|
+
// - vs git refs (refs/kenaz-landed/*): not hand-editable, needs git plumbing
|
|
186
|
+
// to inspect/revoke, and cannot carry who/why/when metadata legibly.
|
|
187
|
+
// - JSONL in-repo: human-readable, greppable, revocable by deleting a line,
|
|
188
|
+
// survives worktree deletion, readable with zero infrastructure (no
|
|
189
|
+
// dashboard). Located under .formation/worktrees/ which is wholesale
|
|
190
|
+
// gitignored (line ".formation/worktrees/"), so the ledger itself never
|
|
191
|
+
// shows up as git-status noise — the exact failure mode this card fights.
|
|
192
|
+
function landedLedgerPath(repo) {
|
|
193
|
+
return path.join(repo, '.formation', 'worktrees', 'landed-ledger.jsonl');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function appendLandedMarker(repo, { branch, worktree, task, tip, via, by }) {
|
|
197
|
+
const entry = {
|
|
198
|
+
v: 1,
|
|
199
|
+
branch: branch || null,
|
|
200
|
+
worktree: worktree || null,
|
|
201
|
+
task: task || null,
|
|
202
|
+
tip: tip || null,
|
|
203
|
+
via: via || 'unknown',
|
|
204
|
+
by: by || null,
|
|
205
|
+
at: new Date().toISOString(),
|
|
206
|
+
};
|
|
207
|
+
const ledger = landedLedgerPath(repo);
|
|
208
|
+
fs.mkdirSync(path.dirname(ledger), { recursive: true });
|
|
209
|
+
fs.appendFileSync(ledger, JSON.stringify(entry) + '\n');
|
|
210
|
+
return entry;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** Read the ledger into lookup maps. Later entries win. Bad lines are skipped. */
|
|
214
|
+
function readLandedIndex(repo) {
|
|
215
|
+
const byBranch = new Map();
|
|
216
|
+
const byName = new Map();
|
|
217
|
+
try {
|
|
218
|
+
const raw = fs.readFileSync(landedLedgerPath(repo), 'utf8');
|
|
219
|
+
for (const line of raw.split('\n')) {
|
|
220
|
+
const t = line.trim();
|
|
221
|
+
if (!t) continue;
|
|
222
|
+
try {
|
|
223
|
+
const e = JSON.parse(t);
|
|
224
|
+
if (e && e.branch) byBranch.set(e.branch, e);
|
|
225
|
+
if (e && e.worktree) byName.set(e.worktree, e);
|
|
226
|
+
} catch { /* skip malformed line — revocation by hand-editing is allowed */ }
|
|
227
|
+
}
|
|
228
|
+
} catch { /* no ledger yet */ }
|
|
229
|
+
return { byBranch, byName };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Branch derivation per naming family (TASK_1826). Unknown families → null. */
|
|
233
|
+
function deriveBranchForName(name) {
|
|
234
|
+
if (name.startsWith('wt-')) return 'ansuz-wt-' + name.slice(3);
|
|
235
|
+
if (name.startsWith('task_')) return 'task/' + name.slice(5);
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ── TASK_1827: daemon-noise classification for dirty paths ──────────────────
|
|
240
|
+
// The tracked/untracked dichotomy CANNOT separate the two observed specimens
|
|
241
|
+
// (ansuz_project_pins.json = daemon state, TASK_1739_HANDOFF.md = agent
|
|
242
|
+
// deliverable — BOTH untracked). Discrimination is therefore an explicit
|
|
243
|
+
// path allowlist of known daemon/harness writers, read from
|
|
244
|
+
// .kenaz/specialist/daemon-manifest.yaml: state_files + static_paths +
|
|
245
|
+
// gc_disposable_paths (new GC-only section). Everything NOT on the list —
|
|
246
|
+
// tracked source, untracked deliverables like HANDOFF docs — is real work and
|
|
247
|
+
// blocks reclaim. Rejected alternatives: glob heuristics ("*.jsonl is noise")
|
|
248
|
+
// would eat real agent logs; age-based rules say nothing about a file's
|
|
249
|
+
// nature; tracked/untracked fails both specimens above. commit_exclude_files
|
|
250
|
+
// (user configs, TASK_1818) are deliberately NOT noise: user-authored bytes
|
|
251
|
+
// are never discardable.
|
|
252
|
+
// thrift: flat-list YAML subset parser (the manifest is flat lists only);
|
|
253
|
+
// switch to .vendor/js-yaml.cjs if the manifest ever gains nesting.
|
|
254
|
+
const GC_NOISE_MANIFEST_SECTIONS = ['state_files', 'static_paths', 'gc_disposable_paths'];
|
|
255
|
+
|
|
256
|
+
function loadGcNoisePaths(repo) {
|
|
257
|
+
const out = [];
|
|
258
|
+
try {
|
|
259
|
+
const raw = fs.readFileSync(path.join(repo, '.kenaz', 'specialist', 'daemon-manifest.yaml'), 'utf8');
|
|
260
|
+
let section = null;
|
|
261
|
+
for (const line of raw.split('\n')) {
|
|
262
|
+
const key = line.match(/^([A-Za-z0-9_]+):\s*(#.*)?$/);
|
|
263
|
+
if (key) { section = key[1]; continue; }
|
|
264
|
+
if (!GC_NOISE_MANIFEST_SECTIONS.includes(section)) continue;
|
|
265
|
+
const item = line.match(/^\s*-\s*(.+?)\s*$/);
|
|
266
|
+
if (!item) continue;
|
|
267
|
+
let v = item[1];
|
|
268
|
+
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
|
|
269
|
+
v = v.slice(1, -1);
|
|
270
|
+
}
|
|
271
|
+
if (v && !v.startsWith('#')) out.push(v.replace(/\\/g, '/'));
|
|
272
|
+
}
|
|
273
|
+
} catch { /* manifest unreadable → empty noise set → ALL dirt kept (safe direction) */ }
|
|
274
|
+
return out;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function isNoisePath(relPath, noisePaths) {
|
|
278
|
+
const p = relPath.replace(/\\/g, '/');
|
|
279
|
+
for (const n of noisePaths) {
|
|
280
|
+
if (n.endsWith('/')) { if (p.startsWith(n)) return true; }
|
|
281
|
+
else if (n.endsWith('*')) {
|
|
282
|
+
// TASK_1840: trailing-* prefix match for filenames with a variable part
|
|
283
|
+
// (e.g. .kenaz/specialist/progress_note_* matches
|
|
284
|
+
// progress_note_TASK_1793.json). Same-directory ONLY: the remainder must
|
|
285
|
+
// not contain '/', so a wildcard entry can never silently cover a whole
|
|
286
|
+
// subtree the way a '/'-suffixed directory entry does.
|
|
287
|
+
const rest = p.slice(n.length - 1);
|
|
288
|
+
if (p.startsWith(n.slice(0, -1)) && !rest.includes('/')) return true;
|
|
289
|
+
}
|
|
290
|
+
else if (p === n) return true;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ── TASK_1840: progress-note landed gate ────────────────────────────────────
|
|
296
|
+
// Agents write .kenaz/specialist/progress_note_<TASK_ID>.json in their worktree
|
|
297
|
+
// AFTER the final commit (per the dispatch prompt), leaving permanent dirt that
|
|
298
|
+
// made the worktree unreclaimable forever. The manifest wildcard entry makes
|
|
299
|
+
// the path expressible, but the LOCAL copy is only disposable when the note is
|
|
300
|
+
// CONFIRMED merged into the core chart (phase-gate.js `note` appends it to
|
|
301
|
+
// <repo>/.specialist/sessions/chart_<TASK_ID>.json -> progress_notes[]).
|
|
302
|
+
// Returns: null = not a progress-note path (no gating applies),
|
|
303
|
+
// true = note landed in the core chart (disposable),
|
|
304
|
+
// false = not confirmed landed -> treated as REAL work (keep).
|
|
305
|
+
// Unknown/unreadable chart -> false (safe direction: keep).
|
|
306
|
+
// TASK_2163: chart-path.js resolves the REAL core sessions dir regardless of
|
|
307
|
+
// what `repo` is (it walks up from its own file location, not from `repo`),
|
|
308
|
+
// and keys the chart by `repo` as project identity -- core repo -> flat
|
|
309
|
+
// legacy filename (unchanged), sub-project repo -> the keyed subdirectory
|
|
310
|
+
// that sub-project's phase-gate/etc. runs actually wrote to (getChartReadPath
|
|
311
|
+
// also falls back to the pre-fix flat path, so charts written before this
|
|
312
|
+
// fix still resolve). Previously this hand-built path.join(repo,
|
|
313
|
+
// '.specialist', 'sessions', ...) directly, which could only ever succeed
|
|
314
|
+
// for the core repo (sub-projects have no .specialist/ of their own).
|
|
315
|
+
const PROGRESS_NOTE_RE = /^\.kenaz\/specialist\/progress_note_(.+?)(?:\.json)?$/;
|
|
316
|
+
|
|
317
|
+
function isLandedProgressNote(repo, relPath) {
|
|
318
|
+
const m = relPath.replace(/\\/g, '/').match(PROGRESS_NOTE_RE);
|
|
319
|
+
if (!m) return null;
|
|
320
|
+
if (!repo) return false;
|
|
321
|
+
try {
|
|
322
|
+
const chart = JSON.parse(fs.readFileSync(
|
|
323
|
+
chartReadPath(repo, m[1]), 'utf8'));
|
|
324
|
+
return Array.isArray(chart.progress_notes) && chart.progress_notes.length > 0;
|
|
325
|
+
} catch { return false; }
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Classify a worktree's `status --porcelain` output into daemon noise vs real
|
|
330
|
+
* work. Returns { real: string[], noise: string[] }. Uses its own raw git call
|
|
331
|
+
* (NOT the trimming git() helper — trimming eats the leading space of the
|
|
332
|
+
* first " M path" line) with core.quotePath=false so CJK paths stay literal.
|
|
333
|
+
*/
|
|
334
|
+
function classifyWorktreeDirt(worktreeDir, noisePaths, repo) {
|
|
335
|
+
const raw = execFileSync('git', ['-C', worktreeDir, '-c', 'core.longpaths=true',
|
|
336
|
+
'-c', 'core.quotePath=false', 'status', '--porcelain'],
|
|
337
|
+
{ stdio: ['ignore', 'pipe', 'pipe'] }).toString();
|
|
338
|
+
const real = [];
|
|
339
|
+
const noise = [];
|
|
340
|
+
for (const line of raw.split('\n')) {
|
|
341
|
+
if (!line.trim()) continue;
|
|
342
|
+
let rel = line.slice(3);
|
|
343
|
+
const arrow = rel.indexOf(' -> '); // rename: judge the destination path
|
|
344
|
+
if (arrow >= 0) rel = rel.slice(arrow + 4);
|
|
345
|
+
rel = rel.replace(/\\/g, '/');
|
|
346
|
+
// TASK_1840: a noise-matched progress note is disposable ONLY when its
|
|
347
|
+
// content is confirmed merged into the core chart. false = keep as real
|
|
348
|
+
// work; null = not a progress note, the plain noise-list verdict stands.
|
|
349
|
+
const noisy = isNoisePath(rel, noisePaths)
|
|
350
|
+
&& isLandedProgressNote(repo, rel) !== false;
|
|
351
|
+
(noisy ? noise : real).push(rel);
|
|
352
|
+
}
|
|
353
|
+
return { real, noise };
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function gcStaleWorktrees(repo, keepPath, opts) {
|
|
357
|
+
const dryRun = !!(opts && opts.dryRun);
|
|
358
|
+
// TASK_1827 follow-up: KEEP diagnostics are opt-in (verbose), because this GC
|
|
359
|
+
// also runs inline in WorktreeCreate hook mode, whose ONLY contract is "write
|
|
360
|
+
// the worktree path to stdout". Emitting one line per kept worktree there made
|
|
361
|
+
// the harness fail every dispatch with "hook succeeded but returned no worktree
|
|
362
|
+
// path" — 21 kept worktrees produced 21 lines around the single line that
|
|
363
|
+
// matters. Reclaim/failure notices below stay unconditional: they report an
|
|
364
|
+
// action actually taken, and there is at most a handful per run.
|
|
365
|
+
// Run `node .claude/hooks/worktree-create.js gc --dry-run` for the full report.
|
|
366
|
+
const verbose = !!(opts && opts.verbose);
|
|
367
|
+
const notice = (msg) => process.stderr.write('[worktree-create] gc: ' + msg + '\n');
|
|
368
|
+
const diag = (msg) => { if (verbose) notice(msg); };
|
|
369
|
+
// TASK_1876: count (and optionally collect) worktrees kept at the
|
|
370
|
+
// missing-marker conjunct. Before this, the structural gap "the merger never
|
|
371
|
+
// records landings" was invisible unless someone ran --dry-run AND read 30
|
|
372
|
+
// per-tree diag lines; measured result: 30/31 worktrees accumulated silently.
|
|
373
|
+
// The count is emitted UNCONDITIONALLY as ONE stderr line (see below) so the
|
|
374
|
+
// gap reads 0 when healthy and non-zero the moment the auto path degrades.
|
|
375
|
+
let markerStarved = 0;
|
|
376
|
+
let reclaimedCount = 0;
|
|
377
|
+
const starvedOut = (opts && opts.collectStarved) || null;
|
|
378
|
+
try {
|
|
379
|
+
const wtDirs = [
|
|
380
|
+
siblingWorktreeBase(repo), // sibling layout (TASK_1777)
|
|
381
|
+
path.join(repo, '.formation', 'worktrees'), // legacy in-repo layout (old husks)
|
|
382
|
+
];
|
|
383
|
+
const landed = readLandedIndex(repo);
|
|
384
|
+
const noisePaths = loadGcNoisePaths(repo);
|
|
385
|
+
const keep = path.resolve(keepPath).replace(/\\/g, '/').toLowerCase();
|
|
386
|
+
const now = Date.now();
|
|
387
|
+
for (const wtDir of wtDirs) {
|
|
388
|
+
if (!fs.existsSync(wtDir)) continue;
|
|
389
|
+
for (const name of fs.readdirSync(wtDir)) {
|
|
390
|
+
// Two GC-eligible naming families (TASK_1826). Unknown names (e.g. squad
|
|
391
|
+
// `<sessionId>-<memberId>` detached worktrees) are never touched.
|
|
392
|
+
// NOTE: .claude/worktrees/agent-* (harness-owned) is deliberately OUTSIDE
|
|
393
|
+
// both base dirs and must never be added here — deleting a live one kills
|
|
394
|
+
// a running agent (TASK_1827 exclusion).
|
|
395
|
+
const branch = deriveBranchForName(name);
|
|
396
|
+
if (!branch) continue;
|
|
397
|
+
const p = path.join(wtDir, name);
|
|
398
|
+
const rp = path.resolve(p).replace(/\\/g, '/').toLowerCase();
|
|
399
|
+
if (rp === keep) continue;
|
|
400
|
+
let st;
|
|
401
|
+
try { st = fs.statSync(p); } catch { continue; }
|
|
402
|
+
if (!st.isDirectory()) continue;
|
|
403
|
+
if (now - st.mtimeMs < GC_MIN_AGE_MS) {
|
|
404
|
+
// Too fresh — maybe a live concurrent session. Not inspected further
|
|
405
|
+
// (no git command is run against it).
|
|
406
|
+
const ageMin = Math.round((now - st.mtimeMs) / 60000);
|
|
407
|
+
diag(name + ' kept — too fresh (mtime ' + ageMin + 'm < 2h), not inspected');
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
// CONJUNCT (TASK_1827): landed marker. The merger records the landing;
|
|
411
|
+
// GC never infers it. Missing marker → keep, no bypass.
|
|
412
|
+
const marker = landed.byBranch.get(branch) || landed.byName.get(name);
|
|
413
|
+
if (!marker) {
|
|
414
|
+
markerStarved += 1;
|
|
415
|
+
if (starvedOut) starvedOut.push({ name, branch, dir: p, baseDir: wtDir });
|
|
416
|
+
diag(name + ' kept — no landed marker for branch ' + branch
|
|
417
|
+
+ ' (merge not recorded; after verifying the work landed, run:'
|
|
418
|
+
+ ' node .claude/hooks/worktree-create.js mark-landed ' + name + ')');
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
// Marker staleness: if the branch still exists and its tip moved past
|
|
422
|
+
// what was recorded at landing time, the newer commits were never
|
|
423
|
+
// verified as landed — keep. (Not inference: just checking the recorded
|
|
424
|
+
// fact still describes the current branch state.)
|
|
425
|
+
let tip = null;
|
|
426
|
+
try {
|
|
427
|
+
tip = git(repo, ['rev-parse', '--verify', '--quiet', 'refs/heads/' + branch]);
|
|
428
|
+
} catch { tip = null; } // branch already deleted — normal post-merge state
|
|
429
|
+
// TASK_2253: a null-tip marker (written after the branch was already
|
|
430
|
+
// deleted) cannot vouch for a branch that exists NOW — a re-dispatch may
|
|
431
|
+
// have reused the name with unverified commits. Staleness unverifiable →
|
|
432
|
+
// keep (safe direction); `git branch -D` below never runs on this path.
|
|
433
|
+
if (tip && !marker.tip) {
|
|
434
|
+
diag(name + ' kept — branch ' + branch + ' exists (tip ' + tip.slice(0, 8)
|
|
435
|
+
+ ') but landed marker has no tip, so staleness cannot be verified'
|
|
436
|
+
+ ' (branch name may have been reused). After verifying the work landed, re-run:'
|
|
437
|
+
+ ' node .claude/hooks/worktree-create.js mark-landed ' + name);
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
if (tip && marker.tip && tip !== marker.tip) {
|
|
441
|
+
diag(name + ' kept — branch ' + branch + ' tip ' + tip.slice(0, 8)
|
|
442
|
+
+ ' differs from landed-marker tip ' + String(marker.tip).slice(0, 8)
|
|
443
|
+
+ ' (commits after landing were never verified)');
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
// Is this directory a FUNCTIONING standalone worktree? A husk whose .git
|
|
447
|
+
// link is gone resolves `--show-toplevel` upward to the PARENT repo (or
|
|
448
|
+
// errors on a pruned gitdir), so running `status --porcelain` there would
|
|
449
|
+
// report the parent repo's dirt — the wrong tree entirely (observed on 4
|
|
450
|
+
// real husks in KenazAI core, TASK_1826).
|
|
451
|
+
let topLevel = null;
|
|
452
|
+
try { topLevel = git(p, ['rev-parse', '--show-toplevel']); } catch { topLevel = null; }
|
|
453
|
+
const isOwnWorktree = topLevel !== null
|
|
454
|
+
&& path.resolve(topLevel).replace(/\\/g, '/').toLowerCase() === rp;
|
|
455
|
+
let huskNote = '';
|
|
456
|
+
if (isOwnWorktree) {
|
|
457
|
+
// CONJUNCT: no uncommitted change outside the daemon-noise allowlist.
|
|
458
|
+
// Tracked source modifications and untracked deliverables (e.g.
|
|
459
|
+
// TASK_XXXX_HANDOFF.md) are real work → keep, naming the files.
|
|
460
|
+
let dirt = null;
|
|
461
|
+
try { dirt = classifyWorktreeDirt(p, noisePaths, repo); } catch { dirt = null; }
|
|
462
|
+
if (dirt === null) {
|
|
463
|
+
diag(name + ' kept — cannot read git status (unable to judge dirtiness)');
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
if (dirt.real.length > 0) {
|
|
467
|
+
const shown = dirt.real.slice(0, 5).join(', ')
|
|
468
|
+
+ (dirt.real.length > 5 ? ' (+' + (dirt.real.length - 5) + ' more)' : '');
|
|
469
|
+
diag(name + ' kept — uncommitted non-daemon change(s): ' + shown);
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
if (dirt.noise.length > 0) {
|
|
473
|
+
diag(name + ' dirty only with daemon noise (' + dirt.noise.slice(0, 5).join(', ')
|
|
474
|
+
+ (dirt.noise.length > 5 ? ', …' : '') + ') — noise does not block reclaim');
|
|
475
|
+
}
|
|
476
|
+
} else {
|
|
477
|
+
// Unlinked husk: no functioning .git link → a live agent cannot be
|
|
478
|
+
// using it (no git op works there). Dirtiness is unknowable, but the
|
|
479
|
+
// landed marker (checked above) asserts the work landed — reclaimable.
|
|
480
|
+
huskNote = ' [unlinked husk: '
|
|
481
|
+
+ (topLevel === null ? 'broken .git link' : 'no own .git — resolves to parent repo') + ']';
|
|
482
|
+
}
|
|
483
|
+
// All conjuncts hold: landed marker present (tip unchanged), old enough,
|
|
484
|
+
// not keepPath, no real uncommitted work.
|
|
485
|
+
if (dryRun) {
|
|
486
|
+
diag(name + ' RECLAIMABLE (dry-run — not removed) — landed ' + marker.at
|
|
487
|
+
+ ' via ' + (marker.via || 'unknown') + huskNote);
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
// TASK_1844: drop node_modules junctions/symlinks FIRST — Git for
|
|
491
|
+
// Windows recurses through junctions on delete and would empty the MAIN
|
|
492
|
+
// checkout's node_modules (measured; see unlinkNodeModulesLinks). This
|
|
493
|
+
// also covers pre-TASK_1844 worktrees where agents hand-built junctions.
|
|
494
|
+
unlinkNodeModulesLinks(p);
|
|
495
|
+
// Lock-resilient removal: try git remove --force, fall back to fs.rmSync
|
|
496
|
+
// with retries, then prune. If still locked -> log to stderr (observable)
|
|
497
|
+
// but never throw (GC must remain non-blocking).
|
|
498
|
+
let removed = false;
|
|
499
|
+
try {
|
|
500
|
+
git(repo, ['worktree', 'remove', '--force', p]);
|
|
501
|
+
removed = true;
|
|
502
|
+
} catch { /* git locked -- fall through to fs fallback */ }
|
|
503
|
+
if (!removed) {
|
|
504
|
+
try {
|
|
505
|
+
fs.rmSync(p, { recursive: true, force: true, maxRetries: 3, retryDelay: 200 });
|
|
506
|
+
try { git(repo, ['worktree', 'prune']); } catch { /* best-effort */ }
|
|
507
|
+
removed = true;
|
|
508
|
+
} catch {
|
|
509
|
+
// Still locked -- emit a single observable diagnostic line and skip.
|
|
510
|
+
notice(name + ' locked, skipped');
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
if (removed) {
|
|
514
|
+
try { git(repo, ['branch', '-D', branch]); } catch { /* already gone or unregistered */ }
|
|
515
|
+
reclaimedCount += 1;
|
|
516
|
+
notice(name + ' reclaimed — landed ' + marker.at + ' via ' + (marker.via || 'unknown') + huskNote);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// TASK_1876 (R4): ALWAYS report the marker-starved count — one line, stderr
|
|
521
|
+
// only (C1: hook-mode stdout carries exactly the worktree path, nothing
|
|
522
|
+
// else; that contract broke every dispatch once before, see the verbose
|
|
523
|
+
// comment above). Both values are reachable: 0 when every eligible tree
|
|
524
|
+
// has a marker, N when the recording duty is being missed — a signal
|
|
525
|
+
// pinned at one value would be no signal.
|
|
526
|
+
notice('marker-starved: ' + markerStarved
|
|
527
|
+
+ ' worktree(s) kept only because no landed marker was recorded'
|
|
528
|
+
+ (markerStarved > 0
|
|
529
|
+
? ' — run: node .claude/hooks/worktree-create.js gc --review'
|
|
530
|
+
: ''));
|
|
531
|
+
if (!dryRun) {
|
|
532
|
+
try { git(repo, ['worktree', 'prune']); } catch { /* skip */ }
|
|
533
|
+
}
|
|
534
|
+
return { markerStarved, reclaimed: reclaimedCount };
|
|
535
|
+
} catch { /* GC is best-effort — never block creation */ }
|
|
536
|
+
// Unknown outcome (mid-sweep failure) is null, NOT a healthy-looking zero.
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
function emit(p) { process.stdout.write(String(p).replace(/\\/g, '/') + '\n'); process.exit(0); }
|
|
541
|
+
function fail(msg) { process.stderr.write('[worktree-create] ' + msg + '\n'); process.exit(1); }
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Build a short worktree directory name using only the first 8 chars of the
|
|
545
|
+
* session UUID. Format: wt-<sid8>-<pid> (e.g. wt-b19fbb34-23468).
|
|
546
|
+
* The pid suffix keeps concurrent subagents that share a session_id unique.
|
|
547
|
+
* Collision recovery is handled by the uniquify loop below.
|
|
548
|
+
*/
|
|
549
|
+
function makeWtName(sessionId, pid) {
|
|
550
|
+
const sid8 = sessionId.slice(0, 8);
|
|
551
|
+
return 'wt-' + sid8 + '-' + pid;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Sibling worktree base dir: <repoParent>/.kenaz-worktrees/<repoName>.
|
|
556
|
+
*
|
|
557
|
+
* TASK_1777: worktrees MUST live OUTSIDE the repo tree. The harness
|
|
558
|
+
* worktree-isolation guard denies Edit/Write on any path under the shared
|
|
559
|
+
* checkout; a worktree nested inside the repo has every one of its paths also
|
|
560
|
+
* under the shared checkout, so the guard denied ALL agent Edit/Write calls
|
|
561
|
+
* (agents were forced to fall back to Bash patch scripts). Sibling placement
|
|
562
|
+
* is the only layout the guard accepts. Bonus: shorter paths (MAX_PATH).
|
|
563
|
+
*/
|
|
564
|
+
function siblingWorktreeBase(repo) {
|
|
565
|
+
return path.join(path.dirname(repo), '.kenaz-worktrees', path.basename(repo));
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// ── TASK_1844: node_modules provisioning ────────────────────────────────────
|
|
569
|
+
// A fresh worktree is a bare checkout: zero node_modules. Every frontend-ish
|
|
570
|
+
// dispatch then re-invented dependency access ad hoc (measured: 5-7 wasted tool
|
|
571
|
+
// calls per task — locate main-repo tsc → link node_modules → verify junction →
|
|
572
|
+
// retry). Fix: at creation time, link each of the main checkout's node_modules
|
|
573
|
+
// dirs into the worktree so `npx tsc --noEmit` etc. work immediately.
|
|
574
|
+
//
|
|
575
|
+
// Mechanism: fs.symlinkSync with type 'junction' on Windows (junctions need NO
|
|
576
|
+
// admin privilege, unlike real directory symlinks which EPERM for non-elevated
|
|
577
|
+
// users), plain directory symlink on macOS/Linux (type arg is ignored there).
|
|
578
|
+
// GEN-008/GEN-009: locations are discovered by scanning the repo (no hardcoded
|
|
579
|
+
// package dirs), pure node + git CLI, no shell.
|
|
580
|
+
//
|
|
581
|
+
// Trade-off (accepted): all worktrees SHARE the main checkout's node_modules.
|
|
582
|
+
// Read-only consumers (tsc, eslint, next lint) are safe under parallel
|
|
583
|
+
// dispatch; an agent running `npm install` inside a worktree would mutate the
|
|
584
|
+
// shared store — same exposure the previous ad-hoc junction workaround had,
|
|
585
|
+
// and dispatch prompts forbid minute-scale installs anyway.
|
|
586
|
+
//
|
|
587
|
+
// Failure policy (requirement 5): a bare worktree beats a failed dispatch —
|
|
588
|
+
// every error here is a stderr warning, never a hook failure, and NEVER
|
|
589
|
+
// touches stdout (see emit() contract).
|
|
590
|
+
|
|
591
|
+
// Descend at most this many directory levels below the repo root when looking
|
|
592
|
+
// for node_modules (deepest real specimen: .specialist/Ansuz/tools/node_modules
|
|
593
|
+
// at depth 3). Dot-dirs ARE descended (that specimen lives in one).
|
|
594
|
+
const NODE_MODULES_SCAN_DEPTH = 3;
|
|
595
|
+
// Never descend into these: VCS internals, dependency stores themselves, and
|
|
596
|
+
// build outputs whose node_modules are artifacts (dashboard/.next/standalone,
|
|
597
|
+
// target/debug/nextjs-server) that no in-worktree tool resolves against.
|
|
598
|
+
const NODE_MODULES_SCAN_PRUNE = new Set([
|
|
599
|
+
'.git', 'node_modules', '.next', 'target', 'dist', 'build', 'out',
|
|
600
|
+
'vendor', 'worktrees', '.kenaz-worktrees',
|
|
601
|
+
]);
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Return repo-relative paths ('' = root) of every directory that directly
|
|
605
|
+
* contains a node_modules dir, up to NODE_MODULES_SCAN_DEPTH levels deep.
|
|
606
|
+
*/
|
|
607
|
+
function findNodeModulesParents(repo) {
|
|
608
|
+
const found = [];
|
|
609
|
+
const walk = (dir, rel, depth) => {
|
|
610
|
+
let entries;
|
|
611
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
|
|
612
|
+
for (const ent of entries) {
|
|
613
|
+
if (!ent.isDirectory()) continue;
|
|
614
|
+
if (ent.name === 'node_modules') { found.push(rel); continue; }
|
|
615
|
+
if (NODE_MODULES_SCAN_PRUNE.has(ent.name)) continue;
|
|
616
|
+
if (depth + 1 <= NODE_MODULES_SCAN_DEPTH) {
|
|
617
|
+
walk(path.join(dir, ent.name), rel ? rel + '/' + ent.name : ent.name, depth + 1);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
walk(repo, '', 0);
|
|
622
|
+
return found;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Ensure `relPath` (posix-style, relative to the worktree root) is git-ignored
|
|
627
|
+
* INSIDE the worktree — otherwise `git status` drowns in dependency files and
|
|
628
|
+
* `git add -A` sweeps the whole store into a commit (TASK_1819: 392-file
|
|
629
|
+
* incident). Repos that already ignore node_modules pass the check-ignore fast
|
|
630
|
+
* path; otherwise the pattern is appended to the worktree's PRIVATE exclude
|
|
631
|
+
* file (rev-parse --git-path info/exclude → .git/worktrees/<name>/info/exclude),
|
|
632
|
+
* which is per-worktree state and never touches tracked files or the shared
|
|
633
|
+
* .git/info/exclude. Throws on failure — caller skips creating that link.
|
|
634
|
+
*/
|
|
635
|
+
function ensureWorktreeIgnores(worktreePath, relPath) {
|
|
636
|
+
try {
|
|
637
|
+
execFileSync('git', ['-C', worktreePath, 'check-ignore', '-q', '--', relPath],
|
|
638
|
+
{ stdio: ['ignore', 'ignore', 'ignore'] });
|
|
639
|
+
return; // exit 0 → already ignored (repo .gitignore covers it)
|
|
640
|
+
} catch { /* not ignored → add per-worktree exclude */ }
|
|
641
|
+
const gp = execFileSync('git', ['-C', worktreePath, 'rev-parse', '--git-path', 'info/exclude'],
|
|
642
|
+
{ stdio: ['ignore', 'pipe', 'pipe'] }).toString().trim();
|
|
643
|
+
const excludeFile = path.isAbsolute(gp) ? gp : path.resolve(worktreePath, gp);
|
|
644
|
+
fs.mkdirSync(path.dirname(excludeFile), { recursive: true });
|
|
645
|
+
fs.appendFileSync(excludeFile, '/' + relPath + '/\n');
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Unlink node_modules junctions/symlinks inside `root` (a worktree about to be
|
|
650
|
+
* removed). MUST run before any `git worktree remove`: Git for Windows RECURSES
|
|
651
|
+
* THROUGH junctions when deleting and EMPTIES THE LINK TARGET — measured
|
|
652
|
+
* 2026-08-13 (TASK_1844 control test): a junction into the source repo's
|
|
653
|
+
* node_modules + `git worktree remove --force` → source node_modules wiped.
|
|
654
|
+
* Node's fs.rmSync({recursive}) in contrast unlinks the reparse point without
|
|
655
|
+
* traversal (also measured, populated-target control). Only the link itself is
|
|
656
|
+
* removed here; a REAL node_modules directory (agent ran a package manager) is
|
|
657
|
+
* left for the normal removal path. Best-effort: never throws.
|
|
658
|
+
*/
|
|
659
|
+
function unlinkNodeModulesLinks(root) {
|
|
660
|
+
const walk = (dir, depth) => {
|
|
661
|
+
let entries;
|
|
662
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return; }
|
|
663
|
+
for (const ent of entries) {
|
|
664
|
+
const p = path.join(dir, ent.name);
|
|
665
|
+
if (ent.name === 'node_modules') {
|
|
666
|
+
try {
|
|
667
|
+
if (fs.lstatSync(p).isSymbolicLink()) {
|
|
668
|
+
try { fs.unlinkSync(p); } catch { fs.rmdirSync(p); }
|
|
669
|
+
}
|
|
670
|
+
} catch { /* best-effort */ }
|
|
671
|
+
continue;
|
|
672
|
+
}
|
|
673
|
+
let isDir = false;
|
|
674
|
+
try { const st = fs.lstatSync(p); isDir = st.isDirectory() && !st.isSymbolicLink(); }
|
|
675
|
+
catch { continue; }
|
|
676
|
+
if (!isDir || NODE_MODULES_SCAN_PRUNE.has(ent.name)) continue;
|
|
677
|
+
if (depth + 1 <= NODE_MODULES_SCAN_DEPTH) walk(p, depth + 1);
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
walk(root, 0);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* Link every discovered <repo>/<rel>/node_modules into the worktree at
|
|
685
|
+
* <worktree>/<rel>/node_modules. Per-entry and overall failures degrade to
|
|
686
|
+
* stderr warnings (requirement 5). A repo with no node_modules (requirement 4:
|
|
687
|
+
* non-frontend projects) yields an empty list and this is a no-op.
|
|
688
|
+
*/
|
|
689
|
+
function linkNodeModules(repo, worktreePath) {
|
|
690
|
+
const warn = (msg) => process.stderr.write('[worktree-create] node_modules: ' + msg + '\n');
|
|
691
|
+
let parents;
|
|
692
|
+
try { parents = findNodeModulesParents(repo); } catch (e) {
|
|
693
|
+
warn('scan failed (' + ((e && e.message) || 'unknown') + ') — worktree stays bare');
|
|
694
|
+
return;
|
|
695
|
+
}
|
|
696
|
+
for (const rel of parents) {
|
|
697
|
+
const target = path.join(repo, rel, 'node_modules');
|
|
698
|
+
const linkParent = rel ? path.join(worktreePath, rel) : worktreePath;
|
|
699
|
+
const linkPath = path.join(linkParent, 'node_modules');
|
|
700
|
+
try {
|
|
701
|
+
// Parent dir absent from the checkout = the package dir holds no tracked
|
|
702
|
+
// files (pure build artifact in the main repo) → nothing there needs deps.
|
|
703
|
+
if (!fs.existsSync(linkParent)) continue;
|
|
704
|
+
// Already present (including a broken pre-existing link) → leave it alone.
|
|
705
|
+
let exists = false;
|
|
706
|
+
try { fs.lstatSync(linkPath); exists = true; } catch { exists = false; }
|
|
707
|
+
if (exists) continue;
|
|
708
|
+
// Ignore-cover BEFORE linking: if we cannot guarantee git ignores the
|
|
709
|
+
// link, not linking is the safer state (see ensureWorktreeIgnores).
|
|
710
|
+
ensureWorktreeIgnores(worktreePath, rel ? rel + '/node_modules' : 'node_modules');
|
|
711
|
+
// Windows: 'junction' works without elevation (real dir symlinks EPERM
|
|
712
|
+
// for non-admin users). POSIX: the type argument is ignored by node and a
|
|
713
|
+
// normal directory symlink is created.
|
|
714
|
+
fs.symlinkSync(target, linkPath, process.platform === 'win32' ? 'junction' : 'dir');
|
|
715
|
+
} catch (e) {
|
|
716
|
+
warn('link skipped for "' + (rel || '.') + '": ' + ((e && e.message) || 'unknown'));
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
function main() {
|
|
722
|
+
// TASK_1866: hook mode MUST receive the harness's WorktreeCreate JSON object
|
|
723
|
+
// on stdin. Without this gate, main() fabricated a session id ('session'
|
|
724
|
+
// fallback) and silently built a wt-session-<pid> worktree whenever someone
|
|
725
|
+
// merely inspected the module via `node -e "require(...)"` — which IS the
|
|
726
|
+
// settings.json hook wiring, so require.main === undefined lands here.
|
|
727
|
+
// Observed three times on 2026-08-13 (TASK_1840 agent wt-session-7028, main
|
|
728
|
+
// thread ansuz-wt-session-11624, main thread --help wt-session-17644).
|
|
729
|
+
// The criterion is deliberately "stdin parses to a JSON object", NOT a TTY
|
|
730
|
+
// heuristic: the real harness always pipes the hook JSON, while under a test
|
|
731
|
+
// harness stdin may be neither a TTY nor carry data. The stdin JSON contract
|
|
732
|
+
// itself (file header) is unchanged.
|
|
733
|
+
let input = null;
|
|
734
|
+
try { input = JSON.parse(readStdin()); } catch { input = null; }
|
|
735
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input)) {
|
|
736
|
+
fail('hook mode requires the WorktreeCreate JSON object on stdin '
|
|
737
|
+
+ '({ session_id, cwd, ... }) — refusing to fabricate a session id and '
|
|
738
|
+
+ 'create a worktree without one. If you only meant to inspect this '
|
|
739
|
+
+ 'module, require() it from a script file: `node -e "require(...)"` '
|
|
740
|
+
+ 'runs the REAL hook flow.');
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const rawId = input.session_id || process.env.CLAUDE_SESSION_ID || 'session';
|
|
744
|
+
const sessionId = String(rawId).replace(/[^A-Za-z0-9_-]/g, '_').slice(0, 64);
|
|
745
|
+
const cwd = input.cwd || process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
746
|
+
|
|
747
|
+
// Branch 1: session cwd is a git repo (dev / same-repo) → faithful passthrough.
|
|
748
|
+
// Branch 2: cwd not git (production) → redirect into the active project's repo.
|
|
749
|
+
let repo = isGitRepo(cwd) ? gitTopLevel(cwd) : null;
|
|
750
|
+
let worktreePath;
|
|
751
|
+
|
|
752
|
+
if (repo) {
|
|
753
|
+
// TASK_1777: ALWAYS place the worktree in the sibling base dir OUTSIDE the
|
|
754
|
+
// repo tree — never at the harness-proposed in-repo path (which would make
|
|
755
|
+
// the isolation guard deny every Edit/Write the agent attempts). The
|
|
756
|
+
// proposed basename is discarded too: the short synthesized name enforces
|
|
757
|
+
// the wt-<sid8>-<pid> naming contract that GC and branch naming rely on.
|
|
758
|
+
worktreePath = path.join(siblingWorktreeBase(repo), makeWtName(sessionId, process.pid));
|
|
759
|
+
} else {
|
|
760
|
+
repo = resolveTargetRepo();
|
|
761
|
+
if (!repo) {
|
|
762
|
+
fail('session cwd is not a git repo and no git target project is resolvable from '
|
|
763
|
+
+ '~/.kenaz/projects.json (currentProjectId) — cannot create an isolated worktree');
|
|
764
|
+
}
|
|
765
|
+
// Ignore the proposed path (it points under the non-git cwd); place in the
|
|
766
|
+
// target repo's sibling worktree base (TASK_1777 — see siblingWorktreeBase).
|
|
767
|
+
// pid suffix: concurrent subagents in one session share session_id; the pid
|
|
768
|
+
// makes each hook invocation's synthesized path unique without a TOCTOU race.
|
|
769
|
+
worktreePath = path.join(siblingWorktreeBase(repo), makeWtName(sessionId, process.pid));
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// Uniquify the path: concurrent subagents in one session share session_id,
|
|
773
|
+
// so the synthesized path (and sometimes the proposed one) collides. NEVER
|
|
774
|
+
// claim an existing path — the old `worktree remove --force` "idempotency"
|
|
775
|
+
// here destroyed live sibling agents' worktrees mid-task (TASK_1639). Suffix
|
|
776
|
+
// until free instead.
|
|
777
|
+
{
|
|
778
|
+
const base = worktreePath;
|
|
779
|
+
let n = 1;
|
|
780
|
+
while (fs.existsSync(worktreePath)) {
|
|
781
|
+
n += 1;
|
|
782
|
+
worktreePath = `${base}-${n}`;
|
|
783
|
+
if (n > 50) { worktreePath = `${base}-${Date.now().toString(36)}`; break; }
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Branch derives from the (unique) worktree dir name — NOT the bare session
|
|
788
|
+
// id — keeping gcStaleWorktrees' dirname-based derivation aligned with what
|
|
789
|
+
// we create. If a husk from a destroyed worktree left the branch behind,
|
|
790
|
+
// suffix rather than delete: never touch refs a live sibling might own.
|
|
791
|
+
const wtName = path.basename(worktreePath)
|
|
792
|
+
.replace(/^wt-/, '')
|
|
793
|
+
.replace(/[^A-Za-z0-9_-]/g, '_')
|
|
794
|
+
.slice(0, 64);
|
|
795
|
+
let branch = `ansuz-wt-${wtName}`;
|
|
796
|
+
{
|
|
797
|
+
const taken = (b) => {
|
|
798
|
+
try {
|
|
799
|
+
execFileSync('git', ['-C', repo, 'rev-parse', '--verify', '--quiet', 'refs/heads/' + b],
|
|
800
|
+
{ stdio: ['ignore', 'pipe', 'ignore'] });
|
|
801
|
+
return true;
|
|
802
|
+
} catch { return false; }
|
|
803
|
+
};
|
|
804
|
+
const base = branch;
|
|
805
|
+
let n = 1;
|
|
806
|
+
while (taken(branch)) {
|
|
807
|
+
n += 1;
|
|
808
|
+
branch = `${base}-${n}`;
|
|
809
|
+
if (n > 50) { branch = `${base}-${Date.now().toString(36)}`; break; }
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
// Best-effort GC of stale, clean, merged sibling worktrees (compensates for the
|
|
814
|
+
// harness not reliably firing WorktreeRemove on subagent completion).
|
|
815
|
+
gcStaleWorktrees(repo, worktreePath);
|
|
816
|
+
|
|
817
|
+
try {
|
|
818
|
+
fs.mkdirSync(path.dirname(worktreePath), { recursive: true });
|
|
819
|
+
// Path and branch are guaranteed fresh above — no destructive cleanup here.
|
|
820
|
+
// (The old remove --force/branch -D "idempotency" at this spot destroyed
|
|
821
|
+
// concurrent siblings' live worktrees.) Prune only drops registrations
|
|
822
|
+
// whose directories are already gone.
|
|
823
|
+
try { git(repo, ['worktree', 'prune']); } catch { /* none */ }
|
|
824
|
+
git(repo, ['worktree', 'add', '-b', branch, worktreePath, 'HEAD']);
|
|
825
|
+
} catch (e) {
|
|
826
|
+
const detail = e && e.stderr ? e.stderr.toString().trim() : (e && e.message) || 'unknown error';
|
|
827
|
+
|
|
828
|
+
// Rollback (a): remove via git
|
|
829
|
+
try { git(repo, ['worktree', 'remove', '--force', worktreePath]); } catch { /* best-effort */ }
|
|
830
|
+
// Rollback (b): filesystem rm with retries
|
|
831
|
+
try {
|
|
832
|
+
fs.rmSync(worktreePath, { recursive: true, force: true, maxRetries: 3 });
|
|
833
|
+
} catch { /* best-effort */ }
|
|
834
|
+
// Rollback (c): prune stale registrations
|
|
835
|
+
try { git(repo, ['worktree', 'prune']); } catch { /* best-effort */ }
|
|
836
|
+
// Rollback (d): delete only the branch we created this invocation
|
|
837
|
+
try { git(repo, ['branch', '-D', branch]); } catch { /* may not exist if add never started */ }
|
|
838
|
+
|
|
839
|
+
fail('git worktree add failed in ' + repo + ': ' + detail);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// TASK_1844: make the main checkout's node_modules available inside the
|
|
843
|
+
// worktree (junction on Windows / symlink on POSIX). Strictly best-effort:
|
|
844
|
+
// any failure is a stderr warning and the hook still emits the path — a bare
|
|
845
|
+
// worktree beats a failed dispatch. Millisecond-scale (links only, never any
|
|
846
|
+
// package-manager install on this critical path).
|
|
847
|
+
try { linkNodeModules(repo, worktreePath); } catch (e) {
|
|
848
|
+
process.stderr.write('[worktree-create] node_modules provisioning failed: '
|
|
849
|
+
+ ((e && e.message) || 'unknown') + '\n');
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
emit(worktreePath);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// ── TASK_1827: CLI subcommands ──────────────────────────────────────────────
|
|
856
|
+
|
|
857
|
+
function _cliParseFlags(args) {
|
|
858
|
+
const flags = {};
|
|
859
|
+
const positional = [];
|
|
860
|
+
for (let i = 0; i < args.length; i++) {
|
|
861
|
+
const a = args[i];
|
|
862
|
+
if (a === '--dry-run') flags.dryRun = true;
|
|
863
|
+
else if (a === '--repo') flags.repo = args[++i];
|
|
864
|
+
else if (a === '--task') flags.task = args[++i];
|
|
865
|
+
else if (a === '--by') flags.by = args[++i];
|
|
866
|
+
else if (a === '--tip') flags.tip = args[++i];
|
|
867
|
+
else if (a === '--review') flags.review = true; // TASK_1876
|
|
868
|
+
else if (a === '--approve') flags.approve = true; // TASK_1876
|
|
869
|
+
else if (a === '--all') flags.all = true; // TASK_1876
|
|
870
|
+
else positional.push(a);
|
|
871
|
+
}
|
|
872
|
+
return { flags, positional };
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
function _cliResolveRepo(flags) {
|
|
876
|
+
const start = flags.repo || process.cwd();
|
|
877
|
+
if (!isGitRepo(start)) fail('not a git repo: ' + start + ' (use --repo <path>)');
|
|
878
|
+
return gitTopLevel(start);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
/**
|
|
882
|
+
* mark-landed <worktree-name|worktree-path|branch> [--task TASK_X] [--repo <path>] [--by <who>] [--tip <sha>]
|
|
883
|
+
*
|
|
884
|
+
* The MANUAL merge path (TASK_1827): after the main thread lands a worktree's
|
|
885
|
+
* work via file-scoped checkout (where ancestry and patch-id both lie — see
|
|
886
|
+
* file header), it records the fact here. GC then treats the worktree as
|
|
887
|
+
* reclaimable once the remaining safety conjuncts hold.
|
|
888
|
+
*/
|
|
889
|
+
function cliMarkLanded(args) {
|
|
890
|
+
const { flags, positional } = _cliParseFlags(args);
|
|
891
|
+
const target = positional[0];
|
|
892
|
+
if (!target) {
|
|
893
|
+
fail('usage: mark-landed <wt-name|wt-path|branch> [--task TASK_X] [--repo <path>] [--by <who>] [--tip <sha>]');
|
|
894
|
+
}
|
|
895
|
+
const repo = _cliResolveRepo(flags);
|
|
896
|
+
// Resolve target → { worktree name, branch }. Accepts a worktree directory
|
|
897
|
+
// path, a worktree dir name (wt-* / task_*), or a branch (ansuz-wt-* / task/*).
|
|
898
|
+
let name = target;
|
|
899
|
+
try {
|
|
900
|
+
if (fs.existsSync(target) && fs.statSync(target).isDirectory()) name = path.basename(target);
|
|
901
|
+
} catch { /* treat as name/branch */ }
|
|
902
|
+
let branch = null;
|
|
903
|
+
let worktree = null;
|
|
904
|
+
if (name.startsWith('ansuz-wt-')) { branch = name; worktree = 'wt-' + name.slice('ansuz-wt-'.length); }
|
|
905
|
+
else if (name.startsWith('task/')) { branch = name; worktree = 'task_' + name.slice('task/'.length); }
|
|
906
|
+
else {
|
|
907
|
+
branch = deriveBranchForName(name);
|
|
908
|
+
worktree = branch ? name : null;
|
|
909
|
+
}
|
|
910
|
+
if (!branch) {
|
|
911
|
+
fail('cannot derive a branch from "' + target + '" — expected wt-*/task_* worktree name, '
|
|
912
|
+
+ 'ansuz-wt-*/task/* branch, or a worktree directory path');
|
|
913
|
+
}
|
|
914
|
+
let tip = flags.tip || null;
|
|
915
|
+
if (!tip) {
|
|
916
|
+
try { tip = git(repo, ['rev-parse', '--verify', '--quiet', 'refs/heads/' + branch]); }
|
|
917
|
+
catch { tip = null; } // branch already deleted — marker still valid
|
|
918
|
+
}
|
|
919
|
+
// TASK_2087: idempotent like post-complete's recordLanding (git-merge.js) —
|
|
920
|
+
// if the ledger already has this branch at the same tip (both non-null),
|
|
921
|
+
// every unconditional verify-and-land re-run of this CLI would otherwise
|
|
922
|
+
// append a redundant duplicate line for the same landing event.
|
|
923
|
+
const existing = readLandedIndex(repo).byBranch.get(branch);
|
|
924
|
+
if (existing && existing.tip && tip && existing.tip === tip) {
|
|
925
|
+
process.stdout.write('[worktree-create] mark-landed: already recorded (via '
|
|
926
|
+
+ existing.via + ', by ' + existing.by + ') — skipped\n');
|
|
927
|
+
process.exit(0);
|
|
928
|
+
}
|
|
929
|
+
const entry = appendLandedMarker(repo, {
|
|
930
|
+
branch,
|
|
931
|
+
worktree,
|
|
932
|
+
task: flags.task || null,
|
|
933
|
+
tip,
|
|
934
|
+
via: 'manual-cli',
|
|
935
|
+
by: flags.by || (function () { try { return os.userInfo().username; } catch { return null; } })(),
|
|
936
|
+
});
|
|
937
|
+
process.stdout.write('[worktree-create] mark-landed: recorded ' + JSON.stringify(entry) + '\n');
|
|
938
|
+
process.stdout.write('[worktree-create] ledger: ' + landedLedgerPath(repo).replace(/\\/g, '/') + '\n');
|
|
939
|
+
process.exit(0);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
// ── TASK_1876: gc --review / --approve — the marker-starved backlog path ────
|
|
943
|
+
// Measured 2026-08-21: 30 of 31 accumulated worktrees had no landed marker, so
|
|
944
|
+
// the safe path (gc) could reclaim nothing, and the only path that COULD
|
|
945
|
+
// reclaim them (manual deletion) bypasses unlinkNodeModulesLinks and empties
|
|
946
|
+
// the main checkout's node_modules (happened that same day: 189 .bin shims
|
|
947
|
+
// wiped, npm rebuild required). This flow gives humans an evidence-based batch
|
|
948
|
+
// decision, then reclaims through the ONE existing GC path.
|
|
949
|
+
//
|
|
950
|
+
// Design boundary (TASK_1827, respected): none of the evidence below feeds the
|
|
951
|
+
// GC's reclaim conjunction — the HUMAN's approval writes the marker (exactly
|
|
952
|
+
// like mark-landed), and evidence can only make batch approval MORE
|
|
953
|
+
// conservative (unique content ⇒ refuse), never reclaim without a marker.
|
|
954
|
+
|
|
955
|
+
/** Marker-starved candidates exactly as the GC sees them (single source). */
|
|
956
|
+
function _collectStarvedCandidates(repo) {
|
|
957
|
+
const starved = [];
|
|
958
|
+
// dryRun guarantees read-only enumeration; collectStarved receives every
|
|
959
|
+
// worktree kept at the missing-marker conjunct.
|
|
960
|
+
gcStaleWorktrees(repo, path.join(repo, '.__gc_cli_no_keep__'), { dryRun: true, collectStarved: starved });
|
|
961
|
+
return starved;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
/** Look up a task's status directory across both task-system layouts. */
|
|
965
|
+
function _findTaskStatus(repo, taskId) {
|
|
966
|
+
for (const base of ['.kenaz/tasks', '.collaboration/tasks']) {
|
|
967
|
+
const baseDir = path.join(repo, base);
|
|
968
|
+
let dirs;
|
|
969
|
+
try { dirs = fs.readdirSync(baseDir, { withFileTypes: true }); } catch { continue; }
|
|
970
|
+
for (const d of dirs) {
|
|
971
|
+
if (!d.isDirectory()) continue;
|
|
972
|
+
for (const variant of [taskId + '.yaml', taskId.toLowerCase() + '.yaml']) {
|
|
973
|
+
if (fs.existsSync(path.join(baseDir, d.name, variant))) return d.name;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return null;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
/**
|
|
981
|
+
* Evidence for one marker-starved candidate. All git access is read-only.
|
|
982
|
+
* `unique` states:
|
|
983
|
+
* 'none' — tip fully reachable from the user branch (trivially landed)
|
|
984
|
+
* 'landed' — branch-unique commits exist, but every file they touched is
|
|
985
|
+
* byte-identical between the two tips (the file-scoped-merge
|
|
986
|
+
* signature: patch-id/ancestry lie, content already on main)
|
|
987
|
+
* 'unique' — branch-touched file(s) whose content the user branch does NOT
|
|
988
|
+
* have (uniqueFiles names them)
|
|
989
|
+
* 'unknown' — no resolvable tip (branch deleted + husk) or git failure
|
|
990
|
+
*/
|
|
991
|
+
function _gatherStarvedEvidence(repo, cand, noisePaths, userBranch) {
|
|
992
|
+
const ev = {
|
|
993
|
+
name: cand.name, branch: cand.branch, dir: cand.dir,
|
|
994
|
+
tip: null, tipSource: null, tasks: [], taskStatuses: {},
|
|
995
|
+
unique: 'unknown', uniqueFiles: [], uniqueCommits: 0,
|
|
996
|
+
dirt: 'unknown', dirtReal: null, approvable: false, reason: '',
|
|
997
|
+
};
|
|
998
|
+
// task_<id> family: the task id is in the name itself.
|
|
999
|
+
if (cand.name.startsWith('task_')) ev.tasks.push(cand.name.slice(5).toUpperCase());
|
|
1000
|
+
try { ev.tip = git(repo, ['rev-parse', '--verify', '--quiet', 'refs/heads/' + cand.branch]); ev.tipSource = 'branch'; }
|
|
1001
|
+
catch { ev.tip = null; }
|
|
1002
|
+
// Functioning standalone worktree? (same discrimination the GC uses)
|
|
1003
|
+
let topLevel = null;
|
|
1004
|
+
try { topLevel = git(cand.dir, ['rev-parse', '--show-toplevel']); } catch { topLevel = null; }
|
|
1005
|
+
const isOwn = topLevel !== null
|
|
1006
|
+
&& path.resolve(topLevel).replace(/\\/g, '/').toLowerCase()
|
|
1007
|
+
=== path.resolve(cand.dir).replace(/\\/g, '/').toLowerCase();
|
|
1008
|
+
if (!ev.tip && isOwn) {
|
|
1009
|
+
// Branch already deleted but the worktree still functions: its own HEAD is
|
|
1010
|
+
// the recorded state of the work.
|
|
1011
|
+
try { ev.tip = git(cand.dir, ['rev-parse', 'HEAD']); ev.tipSource = 'worktree-HEAD'; } catch { ev.tip = null; }
|
|
1012
|
+
}
|
|
1013
|
+
if (isOwn) {
|
|
1014
|
+
try {
|
|
1015
|
+
const dirt = classifyWorktreeDirt(cand.dir, noisePaths, repo);
|
|
1016
|
+
ev.dirtReal = dirt.real.length > 0;
|
|
1017
|
+
ev.dirt = dirt.real.length > 0
|
|
1018
|
+
? 'REAL uncommitted: ' + dirt.real.slice(0, 5).join(', ') + (dirt.real.length > 5 ? ' …' : '')
|
|
1019
|
+
: (dirt.noise.length > 0 ? 'daemon-noise only' : 'clean');
|
|
1020
|
+
} catch { ev.dirt = 'unreadable'; ev.dirtReal = null; }
|
|
1021
|
+
} else {
|
|
1022
|
+
ev.dirt = 'husk (no functioning .git link — cannot host live work)';
|
|
1023
|
+
ev.dirtReal = false;
|
|
1024
|
+
}
|
|
1025
|
+
if (ev.tip && userBranch) {
|
|
1026
|
+
try {
|
|
1027
|
+
const logRaw = git(repo, ['log', '--pretty=format:%H%x09%s', userBranch + '..' + ev.tip, '--']);
|
|
1028
|
+
const lines = logRaw ? logRaw.split('\n').filter((l) => l.trim()) : [];
|
|
1029
|
+
ev.uniqueCommits = lines.length;
|
|
1030
|
+
for (const l of lines) {
|
|
1031
|
+
const m = l.match(/TASK_\d+/i);
|
|
1032
|
+
if (m && !ev.tasks.includes(m[0].toUpperCase())) ev.tasks.push(m[0].toUpperCase());
|
|
1033
|
+
}
|
|
1034
|
+
if (lines.length === 0) {
|
|
1035
|
+
ev.unique = 'none';
|
|
1036
|
+
} else {
|
|
1037
|
+
// Files touched by branch-unique commits ∩ files whose content differs
|
|
1038
|
+
// between the two TIPS (two-dot diff — deliberately NOT patch-id or
|
|
1039
|
+
// ancestry, which both lie under file-scoped merges). Intersection in
|
|
1040
|
+
// JS avoids command-line length limits on large branches.
|
|
1041
|
+
const touchedRaw = git(repo, ['log', '--name-only', '--pretty=format:', userBranch + '..' + ev.tip, '--']);
|
|
1042
|
+
const touched = new Set((touchedRaw || '').split('\n').map((s) => s.trim()).filter(Boolean));
|
|
1043
|
+
const diffRaw = git(repo, ['diff', '--name-only', userBranch, ev.tip]);
|
|
1044
|
+
const differing = (diffRaw || '').split('\n').map((s) => s.trim()).filter(Boolean);
|
|
1045
|
+
ev.uniqueFiles = differing.filter((f) => touched.has(f));
|
|
1046
|
+
ev.unique = ev.uniqueFiles.length === 0 ? 'landed' : 'unique';
|
|
1047
|
+
}
|
|
1048
|
+
} catch { ev.unique = 'unknown'; }
|
|
1049
|
+
}
|
|
1050
|
+
for (const t of ev.tasks) ev.taskStatuses[t] = _findTaskStatus(repo, t);
|
|
1051
|
+
// Verdict — evidence can only REFUSE, never auto-reclaim (see block comment).
|
|
1052
|
+
if ((ev.unique === 'landed' || ev.unique === 'none') && ev.dirtReal === false) {
|
|
1053
|
+
ev.approvable = true;
|
|
1054
|
+
ev.reason = ev.unique === 'landed'
|
|
1055
|
+
? 'branch-touched files byte-identical to ' + userBranch
|
|
1056
|
+
: 'all commits reachable from ' + userBranch;
|
|
1057
|
+
} else if (ev.unique === 'unique') {
|
|
1058
|
+
ev.reason = 'UNIQUE content ' + userBranch + ' does not have: '
|
|
1059
|
+
+ ev.uniqueFiles.slice(0, 5).join(', ') + (ev.uniqueFiles.length > 5 ? ' …' : '');
|
|
1060
|
+
} else if (ev.dirtReal) {
|
|
1061
|
+
ev.reason = 'uncommitted non-daemon changes (' + ev.dirt + ')';
|
|
1062
|
+
} else {
|
|
1063
|
+
ev.reason = 'content unverifiable (no resolvable tip) — after manual verification use: '
|
|
1064
|
+
+ 'node .claude/hooks/worktree-create.js mark-landed ' + cand.name;
|
|
1065
|
+
}
|
|
1066
|
+
return ev;
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
function _cliGcReviewOrApprove(repo, flags, positional) {
|
|
1070
|
+
const out = (m) => process.stdout.write(m + '\n');
|
|
1071
|
+
let userBranch = null;
|
|
1072
|
+
try { userBranch = git(repo, ['rev-parse', '--abbrev-ref', 'HEAD']); } catch { userBranch = null; }
|
|
1073
|
+
const noisePaths = loadGcNoisePaths(repo);
|
|
1074
|
+
const candidates = _collectStarvedCandidates(repo);
|
|
1075
|
+
if (candidates.length === 0) {
|
|
1076
|
+
out('[worktree-create] gc review: no marker-starved worktrees — nothing to review.');
|
|
1077
|
+
process.exit(0);
|
|
1078
|
+
}
|
|
1079
|
+
const evidence = candidates.map((c) => _gatherStarvedEvidence(repo, c, noisePaths, userBranch));
|
|
1080
|
+
if (flags.review) {
|
|
1081
|
+
out('[worktree-create] gc review: ' + evidence.length
|
|
1082
|
+
+ ' worktree(s) kept ONLY because no landed marker was recorded (vs ' + (userBranch || '?') + '):');
|
|
1083
|
+
for (const ev of evidence) {
|
|
1084
|
+
out('');
|
|
1085
|
+
out(' ' + ev.name + ' branch=' + ev.branch
|
|
1086
|
+
+ (ev.tip ? ' tip=' + ev.tip.slice(0, 8) + ' (' + ev.tipSource + ')' : ' (branch deleted, no tip)'));
|
|
1087
|
+
out(' task: ' + (ev.tasks.length
|
|
1088
|
+
? ev.tasks.map((t) => t + (ev.taskStatuses[t] ? ' [' + ev.taskStatuses[t] + ']' : ' [not found]')).join(', ')
|
|
1089
|
+
: 'none identifiable'));
|
|
1090
|
+
out(' content: ' + (ev.unique === 'landed' ? 'landed — ' + ev.reason
|
|
1091
|
+
: ev.unique === 'none' ? 'landed — ' + ev.reason
|
|
1092
|
+
: ev.unique === 'unique' ? ev.reason
|
|
1093
|
+
: 'unknown — ' + ev.reason)
|
|
1094
|
+
+ (ev.uniqueCommits ? ' (' + ev.uniqueCommits + ' branch-unique commit(s))' : ''));
|
|
1095
|
+
out(' worktree: ' + ev.dirt);
|
|
1096
|
+
out(' batch-approvable: ' + (ev.approvable ? 'yes' : 'NO — ' + ev.reason));
|
|
1097
|
+
}
|
|
1098
|
+
const ok = evidence.filter((e) => e.approvable).map((e) => e.name);
|
|
1099
|
+
out('');
|
|
1100
|
+
out(ok.length
|
|
1101
|
+
? 'batch approval: node .claude/hooks/worktree-create.js gc --approve ' + ok.join(' ')
|
|
1102
|
+
+ ' (or --approve --all for every batch-approvable candidate)'
|
|
1103
|
+
: 'no candidate qualifies for batch approval — resolve each individually (mark-landed after manual verification).');
|
|
1104
|
+
process.exit(0);
|
|
1105
|
+
}
|
|
1106
|
+
// --approve
|
|
1107
|
+
const byName = new Map(evidence.map((e) => [e.name, e]));
|
|
1108
|
+
const requested = flags.all
|
|
1109
|
+
? evidence.filter((e) => e.approvable).map((e) => e.name)
|
|
1110
|
+
: positional;
|
|
1111
|
+
if (requested.length === 0) {
|
|
1112
|
+
fail('gc --approve needs worktree names (or --all for every batch-approvable candidate); '
|
|
1113
|
+
+ 'run gc --review first');
|
|
1114
|
+
}
|
|
1115
|
+
const by = (function () { try { return os.userInfo().username; } catch { return null; } })();
|
|
1116
|
+
let approved = 0;
|
|
1117
|
+
let refused = 0;
|
|
1118
|
+
for (const nm of requested) {
|
|
1119
|
+
const ev = byName.get(nm);
|
|
1120
|
+
if (!ev) { out('SKIPPED ' + nm + ' — not a marker-starved candidate (already marked, too fresh, or unknown)'); refused += 1; continue; }
|
|
1121
|
+
if (!ev.approvable) { out('REFUSED ' + nm + ' — ' + ev.reason); refused += 1; continue; }
|
|
1122
|
+
appendLandedMarker(repo, {
|
|
1123
|
+
branch: ev.branch, worktree: ev.name, task: ev.tasks[0] || null,
|
|
1124
|
+
tip: ev.tip, via: 'gc-batch-review', by,
|
|
1125
|
+
});
|
|
1126
|
+
out('APPROVED ' + nm + ' — marker written (' + ev.reason + ')');
|
|
1127
|
+
approved += 1;
|
|
1128
|
+
}
|
|
1129
|
+
if (approved > 0) {
|
|
1130
|
+
// Reclaim through the ONE existing path. gcStaleWorktrees runs
|
|
1131
|
+
// unlinkNodeModulesLinks before every removal (TASK_1844: git recurses
|
|
1132
|
+
// through junctions and empties the MAIN checkout's node_modules —
|
|
1133
|
+
// measured twice). Batch reclaim must never grow a second deletion
|
|
1134
|
+
// implementation (TASK_1839 drift lesson) — approval only writes markers.
|
|
1135
|
+
gcStaleWorktrees(repo, path.join(repo, '.__gc_cli_no_keep__'), { verbose: true });
|
|
1136
|
+
}
|
|
1137
|
+
out('[worktree-create] gc approve: ' + approved + ' approved, ' + refused + ' refused/skipped');
|
|
1138
|
+
process.exit(refused > 0 ? 2 : 0);
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
/**
|
|
1142
|
+
* gc [--dry-run] [--review] [--approve <wt-name...>|--approve --all] [--repo <path>]
|
|
1143
|
+
* Runs the same GC as the WorktreeCreate hook. --dry-run is strictly read-only:
|
|
1144
|
+
* no removal, no branch -D, no `worktree prune`.
|
|
1145
|
+
* --review / --approve (TASK_1876): evidence-based batch handling of worktrees
|
|
1146
|
+
* kept only for a missing landed marker — see _cliGcReviewOrApprove.
|
|
1147
|
+
*/
|
|
1148
|
+
function cliGc(args) {
|
|
1149
|
+
const { flags, positional } = _cliParseFlags(args);
|
|
1150
|
+
const repo = _cliResolveRepo(flags);
|
|
1151
|
+
if (flags.review || flags.approve) {
|
|
1152
|
+
_cliGcReviewOrApprove(repo, flags, positional);
|
|
1153
|
+
return; // unreachable (process.exit inside) — defensive
|
|
1154
|
+
}
|
|
1155
|
+
process.stderr.write('[worktree-create] gc: repo=' + repo.replace(/\\/g, '/')
|
|
1156
|
+
+ (flags.dryRun ? ' (DRY-RUN — read-only)' : '') + '\n');
|
|
1157
|
+
// keepPath: a token that can never collide with a real worktree dir.
|
|
1158
|
+
// verbose: the CLI is where the per-worktree "why was this kept" report belongs
|
|
1159
|
+
// (hook mode stays quiet — see the comment on gcStaleWorktrees).
|
|
1160
|
+
gcStaleWorktrees(repo, path.join(repo, '.__gc_cli_no_keep__'), { dryRun: !!flags.dryRun, verbose: true });
|
|
1161
|
+
process.exit(0);
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
// Exports are unconditional: post-complete/git-merge.js requires this file for
|
|
1165
|
+
// appendLandedMarker, and it must get them no matter how we were started.
|
|
1166
|
+
module.exports = {
|
|
1167
|
+
runHook: main,
|
|
1168
|
+
GC_MIN_AGE_MS,
|
|
1169
|
+
landedLedgerPath,
|
|
1170
|
+
appendLandedMarker,
|
|
1171
|
+
readLandedIndex,
|
|
1172
|
+
deriveBranchForName,
|
|
1173
|
+
loadGcNoisePaths,
|
|
1174
|
+
isNoisePath,
|
|
1175
|
+
isLandedProgressNote,
|
|
1176
|
+
classifyWorktreeDirt,
|
|
1177
|
+
gcStaleWorktrees,
|
|
1178
|
+
siblingWorktreeBase,
|
|
1179
|
+
findNodeModulesParents,
|
|
1180
|
+
linkNodeModules,
|
|
1181
|
+
unlinkNodeModulesLinks,
|
|
1182
|
+
};
|
|
1183
|
+
|
|
1184
|
+
// Entry dispatch. Three distinct ways this file is started, and they must NOT be
|
|
1185
|
+
// collapsed — conflating them is what broke every worktree dispatch once the CLI
|
|
1186
|
+
// subcommands were added:
|
|
1187
|
+
//
|
|
1188
|
+
// require.main === module `node worktree-create.js [gc|mark-landed]` — CLI
|
|
1189
|
+
// require.main === undefined `node -e "require(...)"` — how settings.json wires
|
|
1190
|
+
// the WorktreeCreate hook. There is no main module
|
|
1191
|
+
// under `node -e`. The hook flow MUST run here; the
|
|
1192
|
+
// earlier `require.main === module` guard sent this
|
|
1193
|
+
// case to the exports-only branch, so the process
|
|
1194
|
+
// exited 0 having written nothing, and the harness
|
|
1195
|
+
// reported "hook succeeded but returned no worktree
|
|
1196
|
+
// path" on every single dispatch.
|
|
1197
|
+
// require.main === <other> required as a library (post-complete/git-merge.js
|
|
1198
|
+
// for appendLandedMarker, tests). Exports only —
|
|
1199
|
+
// running main() here would create a worktree in the
|
|
1200
|
+
// middle of a merge.
|
|
1201
|
+
if (require.main === module) {
|
|
1202
|
+
// TASK_1866: explicit subcommand whitelist. Anything unrecognized (--help,
|
|
1203
|
+
// typos, stray flags) used to fall through to main(), which built a real
|
|
1204
|
+
// worktree and exited 0 — a query for usage silently mutated the repo.
|
|
1205
|
+
// Whitelist: 'mark-landed' | 'gc' | <no args>. Everything else → usage, exit 1.
|
|
1206
|
+
//
|
|
1207
|
+
// <no args> intentionally still runs main() (manual hook invocation, e.g.
|
|
1208
|
+
// `echo <json> | node worktree-create.js` for testing): verified 2026-08-13
|
|
1209
|
+
// that NO caller depends on argument-less CLI invocation (grepped
|
|
1210
|
+
// .claude/settings.json, .formation/, .specialist/, dev/scripts/ — the hook
|
|
1211
|
+
// is wired via `node -e "require(...)"`, git-merge.js requires this file as
|
|
1212
|
+
// a library, and all documented CLI usage is gc/mark-landed). It is safe
|
|
1213
|
+
// regardless: main()'s stdin gate rejects it with exit 1 unless a valid
|
|
1214
|
+
// WorktreeCreate JSON object is piped in.
|
|
1215
|
+
const sub = process.argv[2];
|
|
1216
|
+
if (sub === 'mark-landed') cliMarkLanded(process.argv.slice(3));
|
|
1217
|
+
else if (sub === 'gc') cliGc(process.argv.slice(3));
|
|
1218
|
+
else if (sub === undefined) main();
|
|
1219
|
+
else {
|
|
1220
|
+
process.stderr.write(
|
|
1221
|
+
'[worktree-create] unknown subcommand: ' + sub + '\n'
|
|
1222
|
+
+ 'usage:\n'
|
|
1223
|
+
+ ' node .claude/hooks/worktree-create.js mark-landed <wt-name|wt-path|branch> [--task TASK_X] [--repo <path>] [--by <who>] [--tip <sha>]\n'
|
|
1224
|
+
+ ' node .claude/hooks/worktree-create.js gc [--dry-run] [--repo <path>]\n'
|
|
1225
|
+
+ ' node .claude/hooks/worktree-create.js gc --review [--repo <path>]\n'
|
|
1226
|
+
+ ' node .claude/hooks/worktree-create.js gc --approve <wt-name...> | --approve --all [--repo <path>]\n'
|
|
1227
|
+
+ ' (no args: WorktreeCreate hook flow — requires the hook JSON object on stdin)\n');
|
|
1228
|
+
process.exit(1);
|
|
1229
|
+
}
|
|
1230
|
+
} else if (require.main === undefined) {
|
|
1231
|
+
main(); // WorktreeCreate hook mode (stdin JSON contract unchanged; stdin gate inside main)
|
|
1232
|
+
}
|