@mc-and-his-agents/loom-installer 0.1.1
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/README.md +47 -0
- package/dist/src/claude.js +157 -0
- package/dist/src/cli.js +35 -0
- package/dist/src/codex.js +191 -0
- package/dist/src/index.js +175 -0
- package/dist/src/payload.js +42 -0
- package/dist/src/types.js +1 -0
- package/dist/src/utils.js +84 -0
- package/dist/test/installer.test.js +167 -0
- package/package.json +46 -0
- package/payload/manifest.json +4294 -0
- package/payload/plugin/loom/.codex-plugin/plugin.json +37 -0
- package/payload/plugin/loom/skills/README.md +128 -0
- package/payload/plugin/loom/skills/distribution-and-adapter-contract.md +359 -0
- package/payload/plugin/loom/skills/install-layout.json +91 -0
- package/payload/plugin/loom/skills/loom-adopt/SKILL.md +80 -0
- package/payload/plugin/loom/skills/loom-adopt/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-adopt/contract.json +45 -0
- package/payload/plugin/loom/skills/loom-adopt/references/input-signals.md +17 -0
- package/payload/plugin/loom/skills/loom-adopt/references/output-contract.md +17 -0
- package/payload/plugin/loom/skills/loom-adopt/scripts/loom-adopt.py +14 -0
- package/payload/plugin/loom/skills/loom-handoff/SKILL.md +23 -0
- package/payload/plugin/loom/skills/loom-handoff/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-handoff/contract.json +53 -0
- package/payload/plugin/loom/skills/loom-handoff/references/input-signals.md +7 -0
- package/payload/plugin/loom/skills/loom-handoff/references/output-contract.md +42 -0
- package/payload/plugin/loom/skills/loom-handoff/scripts/loom-handoff.py +14 -0
- package/payload/plugin/loom/skills/loom-init/SKILL.md +246 -0
- package/payload/plugin/loom/skills/loom-init/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-init/contract.json +76 -0
- package/payload/plugin/loom/skills/loom-init/references/input-signals.md +16 -0
- package/payload/plugin/loom/skills/loom-init/references/intake-signals.md +155 -0
- package/payload/plugin/loom/skills/loom-init/references/output-contract.md +208 -0
- package/payload/plugin/loom/skills/loom-init/scripts/loom-init.py +14 -0
- package/payload/plugin/loom/skills/loom-merge-ready/SKILL.md +23 -0
- package/payload/plugin/loom/skills/loom-merge-ready/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-merge-ready/contract.json +49 -0
- package/payload/plugin/loom/skills/loom-merge-ready/references/input-signals.md +7 -0
- package/payload/plugin/loom/skills/loom-merge-ready/references/output-contract.md +34 -0
- package/payload/plugin/loom/skills/loom-merge-ready/scripts/loom-merge-ready.py +14 -0
- package/payload/plugin/loom/skills/loom-pre-review/SKILL.md +69 -0
- package/payload/plugin/loom/skills/loom-pre-review/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-pre-review/contract.json +41 -0
- package/payload/plugin/loom/skills/loom-pre-review/references/input-signals.md +14 -0
- package/payload/plugin/loom/skills/loom-pre-review/references/output-contract.md +20 -0
- package/payload/plugin/loom/skills/loom-pre-review/scripts/loom-pre-review.py +14 -0
- package/payload/plugin/loom/skills/loom-resume/SKILL.md +72 -0
- package/payload/plugin/loom/skills/loom-resume/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-resume/contract.json +47 -0
- package/payload/plugin/loom/skills/loom-resume/references/input-signals.md +15 -0
- package/payload/plugin/loom/skills/loom-resume/references/output-contract.md +58 -0
- package/payload/plugin/loom/skills/loom-resume/scripts/loom-resume.py +14 -0
- package/payload/plugin/loom/skills/loom-retire/SKILL.md +26 -0
- package/payload/plugin/loom/skills/loom-retire/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-retire/contract.json +41 -0
- package/payload/plugin/loom/skills/loom-retire/references/input-signals.md +7 -0
- package/payload/plugin/loom/skills/loom-retire/references/output-contract.md +13 -0
- package/payload/plugin/loom/skills/loom-retire/scripts/loom-retire.py +14 -0
- package/payload/plugin/loom/skills/loom-review/SKILL.md +95 -0
- package/payload/plugin/loom/skills/loom-review/agents/openai.yaml +4 -0
- package/payload/plugin/loom/skills/loom-review/contract.json +49 -0
- package/payload/plugin/loom/skills/loom-review/references/input-signals.md +15 -0
- package/payload/plugin/loom/skills/loom-review/references/output-contract.md +57 -0
- package/payload/plugin/loom/skills/loom-review/scripts/loom-review.py +14 -0
- package/payload/plugin/loom/skills/registry.json +64 -0
- package/payload/plugin/loom/skills/route-matrix.md +63 -0
- package/payload/plugin/loom/skills/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/plugin/loom/skills/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/plugin/loom/skills/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/plugin/loom/skills/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/plugin/loom/skills/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/plugin/loom/skills/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/plugin/loom/skills/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/plugin/loom/skills/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/plugin/loom/skills/shared/references/governance/issue-model.md +127 -0
- package/payload/plugin/loom/skills/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/plugin/loom/skills/shared/references/governance/principles.md +180 -0
- package/payload/plugin/loom/skills/shared/references/governance/review-model.md +109 -0
- package/payload/plugin/loom/skills/shared/references/governance/state-machine.md +163 -0
- package/payload/plugin/loom/skills/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/plugin/loom/skills/shared/references/harness/automation-frontload.md +139 -0
- package/payload/plugin/loom/skills/shared/references/harness/closeout-gate.md +97 -0
- package/payload/plugin/loom/skills/shared/references/harness/execution-chain.md +56 -0
- package/payload/plugin/loom/skills/shared/references/harness/execution-context.md +71 -0
- package/payload/plugin/loom/skills/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/plugin/loom/skills/shared/references/harness/host-action-contract.md +128 -0
- package/payload/plugin/loom/skills/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/plugin/loom/skills/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/plugin/loom/skills/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/plugin/loom/skills/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/plugin/loom/skills/shared/references/harness/recovery-model.md +101 -0
- package/payload/plugin/loom/skills/shared/references/harness/review-execution.md +99 -0
- package/payload/plugin/loom/skills/shared/references/harness/runtime-state.md +103 -0
- package/payload/plugin/loom/skills/shared/references/harness/status-surface.md +121 -0
- package/payload/plugin/loom/skills/shared/references/harness/work-item-contract.md +104 -0
- package/payload/plugin/loom/skills/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/plugin/loom/skills/shared/references/harness/workspace-model.md +56 -0
- package/payload/plugin/loom/skills/shared/references/templates/pull-request.md +44 -0
- package/payload/plugin/loom/skills/shared/references/templates/review-record.md +35 -0
- package/payload/plugin/loom/skills/shared/references/templates/spec-suite.md +57 -0
- package/payload/plugin/loom/skills/shared/scripts/fact_chain_support.py +509 -0
- package/payload/plugin/loom/skills/shared/scripts/governance_surface.py +869 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_check.py +4724 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_flow.py +5390 -0
- package/payload/plugin/loom/skills/shared/scripts/loom_init.py +1966 -0
- package/payload/plugin/loom/skills/shared/scripts/runtime_paths.py +116 -0
- package/payload/plugin/loom/skills/shared/scripts/runtime_state.py +405 -0
- package/payload/plugin/loom/skills/upgrade-contract.json +29 -0
- package/payload/skills/loom-adopt/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/SKILL.md +80 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/agents/openai.yaml +4 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/contract.json +45 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/input-signals.md +17 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/references/output-contract.md +17 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-adopt/scripts/loom-adopt.py +14 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-adopt/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-adopt/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-adopt/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-adopt/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-adopt/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-adopt/SKILL.md +80 -0
- package/payload/skills/loom-adopt/agents/openai.yaml +4 -0
- package/payload/skills/loom-adopt/contract.json +45 -0
- package/payload/skills/loom-adopt/references/input-signals.md +17 -0
- package/payload/skills/loom-adopt/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-adopt/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-adopt/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-adopt/references/output-contract.md +17 -0
- package/payload/skills/loom-adopt/references/route-matrix.md +63 -0
- package/payload/skills/loom-adopt/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-adopt/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-adopt/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-adopt/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-adopt/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-adopt/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-adopt/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-adopt/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-adopt/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-adopt/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-adopt/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-adopt/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-adopt/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-adopt/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-adopt/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-adopt/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-adopt/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-adopt/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-adopt/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-adopt/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-adopt/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-adopt/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-adopt/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-adopt/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-adopt/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-adopt/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-adopt/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-adopt/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-adopt/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-adopt/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-adopt/scripts/loom-adopt.py +16 -0
- package/payload/skills/loom-handoff/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/SKILL.md +23 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/agents/openai.yaml +4 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/contract.json +53 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/references/input-signals.md +7 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/references/output-contract.md +42 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-handoff/scripts/loom-handoff.py +14 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-handoff/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-handoff/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-handoff/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-handoff/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-handoff/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-handoff/SKILL.md +23 -0
- package/payload/skills/loom-handoff/agents/openai.yaml +4 -0
- package/payload/skills/loom-handoff/contract.json +53 -0
- package/payload/skills/loom-handoff/references/input-signals.md +7 -0
- package/payload/skills/loom-handoff/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-handoff/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-handoff/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-handoff/references/output-contract.md +42 -0
- package/payload/skills/loom-handoff/references/route-matrix.md +63 -0
- package/payload/skills/loom-handoff/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-handoff/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-handoff/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-handoff/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-handoff/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-handoff/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-handoff/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-handoff/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-handoff/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-handoff/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-handoff/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-handoff/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-handoff/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-handoff/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-handoff/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-handoff/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-handoff/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-handoff/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-handoff/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-handoff/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-handoff/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-handoff/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-handoff/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-handoff/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-handoff/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-handoff/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-handoff/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-handoff/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-handoff/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-handoff/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-handoff/scripts/loom-handoff.py +16 -0
- package/payload/skills/loom-init/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/SKILL.md +246 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/agents/openai.yaml +4 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/contract.json +76 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-init/.loom-runtime/loom-init/scripts/loom-init.py +14 -0
- package/payload/skills/loom-init/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-init/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-init/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-init/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-init/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-init/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-init/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-init/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-init/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-init/SKILL.md +246 -0
- package/payload/skills/loom-init/agents/openai.yaml +4 -0
- package/payload/skills/loom-init/contract.json +76 -0
- package/payload/skills/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-init/references/route-matrix.md +63 -0
- package/payload/skills/loom-init/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-init/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-init/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-init/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-init/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-init/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-init/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-init/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-init/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-init/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-init/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-init/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-init/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-init/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-init/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-init/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-init/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-init/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-init/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-init/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-init/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-init/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-init/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-init/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-init/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-init/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-init/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-init/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-init/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-init/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-init/scripts/loom-init.py +16 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/SKILL.md +23 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/agents/openai.yaml +4 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/contract.json +49 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/references/input-signals.md +7 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/references/output-contract.md +34 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/loom-merge-ready/scripts/loom-merge-ready.py +14 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-merge-ready/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-merge-ready/SKILL.md +23 -0
- package/payload/skills/loom-merge-ready/agents/openai.yaml +4 -0
- package/payload/skills/loom-merge-ready/contract.json +49 -0
- package/payload/skills/loom-merge-ready/references/input-signals.md +7 -0
- package/payload/skills/loom-merge-ready/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-merge-ready/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-merge-ready/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-merge-ready/references/output-contract.md +34 -0
- package/payload/skills/loom-merge-ready/references/route-matrix.md +63 -0
- package/payload/skills/loom-merge-ready/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-merge-ready/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-merge-ready/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-merge-ready/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-merge-ready/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-merge-ready/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-merge-ready/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-merge-ready/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-merge-ready/scripts/loom-merge-ready.py +16 -0
- package/payload/skills/loom-pre-review/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/SKILL.md +69 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/agents/openai.yaml +4 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/contract.json +41 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/references/input-signals.md +14 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/references/output-contract.md +20 -0
- package/payload/skills/loom-pre-review/.loom-runtime/loom-pre-review/scripts/loom-pre-review.py +14 -0
- package/payload/skills/loom-pre-review/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-pre-review/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-pre-review/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-pre-review/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-pre-review/SKILL.md +69 -0
- package/payload/skills/loom-pre-review/agents/openai.yaml +4 -0
- package/payload/skills/loom-pre-review/contract.json +41 -0
- package/payload/skills/loom-pre-review/references/input-signals.md +14 -0
- package/payload/skills/loom-pre-review/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-pre-review/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-pre-review/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-pre-review/references/output-contract.md +20 -0
- package/payload/skills/loom-pre-review/references/route-matrix.md +63 -0
- package/payload/skills/loom-pre-review/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-pre-review/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-pre-review/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-pre-review/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-pre-review/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-pre-review/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-pre-review/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-pre-review/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-pre-review/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-pre-review/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-pre-review/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-pre-review/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-pre-review/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-pre-review/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-pre-review/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-pre-review/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-pre-review/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-pre-review/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-pre-review/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-pre-review/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-pre-review/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-pre-review/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-pre-review/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-pre-review/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-pre-review/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-pre-review/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-pre-review/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-pre-review/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-pre-review/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-pre-review/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-pre-review/scripts/loom-pre-review.py +16 -0
- package/payload/skills/loom-resume/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/SKILL.md +72 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/agents/openai.yaml +4 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/contract.json +47 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/references/input-signals.md +15 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/references/output-contract.md +58 -0
- package/payload/skills/loom-resume/.loom-runtime/loom-resume/scripts/loom-resume.py +14 -0
- package/payload/skills/loom-resume/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-resume/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-resume/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-resume/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-resume/SKILL.md +72 -0
- package/payload/skills/loom-resume/agents/openai.yaml +4 -0
- package/payload/skills/loom-resume/contract.json +47 -0
- package/payload/skills/loom-resume/references/input-signals.md +15 -0
- package/payload/skills/loom-resume/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-resume/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-resume/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-resume/references/output-contract.md +58 -0
- package/payload/skills/loom-resume/references/route-matrix.md +63 -0
- package/payload/skills/loom-resume/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-resume/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-resume/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-resume/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-resume/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-resume/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-resume/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-resume/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-resume/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-resume/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-resume/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-resume/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-resume/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-resume/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-resume/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-resume/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-resume/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-resume/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-resume/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-resume/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-resume/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-resume/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-resume/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-resume/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-resume/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-resume/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-resume/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-resume/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-resume/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-resume/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-resume/scripts/loom-resume.py +16 -0
- package/payload/skills/loom-retire/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-retire/SKILL.md +26 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-retire/agents/openai.yaml +4 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-retire/contract.json +41 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-retire/references/input-signals.md +7 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-retire/references/output-contract.md +13 -0
- package/payload/skills/loom-retire/.loom-runtime/loom-retire/scripts/loom-retire.py +14 -0
- package/payload/skills/loom-retire/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-retire/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-retire/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-retire/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-retire/SKILL.md +26 -0
- package/payload/skills/loom-retire/agents/openai.yaml +4 -0
- package/payload/skills/loom-retire/contract.json +41 -0
- package/payload/skills/loom-retire/references/input-signals.md +7 -0
- package/payload/skills/loom-retire/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-retire/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-retire/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-retire/references/output-contract.md +13 -0
- package/payload/skills/loom-retire/references/route-matrix.md +63 -0
- package/payload/skills/loom-retire/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-retire/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-retire/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-retire/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-retire/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-retire/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-retire/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-retire/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-retire/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-retire/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-retire/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-retire/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-retire/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-retire/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-retire/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-retire/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-retire/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-retire/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-retire/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-retire/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-retire/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-retire/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-retire/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-retire/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-retire/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-retire/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-retire/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-retire/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-retire/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-retire/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-retire/scripts/loom-retire.py +16 -0
- package/payload/skills/loom-review/.loom-runtime/install-layout.json +77 -0
- package/payload/skills/loom-review/.loom-runtime/loom-init/references/input-signals.md +16 -0
- package/payload/skills/loom-review/.loom-runtime/loom-init/references/intake-signals.md +155 -0
- package/payload/skills/loom-review/.loom-runtime/loom-init/references/output-contract.md +208 -0
- package/payload/skills/loom-review/.loom-runtime/loom-review/SKILL.md +95 -0
- package/payload/skills/loom-review/.loom-runtime/loom-review/agents/openai.yaml +4 -0
- package/payload/skills/loom-review/.loom-runtime/loom-review/contract.json +49 -0
- package/payload/skills/loom-review/.loom-runtime/loom-review/references/input-signals.md +15 -0
- package/payload/skills/loom-review/.loom-runtime/loom-review/references/output-contract.md +57 -0
- package/payload/skills/loom-review/.loom-runtime/loom-review/scripts/loom-review.py +14 -0
- package/payload/skills/loom-review/.loom-runtime/registry.json +15 -0
- package/payload/skills/loom-review/.loom-runtime/route-matrix.md +63 -0
- package/payload/skills/loom-review/.loom-runtime/shared/assets/github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/payload/skills/loom-review/.loom-runtime/shared/assets/review/loom-review-result-schema.json +93 -0
- package/payload/skills/loom-review/.loom-runtime/shared/assets/templates/scaffold/plan.md +51 -0
- package/payload/skills/loom-review/.loom-runtime/shared/assets/templates/scaffold/spec.md +48 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/issue-model.md +127 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/principles.md +180 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/review-model.md +109 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/state-machine.md +163 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/execution-chain.md +56 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/execution-context.md +71 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/recovery-model.md +101 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/review-execution.md +99 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/runtime-state.md +103 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/status-surface.md +121 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/harness/workspace-model.md +56 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/templates/pull-request.md +44 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/templates/review-record.md +35 -0
- package/payload/skills/loom-review/.loom-runtime/shared/references/templates/spec-suite.md +57 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/fact_chain_support.py +509 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/governance_surface.py +879 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_check.py +4683 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_flow.py +5390 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/loom_init.py +1966 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/runtime_paths.py +116 -0
- package/payload/skills/loom-review/.loom-runtime/shared/scripts/runtime_state.py +405 -0
- package/payload/skills/loom-review/.loom-runtime/upgrade-contract.json +29 -0
- package/payload/skills/loom-review/SKILL.md +95 -0
- package/payload/skills/loom-review/agents/openai.yaml +4 -0
- package/payload/skills/loom-review/contract.json +49 -0
- package/payload/skills/loom-review/references/input-signals.md +15 -0
- package/payload/skills/loom-review/references/loom-init/input-signals.md +16 -0
- package/payload/skills/loom-review/references/loom-init/intake-signals.md +155 -0
- package/payload/skills/loom-review/references/loom-init/output-contract.md +208 -0
- package/payload/skills/loom-review/references/output-contract.md +57 -0
- package/payload/skills/loom-review/references/route-matrix.md +63 -0
- package/payload/skills/loom-review/references/shared/adoption/deep-existing-repo-default.md +64 -0
- package/payload/skills/loom-review/references/shared/adoption/lightweight-retrofit-default.md +71 -0
- package/payload/skills/loom-review/references/shared/adoption/routing-and-checkpoints.md +88 -0
- package/payload/skills/loom-review/references/shared/governance/host-object-taxonomy.md +148 -0
- package/payload/skills/loom-review/references/shared/governance/issue-model.md +127 -0
- package/payload/skills/loom-review/references/shared/governance/maturity-and-closing.md +69 -0
- package/payload/skills/loom-review/references/shared/governance/principles.md +180 -0
- package/payload/skills/loom-review/references/shared/governance/review-model.md +109 -0
- package/payload/skills/loom-review/references/shared/governance/state-machine.md +163 -0
- package/payload/skills/loom-review/references/shared/governance/truth-and-sync-boundary.md +161 -0
- package/payload/skills/loom-review/references/shared/harness/automation-frontload.md +139 -0
- package/payload/skills/loom-review/references/shared/harness/closeout-gate.md +97 -0
- package/payload/skills/loom-review/references/shared/harness/execution-chain.md +56 -0
- package/payload/skills/loom-review/references/shared/harness/execution-context.md +71 -0
- package/payload/skills/loom-review/references/shared/harness/fact-chain-contract.md +160 -0
- package/payload/skills/loom-review/references/shared/harness/host-action-contract.md +128 -0
- package/payload/skills/loom-review/references/shared/harness/host-issue-binding.md +90 -0
- package/payload/skills/loom-review/references/shared/harness/host-lifecycle-boundary.md +56 -0
- package/payload/skills/loom-review/references/shared/harness/merge-checkpoint.md +95 -0
- package/payload/skills/loom-review/references/shared/harness/reconciliation-audit.md +64 -0
- package/payload/skills/loom-review/references/shared/harness/recovery-model.md +101 -0
- package/payload/skills/loom-review/references/shared/harness/review-execution.md +99 -0
- package/payload/skills/loom-review/references/shared/harness/runtime-state.md +103 -0
- package/payload/skills/loom-review/references/shared/harness/status-surface.md +121 -0
- package/payload/skills/loom-review/references/shared/harness/work-item-contract.md +104 -0
- package/payload/skills/loom-review/references/shared/harness/workspace-and-purity.md +73 -0
- package/payload/skills/loom-review/references/shared/harness/workspace-model.md +56 -0
- package/payload/skills/loom-review/references/shared/templates/pull-request.md +44 -0
- package/payload/skills/loom-review/references/shared/templates/review-record.md +35 -0
- package/payload/skills/loom-review/references/shared/templates/spec-suite.md +57 -0
- package/payload/skills/loom-review/scripts/loom-review.py +16 -0
|
@@ -0,0 +1,869 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Shared governance-surface detection for Loom bootstrap, route, and resume."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import re
|
|
8
|
+
import subprocess
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from runtime_paths import installed_skill_script
|
|
13
|
+
|
|
14
|
+
CARRIER_KEYS = (
|
|
15
|
+
"work_item",
|
|
16
|
+
"recovery",
|
|
17
|
+
"review",
|
|
18
|
+
"status_surface",
|
|
19
|
+
"spec_path",
|
|
20
|
+
"plan_path",
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
PLANNED_LOCATORS = {
|
|
24
|
+
"work_item": ".loom/work-items/INIT-0001.md",
|
|
25
|
+
"recovery": ".loom/progress/INIT-0001.md",
|
|
26
|
+
"review": ".loom/reviews/INIT-0001.json",
|
|
27
|
+
"status_surface": ".loom/status/current.md",
|
|
28
|
+
"spec_path": ".loom/specs/INIT-0001/spec.md",
|
|
29
|
+
"plan_path": ".loom/specs/INIT-0001/plan.md",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
REPO_INTERFACE_SURFACES = ("review", "merge_ready", "closeout")
|
|
33
|
+
REPO_INTERFACE_AVAILABILITY = {"absent", "companion_docs_only", "incomplete", "present"}
|
|
34
|
+
REPO_INTERFACE_MANIFEST_SCHEMA = "loom-repo-companion-manifest/v1"
|
|
35
|
+
REPO_INTERFACE_V1_SCHEMA = "loom-repo-interface/v1"
|
|
36
|
+
REPO_INTERFACE_V2_SCHEMA = "loom-repo-interface/v2"
|
|
37
|
+
REPO_INTERFACE_SCHEMAS = {REPO_INTERFACE_V1_SCHEMA, REPO_INTERFACE_V2_SCHEMA}
|
|
38
|
+
REPO_INTERFACE_ENFORCEMENT = {"blocking", "advisory"}
|
|
39
|
+
REPO_INTERFACE_GATE_TYPES = {
|
|
40
|
+
"admission",
|
|
41
|
+
"pre_review",
|
|
42
|
+
"review",
|
|
43
|
+
"build",
|
|
44
|
+
"merge_ready",
|
|
45
|
+
"closeout",
|
|
46
|
+
}
|
|
47
|
+
REPO_INTERFACE_CONTEXT_TYPES = {"string", "integer", "number", "boolean"}
|
|
48
|
+
REPO_INTERFACE_MANIFEST_KEYS = {"schema_version", "companion_entry", "repo_interface"}
|
|
49
|
+
REPO_INTERFACE_V1_KEYS = {"schema_version", "companion_entry", "repo_specific_requirements", "specialized_gates"}
|
|
50
|
+
REPO_INTERFACE_V2_KEYS = REPO_INTERFACE_V1_KEYS | {"metadata_contract", "context_schema"}
|
|
51
|
+
REPO_INTEROP_AVAILABILITY = {"absent", "incomplete", "present"}
|
|
52
|
+
REPO_INTEROP_SCHEMA = "loom-repo-interop/v1"
|
|
53
|
+
REPO_INTEROP_KEYS = {"schema_version", "host_adapters", "repo_native_carriers", "shadow_surfaces"}
|
|
54
|
+
REPO_INTEROP_COLLECTION_SURFACES = {
|
|
55
|
+
"admission",
|
|
56
|
+
"pre_review",
|
|
57
|
+
"review",
|
|
58
|
+
"build",
|
|
59
|
+
"merge_ready",
|
|
60
|
+
"closeout",
|
|
61
|
+
}
|
|
62
|
+
REPO_INTEROP_SHADOW_SURFACES = ("admission", "review", "merge_ready", "closeout")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def run_process(args: list[str], cwd: Path) -> subprocess.CompletedProcess[str]:
|
|
66
|
+
return subprocess.run(args, cwd=cwd, check=False, capture_output=True, text=True)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def file_exists(root: Path, relative: str) -> bool:
|
|
70
|
+
return (root / relative).exists()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def relative_locator(path: Path, root: Path) -> str:
|
|
74
|
+
try:
|
|
75
|
+
return str(path.relative_to(root))
|
|
76
|
+
except ValueError:
|
|
77
|
+
return str(path)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def safe_read_json(path: Path) -> dict[str, Any] | None:
|
|
81
|
+
if not path.exists():
|
|
82
|
+
return None
|
|
83
|
+
try:
|
|
84
|
+
payload = json.loads(path.read_text(encoding="utf-8"))
|
|
85
|
+
except (OSError, json.JSONDecodeError):
|
|
86
|
+
return None
|
|
87
|
+
return payload if isinstance(payload, dict) else None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def command_prefix(root: Path, tool_name: str) -> str:
|
|
91
|
+
loom_tool = root / ".loom/bin" / tool_name
|
|
92
|
+
if loom_tool.exists():
|
|
93
|
+
return f"python3 .loom/bin/{tool_name}"
|
|
94
|
+
if tool_name == "loom_init.py":
|
|
95
|
+
return f"python3 {installed_skill_script(__file__, 'loom-init')}"
|
|
96
|
+
if tool_name == "loom_flow.py":
|
|
97
|
+
return f"python3 {installed_skill_script(__file__, 'loom-resume')}"
|
|
98
|
+
return "unknown"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def git_remote_origin(root: Path) -> str | None:
|
|
102
|
+
result = run_process(["git", "remote", "get-url", "origin"], root)
|
|
103
|
+
if result.returncode != 0:
|
|
104
|
+
return None
|
|
105
|
+
remote = result.stdout.strip()
|
|
106
|
+
return remote or None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def detect_github_repo(root: Path) -> tuple[str | None, str | None]:
|
|
110
|
+
remote = git_remote_origin(root)
|
|
111
|
+
if not remote:
|
|
112
|
+
return None, None
|
|
113
|
+
match = re.search(r"github\.com[:/](?P<owner>[^/]+)/(?P<repo>[^/.]+)(?:\.git)?$", remote)
|
|
114
|
+
if not match:
|
|
115
|
+
return None, None
|
|
116
|
+
return match.group("owner"), match.group("repo")
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def gh_json(root: Path, args: list[str]) -> tuple[dict[str, Any] | None, list[str]]:
|
|
120
|
+
result = run_process(["gh", *args], root)
|
|
121
|
+
if result.returncode != 0:
|
|
122
|
+
detail = result.stderr.strip() or result.stdout.strip() or "gh command failed"
|
|
123
|
+
return None, [detail]
|
|
124
|
+
try:
|
|
125
|
+
payload = json.loads(result.stdout)
|
|
126
|
+
except json.JSONDecodeError as exc:
|
|
127
|
+
return None, [f"invalid JSON from gh {' '.join(args)}: {exc.msg}"]
|
|
128
|
+
if not isinstance(payload, dict):
|
|
129
|
+
return None, [f"gh {' '.join(args)} did not return a JSON object"]
|
|
130
|
+
return payload, []
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def detect_loom_state(root: Path) -> str:
|
|
134
|
+
active_requirements = (
|
|
135
|
+
root / ".loom/bootstrap/init-result.json",
|
|
136
|
+
root / ".loom/work-items",
|
|
137
|
+
root / ".loom/progress",
|
|
138
|
+
root / ".loom/status/current.md",
|
|
139
|
+
)
|
|
140
|
+
if all(path.exists() for path in active_requirements):
|
|
141
|
+
return "active"
|
|
142
|
+
|
|
143
|
+
partial_markers = (
|
|
144
|
+
root / ".loom",
|
|
145
|
+
root / "AGENTS.md",
|
|
146
|
+
root / ".github/PULL_REQUEST_TEMPLATE.md",
|
|
147
|
+
)
|
|
148
|
+
if any(path.exists() for path in partial_markers):
|
|
149
|
+
return "partial"
|
|
150
|
+
return "absent"
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def detect_repository_mode(root: Path, loom_state: str, scenario_override: str | None = None) -> str:
|
|
154
|
+
if scenario_override in {"new", "small-existing", "complex-existing"}:
|
|
155
|
+
return scenario_override
|
|
156
|
+
|
|
157
|
+
init_result = safe_read_json(root / ".loom/bootstrap/init-result.json")
|
|
158
|
+
if isinstance(init_result, dict):
|
|
159
|
+
run = init_result.get("run")
|
|
160
|
+
if isinstance(run, dict):
|
|
161
|
+
scenario_key = run.get("scenario_key")
|
|
162
|
+
if scenario_key in {"new", "small-existing", "complex-existing"}:
|
|
163
|
+
return str(scenario_key)
|
|
164
|
+
|
|
165
|
+
code_dirs = ("src", "app", "lib", "cmd", "pkg", "services", "packages")
|
|
166
|
+
boundary_files = (
|
|
167
|
+
"README.md",
|
|
168
|
+
"AGENTS.md",
|
|
169
|
+
"WORKFLOW.md",
|
|
170
|
+
"docs/WORKFLOW.md",
|
|
171
|
+
"package.json",
|
|
172
|
+
"pyproject.toml",
|
|
173
|
+
"Cargo.toml",
|
|
174
|
+
"go.mod",
|
|
175
|
+
"Makefile",
|
|
176
|
+
".github/workflows",
|
|
177
|
+
)
|
|
178
|
+
baseline_count = sum(1 for entry in boundary_files if file_exists(root, entry))
|
|
179
|
+
code_count = sum(1 for entry in code_dirs if file_exists(root, entry))
|
|
180
|
+
|
|
181
|
+
meaningful_entries = 0
|
|
182
|
+
for path in root.iterdir():
|
|
183
|
+
if path.name in {".git", ".DS_Store"}:
|
|
184
|
+
continue
|
|
185
|
+
if path.name == ".loom" and loom_state != "absent":
|
|
186
|
+
continue
|
|
187
|
+
meaningful_entries += 1
|
|
188
|
+
|
|
189
|
+
if loom_state == "absent" and meaningful_entries <= 2 and baseline_count <= 1 and code_count == 0:
|
|
190
|
+
return "new"
|
|
191
|
+
if baseline_count + code_count >= 4 or meaningful_entries >= 8:
|
|
192
|
+
return "complex-existing"
|
|
193
|
+
return "small-existing"
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def carrier_entry(status: str, locator: str, source: str) -> dict[str, str]:
|
|
197
|
+
return {"status": status, "locator": locator, "source": source}
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def has_legacy_companion_docs(root: Path) -> bool:
|
|
201
|
+
companion_dir = root / ".loom" / "companion"
|
|
202
|
+
if not companion_dir.exists() or not companion_dir.is_dir():
|
|
203
|
+
return False
|
|
204
|
+
for path in companion_dir.iterdir():
|
|
205
|
+
if path.name in {"manifest.json", "repo-interface.json"}:
|
|
206
|
+
continue
|
|
207
|
+
if path.suffix.lower() == ".md":
|
|
208
|
+
return True
|
|
209
|
+
return False
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def relative_locator_from_value(root: Path, raw_locator: object) -> str | None:
|
|
213
|
+
if not isinstance(raw_locator, str):
|
|
214
|
+
return None
|
|
215
|
+
locator = raw_locator.strip()
|
|
216
|
+
if not locator:
|
|
217
|
+
return None
|
|
218
|
+
locator_path = Path(locator)
|
|
219
|
+
if locator_path.is_absolute():
|
|
220
|
+
try:
|
|
221
|
+
return str(locator_path.relative_to(root))
|
|
222
|
+
except ValueError:
|
|
223
|
+
return str(locator_path)
|
|
224
|
+
return str(locator_path)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def resolve_locator(root: Path, raw_locator: object) -> tuple[str | None, Path | None]:
|
|
228
|
+
locator = relative_locator_from_value(root, raw_locator)
|
|
229
|
+
if locator is None:
|
|
230
|
+
return None, None
|
|
231
|
+
return locator, (root / locator).resolve()
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def locator_status_entry(
|
|
235
|
+
*,
|
|
236
|
+
root: Path,
|
|
237
|
+
raw_locator: object,
|
|
238
|
+
source: str,
|
|
239
|
+
) -> tuple[dict[str, str], str | None]:
|
|
240
|
+
locator, target = resolve_locator(root, raw_locator)
|
|
241
|
+
if locator is None or target is None:
|
|
242
|
+
return carrier_entry("missing", "unknown", source), f"{source} is missing a valid locator"
|
|
243
|
+
if not target.exists():
|
|
244
|
+
return carrier_entry("missing", locator, source), f"{source} points to missing path `{locator}`"
|
|
245
|
+
return carrier_entry("present", locator, source), None
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def validate_repo_specific_requirement(
|
|
249
|
+
*,
|
|
250
|
+
root: Path,
|
|
251
|
+
surface: str,
|
|
252
|
+
entry: object,
|
|
253
|
+
index: int,
|
|
254
|
+
) -> list[str]:
|
|
255
|
+
prefix = f"repo_interface.{surface}[{index}]"
|
|
256
|
+
if not isinstance(entry, dict):
|
|
257
|
+
return [f"{prefix} must be an object"]
|
|
258
|
+
missing_inputs: list[str] = []
|
|
259
|
+
for field in ("id", "summary", "locator", "enforcement"):
|
|
260
|
+
value = entry.get(field)
|
|
261
|
+
if not isinstance(value, str) or not value.strip():
|
|
262
|
+
missing_inputs.append(f"{prefix} missing `{field}`")
|
|
263
|
+
enforcement = entry.get("enforcement")
|
|
264
|
+
if enforcement not in REPO_INTERFACE_ENFORCEMENT:
|
|
265
|
+
missing_inputs.append(f"{prefix} enforcement must be `blocking` or `advisory`")
|
|
266
|
+
locator, target = resolve_locator(root, entry.get("locator"))
|
|
267
|
+
if locator is None or target is None:
|
|
268
|
+
missing_inputs.append(f"{prefix} locator must be a non-empty string")
|
|
269
|
+
elif not target.exists():
|
|
270
|
+
missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
|
|
271
|
+
return missing_inputs
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def validate_specialized_gate(
|
|
275
|
+
*,
|
|
276
|
+
root: Path,
|
|
277
|
+
entry: object,
|
|
278
|
+
index: int,
|
|
279
|
+
) -> list[str]:
|
|
280
|
+
prefix = f"specialized_gates[{index}]"
|
|
281
|
+
if not isinstance(entry, dict):
|
|
282
|
+
return [f"{prefix} must be an object"]
|
|
283
|
+
missing_inputs: list[str] = []
|
|
284
|
+
for field in ("id", "summary", "locator"):
|
|
285
|
+
value = entry.get(field)
|
|
286
|
+
if not isinstance(value, str) or not value.strip():
|
|
287
|
+
missing_inputs.append(f"{prefix} missing `{field}`")
|
|
288
|
+
locator, target = resolve_locator(root, entry.get("locator"))
|
|
289
|
+
if locator is None or target is None:
|
|
290
|
+
missing_inputs.append(f"{prefix} locator must be a non-empty string")
|
|
291
|
+
elif not target.exists():
|
|
292
|
+
missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
|
|
293
|
+
gate_type = entry.get("gate_type")
|
|
294
|
+
if gate_type is not None and gate_type not in REPO_INTERFACE_GATE_TYPES:
|
|
295
|
+
missing_inputs.append(
|
|
296
|
+
f"{prefix} gate_type must be one of `admission`, `pre_review`, `review`, `build`, `merge_ready`, `closeout`"
|
|
297
|
+
)
|
|
298
|
+
return missing_inputs
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def validate_metadata_contract(
|
|
302
|
+
*,
|
|
303
|
+
root: Path,
|
|
304
|
+
entry: object,
|
|
305
|
+
) -> list[str]:
|
|
306
|
+
prefix = "metadata_contract"
|
|
307
|
+
if not isinstance(entry, dict):
|
|
308
|
+
return [f"{prefix} must be an object"]
|
|
309
|
+
fields = entry.get("fields")
|
|
310
|
+
if not isinstance(fields, list):
|
|
311
|
+
return [f"{prefix} must include `fields` as a list"]
|
|
312
|
+
missing_inputs: list[str] = []
|
|
313
|
+
for index, field in enumerate(fields):
|
|
314
|
+
field_prefix = f"{prefix}.fields[{index}]"
|
|
315
|
+
if not isinstance(field, dict):
|
|
316
|
+
missing_inputs.append(f"{field_prefix} must be an object")
|
|
317
|
+
continue
|
|
318
|
+
for required in ("id", "summary", "applicability_locator", "authority_locator", "enforcement"):
|
|
319
|
+
value = field.get(required)
|
|
320
|
+
if required == "enforcement":
|
|
321
|
+
continue
|
|
322
|
+
if not isinstance(value, str) or not value.strip():
|
|
323
|
+
missing_inputs.append(f"{field_prefix} missing `{required}`")
|
|
324
|
+
enforcement = field.get("enforcement")
|
|
325
|
+
if enforcement not in REPO_INTERFACE_ENFORCEMENT:
|
|
326
|
+
missing_inputs.append(f"{field_prefix} enforcement must be `blocking` or `advisory`")
|
|
327
|
+
for locator_field in ("applicability_locator", "authority_locator"):
|
|
328
|
+
locator, target = resolve_locator(root, field.get(locator_field))
|
|
329
|
+
if locator is None or target is None:
|
|
330
|
+
missing_inputs.append(f"{field_prefix} `{locator_field}` must be a non-empty string")
|
|
331
|
+
elif not target.exists():
|
|
332
|
+
missing_inputs.append(f"{field_prefix} `{locator_field}` points to missing path `{locator}`")
|
|
333
|
+
return missing_inputs
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def validate_context_schema(
|
|
337
|
+
*,
|
|
338
|
+
root: Path,
|
|
339
|
+
entry: object,
|
|
340
|
+
) -> list[str]:
|
|
341
|
+
prefix = "context_schema"
|
|
342
|
+
if not isinstance(entry, dict):
|
|
343
|
+
return [f"{prefix} must be an object"]
|
|
344
|
+
fields = entry.get("fields")
|
|
345
|
+
if not isinstance(fields, list):
|
|
346
|
+
return [f"{prefix} must include `fields` as a list"]
|
|
347
|
+
missing_inputs: list[str] = []
|
|
348
|
+
for index, field in enumerate(fields):
|
|
349
|
+
field_prefix = f"{prefix}.fields[{index}]"
|
|
350
|
+
if not isinstance(field, dict):
|
|
351
|
+
missing_inputs.append(f"{field_prefix} must be an object")
|
|
352
|
+
continue
|
|
353
|
+
for required in ("id", "summary", "type", "mapping_rule_locator"):
|
|
354
|
+
value = field.get(required)
|
|
355
|
+
if not isinstance(value, str) or not value.strip():
|
|
356
|
+
missing_inputs.append(f"{field_prefix} missing `{required}`")
|
|
357
|
+
field_type = field.get("type")
|
|
358
|
+
if field_type not in REPO_INTERFACE_CONTEXT_TYPES:
|
|
359
|
+
missing_inputs.append(f"{field_prefix} type must be one of `string`, `integer`, `number`, `boolean`")
|
|
360
|
+
if not isinstance(field.get("required"), bool):
|
|
361
|
+
missing_inputs.append(f"{field_prefix} `required` must be a boolean")
|
|
362
|
+
locator, target = resolve_locator(root, field.get("mapping_rule_locator"))
|
|
363
|
+
if locator is None or target is None:
|
|
364
|
+
missing_inputs.append(f"{field_prefix} `mapping_rule_locator` must be a non-empty string")
|
|
365
|
+
elif not target.exists():
|
|
366
|
+
missing_inputs.append(f"{field_prefix} `mapping_rule_locator` points to missing path `{locator}`")
|
|
367
|
+
return missing_inputs
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def validate_repo_interop_collection_entry(
|
|
371
|
+
*,
|
|
372
|
+
root: Path,
|
|
373
|
+
collection: str,
|
|
374
|
+
entry: object,
|
|
375
|
+
index: int,
|
|
376
|
+
) -> list[str]:
|
|
377
|
+
prefix = f"{collection}[{index}]"
|
|
378
|
+
if not isinstance(entry, dict):
|
|
379
|
+
return [f"{prefix} must be an object"]
|
|
380
|
+
missing_inputs: list[str] = []
|
|
381
|
+
for field in ("id", "summary", "locator"):
|
|
382
|
+
value = entry.get(field)
|
|
383
|
+
if not isinstance(value, str) or not value.strip():
|
|
384
|
+
missing_inputs.append(f"{prefix} missing `{field}`")
|
|
385
|
+
surfaces = entry.get("surfaces")
|
|
386
|
+
if not isinstance(surfaces, list) or not surfaces:
|
|
387
|
+
missing_inputs.append(f"{prefix} must include `surfaces` as a non-empty list")
|
|
388
|
+
else:
|
|
389
|
+
for surface_index, surface in enumerate(surfaces):
|
|
390
|
+
if surface not in REPO_INTEROP_COLLECTION_SURFACES:
|
|
391
|
+
missing_inputs.append(
|
|
392
|
+
f"{prefix}.surfaces[{surface_index}] must be one of `admission`, `pre_review`, `review`, `build`, `merge_ready`, `closeout`"
|
|
393
|
+
)
|
|
394
|
+
locator, target = resolve_locator(root, entry.get("locator"))
|
|
395
|
+
if locator is None or target is None:
|
|
396
|
+
missing_inputs.append(f"{prefix} locator must be a non-empty string")
|
|
397
|
+
elif not target.exists():
|
|
398
|
+
missing_inputs.append(f"{prefix} locator points to missing path `{locator}`")
|
|
399
|
+
return missing_inputs
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def validate_shadow_surface(
|
|
403
|
+
*,
|
|
404
|
+
root: Path,
|
|
405
|
+
surface: str,
|
|
406
|
+
entry: object,
|
|
407
|
+
) -> list[str]:
|
|
408
|
+
prefix = f"shadow_surfaces.{surface}"
|
|
409
|
+
if not isinstance(entry, dict):
|
|
410
|
+
return [f"{prefix} must be an object"]
|
|
411
|
+
missing_inputs: list[str] = []
|
|
412
|
+
summary = entry.get("summary")
|
|
413
|
+
if not isinstance(summary, str) or not summary.strip():
|
|
414
|
+
missing_inputs.append(f"{prefix} missing `summary`")
|
|
415
|
+
for locator_field in ("loom_locator", "repo_locator"):
|
|
416
|
+
locator, target = resolve_locator(root, entry.get(locator_field))
|
|
417
|
+
if locator is None or target is None:
|
|
418
|
+
missing_inputs.append(f"{prefix} `{locator_field}` must be a non-empty string")
|
|
419
|
+
elif not target.exists():
|
|
420
|
+
missing_inputs.append(f"{prefix} `{locator_field}` points to missing path `{locator}`")
|
|
421
|
+
return missing_inputs
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def detect_repo_interface(root: Path) -> tuple[dict[str, Any], list[str]]:
|
|
425
|
+
companion_dir = root / ".loom" / "companion"
|
|
426
|
+
manifest_path = companion_dir / "manifest.json"
|
|
427
|
+
repo_interface_path = companion_dir / "repo-interface.json"
|
|
428
|
+
|
|
429
|
+
repo_interface_surface: dict[str, Any] = {
|
|
430
|
+
"availability": "absent",
|
|
431
|
+
"manifest": carrier_entry("missing", ".loom/companion/manifest.json", "companion manifest"),
|
|
432
|
+
"companion_entry": carrier_entry("missing", "unknown", "repo companion manifest"),
|
|
433
|
+
"repo_specific_requirements": carrier_entry("missing", "unknown", "repo companion interface"),
|
|
434
|
+
"specialized_gates": carrier_entry("missing", "unknown", "repo companion interface"),
|
|
435
|
+
"summary": "no repo companion interface is declared for this repository.",
|
|
436
|
+
"missing_inputs": [],
|
|
437
|
+
}
|
|
438
|
+
missing_inputs: list[str] = []
|
|
439
|
+
|
|
440
|
+
if not manifest_path.exists():
|
|
441
|
+
if has_legacy_companion_docs(root):
|
|
442
|
+
repo_interface_surface["availability"] = "companion_docs_only"
|
|
443
|
+
repo_interface_surface["summary"] = (
|
|
444
|
+
"legacy companion docs are present, but no machine-readable repo companion manifest is declared."
|
|
445
|
+
)
|
|
446
|
+
return repo_interface_surface, missing_inputs
|
|
447
|
+
|
|
448
|
+
repo_interface_surface["manifest"] = carrier_entry(
|
|
449
|
+
"present",
|
|
450
|
+
".loom/companion/manifest.json",
|
|
451
|
+
"repository scan",
|
|
452
|
+
)
|
|
453
|
+
manifest = safe_read_json(manifest_path)
|
|
454
|
+
if manifest is None:
|
|
455
|
+
missing_inputs.append("repo companion manifest is unreadable")
|
|
456
|
+
repo_interface_surface["availability"] = "incomplete"
|
|
457
|
+
repo_interface_surface["summary"] = "repo companion manifest exists, but the machine-readable interface is incomplete."
|
|
458
|
+
repo_interface_surface["missing_inputs"] = missing_inputs
|
|
459
|
+
return repo_interface_surface, missing_inputs
|
|
460
|
+
|
|
461
|
+
if manifest.get("schema_version") != REPO_INTERFACE_MANIFEST_SCHEMA:
|
|
462
|
+
missing_inputs.append(
|
|
463
|
+
f"repo companion manifest schema must be `{REPO_INTERFACE_MANIFEST_SCHEMA}`"
|
|
464
|
+
)
|
|
465
|
+
extra_manifest_keys = sorted(set(manifest.keys()) - REPO_INTERFACE_MANIFEST_KEYS)
|
|
466
|
+
if extra_manifest_keys:
|
|
467
|
+
missing_inputs.append(
|
|
468
|
+
"repo companion manifest must stay locator-only: "
|
|
469
|
+
+ ", ".join(extra_manifest_keys)
|
|
470
|
+
)
|
|
471
|
+
|
|
472
|
+
companion_entry, companion_error = locator_status_entry(
|
|
473
|
+
root=root,
|
|
474
|
+
raw_locator=manifest.get("companion_entry"),
|
|
475
|
+
source="repo companion manifest.companion_entry",
|
|
476
|
+
)
|
|
477
|
+
repo_interface_surface["companion_entry"] = companion_entry
|
|
478
|
+
if companion_error:
|
|
479
|
+
missing_inputs.append(companion_error)
|
|
480
|
+
|
|
481
|
+
manifest_repo_interface, manifest_repo_interface_error = locator_status_entry(
|
|
482
|
+
root=root,
|
|
483
|
+
raw_locator=manifest.get("repo_interface"),
|
|
484
|
+
source="repo companion manifest.repo_interface",
|
|
485
|
+
)
|
|
486
|
+
repo_interface_surface["repo_specific_requirements"] = manifest_repo_interface
|
|
487
|
+
repo_interface_surface["specialized_gates"] = manifest_repo_interface.copy()
|
|
488
|
+
if manifest_repo_interface_error:
|
|
489
|
+
missing_inputs.append(manifest_repo_interface_error)
|
|
490
|
+
|
|
491
|
+
repo_interface_locator, repo_interface_target = resolve_locator(root, manifest.get("repo_interface"))
|
|
492
|
+
if repo_interface_surface["repo_specific_requirements"]["status"] != "present":
|
|
493
|
+
if repo_interface_path.exists() and manifest_repo_interface_error:
|
|
494
|
+
missing_inputs.append("repo companion manifest must point `repo_interface` to `.loom/companion/repo-interface.json`")
|
|
495
|
+
else:
|
|
496
|
+
interface_payload = safe_read_json(repo_interface_target or repo_interface_path)
|
|
497
|
+
if interface_payload is None:
|
|
498
|
+
missing_inputs.append("repo companion interface is unreadable")
|
|
499
|
+
else:
|
|
500
|
+
interface_schema = interface_payload.get("schema_version")
|
|
501
|
+
if interface_schema not in REPO_INTERFACE_SCHEMAS:
|
|
502
|
+
missing_inputs.append(
|
|
503
|
+
"repo companion interface schema must be `loom-repo-interface/v1` or `loom-repo-interface/v2`"
|
|
504
|
+
)
|
|
505
|
+
allowed_interface_keys = (
|
|
506
|
+
REPO_INTERFACE_V2_KEYS if interface_schema == REPO_INTERFACE_V2_SCHEMA else REPO_INTERFACE_V1_KEYS
|
|
507
|
+
)
|
|
508
|
+
extra_interface_keys = sorted(set(interface_payload.keys()) - allowed_interface_keys)
|
|
509
|
+
if extra_interface_keys:
|
|
510
|
+
missing_inputs.append(
|
|
511
|
+
"repo companion interface contains unexpected top-level fields: "
|
|
512
|
+
+ ", ".join(extra_interface_keys)
|
|
513
|
+
)
|
|
514
|
+
interface_companion_entry, interface_companion_error = locator_status_entry(
|
|
515
|
+
root=root,
|
|
516
|
+
raw_locator=interface_payload.get("companion_entry"),
|
|
517
|
+
source="repo companion interface.companion_entry",
|
|
518
|
+
)
|
|
519
|
+
if interface_companion_entry["status"] == "present":
|
|
520
|
+
repo_interface_surface["companion_entry"] = interface_companion_entry
|
|
521
|
+
if interface_companion_error:
|
|
522
|
+
missing_inputs.append(interface_companion_error)
|
|
523
|
+
|
|
524
|
+
requirements = interface_payload.get("repo_specific_requirements")
|
|
525
|
+
if not isinstance(requirements, dict):
|
|
526
|
+
missing_inputs.append("repo companion interface must include `repo_specific_requirements`")
|
|
527
|
+
else:
|
|
528
|
+
for surface in REPO_INTERFACE_SURFACES:
|
|
529
|
+
entries = requirements.get(surface)
|
|
530
|
+
if not isinstance(entries, list):
|
|
531
|
+
missing_inputs.append(
|
|
532
|
+
f"repo companion interface surface `{surface}` must be a list"
|
|
533
|
+
)
|
|
534
|
+
continue
|
|
535
|
+
for index, entry in enumerate(entries):
|
|
536
|
+
missing_inputs.extend(
|
|
537
|
+
validate_repo_specific_requirement(
|
|
538
|
+
root=root,
|
|
539
|
+
surface=surface,
|
|
540
|
+
entry=entry,
|
|
541
|
+
index=index,
|
|
542
|
+
)
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
specialized_gates = interface_payload.get("specialized_gates")
|
|
546
|
+
if not isinstance(specialized_gates, list):
|
|
547
|
+
missing_inputs.append("repo companion interface must include `specialized_gates` as a list")
|
|
548
|
+
else:
|
|
549
|
+
for index, entry in enumerate(specialized_gates):
|
|
550
|
+
missing_inputs.extend(
|
|
551
|
+
validate_specialized_gate(
|
|
552
|
+
root=root,
|
|
553
|
+
entry=entry,
|
|
554
|
+
index=index,
|
|
555
|
+
)
|
|
556
|
+
)
|
|
557
|
+
|
|
558
|
+
if interface_schema == REPO_INTERFACE_V2_SCHEMA:
|
|
559
|
+
metadata_contract = interface_payload.get("metadata_contract")
|
|
560
|
+
if metadata_contract is not None:
|
|
561
|
+
missing_inputs.extend(
|
|
562
|
+
validate_metadata_contract(
|
|
563
|
+
root=root,
|
|
564
|
+
entry=metadata_contract,
|
|
565
|
+
)
|
|
566
|
+
)
|
|
567
|
+
context_schema = interface_payload.get("context_schema")
|
|
568
|
+
if context_schema is not None:
|
|
569
|
+
missing_inputs.extend(
|
|
570
|
+
validate_context_schema(
|
|
571
|
+
root=root,
|
|
572
|
+
entry=context_schema,
|
|
573
|
+
)
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
if missing_inputs:
|
|
577
|
+
repo_interface_surface["availability"] = "incomplete"
|
|
578
|
+
repo_interface_surface["summary"] = (
|
|
579
|
+
"repo companion manifest exists, but the machine-readable interface is incomplete."
|
|
580
|
+
)
|
|
581
|
+
else:
|
|
582
|
+
repo_interface_surface["availability"] = "present"
|
|
583
|
+
repo_interface_surface["summary"] = (
|
|
584
|
+
"repo companion manifest and machine-readable repo interface are readable."
|
|
585
|
+
)
|
|
586
|
+
repo_interface_surface["missing_inputs"] = list(dict.fromkeys(missing_inputs))
|
|
587
|
+
return repo_interface_surface, list(dict.fromkeys(missing_inputs))
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def detect_repo_interop(root: Path) -> tuple[dict[str, Any], list[str]]:
|
|
591
|
+
interop_path = root / ".loom" / "companion" / "interop.json"
|
|
592
|
+
repo_interop_surface: dict[str, Any] = {
|
|
593
|
+
"availability": "absent",
|
|
594
|
+
"contract": carrier_entry("missing", ".loom/companion/interop.json", "repository scan"),
|
|
595
|
+
"host_adapters": carrier_entry("missing", "unknown", "repo interop contract"),
|
|
596
|
+
"repo_native_carriers": carrier_entry("missing", "unknown", "repo interop contract"),
|
|
597
|
+
"shadow_surfaces": carrier_entry("missing", "unknown", "repo interop contract"),
|
|
598
|
+
"summary": "no repo interop contract is declared for this repository.",
|
|
599
|
+
"missing_inputs": [],
|
|
600
|
+
}
|
|
601
|
+
missing_inputs: list[str] = []
|
|
602
|
+
|
|
603
|
+
if not interop_path.exists():
|
|
604
|
+
return repo_interop_surface, missing_inputs
|
|
605
|
+
|
|
606
|
+
repo_interop_surface["contract"] = carrier_entry(
|
|
607
|
+
"present",
|
|
608
|
+
".loom/companion/interop.json",
|
|
609
|
+
"repository scan",
|
|
610
|
+
)
|
|
611
|
+
interop_payload = safe_read_json(interop_path)
|
|
612
|
+
if interop_payload is None:
|
|
613
|
+
missing_inputs.append("repo interop contract is unreadable")
|
|
614
|
+
else:
|
|
615
|
+
if interop_payload.get("schema_version") != REPO_INTEROP_SCHEMA:
|
|
616
|
+
missing_inputs.append(f"repo interop contract schema must be `{REPO_INTEROP_SCHEMA}`")
|
|
617
|
+
extra_keys = sorted(set(interop_payload.keys()) - REPO_INTEROP_KEYS)
|
|
618
|
+
if extra_keys:
|
|
619
|
+
missing_inputs.append(
|
|
620
|
+
"repo interop contract contains unexpected top-level fields: "
|
|
621
|
+
+ ", ".join(extra_keys)
|
|
622
|
+
)
|
|
623
|
+
|
|
624
|
+
for key in ("host_adapters", "repo_native_carriers", "shadow_surfaces"):
|
|
625
|
+
repo_interop_surface[key] = carrier_entry(
|
|
626
|
+
"present",
|
|
627
|
+
".loom/companion/interop.json",
|
|
628
|
+
"repo interop contract",
|
|
629
|
+
)
|
|
630
|
+
|
|
631
|
+
host_adapters = interop_payload.get("host_adapters")
|
|
632
|
+
if not isinstance(host_adapters, list):
|
|
633
|
+
missing_inputs.append("repo interop contract must include `host_adapters` as a list")
|
|
634
|
+
else:
|
|
635
|
+
for index, entry in enumerate(host_adapters):
|
|
636
|
+
missing_inputs.extend(
|
|
637
|
+
validate_repo_interop_collection_entry(
|
|
638
|
+
root=root,
|
|
639
|
+
collection="host_adapters",
|
|
640
|
+
entry=entry,
|
|
641
|
+
index=index,
|
|
642
|
+
)
|
|
643
|
+
)
|
|
644
|
+
|
|
645
|
+
repo_native_carriers = interop_payload.get("repo_native_carriers")
|
|
646
|
+
if not isinstance(repo_native_carriers, list):
|
|
647
|
+
missing_inputs.append("repo interop contract must include `repo_native_carriers` as a list")
|
|
648
|
+
else:
|
|
649
|
+
for index, entry in enumerate(repo_native_carriers):
|
|
650
|
+
missing_inputs.extend(
|
|
651
|
+
validate_repo_interop_collection_entry(
|
|
652
|
+
root=root,
|
|
653
|
+
collection="repo_native_carriers",
|
|
654
|
+
entry=entry,
|
|
655
|
+
index=index,
|
|
656
|
+
)
|
|
657
|
+
)
|
|
658
|
+
|
|
659
|
+
shadow_surfaces = interop_payload.get("shadow_surfaces")
|
|
660
|
+
if not isinstance(shadow_surfaces, dict):
|
|
661
|
+
missing_inputs.append("repo interop contract must include `shadow_surfaces` as an object")
|
|
662
|
+
else:
|
|
663
|
+
extra_shadow_surfaces = sorted(set(shadow_surfaces.keys()) - set(REPO_INTEROP_SHADOW_SURFACES))
|
|
664
|
+
if extra_shadow_surfaces:
|
|
665
|
+
missing_inputs.append(
|
|
666
|
+
"repo interop contract shadow_surfaces contains unexpected surfaces: "
|
|
667
|
+
+ ", ".join(extra_shadow_surfaces)
|
|
668
|
+
)
|
|
669
|
+
for surface in REPO_INTEROP_SHADOW_SURFACES:
|
|
670
|
+
if surface not in shadow_surfaces:
|
|
671
|
+
missing_inputs.append(f"repo interop contract shadow_surfaces missing `{surface}`")
|
|
672
|
+
continue
|
|
673
|
+
missing_inputs.extend(
|
|
674
|
+
validate_shadow_surface(
|
|
675
|
+
root=root,
|
|
676
|
+
surface=surface,
|
|
677
|
+
entry=shadow_surfaces.get(surface),
|
|
678
|
+
)
|
|
679
|
+
)
|
|
680
|
+
|
|
681
|
+
if missing_inputs:
|
|
682
|
+
repo_interop_surface["availability"] = "incomplete"
|
|
683
|
+
repo_interop_surface["summary"] = "repo interop contract exists, but the machine-readable read surface is incomplete."
|
|
684
|
+
else:
|
|
685
|
+
repo_interop_surface["availability"] = "present"
|
|
686
|
+
repo_interop_surface["summary"] = "repo interop contract is readable for host adapters, repo-native carriers, and shadow parity."
|
|
687
|
+
repo_interop_surface["missing_inputs"] = list(dict.fromkeys(missing_inputs))
|
|
688
|
+
return repo_interop_surface, list(dict.fromkeys(missing_inputs))
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
def first_match(directory: Path, suffix: str, root: Path) -> str:
|
|
692
|
+
for path in sorted(directory.glob(f"*{suffix}")):
|
|
693
|
+
return relative_locator(path, root)
|
|
694
|
+
return ""
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
def detect_carrier_summary(root: Path, *, repository_mode: str, planning_mode: bool) -> dict[str, dict[str, str]]:
|
|
698
|
+
item_dir = root / ".loom/work-items"
|
|
699
|
+
recovery_dir = root / ".loom/progress"
|
|
700
|
+
review_dir = root / ".loom/reviews"
|
|
701
|
+
status_path = root / ".loom/status/current.md"
|
|
702
|
+
spec_path = root / ".loom/specs/INIT-0001/spec.md"
|
|
703
|
+
plan_path = root / ".loom/specs/INIT-0001/plan.md"
|
|
704
|
+
|
|
705
|
+
present_locators = {
|
|
706
|
+
"work_item": first_match(item_dir, ".md", root) if item_dir.exists() else "",
|
|
707
|
+
"recovery": first_match(recovery_dir, ".md", root) if recovery_dir.exists() else "",
|
|
708
|
+
"review": first_match(review_dir, ".json", root) if review_dir.exists() else "",
|
|
709
|
+
"status_surface": relative_locator(status_path, root) if status_path.exists() else "",
|
|
710
|
+
"spec_path": relative_locator(spec_path, root) if spec_path.exists() else "",
|
|
711
|
+
"plan_path": relative_locator(plan_path, root) if plan_path.exists() else "",
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
summary: dict[str, dict[str, str]] = {}
|
|
715
|
+
for key in CARRIER_KEYS:
|
|
716
|
+
locator = present_locators[key]
|
|
717
|
+
if locator:
|
|
718
|
+
summary[key] = carrier_entry("present", locator, "repository scan")
|
|
719
|
+
elif planning_mode and repository_mode == "new":
|
|
720
|
+
summary[key] = carrier_entry("planned", PLANNED_LOCATORS[key], "bootstrap plan")
|
|
721
|
+
else:
|
|
722
|
+
summary[key] = carrier_entry("missing", "unknown", "repository scan")
|
|
723
|
+
return summary
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
def detect_execution_entry(root: Path, loom_state: str, *, bootstrap_mode: bool) -> str:
|
|
727
|
+
if bootstrap_mode:
|
|
728
|
+
return "python3 .loom/bin/loom_flow.py flow resume --target . --item INIT-0001"
|
|
729
|
+
if loom_state == "active":
|
|
730
|
+
return f"{command_prefix(root, 'loom_flow.py')} flow resume --target . --item INIT-0001"
|
|
731
|
+
if loom_state == "partial":
|
|
732
|
+
return f"{command_prefix(root, 'loom_init.py')} route --target <repo> --task \"请接手当前事项并恢复上下文后继续推进\""
|
|
733
|
+
return "unknown"
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
def detect_validation_entry(loom_state: str, *, bootstrap_mode: bool) -> str:
|
|
737
|
+
if bootstrap_mode:
|
|
738
|
+
return "python3 .loom/bin/loom_init.py verify --target ."
|
|
739
|
+
if loom_state == "active":
|
|
740
|
+
return "python3 .loom/bin/loom_init.py verify --target ."
|
|
741
|
+
if loom_state == "partial":
|
|
742
|
+
return f"python3 {installed_skill_script(__file__, 'loom-init')} verify --target <repo>"
|
|
743
|
+
return "unknown"
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
def detect_review_merge_surface(root: Path, loom_state: str, *, bootstrap_mode: bool) -> dict[str, str]:
|
|
747
|
+
pr_template = ".github/PULL_REQUEST_TEMPLATE.md" if file_exists(root, ".github/PULL_REQUEST_TEMPLATE.md") else "unknown"
|
|
748
|
+
validation_surface = ".loom/status/current.md" if file_exists(root, ".loom/status/current.md") else "unknown"
|
|
749
|
+
if bootstrap_mode and validation_surface == "unknown":
|
|
750
|
+
validation_surface = ".loom/status/current.md"
|
|
751
|
+
|
|
752
|
+
if bootstrap_mode:
|
|
753
|
+
merge_surface = "python3 .loom/bin/loom_flow.py checkpoint merge --target . --item INIT-0001"
|
|
754
|
+
elif loom_state == "active":
|
|
755
|
+
merge_surface = f"{command_prefix(root, 'loom_flow.py')} checkpoint merge --target . [--item <id>]"
|
|
756
|
+
else:
|
|
757
|
+
merge_surface = "unknown"
|
|
758
|
+
return {
|
|
759
|
+
"pr_template": pr_template,
|
|
760
|
+
"validation_surface": validation_surface,
|
|
761
|
+
"merge_surface": merge_surface,
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
def detect_github_control_plane(root: Path) -> tuple[dict[str, Any], list[str]]:
|
|
766
|
+
owner, repo = detect_github_repo(root)
|
|
767
|
+
surface: dict[str, Any] = {
|
|
768
|
+
"repository": f"{owner}/{repo}" if owner and repo else "unknown",
|
|
769
|
+
"default_branch": "unknown",
|
|
770
|
+
"branch_protection": "unknown",
|
|
771
|
+
"required_checks": "unknown",
|
|
772
|
+
"pr_reviews": "unknown",
|
|
773
|
+
}
|
|
774
|
+
missing_inputs: list[str] = []
|
|
775
|
+
|
|
776
|
+
if not owner or not repo:
|
|
777
|
+
missing_inputs.append("cannot resolve GitHub repository from git origin")
|
|
778
|
+
return surface, missing_inputs
|
|
779
|
+
|
|
780
|
+
repo_payload, repo_errors = gh_json(root, ["repo", "view", f"{owner}/{repo}", "--json", "nameWithOwner,defaultBranchRef"])
|
|
781
|
+
if repo_errors or repo_payload is None:
|
|
782
|
+
missing_inputs.extend(f"github control plane: {message}" for message in repo_errors)
|
|
783
|
+
return surface, missing_inputs
|
|
784
|
+
|
|
785
|
+
branch_ref = repo_payload.get("defaultBranchRef")
|
|
786
|
+
if isinstance(branch_ref, dict):
|
|
787
|
+
branch_name = branch_ref.get("name")
|
|
788
|
+
if isinstance(branch_name, str) and branch_name:
|
|
789
|
+
surface["default_branch"] = branch_name
|
|
790
|
+
if surface["default_branch"] == "unknown":
|
|
791
|
+
missing_inputs.append("github control plane: default branch is unavailable")
|
|
792
|
+
return surface, missing_inputs
|
|
793
|
+
|
|
794
|
+
branch_payload, branch_errors = gh_json(root, ["api", f"repos/{owner}/{repo}/branches/{surface['default_branch']}"])
|
|
795
|
+
if branch_errors or branch_payload is None:
|
|
796
|
+
missing_inputs.extend(f"github control plane: {message}" for message in branch_errors)
|
|
797
|
+
return surface, missing_inputs
|
|
798
|
+
|
|
799
|
+
protected = branch_payload.get("protected")
|
|
800
|
+
if isinstance(protected, bool):
|
|
801
|
+
surface["branch_protection"] = "enabled" if protected else "disabled"
|
|
802
|
+
protection = branch_payload.get("protection")
|
|
803
|
+
if isinstance(protection, dict):
|
|
804
|
+
required_status = protection.get("required_status_checks")
|
|
805
|
+
if isinstance(required_status, dict):
|
|
806
|
+
contexts = required_status.get("contexts")
|
|
807
|
+
if isinstance(contexts, list) and all(isinstance(item, str) for item in contexts):
|
|
808
|
+
surface["required_checks"] = contexts
|
|
809
|
+
else:
|
|
810
|
+
surface["required_checks"] = []
|
|
811
|
+
pull_request_reviews = protection.get("required_pull_request_reviews")
|
|
812
|
+
if isinstance(pull_request_reviews, dict):
|
|
813
|
+
surface["pr_reviews"] = "required"
|
|
814
|
+
elif surface["branch_protection"] == "enabled":
|
|
815
|
+
surface["pr_reviews"] = "not_required"
|
|
816
|
+
return surface, missing_inputs
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
def build_governance_surface(
|
|
820
|
+
root: Path,
|
|
821
|
+
*,
|
|
822
|
+
bootstrap_mode: bool = False,
|
|
823
|
+
scenario_override: str | None = None,
|
|
824
|
+
) -> dict[str, Any]:
|
|
825
|
+
loom_state = detect_loom_state(root)
|
|
826
|
+
repository_mode = detect_repository_mode(root, loom_state, scenario_override=scenario_override)
|
|
827
|
+
planning_mode = bootstrap_mode and repository_mode == "new" and loom_state != "active"
|
|
828
|
+
carrier_summary = detect_carrier_summary(root, repository_mode=repository_mode, planning_mode=planning_mode)
|
|
829
|
+
github_control_plane, github_missing = detect_github_control_plane(root)
|
|
830
|
+
execution_entry = detect_execution_entry(root, loom_state, bootstrap_mode=bootstrap_mode)
|
|
831
|
+
validation_entry = detect_validation_entry(loom_state, bootstrap_mode=bootstrap_mode)
|
|
832
|
+
review_merge_surface = detect_review_merge_surface(root, loom_state, bootstrap_mode=bootstrap_mode)
|
|
833
|
+
repo_interface, repo_interface_missing = detect_repo_interface(root)
|
|
834
|
+
repo_interop, repo_interop_missing = detect_repo_interop(root)
|
|
835
|
+
|
|
836
|
+
missing_inputs: list[str] = []
|
|
837
|
+
if bootstrap_mode and repository_mode == "new":
|
|
838
|
+
missing_inputs.extend(github_missing)
|
|
839
|
+
summary = "repository is treated as new; Loom can plan the first governance carriers and bootstrap entrypoints without adding a second truth source."
|
|
840
|
+
else:
|
|
841
|
+
present_carriers = [key for key, value in carrier_summary.items() if value["status"] == "present"]
|
|
842
|
+
if not present_carriers:
|
|
843
|
+
missing_inputs.append("no stable Loom carriers are readable yet")
|
|
844
|
+
missing_inputs.extend(github_missing)
|
|
845
|
+
if repo_interface["availability"] == "incomplete":
|
|
846
|
+
missing_inputs.extend(repo_interface_missing)
|
|
847
|
+
if repo_interop["availability"] == "incomplete":
|
|
848
|
+
missing_inputs.extend(repo_interop_missing)
|
|
849
|
+
control_plane_ready = github_control_plane["default_branch"] != "unknown"
|
|
850
|
+
carrier_ready = bool(present_carriers)
|
|
851
|
+
summary = (
|
|
852
|
+
"resume chain is readable and the current governance carriers can support continued execution."
|
|
853
|
+
if carrier_ready and control_plane_ready
|
|
854
|
+
else "resume chain is only partially supported because governance carriers or GitHub control-plane signals are incomplete."
|
|
855
|
+
)
|
|
856
|
+
|
|
857
|
+
return {
|
|
858
|
+
"repository_mode": repository_mode,
|
|
859
|
+
"loom_state": loom_state,
|
|
860
|
+
"carrier_summary": carrier_summary,
|
|
861
|
+
"execution_entry": execution_entry,
|
|
862
|
+
"validation_entry": validation_entry,
|
|
863
|
+
"review_merge_surface": review_merge_surface,
|
|
864
|
+
"github_control_plane": github_control_plane,
|
|
865
|
+
"repo_interface": repo_interface,
|
|
866
|
+
"repo_interop": repo_interop,
|
|
867
|
+
"summary": summary,
|
|
868
|
+
"missing_inputs": list(dict.fromkeys(missing_inputs)),
|
|
869
|
+
}
|