@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
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# @mc-and-his-agents/loom-installer
|
|
2
|
+
|
|
3
|
+
Loom 的 npm / npx 安装入口。
|
|
4
|
+
|
|
5
|
+
它负责两件事:
|
|
6
|
+
|
|
7
|
+
- 把 Loom 作为完整 plugin 接到 Codex 或 Claude
|
|
8
|
+
- 把某个单独 Loom skill 接到对应宿主
|
|
9
|
+
|
|
10
|
+
它不替代 Loom 当前的 Python runtime;真正的执行面仍然是仓库里的 Python 脚本与已发布的 skill / plugin 产物。
|
|
11
|
+
|
|
12
|
+
## 命令面
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx @mc-and-his-agents/loom-installer add plugin
|
|
16
|
+
npx @mc-and-his-agents/loom-installer add skill loom-init
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
也可以先安装再执行:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -D @mc-and-his-agents/loom-installer
|
|
23
|
+
npx loom-installer add plugin
|
|
24
|
+
npx loom-installer add skill loom-init
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
可选参数:
|
|
28
|
+
|
|
29
|
+
- `--host codex|claude|auto`
|
|
30
|
+
- `--target <repo-root>`
|
|
31
|
+
- `--force`
|
|
32
|
+
- `--json`
|
|
33
|
+
|
|
34
|
+
## 运行时要求
|
|
35
|
+
|
|
36
|
+
- Node `>=20`
|
|
37
|
+
- Python `>=3.10`,推荐 `3.11+`
|
|
38
|
+
|
|
39
|
+
## 发布说明
|
|
40
|
+
|
|
41
|
+
本包支持 `npm publish`,但发布只在 `main` 上进行。
|
|
42
|
+
|
|
43
|
+
发布模型:
|
|
44
|
+
|
|
45
|
+
- PR 只做门禁,不直接发布 npm
|
|
46
|
+
- `main` 是唯一发布真相源
|
|
47
|
+
- publish 成功后再创建同版本 git tag
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { InstallerError, copyTree, dirExists, ensureDirectory, fileExists, readJson, replaceTree, runCommand, writeJson } from './utils.js';
|
|
4
|
+
function claudeEnv(env) {
|
|
5
|
+
return {
|
|
6
|
+
...process.env,
|
|
7
|
+
CLAUDE_CONFIG_DIR: env.claudeConfigDir,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function claudeMarketplaceRoot(targetRoot) {
|
|
11
|
+
return join(targetRoot, '.claude', 'marketplaces', 'loom-local');
|
|
12
|
+
}
|
|
13
|
+
function claudeMarketplaceManifest() {
|
|
14
|
+
return {
|
|
15
|
+
$schema: 'https://anthropic.com/claude-code/marketplace.schema.json',
|
|
16
|
+
name: 'loom-local',
|
|
17
|
+
description: 'Repo-local Loom marketplace for plugin installation.',
|
|
18
|
+
owner: {
|
|
19
|
+
name: 'MC and his Agents',
|
|
20
|
+
email: 'opensource@mc-and-his-agents.dev',
|
|
21
|
+
},
|
|
22
|
+
plugins: [
|
|
23
|
+
{
|
|
24
|
+
name: 'loom',
|
|
25
|
+
description: 'Loom repo-local plugin entry',
|
|
26
|
+
source: './plugins/loom',
|
|
27
|
+
category: 'productivity',
|
|
28
|
+
homepage: 'https://github.com/MC-and-his-Agents/Loom',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function runClaude(env, args) {
|
|
34
|
+
return runCommand(env.claudeBin, args, claudeEnv(env));
|
|
35
|
+
}
|
|
36
|
+
function synthesizeClaudePluginManifest(pluginTarget) {
|
|
37
|
+
const codexManifestPath = join(pluginTarget, '.codex-plugin', 'plugin.json');
|
|
38
|
+
if (!fileExists(codexManifestPath)) {
|
|
39
|
+
throw new InstallerError(`Claude plugin install is missing source plugin manifest: ${codexManifestPath}`);
|
|
40
|
+
}
|
|
41
|
+
const codexManifest = readJson(codexManifestPath);
|
|
42
|
+
const claudeManifestPath = join(pluginTarget, '.claude-plugin', 'plugin.json');
|
|
43
|
+
writeJson(claudeManifestPath, {
|
|
44
|
+
name: codexManifest.name,
|
|
45
|
+
description: codexManifest.description ?? 'Loom repo-local plugin entry',
|
|
46
|
+
version: codexManifest.version ?? '0.0.0',
|
|
47
|
+
author: codexManifest.author ?? {
|
|
48
|
+
name: 'MC and his Agents',
|
|
49
|
+
email: 'opensource@mc-and-his-agents.dev',
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
return claudeManifestPath;
|
|
53
|
+
}
|
|
54
|
+
function verifyClaudePluginInstalled(env) {
|
|
55
|
+
const result = runClaude(env, ['plugin', 'list', '--json']);
|
|
56
|
+
if (result.status !== 0) {
|
|
57
|
+
throw new InstallerError(`claude plugin list failed: ${result.stderr || result.stdout}`.trim());
|
|
58
|
+
}
|
|
59
|
+
let payload;
|
|
60
|
+
try {
|
|
61
|
+
payload = JSON.parse(result.stdout || '[]');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new InstallerError('claude plugin list --json returned invalid JSON');
|
|
65
|
+
}
|
|
66
|
+
if (!Array.isArray(payload)) {
|
|
67
|
+
throw new InstallerError('claude plugin list --json must return an array');
|
|
68
|
+
}
|
|
69
|
+
const found = payload.some((entry) => {
|
|
70
|
+
if (typeof entry === 'string') {
|
|
71
|
+
return entry === 'loom';
|
|
72
|
+
}
|
|
73
|
+
if (typeof entry !== 'object' || entry === null) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return entry.name === 'loom';
|
|
77
|
+
});
|
|
78
|
+
if (!found) {
|
|
79
|
+
throw new InstallerError('claude plugin verify failed: loom is not listed as installed');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function installClaudePlugin(env, targetRoot, packageRoot, manifest, force) {
|
|
83
|
+
const marketplaceRoot = claudeMarketplaceRoot(targetRoot);
|
|
84
|
+
const marketplaceManifestPath = join(marketplaceRoot, '.claude-plugin', 'marketplace.json');
|
|
85
|
+
const pluginTarget = join(marketplaceRoot, 'plugins', 'loom');
|
|
86
|
+
const pluginSource = join(packageRoot, 'payload', manifest.plugin.relative_path);
|
|
87
|
+
ensureDirectory(join(marketplaceRoot, '.claude-plugin'));
|
|
88
|
+
ensureDirectory(join(marketplaceRoot, 'plugins'));
|
|
89
|
+
if (dirExists(pluginTarget)) {
|
|
90
|
+
if (!force && !fileExists(join(pluginTarget, '.codex-plugin', 'plugin.json'))) {
|
|
91
|
+
throw new InstallerError(`existing Claude marketplace plugin is not Loom-managed: ${pluginTarget}`, `refusing to take over non-Loom Claude marketplace plugin: ${pluginTarget}`);
|
|
92
|
+
}
|
|
93
|
+
replaceTree(pluginSource, pluginTarget);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
copyTree(pluginSource, pluginTarget, true);
|
|
97
|
+
}
|
|
98
|
+
const claudePluginManifestPath = synthesizeClaudePluginManifest(pluginTarget);
|
|
99
|
+
writeJson(marketplaceManifestPath, claudeMarketplaceManifest());
|
|
100
|
+
const addResult = runClaude(env, ['plugin', 'marketplace', 'add', marketplaceRoot]);
|
|
101
|
+
const addOutput = `${addResult.stdout}\n${addResult.stderr}`;
|
|
102
|
+
if (addResult.status !== 0 && !/already exists|already added|already configured/i.test(addOutput)) {
|
|
103
|
+
throw new InstallerError(`claude plugin marketplace add failed: ${addOutput.trim()}`);
|
|
104
|
+
}
|
|
105
|
+
const installResult = runClaude(env, ['plugin', 'install', 'loom@loom-local']);
|
|
106
|
+
const installOutput = `${installResult.stdout}\n${installResult.stderr}`;
|
|
107
|
+
if (installResult.status !== 0 && !/already installed/i.test(installOutput)) {
|
|
108
|
+
throw new InstallerError(`claude plugin install failed: ${installOutput.trim()}`);
|
|
109
|
+
}
|
|
110
|
+
verifyClaudePluginInstalled(env);
|
|
111
|
+
return {
|
|
112
|
+
mode: 'plugin',
|
|
113
|
+
host: 'claude',
|
|
114
|
+
status: /already installed/i.test(installOutput) ? 'already-installed' : 'installed',
|
|
115
|
+
installed_paths: [marketplaceRoot, marketplaceManifestPath, pluginTarget, claudePluginManifestPath],
|
|
116
|
+
verification: [
|
|
117
|
+
`verified marketplace source at ${marketplaceRoot}`,
|
|
118
|
+
`verified Claude plugin manifest at ${claudePluginManifestPath}`,
|
|
119
|
+
'verified `claude plugin list --json` contains loom',
|
|
120
|
+
],
|
|
121
|
+
warnings: ['Claude plugin install goes through the official CLI and does not replace the Python runtime.'],
|
|
122
|
+
fail_closed_reason: null,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function installClaudeSkill(targetRoot, packageRoot, skill, force) {
|
|
126
|
+
const sourceDir = join(packageRoot, 'payload', skill.relative_path);
|
|
127
|
+
const targetDir = join(targetRoot, '.claude', 'skills', skill.id);
|
|
128
|
+
const skillMarkdownPath = join(targetDir, 'SKILL.md');
|
|
129
|
+
ensureDirectory(join(targetRoot, '.claude', 'skills'));
|
|
130
|
+
if (dirExists(targetDir)) {
|
|
131
|
+
if (!force && !fileExists(skillMarkdownPath)) {
|
|
132
|
+
throw new InstallerError(`existing Claude skill directory is not Loom-managed: ${targetDir}`, `refusing to take over non-Loom Claude skill directory: ${targetDir}`);
|
|
133
|
+
}
|
|
134
|
+
replaceTree(sourceDir, targetDir);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
copyTree(sourceDir, targetDir, true);
|
|
138
|
+
}
|
|
139
|
+
if (!fileExists(skillMarkdownPath)) {
|
|
140
|
+
throw new InstallerError(`Claude skill install is missing SKILL.md: ${skillMarkdownPath}`);
|
|
141
|
+
}
|
|
142
|
+
if (!readFileSync(skillMarkdownPath, 'utf8').startsWith('---\n')) {
|
|
143
|
+
throw new InstallerError(`Claude skill install must keep YAML frontmatter in ${skillMarkdownPath}`);
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
mode: 'skill',
|
|
147
|
+
host: 'claude',
|
|
148
|
+
status: 'installed',
|
|
149
|
+
installed_paths: [targetDir],
|
|
150
|
+
verification: [
|
|
151
|
+
`verified skill payload at ${targetDir}`,
|
|
152
|
+
`verified discoverable SKILL.md at ${skillMarkdownPath}`,
|
|
153
|
+
],
|
|
154
|
+
warnings: ['Claude single-skill install relies on project-level `.claude/skills` discovery and does not expose the full Loom plugin surface.'],
|
|
155
|
+
fail_closed_reason: null,
|
|
156
|
+
};
|
|
157
|
+
}
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { formatResult, parseCli, runInstaller } from './index.js';
|
|
3
|
+
import { InstallerError } from './utils.js';
|
|
4
|
+
function errorResult(message) {
|
|
5
|
+
return {
|
|
6
|
+
mode: 'plugin',
|
|
7
|
+
host: 'codex',
|
|
8
|
+
status: 'installed',
|
|
9
|
+
installed_paths: [],
|
|
10
|
+
verification: [],
|
|
11
|
+
warnings: [],
|
|
12
|
+
fail_closed_reason: message,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const parsed = parseCli(process.argv.slice(2));
|
|
17
|
+
const result = runInstaller(parsed);
|
|
18
|
+
if (parsed.options.json) {
|
|
19
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
process.stdout.write(`${formatResult(result)}\n`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const message = error instanceof InstallerError ? error.failClosedReason : error instanceof Error ? error.message : String(error);
|
|
27
|
+
const parsedJson = process.argv.includes('--json');
|
|
28
|
+
if (parsedJson) {
|
|
29
|
+
process.stdout.write(`${JSON.stringify(errorResult(message), null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
process.stderr.write(`loom-installer: ${message}\n`);
|
|
33
|
+
}
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { InstallerError, copyTree, dirExists, ensureDirectory, fileExists, readJson, replaceTree, writeJson } from './utils.js';
|
|
4
|
+
function codexMarketplacePath(targetRoot) {
|
|
5
|
+
return join(targetRoot, '.agents', 'plugins', 'marketplace.json');
|
|
6
|
+
}
|
|
7
|
+
function parseMarketplace(path) {
|
|
8
|
+
if (!fileExists(path)) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return readJson(path);
|
|
12
|
+
}
|
|
13
|
+
function defaultMarketplace() {
|
|
14
|
+
return {
|
|
15
|
+
name: 'loom-local',
|
|
16
|
+
interface: {
|
|
17
|
+
displayName: 'Loom Local Plugins',
|
|
18
|
+
},
|
|
19
|
+
plugins: [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function loomMarketplaceEntry() {
|
|
23
|
+
return {
|
|
24
|
+
name: 'loom',
|
|
25
|
+
source: {
|
|
26
|
+
source: 'local',
|
|
27
|
+
path: './plugins/loom',
|
|
28
|
+
},
|
|
29
|
+
policy: {
|
|
30
|
+
installation: 'AVAILABLE',
|
|
31
|
+
authentication: 'ON_INSTALL',
|
|
32
|
+
},
|
|
33
|
+
category: 'Productivity',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function ensureMarketplace(targetRoot, force) {
|
|
37
|
+
const marketplacePath = codexMarketplacePath(targetRoot);
|
|
38
|
+
const marketplace = parseMarketplace(marketplacePath) ?? defaultMarketplace();
|
|
39
|
+
if (!Array.isArray(marketplace.plugins)) {
|
|
40
|
+
throw new InstallerError('Codex marketplace.json must contain a plugins array');
|
|
41
|
+
}
|
|
42
|
+
const expectedPath = './plugins/loom';
|
|
43
|
+
const existing = marketplace.plugins.find((entry) => typeof entry === 'object' && entry !== null && entry.name === 'loom');
|
|
44
|
+
if (existing && existing.source?.path && existing.source.path !== expectedPath) {
|
|
45
|
+
throw new InstallerError(`Codex marketplace already declares loom from a different path: ${existing.source.path}`, `refusing to take over non-Loom marketplace entry for loom: ${existing.source.path}`);
|
|
46
|
+
}
|
|
47
|
+
if (!existing) {
|
|
48
|
+
marketplace.plugins.push(loomMarketplaceEntry());
|
|
49
|
+
}
|
|
50
|
+
else if (force) {
|
|
51
|
+
const index = marketplace.plugins.indexOf(existing);
|
|
52
|
+
marketplace.plugins[index] = loomMarketplaceEntry();
|
|
53
|
+
}
|
|
54
|
+
writeJson(marketplacePath, marketplace);
|
|
55
|
+
return [marketplacePath];
|
|
56
|
+
}
|
|
57
|
+
function parseSkillBlocks(content) {
|
|
58
|
+
const lines = content.split('\n');
|
|
59
|
+
const blocks = [];
|
|
60
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
61
|
+
if (lines[index].trim() !== '[[skills.config]]') {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const blockLines = [lines[index]];
|
|
65
|
+
index += 1;
|
|
66
|
+
while (index < lines.length && !lines[index].trim().startsWith('[[')) {
|
|
67
|
+
blockLines.push(lines[index]);
|
|
68
|
+
index += 1;
|
|
69
|
+
}
|
|
70
|
+
index -= 1;
|
|
71
|
+
const raw = blockLines.join('\n');
|
|
72
|
+
const pathMatch = raw.match(/^path\s*=\s*"([^"]+)"/m);
|
|
73
|
+
const enabledMatch = raw.match(/^enabled\s*=\s*(true|false)/m);
|
|
74
|
+
blocks.push({
|
|
75
|
+
raw,
|
|
76
|
+
path: pathMatch?.[1] ?? null,
|
|
77
|
+
enabled: enabledMatch ? enabledMatch[1] === 'true' : null,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return blocks;
|
|
81
|
+
}
|
|
82
|
+
function upsertSkillBlock(configPath, desiredSkillPath, skillId, force) {
|
|
83
|
+
const content = fileExists(configPath) ? readFileSync(configPath, 'utf8') : '';
|
|
84
|
+
const blocks = parseSkillBlocks(content);
|
|
85
|
+
const skillDir = skillId.startsWith('loom-') ? skillId : `loom-${skillId}`;
|
|
86
|
+
const conflicting = blocks.filter((block) => {
|
|
87
|
+
if (!block.path) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return block.path.endsWith(`/${skillDir}/SKILL.md`) && block.path !== desiredSkillPath;
|
|
91
|
+
});
|
|
92
|
+
if (conflicting.length > 0 && !force) {
|
|
93
|
+
throw new InstallerError(`Codex already has ${skillId} from a different path`, `Codex already has ${skillId} from a different path`);
|
|
94
|
+
}
|
|
95
|
+
let nextContent = content;
|
|
96
|
+
for (const block of conflicting) {
|
|
97
|
+
nextContent = nextContent.replace(`${block.raw}\n`, '').replace(block.raw, '');
|
|
98
|
+
}
|
|
99
|
+
const existingBlock = parseSkillBlocks(nextContent).find((block) => block.path === desiredSkillPath);
|
|
100
|
+
if (existingBlock) {
|
|
101
|
+
const enabledBlock = existingBlock.raw.match(/^enabled\s*=\s*false/m)
|
|
102
|
+
? existingBlock.raw.replace(/^enabled\s*=\s*false/m, 'enabled = true')
|
|
103
|
+
: existingBlock.enabled === null
|
|
104
|
+
? `${existingBlock.raw}\nenabled = true`
|
|
105
|
+
: existingBlock.raw;
|
|
106
|
+
nextContent = nextContent.replace(existingBlock.raw, enabledBlock);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
if (nextContent && !nextContent.endsWith('\n')) {
|
|
110
|
+
nextContent += '\n';
|
|
111
|
+
}
|
|
112
|
+
nextContent += `\n[[skills.config]]\npath = ${JSON.stringify(desiredSkillPath)}\nenabled = true\n`;
|
|
113
|
+
}
|
|
114
|
+
ensureDirectory(join(configPath, '..'));
|
|
115
|
+
writeFileSync(configPath, nextContent.replace(/^\n+/, ''), 'utf8');
|
|
116
|
+
}
|
|
117
|
+
function verifySkillEnabled(configPath, desiredSkillPath) {
|
|
118
|
+
const content = fileExists(configPath) ? readFileSync(configPath, 'utf8') : '';
|
|
119
|
+
return parseSkillBlocks(content).some((block) => block.path === desiredSkillPath && block.enabled !== false);
|
|
120
|
+
}
|
|
121
|
+
export function installCodexPlugin(targetRoot, packageRoot, manifest, force) {
|
|
122
|
+
const pluginSource = join(packageRoot, 'payload', manifest.plugin.relative_path);
|
|
123
|
+
const pluginTarget = join(targetRoot, 'plugins', 'loom');
|
|
124
|
+
const pluginManifestPath = join(pluginTarget, '.codex-plugin', 'plugin.json');
|
|
125
|
+
const installedPaths = [];
|
|
126
|
+
const warnings = [];
|
|
127
|
+
if (dirExists(pluginTarget) && !force) {
|
|
128
|
+
if (!fileExists(pluginManifestPath)) {
|
|
129
|
+
throw new InstallerError(`target already contains plugins/loom but it is not a Loom plugin: ${pluginTarget}`, `refusing to take over non-Loom plugin directory: ${pluginTarget}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (dirExists(pluginTarget)) {
|
|
133
|
+
replaceTree(pluginSource, pluginTarget);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
copyTree(pluginSource, pluginTarget, true);
|
|
137
|
+
}
|
|
138
|
+
installedPaths.push(pluginTarget);
|
|
139
|
+
installedPaths.push(...ensureMarketplace(targetRoot, force));
|
|
140
|
+
const pluginManifest = readJson(pluginManifestPath);
|
|
141
|
+
if (pluginManifest.name !== 'loom') {
|
|
142
|
+
throw new InstallerError('Codex plugin installation drifted: plugin name must stay `loom`');
|
|
143
|
+
}
|
|
144
|
+
warnings.push('Codex plugin install remains repo-local; it does not replace the Python runtime.');
|
|
145
|
+
return {
|
|
146
|
+
mode: 'plugin',
|
|
147
|
+
host: 'codex',
|
|
148
|
+
status: 'installed',
|
|
149
|
+
installed_paths: installedPaths,
|
|
150
|
+
verification: [
|
|
151
|
+
`verified plugin payload at ${pluginTarget}`,
|
|
152
|
+
`verified marketplace entry at ${codexMarketplacePath(targetRoot)}`,
|
|
153
|
+
],
|
|
154
|
+
warnings,
|
|
155
|
+
fail_closed_reason: null,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function installCodexSkill(env, packageRoot, skill, force) {
|
|
159
|
+
const skillDirName = skill.id.startsWith('loom-') ? skill.id : `loom-${skill.id}`;
|
|
160
|
+
const sourceDir = join(packageRoot, 'payload', skill.relative_path);
|
|
161
|
+
const targetDir = join(env.codexHome, 'skills', skillDirName);
|
|
162
|
+
const skillMarkdownPath = join(targetDir, 'SKILL.md');
|
|
163
|
+
const configPath = join(env.codexHome, 'config.toml');
|
|
164
|
+
ensureDirectory(join(env.codexHome, 'skills'));
|
|
165
|
+
if (dirExists(targetDir)) {
|
|
166
|
+
if (!force && !fileExists(skillMarkdownPath)) {
|
|
167
|
+
throw new InstallerError(`existing Codex skill directory is not Loom-managed: ${targetDir}`, `refusing to take over non-Loom Codex skill directory: ${targetDir}`);
|
|
168
|
+
}
|
|
169
|
+
replaceTree(sourceDir, targetDir);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
copyTree(sourceDir, targetDir, true);
|
|
173
|
+
}
|
|
174
|
+
ensureDirectory(env.codexHome);
|
|
175
|
+
upsertSkillBlock(configPath, skillMarkdownPath, skill.id, force);
|
|
176
|
+
if (!verifySkillEnabled(configPath, skillMarkdownPath)) {
|
|
177
|
+
throw new InstallerError(`Codex config did not enable ${skill.id}`);
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
mode: 'skill',
|
|
181
|
+
host: 'codex',
|
|
182
|
+
status: 'installed',
|
|
183
|
+
installed_paths: [targetDir, configPath],
|
|
184
|
+
verification: [
|
|
185
|
+
`verified skill payload at ${targetDir}`,
|
|
186
|
+
`verified skills.config entry for ${skill.id}`,
|
|
187
|
+
],
|
|
188
|
+
warnings: ['Codex single-skill install exposes only the named skill, not the full Loom plugin surface.'],
|
|
189
|
+
fail_closed_reason: null,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { dirname, join, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { InstallerError, assert, dirExists, ensureTargetWritable, runCommand } from './utils.js';
|
|
4
|
+
import { loadPayloadManifest, resolveSkillRecord, verifyPayload } from './payload.js';
|
|
5
|
+
import { installCodexPlugin, installCodexSkill } from './codex.js';
|
|
6
|
+
import { installClaudePlugin, installClaudeSkill } from './claude.js';
|
|
7
|
+
const DEFAULT_OPTIONS = {
|
|
8
|
+
host: 'auto',
|
|
9
|
+
target: '.',
|
|
10
|
+
force: false,
|
|
11
|
+
json: false,
|
|
12
|
+
};
|
|
13
|
+
export function packageRootFromUrl(moduleUrl) {
|
|
14
|
+
return resolve(dirname(fileURLToPath(moduleUrl)), '..', '..');
|
|
15
|
+
}
|
|
16
|
+
export function resolveEnvironment(env = process.env) {
|
|
17
|
+
const homeDir = env.HOME ?? '';
|
|
18
|
+
assert(homeDir, 'HOME is required');
|
|
19
|
+
return {
|
|
20
|
+
homeDir,
|
|
21
|
+
codexHome: env.CODEX_HOME ?? join(homeDir, '.codex'),
|
|
22
|
+
claudeConfigDir: env.CLAUDE_CONFIG_DIR ?? join(homeDir, '.claude'),
|
|
23
|
+
pythonBin: env.LOOM_INSTALLER_PYTHON_BIN ?? 'python3',
|
|
24
|
+
claudeBin: env.LOOM_INSTALLER_CLAUDE_BIN ?? 'claude',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function detectHosts(env) {
|
|
28
|
+
const hosts = [];
|
|
29
|
+
if (dirExists(env.codexHome)) {
|
|
30
|
+
hosts.push('codex');
|
|
31
|
+
}
|
|
32
|
+
if (dirExists(env.claudeConfigDir)) {
|
|
33
|
+
hosts.push('claude');
|
|
34
|
+
}
|
|
35
|
+
return hosts;
|
|
36
|
+
}
|
|
37
|
+
export function selectHost(requested, env) {
|
|
38
|
+
if (requested !== 'auto') {
|
|
39
|
+
return requested;
|
|
40
|
+
}
|
|
41
|
+
const detected = detectHosts(env);
|
|
42
|
+
if (detected.length === 1) {
|
|
43
|
+
return detected[0];
|
|
44
|
+
}
|
|
45
|
+
if (detected.length === 0) {
|
|
46
|
+
throw new InstallerError('auto host detection failed: no supported host was detected');
|
|
47
|
+
}
|
|
48
|
+
throw new InstallerError('auto host detection found both Codex and Claude; pass --host explicitly');
|
|
49
|
+
}
|
|
50
|
+
export function parseCli(argv) {
|
|
51
|
+
const command = argv[0];
|
|
52
|
+
const subject = argv[1];
|
|
53
|
+
const third = argv[2];
|
|
54
|
+
const rest = subject === 'plugin' ? argv.slice(2) : argv.slice(3);
|
|
55
|
+
if (command !== 'add') {
|
|
56
|
+
throw new InstallerError('usage: loom-installer add plugin|skill <skill-id> [--host ...] [--target ...] [--force] [--json]');
|
|
57
|
+
}
|
|
58
|
+
const options = { ...DEFAULT_OPTIONS };
|
|
59
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
60
|
+
const token = rest[index];
|
|
61
|
+
if (token === '--host') {
|
|
62
|
+
const next = rest[index + 1];
|
|
63
|
+
if (next !== 'auto' && next !== 'codex' && next !== 'claude') {
|
|
64
|
+
throw new InstallerError(`unsupported --host value: ${String(next)}`);
|
|
65
|
+
}
|
|
66
|
+
options.host = next;
|
|
67
|
+
index += 1;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (token === '--target') {
|
|
71
|
+
const next = rest[index + 1];
|
|
72
|
+
if (!next) {
|
|
73
|
+
throw new InstallerError('--target requires a value');
|
|
74
|
+
}
|
|
75
|
+
options.target = next;
|
|
76
|
+
index += 1;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (token === '--force') {
|
|
80
|
+
options.force = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (token === '--json') {
|
|
84
|
+
options.json = true;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
throw new InstallerError(`unknown option: ${token}`);
|
|
88
|
+
}
|
|
89
|
+
if (subject === 'plugin') {
|
|
90
|
+
return {
|
|
91
|
+
mode: 'plugin',
|
|
92
|
+
options,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (subject === 'skill') {
|
|
96
|
+
if (!third) {
|
|
97
|
+
throw new InstallerError('usage: loom-installer add skill <skill-id>');
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
mode: 'skill',
|
|
101
|
+
skillId: third,
|
|
102
|
+
options,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
throw new InstallerError(`unknown add target: ${String(subject)}`);
|
|
106
|
+
}
|
|
107
|
+
export function checkPython(env) {
|
|
108
|
+
const result = runCommand(env.pythonBin, ['-c', 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]}")'], process.env);
|
|
109
|
+
if (result.status !== 0) {
|
|
110
|
+
throw new InstallerError(`python preflight failed: ${result.stderr || result.stdout}`.trim());
|
|
111
|
+
}
|
|
112
|
+
const match = result.stdout.trim().match(/^(\d+)\.(\d+)\.(\d+)$/);
|
|
113
|
+
if (!match) {
|
|
114
|
+
throw new InstallerError(`python preflight returned an invalid version: ${result.stdout.trim()}`);
|
|
115
|
+
}
|
|
116
|
+
const major = Number(match[1]);
|
|
117
|
+
const minor = Number(match[2]);
|
|
118
|
+
if (major < 3 || (major === 3 && minor < 10)) {
|
|
119
|
+
throw new InstallerError(`python ${result.stdout.trim()} is unsupported; require >= 3.10`);
|
|
120
|
+
}
|
|
121
|
+
const warnings = [];
|
|
122
|
+
if (major === 3 && minor < 11) {
|
|
123
|
+
warnings.push(`python ${result.stdout.trim()} is supported, but 3.11+ is recommended`);
|
|
124
|
+
}
|
|
125
|
+
return warnings;
|
|
126
|
+
}
|
|
127
|
+
export function ensureClaudeCliWhenNeeded(host, mode, env) {
|
|
128
|
+
if (host !== 'claude' || mode !== 'plugin') {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const result = runCommand(env.claudeBin, ['--version'], process.env);
|
|
132
|
+
if (result.status !== 0) {
|
|
133
|
+
throw new InstallerError(`claude CLI preflight failed: ${result.stderr || result.stdout}`.trim());
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export function formatResult(result) {
|
|
137
|
+
return [
|
|
138
|
+
`${result.host} ${result.mode}: ${result.status}`,
|
|
139
|
+
...result.verification.map((line) => `- ${line}`),
|
|
140
|
+
...result.warnings.map((line) => `! ${line}`),
|
|
141
|
+
].join('\n');
|
|
142
|
+
}
|
|
143
|
+
export function runInstaller(parsed, envSource = process.env, packageRoot) {
|
|
144
|
+
const resolvedEnv = resolveEnvironment(envSource);
|
|
145
|
+
const host = selectHost(parsed.options.host, resolvedEnv);
|
|
146
|
+
const resolvedPackageRoot = packageRoot ?? packageRootFromUrl(import.meta.url);
|
|
147
|
+
const targetRoot = resolve(parsed.options.target);
|
|
148
|
+
ensureTargetWritable(targetRoot);
|
|
149
|
+
const manifest = loadPayloadManifest(resolvedPackageRoot);
|
|
150
|
+
verifyPayload(resolvedPackageRoot, manifest);
|
|
151
|
+
const warnings = checkPython(resolvedEnv);
|
|
152
|
+
ensureClaudeCliWhenNeeded(host, parsed.mode, resolvedEnv);
|
|
153
|
+
const result = installForHost({
|
|
154
|
+
host,
|
|
155
|
+
parsed,
|
|
156
|
+
env: resolvedEnv,
|
|
157
|
+
packageRoot: resolvedPackageRoot,
|
|
158
|
+
targetRoot,
|
|
159
|
+
manifest,
|
|
160
|
+
});
|
|
161
|
+
result.warnings.unshift(...warnings);
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
function installForHost(input) {
|
|
165
|
+
const { host, parsed, env, packageRoot, targetRoot, manifest } = input;
|
|
166
|
+
if (parsed.mode === 'plugin') {
|
|
167
|
+
return host === 'codex'
|
|
168
|
+
? installCodexPlugin(targetRoot, packageRoot, manifest, parsed.options.force)
|
|
169
|
+
: installClaudePlugin(env, targetRoot, packageRoot, manifest, parsed.options.force);
|
|
170
|
+
}
|
|
171
|
+
const skill = resolveSkillRecord(manifest, parsed.skillId ?? '');
|
|
172
|
+
return host === 'codex'
|
|
173
|
+
? installCodexSkill(env, packageRoot, skill, parsed.options.force)
|
|
174
|
+
: installClaudeSkill(targetRoot, packageRoot, skill, parsed.options.force);
|
|
175
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { InstallerError, dirExists, fileExists, readJson, sha256 } from './utils.js';
|
|
3
|
+
export function loadPayloadManifest(packageRoot) {
|
|
4
|
+
const manifestPath = join(packageRoot, 'payload', 'manifest.json');
|
|
5
|
+
if (!fileExists(manifestPath)) {
|
|
6
|
+
throw new InstallerError(`payload manifest is missing: ${manifestPath}`);
|
|
7
|
+
}
|
|
8
|
+
return readJson(manifestPath);
|
|
9
|
+
}
|
|
10
|
+
export function verifyPayload(packageRoot, manifest) {
|
|
11
|
+
if (manifest.schema_version !== 'loom-installer-payload/v1') {
|
|
12
|
+
throw new InstallerError(`unsupported payload schema: ${manifest.schema_version}`);
|
|
13
|
+
}
|
|
14
|
+
const payloadRoot = join(packageRoot, 'payload');
|
|
15
|
+
const pluginPath = join(payloadRoot, manifest.plugin.relative_path);
|
|
16
|
+
if (!dirExists(pluginPath)) {
|
|
17
|
+
throw new InstallerError(`plugin payload is missing: ${pluginPath}`);
|
|
18
|
+
}
|
|
19
|
+
for (const skill of manifest.skills) {
|
|
20
|
+
const skillPath = join(payloadRoot, skill.relative_path);
|
|
21
|
+
if (!dirExists(skillPath)) {
|
|
22
|
+
throw new InstallerError(`skill payload is missing: ${skillPath}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const file of manifest.files) {
|
|
26
|
+
const absolute = join(payloadRoot, file.path);
|
|
27
|
+
if (!fileExists(absolute)) {
|
|
28
|
+
throw new InstallerError(`payload file is missing: ${file.path}`);
|
|
29
|
+
}
|
|
30
|
+
const actualSha = sha256(absolute);
|
|
31
|
+
if (actualSha !== file.sha256) {
|
|
32
|
+
throw new InstallerError(`payload checksum drift detected for ${file.path}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function resolveSkillRecord(manifest, skillId) {
|
|
37
|
+
const skill = manifest.skills.find((candidate) => candidate.id === skillId);
|
|
38
|
+
if (!skill) {
|
|
39
|
+
throw new InstallerError(`unknown skill id: ${skillId}`, `unknown skill id: ${skillId}`);
|
|
40
|
+
}
|
|
41
|
+
return skill;
|
|
42
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|