project-tiny-context-harness 0.2.84 → 0.6.0
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 +163 -428
- package/assets/README.md +283 -455
- package/assets/README.zh-CN.md +199 -123
- package/assets/agents/AGENTS_CORE.md +54 -67
- package/assets/context_templates/context.toml +3 -0
- package/assets/context_templates/global.md +6 -6
- package/assets/github/harness.yml +2 -2
- package/assets/skills/context_development_engineer/SKILL.md +91 -107
- package/assets/skills/context_product_plan/SKILL.md +18 -28
- package/assets/skills/context_surface_contract/SKILL.md +35 -38
- package/assets/skills/context_uiux_design/SKILL.md +31 -30
- package/assets/skills/long-task-workflow/SKILL.md +76 -0
- package/assets/skills/long-task-workflow/agents/openai.yaml +4 -0
- package/assets/skills/long-task-workflow/references/authority-lifecycle.md +41 -0
- package/assets/skills/long-task-workflow/references/contract-authoring.md +62 -0
- package/assets/skills/long-task-workflow/references/evidence-design.md +45 -0
- package/assets/skills/normal-long-task/SKILL.md +12 -489
- package/assets/skills/source-plan-authoring/SKILL.md +379 -0
- package/assets/tools/validate_context.py +293 -127
- package/dist/cli.js +3 -1
- package/dist/commands/check-modularity.js +33 -10
- package/dist/commands/composite-campaign.d.ts +1 -0
- package/dist/commands/composite-campaign.js +8 -0
- package/dist/commands/composite-long-task.d.ts +1 -6
- package/dist/commands/composite-long-task.js +7 -157
- package/dist/commands/delivery-set.d.ts +1 -0
- package/dist/commands/delivery-set.js +8 -0
- package/dist/commands/disable.d.ts +1 -0
- package/dist/commands/disable.js +15 -0
- package/dist/commands/enable.d.ts +1 -0
- package/dist/commands/enable.js +14 -0
- package/dist/commands/export-context-args.js +13 -4
- package/dist/commands/export-context.js +18 -7
- package/dist/commands/index.js +42 -30
- package/dist/commands/init.js +12 -6
- package/dist/commands/long-task-authoring.d.ts +3 -0
- package/dist/commands/long-task-authoring.js +92 -0
- package/dist/commands/long-task-explain.d.ts +1 -0
- package/dist/commands/long-task-explain.js +52 -0
- package/dist/commands/long-task.d.ts +1 -0
- package/dist/commands/long-task.js +226 -0
- package/dist/commands/package-source.js +2 -2
- package/dist/commands/upgrade.js +10 -10
- package/dist/index.d.ts +11 -1
- package/dist/index.js +8 -0
- package/dist/lib/config.js +34 -8
- package/dist/lib/context-default-footprint.d.ts +16 -0
- package/dist/lib/context-default-footprint.js +107 -0
- package/dist/lib/context-export.js +105 -41
- package/dist/lib/context-graph-snapshot.d.ts +18 -0
- package/dist/lib/context-graph-snapshot.js +171 -0
- package/dist/lib/context-manifest-schema.d.ts +28 -0
- package/dist/lib/context-manifest-schema.js +150 -0
- package/dist/lib/context-manifest.js +28 -20
- package/dist/lib/context-templates.js +5 -5
- package/dist/lib/design-md.js +1 -1
- package/dist/lib/doctor.js +54 -1
- package/dist/lib/harness-root.js +25 -8
- package/dist/lib/init.js +6 -3
- package/dist/lib/legacy-managed-scan.js +23 -7
- package/dist/lib/legacy-sdlc-migration.js +21 -11
- package/dist/lib/long-task-acceptance-reference.d.ts +22 -0
- package/dist/lib/long-task-acceptance-reference.js +46 -0
- package/dist/lib/long-task-acceptance-shape.d.ts +5 -0
- package/dist/lib/long-task-acceptance-shape.js +131 -0
- package/dist/lib/long-task-activation-validation.d.ts +21 -0
- package/dist/lib/long-task-activation-validation.js +136 -0
- package/dist/lib/long-task-artifacts.d.ts +5 -0
- package/dist/lib/long-task-artifacts.js +34 -0
- package/dist/lib/long-task-assertions-v2.d.ts +22 -0
- package/dist/lib/long-task-assertions-v2.js +212 -0
- package/dist/lib/long-task-authoring-authority-preview.d.ts +5 -0
- package/dist/lib/long-task-authoring-authority-preview.js +85 -0
- package/dist/lib/long-task-authoring-preflight-diagnostics.d.ts +8 -0
- package/dist/lib/long-task-authoring-preflight-diagnostics.js +179 -0
- package/dist/lib/long-task-authoring-preflight-repair-order.d.ts +8 -0
- package/dist/lib/long-task-authoring-preflight-repair-order.js +95 -0
- package/dist/lib/long-task-authoring-preflight-types.d.ts +46 -0
- package/dist/lib/long-task-authoring-preflight-types.js +38 -0
- package/dist/lib/long-task-authoring-preflight.d.ts +3 -0
- package/dist/lib/long-task-authoring-preflight.js +44 -0
- package/dist/lib/long-task-authority-material-diff.d.ts +17 -0
- package/dist/lib/long-task-authority-material-diff.js +152 -0
- package/dist/lib/long-task-authority-materials.d.ts +7 -0
- package/dist/lib/long-task-authority-materials.js +83 -0
- package/dist/lib/long-task-authority-policy.d.ts +168 -0
- package/dist/lib/long-task-authority-policy.js +181 -0
- package/dist/lib/long-task-authority-revision-details.d.ts +19 -0
- package/dist/lib/long-task-authority-revision-details.js +192 -0
- package/dist/lib/long-task-authority-revision-enforcement.d.ts +3 -0
- package/dist/lib/long-task-authority-revision-enforcement.js +41 -0
- package/dist/lib/long-task-authority-revision-types.d.ts +50 -0
- package/dist/lib/long-task-authority-revision-types.js +1 -0
- package/dist/lib/long-task-authority-revision.d.ts +4 -0
- package/dist/lib/long-task-authority-revision.js +188 -0
- package/dist/lib/long-task-authority-transition-policy.d.ts +62 -0
- package/dist/lib/long-task-authority-transition-policy.js +62 -0
- package/dist/lib/long-task-authority-types.d.ts +96 -0
- package/dist/lib/long-task-authority-types.js +1 -0
- package/dist/lib/long-task-authority.d.ts +7 -0
- package/dist/lib/long-task-authority.js +142 -0
- package/dist/lib/long-task-boundary-check.d.ts +15 -0
- package/dist/lib/long-task-boundary-check.js +9 -0
- package/dist/lib/long-task-check-evidence-decoder.d.ts +3 -0
- package/dist/lib/long-task-check-evidence-decoder.js +74 -0
- package/dist/lib/long-task-check-execution-policy.d.ts +18 -0
- package/dist/lib/long-task-check-execution-policy.js +36 -0
- package/dist/lib/long-task-check-runner.d.ts +2 -0
- package/dist/lib/long-task-check-runner.js +181 -0
- package/dist/lib/long-task-check-shape.d.ts +2 -0
- package/dist/lib/long-task-check-shape.js +136 -0
- package/dist/lib/long-task-claim-definitions.d.ts +7 -0
- package/dist/lib/long-task-claim-definitions.js +78 -0
- package/dist/lib/long-task-claim-proof-policy.d.ts +4 -0
- package/dist/lib/long-task-claim-proof-policy.js +57 -0
- package/dist/lib/long-task-claims.d.ts +10 -0
- package/dist/lib/long-task-claims.js +187 -0
- package/dist/lib/long-task-context-authority-topology.d.ts +7 -0
- package/dist/lib/long-task-context-authority-topology.js +37 -0
- package/dist/lib/long-task-context-authority.d.ts +14 -0
- package/dist/lib/long-task-context-authority.js +66 -0
- package/dist/lib/long-task-contract-types.d.ts +203 -0
- package/dist/lib/long-task-contract-types.js +1 -0
- package/dist/lib/long-task-counterfactual-claim-policy.d.ts +10 -0
- package/dist/lib/long-task-counterfactual-claim-policy.js +57 -0
- package/dist/lib/long-task-counterfactual-sandbox.d.ts +6 -0
- package/dist/lib/long-task-counterfactual-sandbox.js +87 -0
- package/dist/lib/long-task-counterfactual-types.d.ts +24 -0
- package/dist/lib/long-task-counterfactual-types.js +1 -0
- package/dist/lib/long-task-delivery-compiler.d.ts +10 -0
- package/dist/lib/long-task-delivery-compiler.js +129 -0
- package/dist/lib/long-task-delivery-parser.d.ts +13 -0
- package/dist/lib/long-task-delivery-parser.js +90 -0
- package/dist/lib/long-task-delivery-preflight.d.ts +5 -0
- package/dist/lib/long-task-delivery-preflight.js +151 -0
- package/dist/lib/long-task-delivery-shape.d.ts +5 -0
- package/dist/lib/long-task-delivery-shape.js +5 -0
- package/dist/lib/long-task-delivery-types.d.ts +8 -0
- package/dist/lib/long-task-delivery-types.js +8 -0
- package/dist/lib/long-task-delivery-validation.d.ts +3 -0
- package/dist/lib/long-task-delivery-validation.js +175 -0
- package/dist/lib/long-task-evidence-adapter-policy.d.ts +4 -0
- package/dist/lib/long-task-evidence-adapter-policy.js +15 -0
- package/dist/lib/long-task-evidence-adapter-types.d.ts +1 -0
- package/dist/lib/long-task-evidence-adapter-types.js +1 -0
- package/dist/lib/long-task-evidence-findings.d.ts +5 -0
- package/dist/lib/long-task-evidence-findings.js +113 -0
- package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +4 -0
- package/dist/lib/long-task-evidence-sensitivity-policy.js +98 -0
- package/dist/lib/long-task-evidence-v2.d.ts +5 -0
- package/dist/lib/long-task-evidence-v2.js +226 -0
- package/dist/lib/long-task-explain-acceptance-link.d.ts +46 -0
- package/dist/lib/long-task-explain-acceptance-link.js +96 -0
- package/dist/lib/long-task-explain-claim-links.d.ts +45 -0
- package/dist/lib/long-task-explain-claim-links.js +88 -0
- package/dist/lib/long-task-explain-source-links.d.ts +93 -0
- package/dist/lib/long-task-explain-source-links.js +51 -0
- package/dist/lib/long-task-final-v2.d.ts +2 -0
- package/dist/lib/long-task-final-v2.js +124 -0
- package/dist/lib/long-task-finding-context.d.ts +3 -0
- package/dist/lib/long-task-finding-context.js +63 -0
- package/dist/lib/long-task-freshness.d.ts +3 -0
- package/dist/lib/long-task-freshness.js +80 -0
- package/dist/lib/long-task-hook-install.d.ts +9 -0
- package/dist/lib/long-task-hook-install.js +184 -0
- package/dist/lib/long-task-hook-preflight.d.ts +7 -0
- package/dist/lib/long-task-hook-preflight.js +58 -0
- package/dist/lib/long-task-observation-ownership.d.ts +2 -0
- package/dist/lib/long-task-observation-ownership.js +22 -0
- package/dist/lib/long-task-outcome-parser.d.ts +4 -0
- package/dist/lib/long-task-outcome-parser.js +100 -0
- package/dist/lib/long-task-paths.d.ts +49 -0
- package/dist/lib/long-task-paths.js +418 -0
- package/dist/lib/long-task-playwright-counterfactual-policy.d.ts +7 -0
- package/dist/lib/long-task-playwright-counterfactual-policy.js +125 -0
- package/dist/lib/long-task-playwright-evidence.d.ts +6 -0
- package/dist/lib/long-task-playwright-evidence.js +244 -0
- package/dist/lib/long-task-product-shape.d.ts +6 -0
- package/dist/lib/long-task-product-shape.js +73 -0
- package/dist/lib/long-task-progress.d.ts +4 -0
- package/dist/lib/long-task-progress.js +114 -0
- package/dist/lib/long-task-protected-files.d.ts +1 -0
- package/dist/lib/long-task-protected-files.js +30 -0
- package/dist/lib/long-task-required-proof-surfaces.d.ts +2 -0
- package/dist/lib/long-task-required-proof-surfaces.js +13 -0
- package/dist/lib/long-task-requirement-shape.d.ts +2 -0
- package/dist/lib/long-task-requirement-shape.js +18 -0
- package/dist/lib/long-task-risk-surfaces.d.ts +2 -0
- package/dist/lib/long-task-risk-surfaces.js +60 -0
- package/dist/lib/long-task-risk-types.d.ts +5 -0
- package/dist/lib/long-task-risk-types.js +12 -0
- package/dist/lib/long-task-risk.d.ts +9 -0
- package/dist/lib/long-task-risk.js +132 -0
- package/dist/lib/long-task-root-shape.d.ts +4 -0
- package/dist/lib/long-task-root-shape.js +86 -0
- package/dist/lib/long-task-runner-environment.d.ts +7 -0
- package/dist/lib/long-task-runner-environment.js +57 -0
- package/dist/lib/long-task-runner-files.d.ts +3 -0
- package/dist/lib/long-task-runner-files.js +39 -0
- package/dist/lib/long-task-runner-freeze.d.ts +2 -0
- package/dist/lib/long-task-runner-freeze.js +168 -0
- package/dist/lib/long-task-runtime-types.d.ts +214 -0
- package/dist/lib/long-task-runtime-types.js +1 -0
- package/dist/lib/long-task-shape-primitives.d.ts +17 -0
- package/dist/lib/long-task-shape-primitives.js +81 -0
- package/dist/lib/long-task-source-authority-types.d.ts +13 -0
- package/dist/lib/long-task-source-authority-types.js +1 -0
- package/dist/lib/long-task-source-claim-validation.d.ts +5 -0
- package/dist/lib/long-task-source-claim-validation.js +96 -0
- package/dist/lib/long-task-source-continuity.d.ts +4 -0
- package/dist/lib/long-task-source-continuity.js +57 -0
- package/dist/lib/long-task-source-inventory.d.ts +2 -0
- package/dist/lib/long-task-source-inventory.js +21 -0
- package/dist/lib/long-task-source-item-parser.d.ts +3 -0
- package/dist/lib/long-task-source-item-parser.js +112 -0
- package/dist/lib/long-task-source-shape.d.ts +2 -0
- package/dist/lib/long-task-source-shape.js +56 -0
- package/dist/lib/long-task-source-target-continuity.d.ts +4 -0
- package/dist/lib/long-task-source-target-continuity.js +80 -0
- package/dist/lib/long-task-source-target-index.d.ts +12 -0
- package/dist/lib/long-task-source-target-index.js +76 -0
- package/dist/lib/long-task-source-validation.d.ts +3 -0
- package/dist/lib/long-task-source-validation.js +46 -0
- package/dist/lib/long-task-state.d.ts +91 -0
- package/dist/lib/long-task-state.js +611 -0
- package/dist/lib/long-task-status-projection.d.ts +21 -0
- package/dist/lib/long-task-status-projection.js +116 -0
- package/dist/lib/long-task-status-v2.d.ts +37 -0
- package/dist/lib/long-task-status-v2.js +306 -0
- package/dist/lib/long-task-technical-shape.d.ts +3 -0
- package/dist/lib/long-task-technical-shape.js +44 -0
- package/dist/lib/long-task-verifier-authority.d.ts +12 -0
- package/dist/lib/long-task-verifier-authority.js +47 -0
- package/dist/lib/long-task-verifier-identity.d.ts +2 -0
- package/dist/lib/long-task-verifier-identity.js +55 -0
- package/dist/lib/long-task-verifier-v2.d.ts +13 -0
- package/dist/lib/long-task-verifier-v2.js +266 -0
- package/dist/lib/long-task-workspace-runtime-types.d.ts +23 -0
- package/dist/lib/long-task-workspace-runtime-types.js +1 -0
- package/dist/lib/long-task-workspace.d.ts +25 -0
- package/dist/lib/long-task-workspace.js +366 -0
- package/dist/lib/managed-file.js +20 -5
- package/dist/lib/migrations.js +156 -32
- package/dist/lib/modularity.d.ts +27 -1
- package/dist/lib/modularity.js +499 -23
- package/dist/lib/package-json-config.js +14 -5
- package/dist/lib/package-source.js +15 -3
- package/dist/lib/profiles.d.ts +13 -0
- package/dist/lib/profiles.js +66 -0
- package/dist/lib/schema-guard.js +4 -2
- package/dist/lib/source-files.js +14 -7
- package/dist/lib/source-pack-classify.js +91 -19
- package/dist/lib/source-pack-config.js +25 -8
- package/dist/lib/source-pack-export.js +84 -25
- package/dist/lib/source-pack-manifest.js +18 -6
- package/dist/lib/source-pack-records.js +35 -11
- package/dist/lib/source-pack-render.js +47 -18
- package/dist/lib/stable-json.d.ts +2 -0
- package/dist/lib/stable-json.js +21 -0
- package/dist/lib/strict-codec.d.ts +4 -0
- package/dist/lib/strict-codec.js +65 -0
- package/dist/lib/sync-engine.js +76 -24
- package/dist/lib/types.d.ts +8 -1
- package/dist/lib/upgrade.js +4 -3
- package/dist/lib/validators.js +218 -191
- package/dist/long-task-hook.d.ts +2 -0
- package/dist/long-task-hook.js +55 -0
- package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +340 -0
- package/dist/schemas/long-task-delivery-v2/long-task-outcomes-v2.schema.json +18 -0
- package/migrations/README.md +8 -3
- package/package.json +17 -6
- package/source-mappings.yaml +0 -3
- package/assets/protected-harness-baseline.json +0 -20
- package/assets/skills/composite-long-task-workflow/SKILL.md +0 -244
- package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -57
- package/assets/skills/composite-long-task-workflow/assets/goal-objective.template.md +0 -17
- package/assets/skills/composite-long-task-workflow/references/composite-long-task-workflow-protocol.md +0 -675
- package/dist/commands/superpowers.d.ts +0 -1
- package/dist/commands/superpowers.js +0 -8
- package/dist/lib/composite-long-task-renderer.d.ts +0 -12
- package/dist/lib/composite-long-task-renderer.js +0 -109
- package/dist/lib/plan-acceptance-artifacts.d.ts +0 -1
- package/dist/lib/plan-acceptance-artifacts.js +0 -220
- package/dist/lib/plan-acceptance-evidence.d.ts +0 -2
- package/dist/lib/plan-acceptance-evidence.js +0 -108
- package/dist/lib/plan-acceptance-json.d.ts +0 -15
- package/dist/lib/plan-acceptance-json.js +0 -133
- package/dist/lib/plan-acceptance-validator.d.ts +0 -2
- package/dist/lib/plan-acceptance-validator.js +0 -209
- package/dist/lib/plan-contract-validator.d.ts +0 -2
- package/dist/lib/plan-contract-validator.js +0 -127
- package/dist/lib/plan-validator-common.d.ts +0 -24
- package/dist/lib/plan-validator-common.js +0 -196
- package/dist/lib/superpowers-task-ac010.d.ts +0 -6
- package/dist/lib/superpowers-task-ac010.js +0 -26
- package/dist/lib/superpowers-task-assertion-normalizers.d.ts +0 -3
- package/dist/lib/superpowers-task-assertion-normalizers.js +0 -74
- package/dist/lib/superpowers-task-assertions.d.ts +0 -20
- package/dist/lib/superpowers-task-assertions.js +0 -257
- package/dist/lib/superpowers-task-attempt.d.ts +0 -4
- package/dist/lib/superpowers-task-attempt.js +0 -102
- package/dist/lib/superpowers-task-command-run-correlation.d.ts +0 -8
- package/dist/lib/superpowers-task-command-run-correlation.js +0 -103
- package/dist/lib/superpowers-task-command-specs.d.ts +0 -3
- package/dist/lib/superpowers-task-command-specs.js +0 -52
- package/dist/lib/superpowers-task-compile-diagnostics.d.ts +0 -5
- package/dist/lib/superpowers-task-compile-diagnostics.js +0 -20
- package/dist/lib/superpowers-task-compile-guards.d.ts +0 -2
- package/dist/lib/superpowers-task-compile-guards.js +0 -66
- package/dist/lib/superpowers-task-compile.d.ts +0 -6
- package/dist/lib/superpowers-task-compile.js +0 -133
- package/dist/lib/superpowers-task-completion-output.d.ts +0 -52
- package/dist/lib/superpowers-task-completion-output.js +0 -228
- package/dist/lib/superpowers-task-conformance.d.ts +0 -2
- package/dist/lib/superpowers-task-conformance.js +0 -24
- package/dist/lib/superpowers-task-contradictions.d.ts +0 -6
- package/dist/lib/superpowers-task-contradictions.js +0 -126
- package/dist/lib/superpowers-task-current-evidence.d.ts +0 -3
- package/dist/lib/superpowers-task-current-evidence.js +0 -176
- package/dist/lib/superpowers-task-delivery.d.ts +0 -4
- package/dist/lib/superpowers-task-delivery.js +0 -96
- package/dist/lib/superpowers-task-derive.d.ts +0 -14
- package/dist/lib/superpowers-task-derive.js +0 -382
- package/dist/lib/superpowers-task-events.d.ts +0 -1
- package/dist/lib/superpowers-task-events.js +0 -13
- package/dist/lib/superpowers-task-evidence-kernel.d.ts +0 -19
- package/dist/lib/superpowers-task-evidence-kernel.js +0 -347
- package/dist/lib/superpowers-task-evidence-records.d.ts +0 -2
- package/dist/lib/superpowers-task-evidence-records.js +0 -55
- package/dist/lib/superpowers-task-evidence.d.ts +0 -10
- package/dist/lib/superpowers-task-evidence.js +0 -147
- package/dist/lib/superpowers-task-fields.d.ts +0 -22
- package/dist/lib/superpowers-task-fields.js +0 -276
- package/dist/lib/superpowers-task-final-card.d.ts +0 -3
- package/dist/lib/superpowers-task-final-card.js +0 -24
- package/dist/lib/superpowers-task-gates.d.ts +0 -12
- package/dist/lib/superpowers-task-gates.js +0 -155
- package/dist/lib/superpowers-task-harness-drift.d.ts +0 -11
- package/dist/lib/superpowers-task-harness-drift.js +0 -90
- package/dist/lib/superpowers-task-next-slices.d.ts +0 -1
- package/dist/lib/superpowers-task-next-slices.js +0 -12
- package/dist/lib/superpowers-task-protected-baseline.d.ts +0 -10
- package/dist/lib/superpowers-task-protected-baseline.js +0 -66
- package/dist/lib/superpowers-task-source-compile.d.ts +0 -5
- package/dist/lib/superpowers-task-source-compile.js +0 -226
- package/dist/lib/superpowers-task-source-parser.d.ts +0 -23
- package/dist/lib/superpowers-task-source-parser.js +0 -218
- package/dist/lib/superpowers-task-state-schema.d.ts +0 -440
- package/dist/lib/superpowers-task-state-schema.js +0 -66
- package/dist/lib/superpowers-task-state-shape.d.ts +0 -3
- package/dist/lib/superpowers-task-state-shape.js +0 -50
- package/dist/lib/superpowers-task-state.d.ts +0 -16
- package/dist/lib/superpowers-task-state.js +0 -246
- package/dist/lib/superpowers-task-status.d.ts +0 -2
- package/dist/lib/superpowers-task-status.js +0 -24
- package/dist/lib/superpowers-task-under-specified.d.ts +0 -7
- package/dist/lib/superpowers-task-under-specified.js +0 -61
- package/dist/lib/superpowers-task-unregistered-evidence.d.ts +0 -11
- package/dist/lib/superpowers-task-unregistered-evidence.js +0 -72
- package/dist/lib/superpowers-task-validator.d.ts +0 -5
- package/dist/lib/superpowers-task-validator.js +0 -290
package/dist/lib/sync-engine.js
CHANGED
|
@@ -2,15 +2,17 @@ import path from "node:path";
|
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
3
|
import { readConfig } from "./config.js";
|
|
4
4
|
import { harnessPath, harnessRoot } from "./harness-root.js";
|
|
5
|
-
import { copyTree, listFiles, pathExists, readText, writeTextIfChanged } from "./fs.js";
|
|
6
|
-
import { AGENTS_BLOCK_MARKERS, GITHUB_WORKFLOW_BLOCK_END, GITHUB_WORKFLOW_BLOCK_MARKERS, GITHUB_WORKFLOW_BLOCK_START, MAKEFILE_BLOCK_END, MAKEFILE_BLOCK_MARKERS, MAKEFILE_BLOCK_START, MANAGED_BLOCK_END, MANAGED_BLOCK_START } from "./managed-file.js";
|
|
5
|
+
import { copyTree, listFiles, pathExists, readText, writeTextIfChanged, } from "./fs.js";
|
|
6
|
+
import { AGENTS_BLOCK_MARKERS, GITHUB_WORKFLOW_BLOCK_END, GITHUB_WORKFLOW_BLOCK_MARKERS, GITHUB_WORKFLOW_BLOCK_START, MAKEFILE_BLOCK_END, MAKEFILE_BLOCK_MARKERS, MAKEFILE_BLOCK_START, MANAGED_BLOCK_END, MANAGED_BLOCK_START, } from "./managed-file.js";
|
|
7
7
|
import { packageAssetPath } from "./paths.js";
|
|
8
8
|
import { assertSupportedSchema } from "./schema-guard.js";
|
|
9
|
+
import { installLongTaskHooks, uninstallLongTaskHooks, } from "./long-task-hook-install.js";
|
|
10
|
+
import { enabledManagedSkillNames, isProfileEnabled } from "./profiles.js";
|
|
9
11
|
export function emptySyncReport() {
|
|
10
12
|
return {
|
|
11
13
|
changed: [],
|
|
12
14
|
skipped: [],
|
|
13
|
-
blocked: []
|
|
15
|
+
blocked: [],
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
18
|
export async function runSync(projectRoot) {
|
|
@@ -23,11 +25,17 @@ export async function runSync(projectRoot) {
|
|
|
23
25
|
return report;
|
|
24
26
|
}
|
|
25
27
|
for (const managedFile of config.managed_files) {
|
|
26
|
-
await syncManagedFile(projectRoot, root, managedFile, report);
|
|
28
|
+
await syncManagedFile(projectRoot, root, managedFile, report, config);
|
|
29
|
+
}
|
|
30
|
+
if (isProfileEnabled(config, "long-task")) {
|
|
31
|
+
await installLongTaskHooks(projectRoot, report);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
await uninstallLongTaskHooks(projectRoot, report);
|
|
27
35
|
}
|
|
28
36
|
return report;
|
|
29
37
|
}
|
|
30
|
-
async function syncManagedFile(projectRoot, root, managedFile, report) {
|
|
38
|
+
async function syncManagedFile(projectRoot, root, managedFile, report, config) {
|
|
31
39
|
const destination = path.join(projectRoot, managedFile.path);
|
|
32
40
|
if (managedFile.path === "AGENTS.md") {
|
|
33
41
|
await syncAgentsBlock(destination, root, report);
|
|
@@ -38,7 +46,7 @@ async function syncManagedFile(projectRoot, root, managedFile, report) {
|
|
|
38
46
|
return;
|
|
39
47
|
}
|
|
40
48
|
if (isSkillsManagedPath(managedFile.path, root)) {
|
|
41
|
-
await syncSkillsTree(packageAssetPath("skills"), path.join(projectRoot, root, "skills"), report);
|
|
49
|
+
await syncSkillsTree(packageAssetPath("skills"), path.join(projectRoot, root, "skills"), report, enabledManagedSkillNames(config));
|
|
42
50
|
return;
|
|
43
51
|
}
|
|
44
52
|
const managedPath = normalizeManagedPath(managedFile.path);
|
|
@@ -47,14 +55,17 @@ async function syncManagedFile(projectRoot, root, managedFile, report) {
|
|
|
47
55
|
return;
|
|
48
56
|
}
|
|
49
57
|
if (managedPath === harnessPath(root, "ty-context-managed", "context_templates")) {
|
|
50
|
-
await syncTree(packageAssetPath("context_templates"), destination, report, {
|
|
58
|
+
await syncTree(packageAssetPath("context_templates"), destination, report, {
|
|
59
|
+
prune: true,
|
|
60
|
+
});
|
|
51
61
|
return;
|
|
52
62
|
}
|
|
53
63
|
if (managedPath === harnessPath(root, "ty-context-managed", "policies")) {
|
|
54
64
|
await syncTree(packageAssetPath("policies"), destination, report);
|
|
55
65
|
return;
|
|
56
66
|
}
|
|
57
|
-
if (managedPath ===
|
|
67
|
+
if (managedPath ===
|
|
68
|
+
harnessPath(root, "ty-context-managed", "make", "ty-context.mk")) {
|
|
58
69
|
await syncFile(packageAssetPath("make", "ty-context.mk"), destination, report, "skip-if-missing");
|
|
59
70
|
return;
|
|
60
71
|
}
|
|
@@ -85,14 +96,16 @@ async function syncAgentsBlock(destination, root, report) {
|
|
|
85
96
|
}
|
|
86
97
|
const core = renderAgentsCore(await readText(corePath), root);
|
|
87
98
|
const block = `${MANAGED_BLOCK_START}\n${core.trim()}\n${MANAGED_BLOCK_END}`;
|
|
88
|
-
const existing = (await pathExists(destination))
|
|
99
|
+
const existing = (await pathExists(destination))
|
|
100
|
+
? await readText(destination)
|
|
101
|
+
: "";
|
|
89
102
|
const next = mergeManagedBlock({
|
|
90
103
|
existing,
|
|
91
104
|
block,
|
|
92
105
|
markers: AGENTS_BLOCK_MARKERS,
|
|
93
106
|
pathLabel: "AGENTS.md",
|
|
94
107
|
insert: "append",
|
|
95
|
-
report
|
|
108
|
+
report,
|
|
96
109
|
});
|
|
97
110
|
if (!next) {
|
|
98
111
|
return;
|
|
@@ -108,14 +121,16 @@ function renderAgentsCore(content, root) {
|
|
|
108
121
|
return content.replaceAll(".agent", root).replaceAll(".codex", root);
|
|
109
122
|
}
|
|
110
123
|
async function syncMakefileInclude(destination, root, report) {
|
|
111
|
-
const existing = (await pathExists(destination))
|
|
124
|
+
const existing = (await pathExists(destination))
|
|
125
|
+
? await readText(destination)
|
|
126
|
+
: "";
|
|
112
127
|
const resetDefaultGoal = shouldResetMakeDefaultGoal(existing);
|
|
113
128
|
const includePath = `${root.replace(/\\/g, "/")}/ty-context-managed/make/ty-context.mk`;
|
|
114
129
|
const blockLines = [
|
|
115
130
|
MAKEFILE_BLOCK_START,
|
|
116
131
|
"# Included before project targets so project recipes win on name conflicts.",
|
|
117
132
|
`-include ${includePath}`,
|
|
118
|
-
MAKEFILE_BLOCK_END
|
|
133
|
+
MAKEFILE_BLOCK_END,
|
|
119
134
|
];
|
|
120
135
|
if (resetDefaultGoal) {
|
|
121
136
|
blockLines.splice(3, 0, ".DEFAULT_GOAL :=");
|
|
@@ -127,7 +142,7 @@ async function syncMakefileInclude(destination, root, report) {
|
|
|
127
142
|
markers: MAKEFILE_BLOCK_MARKERS,
|
|
128
143
|
pathLabel: "Makefile",
|
|
129
144
|
insert: "prepend",
|
|
130
|
-
report
|
|
145
|
+
report,
|
|
131
146
|
});
|
|
132
147
|
if (!next) {
|
|
133
148
|
return;
|
|
@@ -194,9 +209,14 @@ function findManagedBlock(existing, markersList) {
|
|
|
194
209
|
matches.push({ markers, startIndex, endIndex });
|
|
195
210
|
}
|
|
196
211
|
if (matches.length > 1) {
|
|
197
|
-
return {
|
|
198
|
-
|
|
199
|
-
|
|
212
|
+
return {
|
|
213
|
+
status: "invalid",
|
|
214
|
+
reason: "conflicting managed block marker namespaces",
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
return matches[0]
|
|
218
|
+
? { status: "found", ...matches[0] }
|
|
219
|
+
: { status: "missing" };
|
|
200
220
|
}
|
|
201
221
|
async function syncTree(source, destination, report, options = {}) {
|
|
202
222
|
if (!(await pathExists(source))) {
|
|
@@ -224,7 +244,10 @@ async function removeStaleManagedFiles(source, destination) {
|
|
|
224
244
|
.map((file) => path.relative(source, file).split(path.sep).join("/")));
|
|
225
245
|
const removed = [];
|
|
226
246
|
for (const destinationFile of await listFiles(destination)) {
|
|
227
|
-
const relative = path
|
|
247
|
+
const relative = path
|
|
248
|
+
.relative(destination, destinationFile)
|
|
249
|
+
.split(path.sep)
|
|
250
|
+
.join("/");
|
|
228
251
|
if (sourceFiles.has(relative)) {
|
|
229
252
|
continue;
|
|
230
253
|
}
|
|
@@ -233,13 +256,18 @@ async function removeStaleManagedFiles(source, destination) {
|
|
|
233
256
|
}
|
|
234
257
|
return removed;
|
|
235
258
|
}
|
|
236
|
-
async function syncSkillsTree(source, destination, report) {
|
|
259
|
+
async function syncSkillsTree(source, destination, report, enabledSkillNames) {
|
|
237
260
|
if (!(await pathExists(source))) {
|
|
238
261
|
report.skipped.push(path.basename(destination));
|
|
239
262
|
return;
|
|
240
263
|
}
|
|
241
264
|
const files = await listFiles(source);
|
|
242
|
-
const
|
|
265
|
+
const allManagedSkillNames = new Set(files
|
|
266
|
+
.map((file) => path.relative(source, file).split(path.sep)[0])
|
|
267
|
+
.filter(Boolean));
|
|
268
|
+
const realFiles = files
|
|
269
|
+
.filter((file) => !file.endsWith(".gitkeep"))
|
|
270
|
+
.filter((file) => enabledSkillNames.has(path.relative(source, file).split(path.sep)[0]));
|
|
243
271
|
if (realFiles.length === 0) {
|
|
244
272
|
report.skipped.push(path.basename(destination));
|
|
245
273
|
return;
|
|
@@ -254,6 +282,21 @@ async function syncSkillsTree(source, destination, report) {
|
|
|
254
282
|
report.skipped.push(destinationFile);
|
|
255
283
|
}
|
|
256
284
|
}
|
|
285
|
+
const managedSkillNames = new Set(realFiles
|
|
286
|
+
.map((file) => path.relative(source, file).split(path.sep)[0])
|
|
287
|
+
.filter(Boolean));
|
|
288
|
+
for (const skillName of managedSkillNames) {
|
|
289
|
+
report.changed.push(...(await removeStaleManagedFiles(path.join(source, skillName), path.join(destination, skillName))));
|
|
290
|
+
}
|
|
291
|
+
for (const skillName of allManagedSkillNames) {
|
|
292
|
+
if (enabledSkillNames.has(skillName))
|
|
293
|
+
continue;
|
|
294
|
+
const disabled = path.join(destination, skillName);
|
|
295
|
+
if (!(await pathExists(disabled)))
|
|
296
|
+
continue;
|
|
297
|
+
await fs.rm(disabled, { recursive: true, force: true });
|
|
298
|
+
report.changed.push(disabled);
|
|
299
|
+
}
|
|
257
300
|
}
|
|
258
301
|
async function blockDeprecatedSkillOverrides(projectRoot, root, report) {
|
|
259
302
|
for (const overrideRoot of skillOverrideRoots(projectRoot, root)) {
|
|
@@ -274,12 +317,18 @@ function skillOverrideRoots(projectRoot, root) {
|
|
|
274
317
|
return [
|
|
275
318
|
{
|
|
276
319
|
absolute: path.join(projectRoot, root, "ty-context-managed", "override_skills"),
|
|
277
|
-
relative: path
|
|
320
|
+
relative: path
|
|
321
|
+
.join(root, "ty-context-managed", "override_skills")
|
|
322
|
+
.split(path.sep)
|
|
323
|
+
.join("/"),
|
|
278
324
|
},
|
|
279
325
|
{
|
|
280
326
|
absolute: path.join(projectRoot, root, "pjsdlc_managed", "override_skills"),
|
|
281
|
-
relative: path
|
|
282
|
-
|
|
327
|
+
relative: path
|
|
328
|
+
.join(root, "pjsdlc_managed", "override_skills")
|
|
329
|
+
.split(path.sep)
|
|
330
|
+
.join("/"),
|
|
331
|
+
},
|
|
283
332
|
];
|
|
284
333
|
}
|
|
285
334
|
async function syncFile(source, destination, report, missingMode) {
|
|
@@ -320,7 +369,9 @@ async function syncGithubWorkflow(source, destination, relativePath, report) {
|
|
|
320
369
|
report.blocked.push(`${relativePath}: incomplete managed workflow markers`);
|
|
321
370
|
return;
|
|
322
371
|
}
|
|
323
|
-
if (markerState === "managed" ||
|
|
372
|
+
if (markerState === "managed" ||
|
|
373
|
+
normalizeWorkflow(existing) ===
|
|
374
|
+
normalizeWorkflow(stripWorkflowMarkers(sourceContent))) {
|
|
324
375
|
if (await writeTextIfChanged(destination, sourceContent)) {
|
|
325
376
|
report.changed.push(relativePath);
|
|
326
377
|
}
|
|
@@ -344,7 +395,8 @@ function workflowMarkerState(content) {
|
|
|
344
395
|
function stripWorkflowMarkers(content) {
|
|
345
396
|
return content
|
|
346
397
|
.split(/\r?\n/)
|
|
347
|
-
.filter((line) => line.trim() !== GITHUB_WORKFLOW_BLOCK_START &&
|
|
398
|
+
.filter((line) => line.trim() !== GITHUB_WORKFLOW_BLOCK_START &&
|
|
399
|
+
line.trim() !== GITHUB_WORKFLOW_BLOCK_END)
|
|
348
400
|
.join("\n");
|
|
349
401
|
}
|
|
350
402
|
function normalizeWorkflow(content) {
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -3,10 +3,14 @@ export interface HarnessConfig {
|
|
|
3
3
|
package: string;
|
|
4
4
|
schema_version: string;
|
|
5
5
|
};
|
|
6
|
+
profiles: {
|
|
7
|
+
enabled: HarnessProfile[];
|
|
8
|
+
};
|
|
6
9
|
modularity?: HarnessModularityConfig;
|
|
7
10
|
managed_files: ManagedFile[];
|
|
8
11
|
never_overwrite: string[];
|
|
9
12
|
}
|
|
13
|
+
export type HarnessProfile = "core-portable" | "workflow-default" | "long-task";
|
|
10
14
|
export interface HarnessModularityConfig {
|
|
11
15
|
limit?: number;
|
|
12
16
|
policy?: "scoped_waivers" | "strict_except_generated";
|
|
@@ -15,8 +19,11 @@ export interface HarnessModularityConfig {
|
|
|
15
19
|
export interface ModularityWaiverConfig {
|
|
16
20
|
path?: string;
|
|
17
21
|
category?: string;
|
|
22
|
+
owner?: string;
|
|
23
|
+
introduced_at?: string;
|
|
18
24
|
reason?: string;
|
|
19
|
-
|
|
25
|
+
tracking_issue?: string;
|
|
26
|
+
expiry_condition?: string;
|
|
20
27
|
}
|
|
21
28
|
export interface ManagedFile {
|
|
22
29
|
path: string;
|
package/dist/lib/upgrade.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { runDoctor } from "./doctor.js";
|
|
2
|
-
import { createUpgradePlan, formatUpgradePlan, runMigrations } from "./migrations.js";
|
|
2
|
+
import { createUpgradePlan, formatUpgradePlan, runMigrations, } from "./migrations.js";
|
|
3
3
|
import { assertSupportedSchema } from "./schema-guard.js";
|
|
4
4
|
import { runSync } from "./sync-engine.js";
|
|
5
5
|
export class UpgradeBlockedError extends Error {
|
|
@@ -29,11 +29,12 @@ export async function runUpgradeReport(projectRoot) {
|
|
|
29
29
|
}
|
|
30
30
|
const migrationReport = await runMigrations(projectRoot, plan);
|
|
31
31
|
lines.push(`migrations changed=${migrationReport.changed.length} skipped=${migrationReport.skipped.length} manual_required=${migrationReport.manualRequired.length} blocked=${migrationReport.blocked.length}`);
|
|
32
|
-
if (migrationReport.manualRequired.length > 0 ||
|
|
32
|
+
if (migrationReport.manualRequired.length > 0 ||
|
|
33
|
+
migrationReport.blocked.length > 0) {
|
|
33
34
|
lines.push(...formatUpgradePlan({
|
|
34
35
|
safe_pending: [],
|
|
35
36
|
manual_required: migrationReport.manualRequired,
|
|
36
|
-
blocked: migrationReport.blocked
|
|
37
|
+
blocked: migrationReport.blocked,
|
|
37
38
|
}).slice(1));
|
|
38
39
|
}
|
|
39
40
|
const syncReport = await runSync(projectRoot);
|