Skip to content

feat: Phase 3 — bootstrap commands, skills, and state issue#81

Merged
thejustinwalsh merged 10 commits into
mainfrom
middle-issue-21
May 23, 2026
Merged

feat: Phase 3 — bootstrap commands, skills, and state issue#81
thejustinwalsh merged 10 commits into
mainfrom
middle-issue-21

Conversation

@thejustinwalsh

@thejustinwalsh thejustinwalsh commented May 23, 2026

Copy link
Copy Markdown
Owner

Summary

Closes #21

🚧 Draft — work in progress. Phase 3 of the build spec: the dogfooding crossover. See the plan comment for full scope.

Plan

mm init/mm uninit bootstrap (and reverse) middle into a target repo — skills, hooks, per-repo config, a schema-conforming state issue, gitignore. The dispatcher gains read/write of its three owned state-issue sections. Finally, middle is bootstrapped into its own repo.

Status

Verification evidence

Decisions

See planning/issues/21/decisions.md (distilled into per-line review comments before final review).

Summary by CodeRabbit

  • New Features

    • Add mm init / mm uninit to bootstrap and unbootstrap a repo (skills, hooks, per-repo config, state issue).
    • Skills synchronization and a sync/check script plus pre-commit verification; doctor now reports skills drift.
  • Documentation

    • New comprehensive skill specs, integration-test guide, and dogfooding operator runbook.
  • Chores

    • Package scripts updated to expose sync and prepare hooks.
  • Tests

    • Extensive tests for init/uninit, skills sync, state-issue handling, and dispatcher seams.
  • Bug Fixes

    • Updated .gitignore to ignore local-only files/directories.

Review Change Stack

@coderabbitai

coderabbitai Bot commented May 23, 2026

Copy link
Copy Markdown

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f52dc088-9df3-4b1a-9fd5-f47a7d74916a

📥 Commits

Reviewing files that changed from the base of the PR and between 197df6c and 4fc72fd.

📒 Files selected for processing (8)
  • docs/dogfooding.md
  • package.json
  • packages/cli/src/bootstrap/init.ts
  • packages/cli/src/bootstrap/skills-sync.ts
  • packages/cli/src/bootstrap/uninit.ts
  • packages/cli/src/commands/doctor.ts
  • packages/cli/test/bootstrap-init.test.ts
  • packages/cli/test/skills-sync.test.ts
✅ Files skipped from review due to trivial changes (1)
  • docs/dogfooding.md

📝 Walkthrough

Walkthrough

Implements Phase 3 bootstrap: adds mm init/uninit CLI flows, byte-accurate canonical skills mirroring with sync/check scripts and pre-commit enforcement, hook config writers/stripers, state-issue creation and dispatcher read/write seams, CLI wiring, operator runbook, and comprehensive tests.

Changes

Phase 3 Bootstrap Commands, Skills, and State Issue

Layer / File(s) Summary
Canonical skills and docs
packages/skills/..., packages/cli/src/bootstrap-assets/skills/..., docs/dogfooding.md, planning/issues/21/*
Adds SKILL.md documents and vitexec references for implementing/recommending GitHub issues, plus planning/decisions and operator runbook for the dogfooding crossover.
Skills sync, pre-commit, and scripts
packages/cli/src/bootstrap/skills-sync.ts, scripts/sync-skills.ts, scripts/hooks/pre-commit, packages/cli/test/skills-sync.test.ts
Implements diffSkills/syncSkills, a sync script with --check, and pre-commit enforcement; tests for copy/idempotency/orphan removal.
Bootstrap types and config utilities
packages/cli/src/bootstrap/types.ts, packages/cli/src/bootstrap/config-template.ts, packages/cli/src/bootstrap/index.ts
Adds bootstrap types/constants, renderRepoConfig, and a barrel export for bootstrap surface.
Deps and real GH/git impls
packages/cli/src/bootstrap/deps.ts
Adds process runner, parseRepoSlug, realGithub wrappers calling gh for label/issue operations, and realDeps (worktree/remote/gh auth/repo info).
Assets staging and gitignore/hooks
packages/cli/src/bootstrap/assets.ts, packages/cli/src/bootstrap/gitignore.ts, packages/cli/src/bootstrap/hook-config.ts
Adds list/copy/stage skills and stageHookScript, add/remove .middle/ in .gitignore, and write/strip hook configs for Claude (.claude/settings.json) and Codex (.codex/config.toml sentinel blocks).
MM init orchestration and CLI
packages/cli/src/bootstrap/init.ts, packages/cli/src/commands/init.ts, packages/cli/test/bootstrap-init.test.ts
Implements initRepo (fresh/reinit/migrate modes, target validation, staging, state-issue creation, config write, gitignore update, dry-run), runInit CLI, and tests verifying behaviors and schema validation.
MM uninit orchestration and CLI
packages/cli/src/bootstrap/uninit.ts, packages/cli/src/commands/uninit.ts
Implements uninitRepo (close state issue when resolvable, strip hook configs, remove skills/.middle, gitignore cleanup) and runUninit CLI with dry-run support and tests.
State-issue and dispatcher seams
packages/cli/src/bootstrap/state-issue-body.ts, packages/dispatcher/src/state-issue.ts, packages/dispatcher/test/state-issue.test.ts, packages/cli/test/state-issue-body.test.ts
Generates initial empty state-issue bodies, provides applyDispatcherSections/insertDispatcherTick/readState/updateDispatcherSections plus a ghStateIssueGateway; tests ensure byte-identical preservation of recommender sections and correct dispatcher updates/tick semantics.
CLI wiring and doctor
packages/cli/src/index.ts, packages/cli/src/commands/doctor.ts, packages/cli/test/doctor.test.ts
Registers mm init/mm uninit subcommands; adds checkSkillsDrift to doctor (warn + sync-skills guidance) and updates doctor tests.
Packaging and gitignore
package.json, packages/cli/package.json, .gitignore
Adds sync-skills and prepare scripts, new workspace dependency entries, and updates .gitignore to ignore .claude settings/worktrees and document .middle/ local-only handling.
Tests
packages/cli/test/*, packages/dispatcher/test/*
Adds/updates comprehensive tests for init/uninit, skills-sync, state-issue body and dispatcher behaviors, and doctor checks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related issues

  • #26: Implements the operator-run dogfooding crossover via mm init/uninit and operator runbook (direct overlap).
  • #25: Implements dispatcher state-issue read/patch/write seam and tick marker handling (direct overlap).
  • #24: Implements state-issue creation, initial body generation, and label/issue creation (direct overlap).
  • #23: Implements canonical skills mirroring, sync enforcement, pre-commit hook, and doctor drift checks (direct overlap).
  • #22: Implements mm init/mm uninit CLI commands, hook/config handling, and bootstrap modules (direct overlap).

packages/skills/ holds the canonical implementing- and recommending-github-issues
skills; packages/cli/src/bootstrap-assets/skills/ mirrors them byte-for-byte (the
copy mm init stamps). scripts/sync-skills.ts keeps them in sync; a committed
pre-commit hook (core.hooksPath=scripts/hooks, installed by the prepare script)
fails the commit on drift, and mm doctor warns on it.
Transactional bootstrap of middle into a target repo (validate → stage skills to
.claude/.codex → hook.sh + per-CLI hook config → .middle/config.toml → state
label/issue seam → gitignore), idempotent across re-init, with a --dry-run plan.
mm uninit reverses each step, stripping only middle's hook entries and preserving
foreign ones. Externals are isolated behind an injectable BootstrapDeps; tests
exercise fresh/reinit/dry-run/uninit over a scratch repo.
…arsing

Locks sub-issue #24: the empty body mm init creates is schema-conforming and
byte-identical round-trip stable, and origin-remote slug parsing covers SSH/HTTPS
forms with and without .git.
The dispatcher reads a repo's state issue via gh, parses it, and writes back only
In-flight / Rate limits / Slot usage (partial patch supported), re-rendering so
recommender-owned sections and the generated metadata survive byte-identically.
Optional dispatcher-tick markers are placed before the first section and ignored
by the parser. gh access is behind an injectable StateIssueGateway.
Untrack files an earlier `git add -A` swept in; the per-repo .middle/ dir and the
machine-local .claude/settings.json are operational, not source. Ignoring
.middle/ is mm init's own step 7 applied to middle — the committable slice of the
dogfooding self-bootstrap. Skills under .claude/skills/ stay committed.
The live mm init . on middle and mm dispatch . <issue> are an operator handoff
(spec dogfooding rule #5), not an in-flight-agent action: dispatch nests agents
and the live state issue would orphan from an unmerged branch. Documents the
runbook and records the decision; the committable self-bootstrap slice (gitignore
.middle/) already landed.
@thejustinwalsh

Copy link
Copy Markdown
Owner Author

Phase 3 status — 4/5 done, #26 is an operator handoff

Sub-issues #22, #23, #24, #25 are implemented, tested, and pushed on PR #81 (all tests + typecheck green):

#26 (dogfooding crossover) needs you

The live crossover can't be safely run from inside this dispatch:

  1. mm dispatch . <issue> nests agents — it needs mm start (port 8822), a second worktree + claude/tmux session, and a human-created Epic to target.
  2. mm init . opens a live agent-queue:state issue on this repo; from an unmerged branch it would orphan if the PR is reworked. The spec frames the crossover as the operator's deliberate chicken-and-egg handoff (dogfooding rule Add hand-crafted state-issue body fixture #5).

Delivered committable slice: .gitignore now ignores .middle/ (mm init step 7), and docs/dogfooding.md is the operator runbook. mm init . --dry-run resolves the real thejustinwalsh/middle identity and validates a clean plan.

Decision needed: run the live crossover yourself per docs/dogfooding.md (recommended, post-merge), or tell me capability-evidence counts as #26 done so the PR can go ready. The PR stays draft until then.

@thejustinwalsh

Copy link
Copy Markdown
Owner Author

#26 is stale, we have manually done these steps and are indeed running it through middle now, so contraints have been handled and we just need to ensute mm init . is ready to be used.

@thejustinwalsh thejustinwalsh marked this pull request as ready for review May 23, 2026 20:42
@thejustinwalsh thejustinwalsh added the ready-for-review All phases done and verified — PR ready for final human review and merge label May 23, 2026
@thejustinwalsh

Copy link
Copy Markdown
Owner Author

Reviewer's brief — Phase 3 (bootstrap commands, skills, state issue)

Scope: sub-issues #22#25 (all closed). #26 — the live "bootstrap middle into its own repo" crossover — is a post-merge operator action, deliberately deferred. It is not part of this review; don't block on it being open. Rationale in planning/issues/21/decisions.md (last entry) and the runbook in docs/dogfooding.md.

How to run / verify

  • bun run typecheck → clean.
  • bun test → 212 pass / 0 fail.
  • bun scripts/sync-skills.ts --check → confirms packages/skills/ and packages/cli/src/bootstrap-assets/skills/ are byte-identical (the pre-commit hook and mm doctor both flag drift).
  • mm init <scratch-repo> --dry-run → resolves the repo identity and prints the plan, no changes made.

What to verify (load-bearing)

  • State-issue round-trip invariant (packages/dispatcher/src/state-issue.ts): the dispatcher patches only In-flight / Rate limits / Slot usage via parse → patch → render; recommender-owned sections must return byte-identical (tests cover this, incl. with a dispatcher-tick marker — and ticks must not accumulate).
  • mm init/mm uninit transactionality + reversibility (packages/cli/src/bootstrap/): fresh install, idempotent re-init, --dry-run, uninit removal. .claude/settings.json edits must preserve foreign hook entries (structured JSON); .codex/config.toml uses a sentinel block uninit strips by line range.
  • Initial state-issue body (bootstrap/state-issue-body.ts): empty sections, rate limits UNKNOWN, passes validate(), round-trips byte-identical.

Extra eyes

  • recommending-github-issues SKILL.md was extracted verbatim from the build spec's embedded code block with fence/continuation escapes resolved — worth a skim that nothing got mangled.
  • core.hooksPath install via the prepare script (no husky) — confirm it installs on a fresh bun install.

Decisions log: planning/issues/21/decisions.md (9 entries).

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (3)
packages/cli/src/bootstrap/assets.ts (1)

10-13: ⚡ Quick win

Make bootstrap skill ordering deterministic.

readdirSync order can vary by filesystem, which can cause unstable stageSkills action ordering/tests. Sorting the skill names keeps behavior reproducible.

♻️ Proposed change
 export function listBootstrapSkills(): string[] {
   if (!existsSync(BOOTSTRAP_SKILLS_DIR)) return [];
   return readdirSync(BOOTSTRAP_SKILLS_DIR, { withFileTypes: true })
     .filter((e) => e.isDirectory())
-    .map((e) => e.name);
+    .map((e) => e.name)
+    .sort((a, b) => a.localeCompare(b));
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/src/bootstrap/assets.ts` around lines 10 - 13, readdirSync on
BOOTSTRAP_SKILLS_DIR can return entries in non-deterministic order; ensure the
returned skill list is stable by sorting the directory names before returning:
after filtering/map of Dirent names (reference the usage of readdirSync and
BOOTSTRAP_SKILLS_DIR in this function), call a stable sort on the array of names
(e.g., alphabetical) so stageSkills ordering/tests become deterministic.
packages/cli/test/bootstrap-init.test.ts (1)

100-140: ⚡ Quick win

Add a regression test for reinit/migrate when state_issue.number is missing/zero.

Current tests cover clean reinit, but not the broken-config path that can preserve stateIssue = 0. A focused test here would lock the expected recovery behavior and prevent regressions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/cli/test/bootstrap-init.test.ts` around lines 100 - 140, Add a new
unit test in packages/cli/test/bootstrap-init.test.ts that covers the regression
where the stored state_issue.number is missing or zero: use makeFakeDeps() and
prepare the repo so .middle/config.toml either lacks state_issue or has
state_issue = 0, then call initRepo(repo, deps, { dryRun: false }) and assert
that initRepo recovers/migrates (result.mode indicates reinit/migrate),
result.stateIssue is a non-zero issue id, and no duplicate issue is created
(calls.created length remains 1); reference initRepo, makeFakeDeps, stateIssue,
.middle/config.toml and calls.created when locating where to add this test.
planning/issues/21/plan.md (1)

29-44: 💤 Low value

Consider clarifying phase numbering vs issue numbers.

The section header "Phases (one per sub-issue)" lists phases 1-5, but the issue numbers appear as #23, #22, #24, #25, #26 (out of numerical order). This is intentional—phases are ordered by implementation dependency—but might briefly confuse readers expecting sequential issue numbers.

Optional clarification
-## Phases (one per sub-issue)
+## Phases (one per sub-issue, ordered by implementation dependency)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@planning/issues/21/plan.md` around lines 29 - 44, Clarify that the "Phases
(one per sub-issue)" numbering is implementation order not GitHub issue
numerical order by adding a short parenthetical or sentence after the header
(referencing the header text "Phases (one per sub-issue)" and the listed items
that reference issues `#23`, `#22`, `#24`, `#25`, `#26`) stating that phases 1–5 are
ordered by dependency and do not correspond to ascending issue numbers; keep
each bullet as-is but add this one-line note so readers aren’t confused.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/dogfooding.md`:
- Around line 56-58: Add concrete guidance for creating the manual Epic
referenced by the mm dispatch step: specify required labels (e.g., "epic" plus
any pipeline-specific tags), the expected sub-issue format (each sub-issue must
include title, corresponding assignee and status label, and an optional
"estimate" field in the body), and the Epic description structure (summary,
expected acceptance criteria, and a simple list of sub-issue issue keys or
links). Reference the commands "mm start" and "mm dispatch . <epic-number>" and
mention that the Epic must be reachable by its issue number/id and that
sub-issues should be linked to the Epic (via parent field or issue links) so
dispatch can resolve them.
- Around line 49-50: Update docs/dogfooding.md to clarify two points: confirm
that the git command in step 3 (git add .claude/skills .codex/skills .gitignore)
is correct because mm init stages skills into .claude/skills and .codex/skills
and only .middle/ is intended to be local-only in .gitignore; and enhance step 5
to specify the exact requirements for the “manually created Epic” used with mm
dispatch . <epic-number>: the Epic must be a GitHub issue that contains native
GitHub sub-issues (open sub-issues represent phases and their acceptance
criteria), do not dispatch bare sub-issues, and include a link to the skills
documentation section that explains Epic/sub-issue requirements so operators
know what to put in each sub-issue.

In `@package.json`:
- Line 15: The package.json "prepare" script currently runs automatically and
changes the user's Git core.hooksPath; update this by either removing or making
it opt-in (e.g., require an env flag like INSTALL_HOOKS=true or SKIP_HOOKS check
before running the git config command) and add a short note to README or
CONTRIBUTING describing the behavior and how to opt into or disable it so
contributors aren't surprised by the automatic git configuration change.

In `@packages/cli/src/bootstrap/init.ts`:
- Around line 22-34: The readExistingConfig function currently swallows TOML
parse errors and returns null, causing a malformed .middle/config.toml to be
treated as a fresh install; update readExistingConfig to rethrow or propagate
parsing errors instead of returning null (i.e., remove the empty catch and let
the parseToml/readFileSync errors bubble up or throw a new Error with context),
ensuring callers (initRepo) will fail fast; apply the same change to the other
identical parse block referenced in the diff (the second TOML read/parse code
path) so both code paths consistently surface parse failures.
- Around line 95-106: The code keeps stateIssue (which may be 0) for any mode
!== "fresh", causing repos with no valid state issue to proceed without one;
change the logic so when stateIssue is falsy (e.g., 0) you perform the same
creation steps as the "fresh" branch: call deps.github.ensureStateLabel(info)
and, if not dry, call buildInitialStateIssueBody(deps.now()) and
deps.github.createStateIssue(info, STATE_ISSUE_TITLE, body) to set stateIssue.
Locate the variables/stateIssue, mode, existing, and the calls
deps.github.ensureStateLabel and deps.github.createStateIssue to implement this
fallback creation when stateIssue is missing.

In `@packages/cli/src/bootstrap/skills-sync.ts`:
- Around line 65-77: unionSkillFiles currently builds the file union by
iterating only skills returned from listSkillDirs(canonicalDir), so any skill
directories that exist solely in mirrorDir are omitted and won't be removed by
syncSkills; fix by enumerating skill directories from both trees (e.g., call
listSkillDirs(canonicalDir) and listSkillDirs(mirrorDir) or merge their results
into a single set) and then iterate that combined set when collecting paths with
listFilesRecursive(join(...)). Ensure the returned sorted array includes files
from both canonicalDir and mirrorDir so orphaned mirror directories are detected
and removed during syncSkills.

In `@packages/cli/src/bootstrap/uninit.ts`:
- Around line 58-61: When deciding whether to close a state issue in uninit,
don't skip closure just because local repo metadata `info` is missing; if
`stateIssue > 0` attempt to resolve repository info via the injected `deps`
before skipping. Update the block around `if (stateIssue > 0 && info)` (where
`note`, `dry`, and `deps.github.closeStateIssue` are used) to first try a
fallback lookup like `info = info || await deps.github.resolveRepoInfo()` (or
the appropriate deps method) and only skip closure if that lookup fails; then
call `deps.github.closeStateIssue(info, stateIssue, ...)` when `dry` is false.

In `@packages/cli/src/commands/doctor.ts`:
- Line 111: The current warning summary text still refers to "UX" degradation
but checkSkillsDrift() (and similar checks) produce non-UX warnings; update the
summary strings used around the doctor warnings so they are generic (e.g.,
"Warnings detected" or "Potential issues detected") instead of UX-specific
language. Locate the places that compose the final warning summary (the array
including checkSkillsDrift() and the code that formats/prints the summary around
the entries at the same block that handles warnings at lines near where
checkSkillsDrift() is included) and replace the UX-specific message with a
neutral summary used for all warnings.

---

Nitpick comments:
In `@packages/cli/src/bootstrap/assets.ts`:
- Around line 10-13: readdirSync on BOOTSTRAP_SKILLS_DIR can return entries in
non-deterministic order; ensure the returned skill list is stable by sorting the
directory names before returning: after filtering/map of Dirent names (reference
the usage of readdirSync and BOOTSTRAP_SKILLS_DIR in this function), call a
stable sort on the array of names (e.g., alphabetical) so stageSkills
ordering/tests become deterministic.

In `@packages/cli/test/bootstrap-init.test.ts`:
- Around line 100-140: Add a new unit test in
packages/cli/test/bootstrap-init.test.ts that covers the regression where the
stored state_issue.number is missing or zero: use makeFakeDeps() and prepare the
repo so .middle/config.toml either lacks state_issue or has state_issue = 0,
then call initRepo(repo, deps, { dryRun: false }) and assert that initRepo
recovers/migrates (result.mode indicates reinit/migrate), result.stateIssue is a
non-zero issue id, and no duplicate issue is created (calls.created length
remains 1); reference initRepo, makeFakeDeps, stateIssue, .middle/config.toml
and calls.created when locating where to add this test.

In `@planning/issues/21/plan.md`:
- Around line 29-44: Clarify that the "Phases (one per sub-issue)" numbering is
implementation order not GitHub issue numerical order by adding a short
parenthetical or sentence after the header (referencing the header text "Phases
(one per sub-issue)" and the listed items that reference issues `#23`, `#22`, `#24`,
`#25`, `#26`) stating that phases 1–5 are ordered by dependency and do not
correspond to ascending issue numbers; keep each bullet as-is but add this
one-line note so readers aren’t confused.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: fedc0f82-3354-4cf3-b04e-136eb17ed2d3

📥 Commits

Reviewing files that changed from the base of the PR and between df5363a and 197df6c.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (35)
  • .gitignore
  • docs/dogfooding.md
  • package.json
  • packages/cli/package.json
  • packages/cli/src/bootstrap-assets/skills/implementing-github-issues/SKILL.md
  • packages/cli/src/bootstrap-assets/skills/implementing-github-issues/references/vitexec-integration-suite.md
  • packages/cli/src/bootstrap-assets/skills/recommending-github-issues/SKILL.md
  • packages/cli/src/bootstrap/assets.ts
  • packages/cli/src/bootstrap/config-template.ts
  • packages/cli/src/bootstrap/deps.ts
  • packages/cli/src/bootstrap/gitignore.ts
  • packages/cli/src/bootstrap/hook-config.ts
  • packages/cli/src/bootstrap/index.ts
  • packages/cli/src/bootstrap/init.ts
  • packages/cli/src/bootstrap/skills-sync.ts
  • packages/cli/src/bootstrap/state-issue-body.ts
  • packages/cli/src/bootstrap/types.ts
  • packages/cli/src/bootstrap/uninit.ts
  • packages/cli/src/commands/doctor.ts
  • packages/cli/src/commands/init.ts
  • packages/cli/src/commands/uninit.ts
  • packages/cli/src/index.ts
  • packages/cli/test/bootstrap-init.test.ts
  • packages/cli/test/doctor.test.ts
  • packages/cli/test/skills-sync.test.ts
  • packages/cli/test/state-issue-body.test.ts
  • packages/dispatcher/src/state-issue.ts
  • packages/dispatcher/test/state-issue.test.ts
  • packages/skills/implementing-github-issues/SKILL.md
  • packages/skills/implementing-github-issues/references/vitexec-integration-suite.md
  • packages/skills/recommending-github-issues/SKILL.md
  • planning/issues/21/decisions.md
  • planning/issues/21/plan.md
  • scripts/hooks/pre-commit
  • scripts/sync-skills.ts

Comment thread docs/dogfooding.md
Comment thread docs/dogfooding.md Outdated
Comment thread package.json Outdated
Comment thread packages/cli/src/bootstrap/init.ts
Comment thread packages/cli/src/bootstrap/init.ts
Comment thread packages/cli/src/bootstrap/skills-sync.ts
Comment thread packages/cli/src/bootstrap/uninit.ts Outdated
Comment thread packages/cli/src/commands/doctor.ts
- init: fail fast on a malformed existing .middle/config.toml instead of
  treating it as fresh (was risking a duplicate state issue + clobbered metadata)
- init: mint + persist a state issue on reinit/migrate when the config carries
  no usable issue number, not only on fresh
- uninit: resolve repo identity from deps when [repo] is missing, so the state
  issue is never left orphaned open
- skills-sync: union skill dirs from both trees so an orphaned mirror dir is
  detected and removed (was silently breaking byte-identity)
- doctor: generic warning summary (skills-drift warnings aren't UX-only)
- prepare: announce the core.hooksPath change instead of doing it silently
- docs/dogfooding: how to create a dispatchable Epic; .codex/skills commit note
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-review All phases done and verified — PR ready for final human review and merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bootstrap commands, skills, and state issue

1 participant