@mc-and-his-agents/loom-installer 0.1.113 → 0.1.115
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/package.json +1 -1
- package/payload/manifest.json +421 -421
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-build/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/loom-story/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/plugin/loom/skills/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/plugin/loom/skills/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/plugin/loom/skills/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +0 -3
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +130 -2
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +0 -52
- package/payload/plugin/loom/skills/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-adopt/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-build/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-build/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-build/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-build/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-build/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-build/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-build/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-build/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-build/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-handoff/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-init/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-init/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-pre-review/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-resume/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-resume/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-retire/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-retire/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-review/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-review/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-spec-review/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-spec-review/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-spec-review/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-spec-review/.loom-runtime/shared/scripts/loom_init.py +105 -103
- package/payload/skills/loom-story/.loom-runtime/loom-init/SKILL.md +5 -3
- package/payload/skills/loom-story/.loom-runtime/loom-init/references/intake-signals.md +5 -5
- package/payload/skills/loom-story/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +11 -3
- package/payload/skills/loom-story/.loom-runtime/shared/references/adoption/repo-companion-contract.md +4 -7
- package/payload/skills/loom-story/.loom-runtime/shared/references/adoption/target-repo-version-contract.md +3 -1
- package/payload/skills/loom-story/.loom-runtime/shared/scripts/governance_surface.py +0 -3
- package/payload/skills/loom-story/.loom-runtime/shared/scripts/loom_check.py +130 -2
- package/payload/skills/loom-story/.loom-runtime/shared/scripts/loom_flow.py +0 -52
- package/payload/skills/loom-story/.loom-runtime/shared/scripts/loom_init.py +105 -103
|
@@ -66,7 +66,7 @@ description: Loom 的 root entry。负责初始化新项目或既有仓库,并
|
|
|
66
66
|
|
|
67
67
|
`--intent` 用来表达采用意图,而不是仓库静态分类。未显式给出 intent 时,dry-run 仍会输出推荐路径、风险摘要和计划写入载体;如果实际写入会创建重执行控制面,必须先显式选择 `execution-control` 或 `strong-governance`。
|
|
68
68
|
|
|
69
|
-
每个 intent 会收敛到一个 `scaffold_profile`。`observe-only` 与 `skill-install-only` 不写 adoption carriers;`attach-only` 只写 companion/read surfaces,并显式禁止 `.loom/work-items/**`、`.loom/progress/**`、`.loom/status/current.md`、`.loom/reviews/**`、`.loom/specs/**` 等 Loom-authored truth carriers;`light-governance` 写 companion、review
|
|
69
|
+
每个 intent 会收敛到一个 `scaffold_profile`。`observe-only` 与 `skill-install-only` 不写 adoption carriers;`attach-only` 只写 companion/read surfaces,并显式禁止 `.loom/work-items/**`、`.loom/progress/**`、`.loom/status/current.md`、`.loom/reviews/**`、`.loom/specs/**` 等 Loom-authored truth carriers;`light-governance` 写 companion、review guidance 与 PR 最小闭环但不写 Loom-owned work/progress/status/spec carriers;`execution-control` 与 `strong-governance` 才写 Loom-owned execution carriers。
|
|
70
70
|
|
|
71
71
|
## 1. 读取顺序
|
|
72
72
|
|
|
@@ -164,13 +164,15 @@ description: Loom 的 root entry。负责初始化新项目或既有仓库,并
|
|
|
164
164
|
- `code_review`
|
|
165
165
|
- `spec_review`
|
|
166
166
|
- 最小 PR 模板
|
|
167
|
-
-
|
|
167
|
+
- repo companion 与 bootstrap metadata
|
|
168
|
+
- review guidance / spec-review guidance
|
|
168
169
|
- 默认不装配:
|
|
169
170
|
- 完整 recovery 模型
|
|
170
171
|
- work item 合同
|
|
171
172
|
- 状态面
|
|
172
173
|
- profile 分层
|
|
173
174
|
- 重 harness
|
|
175
|
+
- formal spec suite
|
|
174
176
|
- 若需要轻量跨轮承接,默认使用 `checkpoint-lite`
|
|
175
177
|
- 即使本轮不装配标准恢复或状态面,也必须写清:
|
|
176
178
|
- issue / PR 中谁是恢复主入口
|
|
@@ -199,7 +201,7 @@ description: Loom 的 root entry。负责初始化新项目或既有仓库,并
|
|
|
199
201
|
- 保留 root rules
|
|
200
202
|
- 保留 retained host actions
|
|
201
203
|
- 保留 repo-native carriers
|
|
202
|
-
- 第一轮不生成 Loom-owned `work-item` / `progress` / `status-surface` placeholder
|
|
204
|
+
- 第一轮不生成 Loom-owned `work-item` / `progress` / `status-surface` / `spec` placeholder
|
|
203
205
|
|
|
204
206
|
## 4. 输出初始化结果
|
|
205
207
|
|
package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/loom-init/references/intake-signals.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
- 是否已有 CI / 基础测试
|
|
27
27
|
- 是否已有统一的仓库级验证入口
|
|
28
28
|
- 当前主要缺口属于哪一类:
|
|
29
|
-
- 治理入口 / review 合同 / 条件化 spec 路径
|
|
29
|
+
- 治理入口 / review 合同 / 条件化 spec-review 路径
|
|
30
30
|
- 恢复 / 状态 / 执行支撑
|
|
31
31
|
- 是否有明显长任务恢复痛点
|
|
32
32
|
- 是否存在共享契约 / 共享数据模型 / 核心抽象 / 高风险链路
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
- 已有清晰根级边界文档
|
|
78
78
|
- 已有 CI / 基础测试
|
|
79
79
|
- 已有统一的仓库级验证入口
|
|
80
|
-
- 当前缺口主要在治理入口、review 合同、条件化 spec 路径
|
|
80
|
+
- 当前缺口主要在治理入口、review 合同、条件化 spec-review 路径
|
|
81
81
|
- 尚无明显长任务恢复痛点
|
|
82
82
|
- 当前没有需要立即进入更重路径的共享边界或高风险核心抽象信号
|
|
83
83
|
- 当前主产物本身不是共享 contract、shared skill 或 governance module
|
|
@@ -86,8 +86,8 @@
|
|
|
86
86
|
|
|
87
87
|
- 直接采用 [../../shared/references/adoption/lightweight-retrofit-default.md](../../shared/references/adoption/lightweight-retrofit-default.md)
|
|
88
88
|
- 默认 `companion docs` 接入
|
|
89
|
-
-
|
|
90
|
-
- 默认不装配完整 recovery、`Work Item`、`status control plane
|
|
89
|
+
- 默认装配最小治理包、repo companion、bootstrap metadata、review guidance 与 PR 模板
|
|
90
|
+
- 默认不装配完整 recovery、`Work Item`、`status control plane`、formal spec suite 与重 harness
|
|
91
91
|
- 若需要轻量跨轮承接,默认 `checkpoint-lite`
|
|
92
92
|
|
|
93
93
|
### 4.3 `复杂既有仓库`
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
- 若缺少统一验证入口,或仓库主产物本身是共享 contract、shared skill 或 governance module,优先判为 `复杂既有仓库`
|
|
130
130
|
- 任何共享契约、运行模型或高风险核心抽象变化,优先提升到更重路径
|
|
131
131
|
- 任何多轮恢复成本明显升高或出现多个入口并行记录,优先从 `checkpoint-lite` 升级到标准恢复形态
|
|
132
|
-
- 只有在缺口主要集中于治理入口、review 合同、条件化 spec 路径,且恢复痛点不明显时,才保持轻量路径
|
|
132
|
+
- 只有在缺口主要集中于治理入口、review 合同、条件化 spec-review 路径,且恢复痛点不明显时,才保持轻量路径
|
|
133
133
|
|
|
134
134
|
## 6. 场景到默认装配映射
|
|
135
135
|
|
|
@@ -11,19 +11,20 @@
|
|
|
11
11
|
- 已有清晰的工程边界文档,例如 `AGENTS.md`
|
|
12
12
|
- 已有 CI 与基础测试
|
|
13
13
|
- 已有统一的仓库级验证入口,而不是只有零散子模块脚本
|
|
14
|
-
- 当前缺的是治理入口、review 合同或条件化 spec 路径
|
|
14
|
+
- 当前缺的是治理入口、review 合同或条件化 spec-review 路径
|
|
15
15
|
- 当前还没有明显的长任务恢复痛点
|
|
16
16
|
- 当前主产物本身不是共享 contract、shared skill 或 governance module
|
|
17
17
|
|
|
18
18
|
## 2. 默认目标
|
|
19
19
|
|
|
20
|
-
第一轮 retrofit 的目标不是装完整 Loom,而是先建立最小治理闭环。
|
|
20
|
+
第一轮 retrofit 的目标不是装完整 Loom,也不是创建 Loom-owned execution truth,而是先建立最小治理闭环。
|
|
21
21
|
|
|
22
22
|
默认先解决:
|
|
23
23
|
|
|
24
24
|
- 改动如何进入实现
|
|
25
25
|
- reviewer 如何判断改动
|
|
26
26
|
- 哪些边界改动必须先说明再实现
|
|
27
|
+
- 后续何时需要显式升级到 `execution-control`
|
|
27
28
|
|
|
28
29
|
## 3. 默认装配
|
|
29
30
|
|
|
@@ -33,7 +34,10 @@
|
|
|
33
34
|
- `code_review`
|
|
34
35
|
- `spec_review`
|
|
35
36
|
- 最小 PR 模板
|
|
36
|
-
-
|
|
37
|
+
- repo companion 与 bootstrap metadata
|
|
38
|
+
- review guidance / spec-review guidance
|
|
39
|
+
|
|
40
|
+
本策略对应 `light-governance` scaffold profile。该 profile 可以暴露 review/spec-review 指引和轻量 review placeholder,但不生成 Loom-owned formal spec suite。
|
|
37
41
|
|
|
38
42
|
## 4. 默认接入方式
|
|
39
43
|
|
|
@@ -44,6 +48,7 @@
|
|
|
44
48
|
- 在 `repo-interface.json` 中显式声明 `review_instruction_locators`;已有规则用 repo-owned locator,确无规则时才声明 `loom_default`
|
|
45
49
|
- 不在第一轮重写整个根级规则体系
|
|
46
50
|
- 不把轻量 retrofit 升级成 unattended strong adoption
|
|
51
|
+
- 不在默认 `light-governance` 中生成 `.loom/work-items/**`、`.loom/progress/**`、`.loom/status/current.md` 或 `.loom/specs/**`
|
|
47
52
|
|
|
48
53
|
轻量仓库可以从 Loom default review instruction 起步,但这个选择必须是显式 locator 合同,而不是自动猜测 `spec_review.md`、`code_review.md` 或任何单仓历史路径。
|
|
49
54
|
|
|
@@ -56,6 +61,9 @@
|
|
|
56
61
|
- 状态面
|
|
57
62
|
- profile 分层
|
|
58
63
|
- 重 harness
|
|
64
|
+
- formal spec suite
|
|
65
|
+
|
|
66
|
+
如果目标仓库需要 Loom-owned `work item`、`progress`、`status` 或 `spec` carriers,必须把接入意图显式升级到 `execution-control`;此时才允许脚手架生成 `.loom/work-items/**`、`.loom/progress/**`、`.loom/status/current.md` 和 `.loom/specs/**`。
|
|
59
67
|
|
|
60
68
|
## 6. checkpoint-lite
|
|
61
69
|
|
|
@@ -143,13 +143,7 @@
|
|
|
143
143
|
},
|
|
144
144
|
"dynamic_tool_locators": [],
|
|
145
145
|
"policy_locators": [],
|
|
146
|
-
"hook_locators": []
|
|
147
|
-
"release_targets": {
|
|
148
|
-
"catalog_locator": ".loom/companion/releases/catalog.json",
|
|
149
|
-
"current_target_locator": ".loom/companion/releases/current.json",
|
|
150
|
-
"enforcement": "blocking",
|
|
151
|
-
"status_locator": ".loom/companion/releases/status.json"
|
|
152
|
-
}
|
|
146
|
+
"hook_locators": []
|
|
153
147
|
}
|
|
154
148
|
```
|
|
155
149
|
|
|
@@ -372,6 +366,8 @@
|
|
|
372
366
|
|
|
373
367
|
`release_targets` 用于声明目标仓库自己的 release / version 真相入口。
|
|
374
368
|
|
|
369
|
+
默认 adoption 不生成或声明 `release_targets`。只有目标仓库已有明确的 release target truth,并且接入决策显式要求暴露这组 repo-owned / host-owned locator 时,才写入本 section。
|
|
370
|
+
|
|
375
371
|
它回答的是:
|
|
376
372
|
|
|
377
373
|
- 目标仓库 release target catalog 去哪里读
|
|
@@ -403,6 +399,7 @@
|
|
|
403
399
|
稳定约束:
|
|
404
400
|
|
|
405
401
|
- `catalog_locator` 与 `current_target_locator` 只允许使用仓内相对路径;绝对路径、越界或不可读路径必须 fail closed
|
|
402
|
+
- 缺省状态必须视为 `availability: absent` / `target_release.result: not_applicable`,不得生成 `bootstrap-v0.1.0`、空 release 或示例 release truth
|
|
406
403
|
- target release object 必须与 Loom distribution version authority 分离;不得把 installer version、plugin version、runtime version、schema version 或 `VERSION` 回写成 target release truth
|
|
407
404
|
- target release object 可以消费 `Phase` / `FR` / `Work Item` / `PR` / `merge commit` locator,但不得让 target release 直接成为执行入口
|
|
408
405
|
- `status_locator` 若缺失,Loom 仍应从 authored target release object 与 delivery chain 派生自己的 target release status summary
|
|
@@ -63,7 +63,7 @@ Loom 读取 target release truth 后,应派生 `loom-target-release-status/v1`
|
|
|
63
63
|
|
|
64
64
|
## 4. `repo companion` 挂接方式
|
|
65
65
|
|
|
66
|
-
目标仓库通过 `.loom/companion/repo-interface.json` `v2.release_targets`
|
|
66
|
+
目标仓库通过 `.loom/companion/repo-interface.json` `v2.release_targets` 挂接这一能力。默认 adoption 必须省略该 section;没有 release target intent 的仓库应被读取为 `release_targets.availability = absent` 与 `target_release.result = not_applicable`,而不是由 Loom 生成占位 release truth。
|
|
67
67
|
|
|
68
68
|
最小字段:
|
|
69
69
|
|
|
@@ -79,6 +79,8 @@ Loom 读取 target release truth 后,应派生 `loom-target-release-status/v1`
|
|
|
79
79
|
- `status_locator` 若存在,只能是 repo-owned derived status,不替代 Loom 自己的状态面
|
|
80
80
|
- `enforcement` 只允许 `blocking | advisory`
|
|
81
81
|
|
|
82
|
+
Loom 不得为了满足 schema 而生成 `bootstrap-v0.1.0`、空 catalog、示例 current release 或示例 status。声明 `release_targets` 时,locator 指向的对象必须来自目标仓库明确选择的 repo-owned 或 host-owned release/version truth。
|
|
83
|
+
|
|
82
84
|
## 5. closeout 语义
|
|
83
85
|
|
|
84
86
|
若仓库声明了 target release truth,closeout 至少要能区分:
|
package/payload/plugin/loom/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py
CHANGED
|
@@ -2228,9 +2228,6 @@ def detect_repo_interface(root: Path) -> tuple[dict[str, Any], list[str]]:
|
|
|
2228
2228
|
repo_interface_surface["specialized_gates"] = manifest_repo_interface.copy()
|
|
2229
2229
|
repo_interface_surface["dynamic_tool_locators"] = manifest_repo_interface.copy()
|
|
2230
2230
|
repo_interface_surface["policy_locators"] = manifest_repo_interface.copy()
|
|
2231
|
-
repo_interface_surface["release_targets"]["catalog"] = manifest_repo_interface.copy()
|
|
2232
|
-
repo_interface_surface["release_targets"]["current_target"] = manifest_repo_interface.copy()
|
|
2233
|
-
repo_interface_surface["release_targets"]["status"] = manifest_repo_interface.copy()
|
|
2234
2231
|
if manifest_repo_interface_error:
|
|
2235
2232
|
missing_inputs.append(manifest_repo_interface_error)
|
|
2236
2233
|
|
|
@@ -4336,6 +4336,17 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4336
4336
|
if pr_template:
|
|
4337
4337
|
(target / ".github" / "PULL_REQUEST_TEMPLATE.md").write_text("## Summary\n", encoding="utf-8")
|
|
4338
4338
|
|
|
4339
|
+
def write_small_existing_repo(target: Path, *, pr_template: bool = False) -> None:
|
|
4340
|
+
(target / ".github" / "workflows").mkdir(parents=True, exist_ok=True)
|
|
4341
|
+
(target / "src").mkdir(parents=True, exist_ok=True)
|
|
4342
|
+
(target / "README.md").write_text("# Small Existing Repo\n", encoding="utf-8")
|
|
4343
|
+
(target / "AGENTS.md").write_text("# Root Rules\n", encoding="utf-8")
|
|
4344
|
+
(target / "src" / "main.py").write_text("print('ok')\n", encoding="utf-8")
|
|
4345
|
+
(target / ".github" / "workflows" / "ci.yml").write_text("name: ci\n", encoding="utf-8")
|
|
4346
|
+
(target / "Makefile").write_text("check:\n\t@echo ok\n", encoding="utf-8")
|
|
4347
|
+
if pr_template:
|
|
4348
|
+
(target / ".github" / "PULL_REQUEST_TEMPLATE.md").write_text("## Summary\n", encoding="utf-8")
|
|
4349
|
+
|
|
4339
4350
|
attach_only_forbidden_patterns = (
|
|
4340
4351
|
".loom/work-items/**",
|
|
4341
4352
|
".loom/progress/**",
|
|
@@ -4343,6 +4354,15 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4343
4354
|
".loom/reviews/**",
|
|
4344
4355
|
".loom/specs/**",
|
|
4345
4356
|
)
|
|
4357
|
+
default_release_paths = (
|
|
4358
|
+
".loom/companion/releases/changelog.md",
|
|
4359
|
+
".loom/companion/releases/release-notes.md",
|
|
4360
|
+
".loom/companion/releases/migration-notes.md",
|
|
4361
|
+
".loom/companion/releases/rollback.md",
|
|
4362
|
+
".loom/companion/releases/catalog.json",
|
|
4363
|
+
".loom/companion/releases/current.json",
|
|
4364
|
+
".loom/companion/releases/status.json",
|
|
4365
|
+
)
|
|
4346
4366
|
|
|
4347
4367
|
def matches_forbidden(path: str, pattern: str) -> bool:
|
|
4348
4368
|
if pattern.endswith("/**"):
|
|
@@ -4358,6 +4378,50 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4358
4378
|
return pattern
|
|
4359
4379
|
return None
|
|
4360
4380
|
|
|
4381
|
+
def assert_no_default_release_target(target: Path, payload: dict[str, object], context: str) -> None:
|
|
4382
|
+
planned = payload.get("planned_writes")
|
|
4383
|
+
planned_paths = {item.get("path") for item in planned if isinstance(item, dict)} if isinstance(planned, list) else set()
|
|
4384
|
+
initial = payload.get("initial_artifacts")
|
|
4385
|
+
initial_paths = {item.get("path") for item in initial if isinstance(item, dict)} if isinstance(initial, list) else set()
|
|
4386
|
+
absent = payload.get("intentionally_absent")
|
|
4387
|
+
absent_paths = {item.get("path") for item in absent if isinstance(item, dict)} if isinstance(absent, list) else set()
|
|
4388
|
+
serialized = json.dumps(payload, ensure_ascii=False)
|
|
4389
|
+
for release_path in default_release_paths:
|
|
4390
|
+
if release_path in planned_paths:
|
|
4391
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must not plan default release target `{release_path}`"))
|
|
4392
|
+
if release_path in initial_paths:
|
|
4393
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must not declare default release target `{release_path}`"))
|
|
4394
|
+
if (target / release_path).exists():
|
|
4395
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must not generate default release target `{release_path}`"))
|
|
4396
|
+
if ".loom/companion/releases/**" not in absent_paths:
|
|
4397
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must mark release targets intentionally absent by default"))
|
|
4398
|
+
if "bootstrap-v0.1.0" in serialized:
|
|
4399
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must not mention placeholder release id `bootstrap-v0.1.0`"))
|
|
4400
|
+
repo_interface_path = target / ".loom/companion/repo-interface.json"
|
|
4401
|
+
if repo_interface_path.exists():
|
|
4402
|
+
repo_interface = json.loads(repo_interface_path.read_text(encoding="utf-8"))
|
|
4403
|
+
if "release_targets" in repo_interface:
|
|
4404
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` repo-interface must not declare release_targets without release target intent"))
|
|
4405
|
+
surface = build_governance_surface(target)
|
|
4406
|
+
repo_interface_surface = surface.get("repo_interface") if isinstance(surface, dict) else None
|
|
4407
|
+
release_targets = repo_interface_surface.get("release_targets") if isinstance(repo_interface_surface, dict) else None
|
|
4408
|
+
require_release_targets_surface_payload(
|
|
4409
|
+
failures,
|
|
4410
|
+
category="deep-existing-bootstrap",
|
|
4411
|
+
context=f"`{context}` absent release targets",
|
|
4412
|
+
payload=release_targets,
|
|
4413
|
+
)
|
|
4414
|
+
target_release = release_targets.get("target_release") if isinstance(release_targets, dict) else None
|
|
4415
|
+
if not isinstance(release_targets, dict) or release_targets.get("availability") != "absent":
|
|
4416
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must report release_targets availability absent by default"))
|
|
4417
|
+
if not isinstance(target_release, dict) or target_release.get("result") != "not_applicable":
|
|
4418
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must report target_release not_applicable when release targets are absent"))
|
|
4419
|
+
if isinstance(release_targets, dict):
|
|
4420
|
+
for surface_key in ("catalog", "current_target", "status"):
|
|
4421
|
+
surface_entry = release_targets.get(surface_key)
|
|
4422
|
+
if isinstance(surface_entry, dict) and surface_entry.get("status") == "present":
|
|
4423
|
+
failures.append(Failure("deep-existing-bootstrap", f"`{context}` must not report absent release target `{surface_key}` as present"))
|
|
4424
|
+
|
|
4361
4425
|
deep_target = tmp_root / "deep-existing"
|
|
4362
4426
|
write_repo(deep_target, validation_entry=True, pr_template=True, workflow_doc=True)
|
|
4363
4427
|
deep_dry_payload, deep_dry_error = load_command_json(
|
|
@@ -4404,6 +4468,7 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4404
4468
|
failures.append(Failure("deep-existing-bootstrap", "`deep-existing dry-run` must report detected repository mode"))
|
|
4405
4469
|
if not isinstance(write, dict) or write.get("enabled") is not False:
|
|
4406
4470
|
failures.append(Failure("deep-existing-bootstrap", "`deep-existing dry-run` must keep write.enabled = false"))
|
|
4471
|
+
assert_no_default_release_target(deep_target, deep_dry_payload, "deep-existing dry-run")
|
|
4407
4472
|
|
|
4408
4473
|
deep_payload, deep_error = load_command_json(
|
|
4409
4474
|
root,
|
|
@@ -4463,6 +4528,7 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4463
4528
|
host_truth = repo_interface.get("host_truth_locators")
|
|
4464
4529
|
if not isinstance(host_truth, dict) or set(host_truth.keys()) != {"work_item", "project_status", "review", "closeout"}:
|
|
4465
4530
|
failures.append(Failure("deep-existing-bootstrap", "`deep-existing bootstrap` repo-interface must declare attach-only host truth locators"))
|
|
4531
|
+
assert_no_default_release_target(deep_target, deep_payload, "deep-existing bootstrap")
|
|
4466
4532
|
|
|
4467
4533
|
poisoned_files_target = tmp_root / "deep-existing-poison-files"
|
|
4468
4534
|
if deep_target.exists() and (deep_target / ".loom/bin/loom_init.py").exists():
|
|
@@ -4583,6 +4649,10 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4583
4649
|
intent = explicit_payload.get("adoption_intent")
|
|
4584
4650
|
recommended = explicit_payload.get("recommended_adoption")
|
|
4585
4651
|
profile = explicit_payload.get("scaffold_profile")
|
|
4652
|
+
planned = explicit_payload.get("planned_writes")
|
|
4653
|
+
planned_paths = {item.get("path") for item in planned if isinstance(item, dict)} if isinstance(planned, list) else set()
|
|
4654
|
+
initial = explicit_payload.get("initial_artifacts")
|
|
4655
|
+
initial_paths = {item.get("path") for item in initial if isinstance(item, dict)} if isinstance(initial, list) else set()
|
|
4586
4656
|
if not isinstance(intent, dict) or intent.get("effective") != "execution-control":
|
|
4587
4657
|
failures.append(Failure("deep-existing-bootstrap", "explicit full-bootstrap sample must report `adoption_intent.effective = execution-control`"))
|
|
4588
4658
|
if not isinstance(recommended, dict) or recommended.get("path") != "full-bootstrap":
|
|
@@ -4595,12 +4665,17 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4595
4665
|
".loom/status/current.md",
|
|
4596
4666
|
".loom/reviews/INIT-0001.json",
|
|
4597
4667
|
".loom/specs/INIT-0001/spec.md",
|
|
4668
|
+
".loom/specs/INIT-0001/plan.md",
|
|
4669
|
+
".loom/specs/INIT-0001/implementation-contract.md",
|
|
4598
4670
|
):
|
|
4599
4671
|
if not (explicit_full_target / required).exists():
|
|
4600
4672
|
failures.append(Failure("deep-existing-bootstrap", f"`explicit execution-control bootstrap sample` must generate `{required}`"))
|
|
4673
|
+
if required not in planned_paths or required not in initial_paths:
|
|
4674
|
+
failures.append(Failure("deep-existing-bootstrap", f"`explicit execution-control bootstrap sample` must declare `{required}` in planned_writes and initial_artifacts"))
|
|
4675
|
+
assert_no_default_release_target(explicit_full_target, explicit_payload, "explicit execution-control bootstrap sample")
|
|
4601
4676
|
|
|
4602
4677
|
light_target = tmp_root / "light-governance"
|
|
4603
|
-
|
|
4678
|
+
write_small_existing_repo(light_target)
|
|
4604
4679
|
light_payload, light_error = load_command_json(
|
|
4605
4680
|
root,
|
|
4606
4681
|
[
|
|
@@ -4620,23 +4695,76 @@ def check_deep_existing_repo_bootstrap(root: Path) -> list[Failure]:
|
|
|
4620
4695
|
if light_error:
|
|
4621
4696
|
failures.append(Failure("deep-existing-bootstrap", f"`light-governance bootstrap sample` failed: {light_error}"))
|
|
4622
4697
|
else:
|
|
4698
|
+
run = light_payload.get("run")
|
|
4699
|
+
recommended = light_payload.get("recommended_adoption")
|
|
4623
4700
|
profile = light_payload.get("scaffold_profile")
|
|
4701
|
+
intentionally_absent = light_payload.get("intentionally_absent")
|
|
4702
|
+
absent_paths = (
|
|
4703
|
+
{item.get("path") for item in intentionally_absent if isinstance(item, dict)}
|
|
4704
|
+
if isinstance(intentionally_absent, list)
|
|
4705
|
+
else set()
|
|
4706
|
+
)
|
|
4707
|
+
if not isinstance(run, dict) or run.get("scenario_key") != "small-existing" or run.get("recovery_mode") != "checkpoint-lite":
|
|
4708
|
+
failures.append(Failure("deep-existing-bootstrap", "light-governance sample must model small-existing checkpoint-lite adoption"))
|
|
4709
|
+
if not isinstance(recommended, dict) or recommended.get("path") != "lightweight-retrofit":
|
|
4710
|
+
failures.append(Failure("deep-existing-bootstrap", "light-governance sample must select `recommended_adoption.path = lightweight-retrofit`"))
|
|
4624
4711
|
if not isinstance(profile, dict) or profile.get("name") != "light-governance":
|
|
4625
4712
|
failures.append(Failure("deep-existing-bootstrap", "light-governance sample must report `scaffold_profile.name = light-governance`"))
|
|
4713
|
+
if not isinstance(profile, dict) or profile.get("writes_work_item_carriers") is not False:
|
|
4714
|
+
failures.append(Failure("deep-existing-bootstrap", "light-governance sample must report `writes_work_item_carriers = false`"))
|
|
4626
4715
|
if not isinstance(light_payload.get("upgrade_triggers"), list) or not light_payload["upgrade_triggers"]:
|
|
4627
4716
|
failures.append(Failure("deep-existing-bootstrap", "light-governance sample must report top-level upgrade_triggers"))
|
|
4717
|
+
deferred_text = json.dumps(light_payload.get("deferred_capabilities", []), ensure_ascii=False)
|
|
4718
|
+
if "spec" not in deferred_text or "execution-control" not in deferred_text:
|
|
4719
|
+
failures.append(Failure("deep-existing-bootstrap", "light-governance sample must defer Loom-owned spec carriers to execution-control"))
|
|
4628
4720
|
planned = light_payload.get("planned_writes")
|
|
4629
4721
|
planned_paths = {item.get("path") for item in planned if isinstance(item, dict)} if isinstance(planned, list) else set()
|
|
4630
|
-
for required in (".loom/reviews/INIT-0001.json", ".loom/
|
|
4722
|
+
for required in (".loom/reviews/INIT-0001.json", ".loom/reviews/INIT-0001.spec.json", ".github/PULL_REQUEST_TEMPLATE.md"):
|
|
4631
4723
|
if required not in planned_paths or not (light_target / required).exists():
|
|
4632
4724
|
failures.append(Failure("deep-existing-bootstrap", f"`light-governance bootstrap sample` must generate `{required}`"))
|
|
4725
|
+
for absent in (".loom/work-items/**", ".loom/progress/**", ".loom/status/current.md", ".loom/specs/**"):
|
|
4726
|
+
if absent not in absent_paths:
|
|
4727
|
+
failures.append(Failure("deep-existing-bootstrap", f"`light-governance bootstrap sample` must mark `{absent}` intentionally absent"))
|
|
4633
4728
|
for forbidden in (
|
|
4634
4729
|
".loom/work-items/INIT-0001.md",
|
|
4635
4730
|
".loom/progress/INIT-0001.md",
|
|
4636
4731
|
".loom/status/current.md",
|
|
4732
|
+
".loom/specs/INIT-0001/spec.md",
|
|
4733
|
+
".loom/specs/INIT-0001/plan.md",
|
|
4734
|
+
".loom/specs/INIT-0001/implementation-contract.md",
|
|
4637
4735
|
):
|
|
4638
4736
|
if forbidden in planned_paths or (light_target / forbidden).exists():
|
|
4639
4737
|
failures.append(Failure("deep-existing-bootstrap", f"`light-governance bootstrap sample` must not generate `{forbidden}`"))
|
|
4738
|
+
assert_no_default_release_target(light_target, light_payload, "light-governance bootstrap sample")
|
|
4739
|
+
readme_text = (light_target / ".loom/README.md").read_text(encoding="utf-8") if (light_target / ".loom/README.md").exists() else ""
|
|
4740
|
+
if ".loom/specs" in readme_text or "Spec suite" in readme_text:
|
|
4741
|
+
failures.append(Failure("deep-existing-bootstrap", "`light-governance bootstrap sample` must not declare a spec suite in `.loom/README.md`"))
|
|
4742
|
+
spec_review_text = (light_target / ".loom/reviews/INIT-0001.spec.json").read_text(encoding="utf-8") if (light_target / ".loom/reviews/INIT-0001.spec.json").exists() else ""
|
|
4743
|
+
if "formal spec path" in spec_review_text:
|
|
4744
|
+
failures.append(Failure("deep-existing-bootstrap", "`light-governance spec review placeholder` must not tell operators to consume a formal spec path"))
|
|
4745
|
+
if (light_target / ".loom/bin/loom_init.py").exists():
|
|
4746
|
+
poisoned_light_target = tmp_root / "light-governance-poison-specs"
|
|
4747
|
+
shutil.copytree(light_target, poisoned_light_target)
|
|
4748
|
+
(poisoned_light_target / ".loom/specs/INIT-0001").mkdir(parents=True, exist_ok=True)
|
|
4749
|
+
(poisoned_light_target / ".loom/specs/INIT-0001/spec.md").write_text("# Unexpected Spec\n", encoding="utf-8")
|
|
4750
|
+
poisoned_payload, poisoned_error = load_command_json(
|
|
4751
|
+
root,
|
|
4752
|
+
[
|
|
4753
|
+
"python3",
|
|
4754
|
+
str(poisoned_light_target / ".loom/bin/loom_init.py"),
|
|
4755
|
+
"verify",
|
|
4756
|
+
"--target",
|
|
4757
|
+
str(poisoned_light_target),
|
|
4758
|
+
],
|
|
4759
|
+
)
|
|
4760
|
+
if poisoned_error:
|
|
4761
|
+
failures.append(Failure("deep-existing-bootstrap", f"`light-governance forbidden spec verify` failed: {poisoned_error}"))
|
|
4762
|
+
else:
|
|
4763
|
+
errors_text = json.dumps(poisoned_payload.get("errors", []), ensure_ascii=False) if poisoned_payload else ""
|
|
4764
|
+
if poisoned_payload.get("ok") is not False:
|
|
4765
|
+
failures.append(Failure("deep-existing-bootstrap", "`light-governance forbidden spec verify` must fail closed"))
|
|
4766
|
+
if ".loom/specs/INIT-0001/spec.md" not in errors_text:
|
|
4767
|
+
failures.append(Failure("deep-existing-bootstrap", "`light-governance forbidden spec verify` must name the unexpected spec carrier"))
|
|
4640
4768
|
return failures
|
|
4641
4769
|
|
|
4642
4770
|
|
|
@@ -3172,12 +3172,6 @@ def default_repo_interface() -> dict[str, Any]:
|
|
|
3172
3172
|
"dynamic_tool_locators": [],
|
|
3173
3173
|
"policy_locators": [],
|
|
3174
3174
|
"hook_locators": [],
|
|
3175
|
-
"release_targets": {
|
|
3176
|
-
"catalog_locator": ".loom/companion/releases/catalog.json",
|
|
3177
|
-
"current_target_locator": ".loom/companion/releases/current.json",
|
|
3178
|
-
"enforcement": "blocking",
|
|
3179
|
-
"status_locator": ".loom/companion/releases/status.json",
|
|
3180
|
-
},
|
|
3181
3175
|
}
|
|
3182
3176
|
|
|
3183
3177
|
|
|
@@ -3237,10 +3231,6 @@ def companion_text_payloads() -> dict[str, str]:
|
|
|
3237
3231
|
".loom/companion/merge-ready.md": "# Companion Merge-Ready Surface\n",
|
|
3238
3232
|
".loom/companion/closeout.md": "# Companion Closeout Surface\n",
|
|
3239
3233
|
".loom/companion/checkpoints.md": "# Companion Checkpoints\n",
|
|
3240
|
-
".loom/companion/releases/changelog.md": "# Changelog\n\n- Bootstrap release intake example.\n",
|
|
3241
|
-
".loom/companion/releases/release-notes.md": "# Release Notes\n\n- Bootstrap release target is ready for Loom-derived status consumption.\n",
|
|
3242
|
-
".loom/companion/releases/migration-notes.md": "# Migration Notes\n\n- not_applicable\n",
|
|
3243
|
-
".loom/companion/releases/rollback.md": "# Rollback Basis\n\n- Revert the companion-owned release target declaration and rerun Loom checks.\n",
|
|
3244
3234
|
}
|
|
3245
3235
|
|
|
3246
3236
|
|
|
@@ -3249,48 +3239,6 @@ def companion_json_payloads() -> dict[str, dict[str, Any]]:
|
|
|
3249
3239
|
".loom/companion/manifest.json": default_companion_manifest(),
|
|
3250
3240
|
".loom/companion/repo-interface.json": default_repo_interface(),
|
|
3251
3241
|
".loom/companion/interop.json": default_repo_interop(),
|
|
3252
|
-
".loom/companion/releases/catalog.json": {
|
|
3253
|
-
"schema_version": "loom-target-release-catalog/v1",
|
|
3254
|
-
"current_release_id": "bootstrap-v0.1.0",
|
|
3255
|
-
"releases": [
|
|
3256
|
-
{
|
|
3257
|
-
"release_id": "bootstrap-v0.1.0",
|
|
3258
|
-
"locator": ".loom/companion/releases/current.json",
|
|
3259
|
-
}
|
|
3260
|
-
],
|
|
3261
|
-
},
|
|
3262
|
-
".loom/companion/releases/current.json": {
|
|
3263
|
-
"schema_version": "loom-target-release/v1",
|
|
3264
|
-
"release_id": "bootstrap-v0.1.0",
|
|
3265
|
-
"display_name": "Bootstrap v0.1.0",
|
|
3266
|
-
"target_branch": "main",
|
|
3267
|
-
"release_goal": "Bootstrap the first executable Loom path for this repository.",
|
|
3268
|
-
"status": "unreleased",
|
|
3269
|
-
"included_scope": {
|
|
3270
|
-
"phase": [{"id": "bootstrap-phase", "locator": ".loom/companion/checkpoints.md", "delivery_status": "planned"}],
|
|
3271
|
-
"fr": [],
|
|
3272
|
-
"work_item": [{"id": "INIT-0001", "locator": ".loom/work-items/INIT-0001.md", "delivery_status": "unmerged"}],
|
|
3273
|
-
"implementation_pr": [],
|
|
3274
|
-
"merge_commit": [],
|
|
3275
|
-
},
|
|
3276
|
-
"evidence": {
|
|
3277
|
-
"changelog_locator": ".loom/companion/releases/changelog.md",
|
|
3278
|
-
"release_notes_locator": ".loom/companion/releases/release-notes.md",
|
|
3279
|
-
"migration_notes_locator": ".loom/companion/releases/migration-notes.md",
|
|
3280
|
-
"tag_or_artifact_locator": ".loom/companion/README.md",
|
|
3281
|
-
"rollback_basis_locator": ".loom/companion/releases/rollback.md",
|
|
3282
|
-
},
|
|
3283
|
-
"authority": {
|
|
3284
|
-
"owner": "repo-companion",
|
|
3285
|
-
"source_kind": "repo_owned_locator",
|
|
3286
|
-
"source_locator": ".loom/companion/releases/current.json",
|
|
3287
|
-
},
|
|
3288
|
-
},
|
|
3289
|
-
".loom/companion/releases/status.json": {
|
|
3290
|
-
"schema_version": "loom-target-release-status/v1",
|
|
3291
|
-
"result": "pass",
|
|
3292
|
-
"summary": "repo-owned release status example is readable.",
|
|
3293
|
-
},
|
|
3294
3242
|
}
|
|
3295
3243
|
|
|
3296
3244
|
|