feat: adopt mise monorepo (config_roots, native //dir:task, per-family task_templates)#47
Merged
Conversation
Generated root mise.toml (monorepo_root + glob config_roots), tools hoisted from member #1, per-family task_templates hoisted lazily at member #2 (promotion converts the first member's unmodified tasks to extends). Engine verifies via mise //<dir>:<task>; root config + member conversion both done with a comment-preserving surgical TOML merge (go-toml/v2 unstable byte-range splice). Empirically validated against mise 2026.6.6 + go-toml/v2 v2.3.1.
…ars-parameterized)
…:task, templates)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Makes a SpecKit repo a real mise monorepo from the first
specify target add, instead of composing members with subshellcd … && mise run test.mise.toml.monorepo_root = true+ a required[monorepo].config_roots(memberDir globs likeapps/*,cmd/*; mise's filesystem auto-discovery is deprecated). Merged with a real TOML library —go-toml/v2'sunstablebyte-range parser — so user comments, hand-pinned tool versions, and hand-added[tasks.*]/[env]survive every futuretarget add. No managed-region markers.[tools]from member GitHub Pillar 1: PR gating + Oxfmt/Oxlint quality + rules pack + act self-test #1. Members drop their[tools](the apple-specifictuiststays member-level by design).[task_templates]are written to root only once the family has a second member; existing members convert their still-canonical inline tasks toextends(a user-edited task is left inline, never silently overridden).description/depends/comments/custom tasks are preserved.node(web),swift(apple/swift-package/swift-cli —testunified via apackage_pathvar,fmt/lintvia a superset dir walk),go(go-service).target.commandis nowmise //<dir>:test(runs with cwd = the member dir, so relative reports still resolve). Existing repos keep their recorded command — both forms remain valid.op→1password(canonical mise registry name; the binary staysop).Design:
docs/design/mise-monorepo.md. Plan:docs/design/mise-monorepo-plan.md.Implementation
Engine in
internal/scaffold/monorepo.go(parseExprs/spliceprimitives,Family/LoadFamily,EnsureRootMise,PromoteMember); family files ininternal/coreassets/templates/monorepo/{node,swift,go}.toml; CLI orchestration incmd/specify/monorepo.go(wireMonorepo, called bytarget add/register).Built task-by-task via subagent-driven development with two-stage (spec + code-quality) review on every task.
Test Plan
mise run cigreen (gofmt + build + vet + all 10 packages)[tasks.*]preservation, glob derivation, promotion (stays-inline / converts-at-Richer CI annotations: verify/parity --format github (file:line) #2 / edited-task-left-inline / vars-substituted), all via re-parse checks.tomlbody stays byte-identical to its member scaffolds' inline bodiesKnown follow-up
mise trustis now redundant (root trust propagates) but harmless — deliberately left for a later cleanup.