project-tiny-context-harness 0.2.85 → 0.6.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 +164 -427
- package/assets/README.md +284 -455
- package/assets/README.zh-CN.md +200 -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 +63 -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 +467 -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 -163
- 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 +4 -2
- 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 -245
- package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -62
- 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 -682
- 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 -91
- package/dist/lib/superpowers-task-completion-output.js +0 -374
- 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 -393
- 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 -35
- package/dist/lib/superpowers-task-gates.d.ts +0 -12
- package/dist/lib/superpowers-task-gates.js +0 -267
- 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 -460
- 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 -293
|
@@ -1,164 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { nextSuperpowersSlices } from "../lib/superpowers-task-next-slices.js";
|
|
9
|
-
import { renderCompositeLongTaskGoal } from "../lib/composite-long-task-renderer.js";
|
|
10
|
-
export async function compositeLongTask(args) {
|
|
11
|
-
await runCompositeLongTaskCommand(args, {
|
|
12
|
-
commandName: "ty-context composite-long-task",
|
|
13
|
-
label: "composite long-task",
|
|
14
|
-
showHelp: true
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
export async function runCompositeLongTaskCommand(args, options) {
|
|
18
|
-
const subcommand = args[0] ?? "help";
|
|
19
|
-
const workdirArg = args[1];
|
|
20
|
-
if (!workdirArg || subcommand === "help") {
|
|
21
|
-
help(options.commandName, options.showHelp);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const workdir = path.resolve(process.cwd(), workdirArg);
|
|
25
|
-
if (subcommand === "init") {
|
|
26
|
-
await initializeSuperpowersTask(workdir, { planSlug: path.basename(workdir) });
|
|
27
|
-
console.log(`initialized ${options.label} state at ${workdirArg}/task-state.json`);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
if (subcommand === "compile") {
|
|
31
|
-
const state = await compileSuperpowersTask(workdir, { mode: attemptMode(args) });
|
|
32
|
-
console.log(`compiled ${options.label} graph plan_items=${Object.keys(state.graph.plan_items).length} acs=${Object.keys(state.graph.acceptance_criteria).length}`);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (subcommand === "start-attempt") {
|
|
36
|
-
const attempt = await startAndSaveSuperpowersAttempt(workdir, attemptMode(args));
|
|
37
|
-
console.log(`started attempt ${attempt.task_attempt_id}`);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
if (subcommand === "run-assertion") {
|
|
41
|
-
const separator = args.indexOf("--");
|
|
42
|
-
const commandArgs = separator >= 0 ? args.slice(separator + 1) : [];
|
|
43
|
-
const run = await runSuperpowersAssertion(workdir, {
|
|
44
|
-
acId: optionValue(args, "--ac") ?? "",
|
|
45
|
-
proofLayer: optionValue(args, "--proof-layer") ?? "",
|
|
46
|
-
commandArgs
|
|
47
|
-
});
|
|
48
|
-
console.log(`recorded assertion command_run_id=${run.command_run_id} exit_code=${run.exit_code}`);
|
|
49
|
-
if (run.exit_code !== 0) {
|
|
50
|
-
process.exitCode = 1;
|
|
51
|
-
}
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
if (subcommand === "record-evidence") {
|
|
55
|
-
const evidence = await recordSuperpowersEvidence(workdir, {
|
|
56
|
-
artifactPath: path.resolve(process.cwd(), optionValue(args, "--from") ?? ""),
|
|
57
|
-
commandRunId: optionValue(args, "--command-run-id") ?? ""
|
|
58
|
-
});
|
|
59
|
-
console.log(`registered evidence ${evidence.evidence_id}`);
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (subcommand === "apply-slice-delta") {
|
|
63
|
-
const delta = args[2];
|
|
64
|
-
if (!delta) {
|
|
65
|
-
throw new Error("apply-slice-delta requires <slice-delta.json>");
|
|
66
|
-
}
|
|
67
|
-
await applySliceDelta(workdir, path.resolve(process.cwd(), delta));
|
|
68
|
-
const result = await deriveSuperpowersArtifacts(workdir);
|
|
69
|
-
console.log(`applied ${options.label} slice delta and derived files=${result.files.length}`);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
if (subcommand === "derive") {
|
|
73
|
-
const result = await deriveSuperpowersArtifacts(workdir);
|
|
74
|
-
console.log(`derived ${options.label} artifacts files=${result.files.length}`);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
if (subcommand === "slice-gate") {
|
|
78
|
-
const sliceId = optionValue(args, "--slice") ?? "";
|
|
79
|
-
const result = await runSliceGate(workdir, sliceId);
|
|
80
|
-
console.log(result.passed ? `slice gate passed ${sliceId}` : `slice gate blocked ${result.messages.join("; ")}`);
|
|
81
|
-
if (!result.passed) {
|
|
82
|
-
process.exitCode = 1;
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
if (subcommand === "epoch-gate") {
|
|
87
|
-
const epochId = optionValue(args, "--epoch") ?? "";
|
|
88
|
-
const result = await runEpochGate(workdir, epochId);
|
|
89
|
-
console.log(result.passed ? `epoch gate passed ${epochId}` : `epoch gate blocked ${result.messages.join("; ")}`);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (subcommand === "final-gate") {
|
|
93
|
-
const result = await runFinalGate(workdir);
|
|
94
|
-
console.log(`final gate product_goal_complete=${result.product_goal_complete}`);
|
|
95
|
-
console.log(`acceptance_target_status=${result.acceptance_target_status}`);
|
|
96
|
-
console.log(`completion_output_status=${result.completion_output_status}`);
|
|
97
|
-
console.log(`final_answer_allowed=${result.final_answer_allowed}`);
|
|
98
|
-
console.log(`required_user_visible_status=${result.required_user_visible_status}`);
|
|
99
|
-
console.log(`exit_code=${result.exit_code}`);
|
|
100
|
-
console.log(`audit_task_complete=${result.audit_task_complete}`);
|
|
101
|
-
if (result.blocker_triage) {
|
|
102
|
-
console.log(`blocker_triage_category=${result.blocker_triage.category}`);
|
|
103
|
-
console.log(`blocker_triage_self_recoverable=${result.blocker_triage.self_recoverable}`);
|
|
104
|
-
console.log(`blocker_triage_recovery_attempted=${result.blocker_triage.recovery_attempted}`);
|
|
105
|
-
console.log(`blocker_triage_next_action=${result.blocker_triage.next_action}`);
|
|
106
|
-
}
|
|
107
|
-
if (result.blocked_reasons.length > 0) {
|
|
108
|
-
console.log(`blocked_reasons=${result.blocked_reasons.join("; ")}`);
|
|
109
|
-
}
|
|
110
|
-
if (result.rejection_reasons.length > 0) {
|
|
111
|
-
console.log(`rejection_reasons=${result.rejection_reasons.join("; ")}`);
|
|
112
|
-
}
|
|
113
|
-
if (!result.final_answer_allowed) {
|
|
114
|
-
process.exitCode = result.exit_code;
|
|
115
|
-
for (const error of result.errors) {
|
|
116
|
-
console.error(`error: ${error}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (subcommand === "next-slices") {
|
|
122
|
-
const limit = Number.parseInt(optionValue(args, "--limit") ?? "5", 10);
|
|
123
|
-
const slices = await nextSuperpowersSlices(workdir, Number.isFinite(limit) ? limit : 5);
|
|
124
|
-
console.log(`Next ${Math.min(Number.isFinite(limit) ? limit : 5, 5)} high-value clusters:`);
|
|
125
|
-
console.log(slices.join("\n"));
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
if (subcommand === "render-goal") {
|
|
129
|
-
const result = await renderCompositeLongTaskGoal(workdir);
|
|
130
|
-
console.log(`rendered ${options.label} goal artifacts: ${path.basename(result.goalObjectivePath)} ${path.basename(result.protocolPath)} ${path.basename(result.executionBindingPath)} length=${result.goalObjectiveLength}`);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
help(options.commandName, options.showHelp);
|
|
134
|
-
}
|
|
135
|
-
function help(commandName, showRenderGoal) {
|
|
136
|
-
const renderGoal = showRenderGoal ? "\n render-goal <workdir> Render workflow-protocol.md, execution-binding.md and goal-objective.txt" : "";
|
|
137
|
-
console.log(`${commandName} commands:
|
|
138
|
-
init <workdir> Initialize task-state.json and events.ndjson
|
|
139
|
-
compile <workdir> [--mode product_task|harness_task]
|
|
140
|
-
Compile sources into task graph
|
|
141
|
-
start-attempt <workdir> [--mode product_task|harness_task]
|
|
142
|
-
Start a fresh current attempt
|
|
143
|
-
run-assertion <workdir> --ac <id> --proof-layer <layer> -- <command>
|
|
144
|
-
Run and record an assertion command
|
|
145
|
-
record-evidence <workdir> --from <artifact> --command-run-id <id>
|
|
146
|
-
Register current-attempt EvidenceRecordV2
|
|
147
|
-
apply-slice-delta <workdir> <delta> Apply structured slice delta, evidence and derived views
|
|
148
|
-
derive <workdir> Generate derived/** views
|
|
149
|
-
slice-gate <workdir> --slice <id> Validate one slice has real progress
|
|
150
|
-
epoch-gate <workdir> --epoch <id> Refresh shared epoch evidence views
|
|
151
|
-
final-gate <workdir> Compute product_goal_complete and completion_output_status
|
|
152
|
-
next-slices <workdir> --limit 5 Recommend next proof clusters${renderGoal}`);
|
|
153
|
-
}
|
|
154
|
-
function optionValue(args, name) {
|
|
155
|
-
const index = args.indexOf(name);
|
|
156
|
-
return index >= 0 ? args[index + 1] : undefined;
|
|
157
|
-
}
|
|
158
|
-
function attemptMode(args) {
|
|
159
|
-
const value = optionValue(args, "--mode");
|
|
160
|
-
if (value === "harness_task") {
|
|
161
|
-
return "harness_task";
|
|
162
|
-
}
|
|
163
|
-
return "product_task";
|
|
1
|
+
export function compositeLongTask(_args) {
|
|
2
|
+
console.log(JSON.stringify({
|
|
3
|
+
status: "retired",
|
|
4
|
+
command: "composite-long-task",
|
|
5
|
+
next_command: "ty-context long-task",
|
|
6
|
+
historical_state_executed: false,
|
|
7
|
+
}));
|
|
164
8
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function deliverySet(_args: string[]): void;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const TOMBSTONE = {
|
|
2
|
+
status: "retired",
|
|
3
|
+
reason: "Delivery Set orchestration is outside the minimal Single-Goal core.",
|
|
4
|
+
replacement: "Use one complete Delivery Contract with semantic Outcomes and one Final Gate.",
|
|
5
|
+
};
|
|
6
|
+
export function deliverySet(_args) {
|
|
7
|
+
console.log(JSON.stringify(TOMBSTONE));
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function disable(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { disableHarnessProfile } from "../lib/profiles.js";
|
|
2
|
+
import { runSync } from "../lib/sync-engine.js";
|
|
3
|
+
export async function disable(args) {
|
|
4
|
+
const profile = args[0];
|
|
5
|
+
if (profile !== "long-task" || args.length !== 1) {
|
|
6
|
+
throw new Error("usage: ty-context disable long-task");
|
|
7
|
+
}
|
|
8
|
+
const root = process.cwd();
|
|
9
|
+
const result = await disableHarnessProfile(root, profile);
|
|
10
|
+
const sync = await runSync(root);
|
|
11
|
+
console.log(`${result.changed ? "disabled" : "kept disabled"} profile ${profile}`);
|
|
12
|
+
console.log(`sync changed=${sync.changed.length} skipped=${sync.skipped.length} blocked=${sync.blocked.length}`);
|
|
13
|
+
if (sync.blocked.length)
|
|
14
|
+
throw new Error(sync.blocked.join("\n"));
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function enable(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { enableHarnessProfile } from "../lib/profiles.js";
|
|
2
|
+
import { runSync } from "../lib/sync-engine.js";
|
|
3
|
+
export async function enable(args) {
|
|
4
|
+
const profile = args[0];
|
|
5
|
+
if (!profile || args.length !== 1)
|
|
6
|
+
throw new Error("usage: ty-context enable long-task");
|
|
7
|
+
const root = process.cwd();
|
|
8
|
+
const result = await enableHarnessProfile(root, profile);
|
|
9
|
+
const sync = await runSync(root);
|
|
10
|
+
console.log(`${result.changed ? "enabled" : "kept enabled"} profile ${profile}`);
|
|
11
|
+
console.log(`sync changed=${sync.changed.length} skipped=${sync.skipped.length} blocked=${sync.blocked.length}`);
|
|
12
|
+
if (sync.blocked.length)
|
|
13
|
+
throw new Error(sync.blocked.join("\n"));
|
|
14
|
+
}
|
|
@@ -7,7 +7,7 @@ export function parseArgs(args) {
|
|
|
7
7
|
includeContext: [],
|
|
8
8
|
includeCode: [],
|
|
9
9
|
redactionStrict: false,
|
|
10
|
-
help: false
|
|
10
|
+
help: false,
|
|
11
11
|
};
|
|
12
12
|
for (let index = 0; index < args.length; index += 1) {
|
|
13
13
|
const arg = args[index];
|
|
@@ -97,7 +97,10 @@ Secret redaction is always enabled; --redaction-strict fails if redaction was re
|
|
|
97
97
|
The artifact must stay under tmp/ty-context/context-exports/** and must not be referenced from project_context/context.toml.`;
|
|
98
98
|
}
|
|
99
99
|
function validateParsedArgs(parsed) {
|
|
100
|
-
const modeCount = Number(parsed.full) +
|
|
100
|
+
const modeCount = Number(parsed.full) +
|
|
101
|
+
Number(parsed.code) +
|
|
102
|
+
Number(parsed.all) +
|
|
103
|
+
Number(parsed.sourceMode !== undefined);
|
|
101
104
|
if (modeCount > 1) {
|
|
102
105
|
throw new Error("export-context accepts exactly one mode: --full, --code, --all, --code-index, --source-pack, --code-bundles or --task-context");
|
|
103
106
|
}
|
|
@@ -126,13 +129,19 @@ function inlineValue(arg, flag, message) {
|
|
|
126
129
|
return value;
|
|
127
130
|
}
|
|
128
131
|
function parseBundleStrategy(value) {
|
|
129
|
-
if (value === "auto" ||
|
|
132
|
+
if (value === "auto" ||
|
|
133
|
+
value === "area" ||
|
|
134
|
+
value === "topdir" ||
|
|
135
|
+
value === "config")
|
|
130
136
|
return value;
|
|
131
137
|
throw new Error("export-context --bundle-strategy must be one of auto, area, topdir or config");
|
|
132
138
|
}
|
|
133
139
|
function parseInteger(value, flag, allowZero) {
|
|
134
140
|
const parsed = Number.parseInt(value, 10);
|
|
135
|
-
if (!Number.isInteger(parsed) ||
|
|
141
|
+
if (!Number.isInteger(parsed) ||
|
|
142
|
+
String(parsed) !== value.trim() ||
|
|
143
|
+
parsed < 0 ||
|
|
144
|
+
(!allowZero && parsed === 0)) {
|
|
136
145
|
throw new Error(`export-context ${flag} requires ${allowZero ? "a non-negative" : "a positive"} integer`);
|
|
137
146
|
}
|
|
138
147
|
return parsed;
|
|
@@ -11,7 +11,8 @@ export async function exportContext(args) {
|
|
|
11
11
|
process.exitCode = 1;
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
|
-
if (parsed.help ||
|
|
14
|
+
if (parsed.help ||
|
|
15
|
+
(!parsed.full && !parsed.code && !parsed.all && !parsed.sourceMode)) {
|
|
15
16
|
console.log(helpText());
|
|
16
17
|
if (!parsed.help) {
|
|
17
18
|
process.exitCode = 1;
|
|
@@ -32,7 +33,7 @@ export async function exportContext(args) {
|
|
|
32
33
|
maxBundleCharacters: parsed.maxBundleCharacters,
|
|
33
34
|
redactionStrict: parsed.redactionStrict,
|
|
34
35
|
prune: parsed.prune,
|
|
35
|
-
taskName: parsed.taskName
|
|
36
|
+
taskName: parsed.taskName,
|
|
36
37
|
}), parsed.check);
|
|
37
38
|
return;
|
|
38
39
|
}
|
|
@@ -44,9 +45,11 @@ export async function exportContext(args) {
|
|
|
44
45
|
full: parsed.full,
|
|
45
46
|
code: parsed.code,
|
|
46
47
|
check: parsed.check,
|
|
47
|
-
output: parsed.output
|
|
48
|
+
output: parsed.output,
|
|
48
49
|
});
|
|
49
|
-
console.log(parsed.check
|
|
50
|
+
console.log(parsed.check
|
|
51
|
+
? "export-context check OK"
|
|
52
|
+
: "export-context wrote artifact");
|
|
50
53
|
console.log(`mode: ${report.mode}`);
|
|
51
54
|
console.log(`output: ${report.outputRelativePath}`);
|
|
52
55
|
if (report.mode === "code") {
|
|
@@ -71,8 +74,16 @@ export async function exportContext(args) {
|
|
|
71
74
|
}
|
|
72
75
|
async function runLegacyAll(check) {
|
|
73
76
|
const now = new Date();
|
|
74
|
-
const fullReport = await runExportContext(process.cwd(), {
|
|
75
|
-
|
|
77
|
+
const fullReport = await runExportContext(process.cwd(), {
|
|
78
|
+
full: true,
|
|
79
|
+
check,
|
|
80
|
+
now,
|
|
81
|
+
});
|
|
82
|
+
const codeReport = await runExportContext(process.cwd(), {
|
|
83
|
+
code: true,
|
|
84
|
+
check,
|
|
85
|
+
now,
|
|
86
|
+
});
|
|
76
87
|
console.log(check ? "export-context check OK" : "export-context wrote artifacts");
|
|
77
88
|
console.log("mode: all");
|
|
78
89
|
console.log("outputs:");
|
|
@@ -85,7 +96,7 @@ async function runLegacyAll(check) {
|
|
|
85
96
|
console.log("warnings:");
|
|
86
97
|
printWarnings([
|
|
87
98
|
...fullReport.warnings.map((warning) => `full: ${warning}`),
|
|
88
|
-
...codeReport.warnings.map((warning) => `code: ${warning}`)
|
|
99
|
+
...codeReport.warnings.map((warning) => `code: ${warning}`),
|
|
89
100
|
]);
|
|
90
101
|
}
|
|
91
102
|
function printSourcePackReport(report, check) {
|
package/dist/commands/index.js
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
import { checkModularity } from "./check-modularity.js";
|
|
2
2
|
import { compositeLongTask } from "./composite-long-task.js";
|
|
3
|
+
import { compositeCampaign } from "./composite-campaign.js";
|
|
4
|
+
import { longTask } from "./long-task.js";
|
|
5
|
+
import { deliverySet } from "./delivery-set.js";
|
|
3
6
|
import { doctor } from "./doctor.js";
|
|
4
7
|
import { exportContext } from "./export-context.js";
|
|
8
|
+
import { enable } from "./enable.js";
|
|
9
|
+
import { disable } from "./disable.js";
|
|
5
10
|
import { init } from "./init.js";
|
|
6
11
|
import { packageSource } from "./package-source.js";
|
|
7
|
-
import { superpowers } from "./superpowers.js";
|
|
8
12
|
import { sync } from "./sync.js";
|
|
9
13
|
import { upgrade } from "./upgrade.js";
|
|
10
14
|
import { validate } from "./validate.js";
|
|
15
|
+
import { assertHarnessProfileEnabled } from "../lib/profiles.js";
|
|
11
16
|
export const commands = {
|
|
12
17
|
help,
|
|
13
18
|
init,
|
|
19
|
+
enable,
|
|
20
|
+
disable,
|
|
14
21
|
sync,
|
|
15
22
|
upgrade,
|
|
16
23
|
doctor,
|
|
@@ -20,37 +27,42 @@ export const commands = {
|
|
|
20
27
|
"validate-context": (args) => validate(["validate-context", ...args]),
|
|
21
28
|
"validate-code-modularity": (args) => validate(["validate-code-modularity", ...args]),
|
|
22
29
|
"validate-harness": (args) => validate(["validate-harness", ...args]),
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"validate-superpowers-state": (args) => validate(["validate-superpowers-state", ...args]),
|
|
30
|
+
"long-task": (args) => withLongTaskProfile(args, longTask),
|
|
31
|
+
"delivery-set": deliverySet,
|
|
26
32
|
"composite-long-task": compositeLongTask,
|
|
27
|
-
|
|
28
|
-
package: packageSource
|
|
33
|
+
"composite-campaign": compositeCampaign,
|
|
34
|
+
package: packageSource,
|
|
29
35
|
};
|
|
30
36
|
export function help() {
|
|
31
|
-
console.log(`ty-context commands:
|
|
32
|
-
init [--adopt] [--harness-folder <path>]
|
|
33
|
-
Initialize/adopt a project; without --harness-folder, choose target agent first
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
validate
|
|
45
|
-
|
|
46
|
-
validate-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
composite-long-task
|
|
54
|
-
|
|
37
|
+
console.log(`ty-context commands:
|
|
38
|
+
init [--adopt] [--harness-folder <path>]
|
|
39
|
+
Initialize/adopt a project; without --harness-folder, choose target agent first
|
|
40
|
+
enable long-task Install Source Plan/Long-Task Skills, Stop Hook and templates
|
|
41
|
+
disable long-task Remove only package-owned long-task profile assets
|
|
42
|
+
sync Refresh managed assets; does not run migrations
|
|
43
|
+
upgrade [--check] [--json]
|
|
44
|
+
Run safe migrations, sync managed assets and doctor
|
|
45
|
+
doctor Diagnose project configuration and drift
|
|
46
|
+
check-modularity --touched|--file <path>|--base <ref> [--limit 300] [--fail-on-warning]
|
|
47
|
+
Warn when selected handwritten source files exceed a line-count limit
|
|
48
|
+
export-context --full|--code|--all|--source-pack|--code-index|--task-context
|
|
49
|
+
Export temporary Context, code snapshot or bounded Source Pack artifacts
|
|
50
|
+
validate <gate> Run a Harness validation gate
|
|
51
|
+
validate-context Validate Minimal Context fact-source recoverability
|
|
52
|
+
validate-code-modularity
|
|
53
|
+
Enforce touched handwritten source file modularity
|
|
54
|
+
validate-harness Run validate-context and validate-code-modularity
|
|
55
|
+
long-task <subcommand>
|
|
56
|
+
Manage one Canonical Delivery Contract in the current workspace
|
|
57
|
+
delivery-set <subcommand>
|
|
58
|
+
Retired; use one complete Contract with semantic Outcomes
|
|
59
|
+
composite-long-task Retired command; use ty-context long-task
|
|
60
|
+
composite-campaign Retired command; use ty-context long-task
|
|
55
61
|
package <subcommand> Maintain package canonical source`);
|
|
56
62
|
}
|
|
63
|
+
async function withLongTaskProfile(args, handler) {
|
|
64
|
+
const subcommand = args[0] ?? "help";
|
|
65
|
+
if (subcommand !== "help")
|
|
66
|
+
await assertHarnessProfileEnabled(process.cwd(), "long-task");
|
|
67
|
+
await handler(args);
|
|
68
|
+
}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { stdin as input, stdout as output } from "node:process";
|
|
2
2
|
import * as readline from "node:readline/promises";
|
|
3
3
|
import { runInit } from "../lib/init.js";
|
|
4
|
-
import { normalizeHarnessFolderName, readHarnessRootConfig } from "../lib/harness-root.js";
|
|
4
|
+
import { normalizeHarnessFolderName, readHarnessRootConfig, } from "../lib/harness-root.js";
|
|
5
5
|
import { writePackageHarnessRoot } from "../lib/package-json-config.js";
|
|
6
6
|
import { DEFAULT_HARNESS_ROOT } from "../lib/paths.js";
|
|
7
7
|
const AGENT_HARNESS_OPTIONS = [
|
|
@@ -11,7 +11,7 @@ const AGENT_HARNESS_OPTIONS = [
|
|
|
11
11
|
{ key: "cline", label: "Cline", harnessFolderName: ".cline" },
|
|
12
12
|
{ key: "roo", label: "Roo Code", harnessFolderName: ".roo" },
|
|
13
13
|
{ key: "gemini", label: "Gemini CLI", harnessFolderName: ".gemini" },
|
|
14
|
-
{ key: "other", label: "Other" }
|
|
14
|
+
{ key: "other", label: "Other" },
|
|
15
15
|
];
|
|
16
16
|
export async function init(args) {
|
|
17
17
|
const adopt = args.includes("--adopt");
|
|
@@ -28,7 +28,8 @@ export async function init(args) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
export async function resolveInitHarnessRoot(projectRoot, args) {
|
|
31
|
-
const argRoot = valueForArg(args, "--harness-folder") ??
|
|
31
|
+
const argRoot = valueForArg(args, "--harness-folder") ??
|
|
32
|
+
valueForArg(args, "--harnessFolderName");
|
|
32
33
|
if (argRoot) {
|
|
33
34
|
return normalizeHarnessFolderName(argRoot);
|
|
34
35
|
}
|
|
@@ -68,7 +69,9 @@ async function questionUntilValid(rl, query) {
|
|
|
68
69
|
function formatAgentChoices() {
|
|
69
70
|
const lines = ["Choose target agent:"];
|
|
70
71
|
AGENT_HARNESS_OPTIONS.forEach((option, index) => {
|
|
71
|
-
const folder = option.harnessFolderName
|
|
72
|
+
const folder = option.harnessFolderName
|
|
73
|
+
? ` -> ${option.harnessFolderName}`
|
|
74
|
+
: "";
|
|
72
75
|
lines.push(`${index + 1}) ${option.label}${folder}`);
|
|
73
76
|
});
|
|
74
77
|
return lines.join("\n");
|
|
@@ -78,7 +81,8 @@ export function resolveAgentHarnessFolderName(agentAnswer, customFolderAnswer =
|
|
|
78
81
|
if (!option) {
|
|
79
82
|
throw new Error("Unknown agent choice");
|
|
80
83
|
}
|
|
81
|
-
return normalizeHarnessFolderName(option.harnessFolderName ??
|
|
84
|
+
return normalizeHarnessFolderName(option.harnessFolderName ??
|
|
85
|
+
(customFolderAnswer.trim() || DEFAULT_HARNESS_ROOT));
|
|
82
86
|
}
|
|
83
87
|
function agentOptionForAnswer(answer) {
|
|
84
88
|
const normalized = answer.trim().toLowerCase();
|
|
@@ -91,7 +95,9 @@ function agentOptionForAnswer(answer) {
|
|
|
91
95
|
}
|
|
92
96
|
return AGENT_HARNESS_OPTIONS.find((option) => {
|
|
93
97
|
const label = option.label.toLowerCase();
|
|
94
|
-
return option.key === normalized ||
|
|
98
|
+
return (option.key === normalized ||
|
|
99
|
+
label === normalized ||
|
|
100
|
+
label.replace(/\s+/g, "-") === normalized);
|
|
95
101
|
});
|
|
96
102
|
}
|
|
97
103
|
function valueForArg(args, name) {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { preflightDeliveryContract } from "../lib/long-task-authoring-preflight.js";
|
|
4
|
+
export async function initializeLongTask(workdir) {
|
|
5
|
+
await mkdir(workdir, { recursive: true });
|
|
6
|
+
try {
|
|
7
|
+
await writeFile(path.join(workdir, "delivery-contract.yaml"), template(), {
|
|
8
|
+
flag: "wx",
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (error.code !== "EEXIST")
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function preflightLongTask(workdir) {
|
|
17
|
+
const result = await preflightDeliveryContract(workdir, process.cwd());
|
|
18
|
+
console.log(JSON.stringify(result, null, 2));
|
|
19
|
+
if (result.status !== "ready")
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
}
|
|
22
|
+
export function compactLongTaskTemplate() {
|
|
23
|
+
return template();
|
|
24
|
+
}
|
|
25
|
+
function template() {
|
|
26
|
+
return `schema_version: long-task-delivery-v2
|
|
27
|
+
task:
|
|
28
|
+
id: replace-me
|
|
29
|
+
title: Replace me
|
|
30
|
+
goal: Describe the complete observable delivery goal.
|
|
31
|
+
source_paths: [plans/replace-me.md]
|
|
32
|
+
context_refs: [project_context/areas/replace-me.md]
|
|
33
|
+
source_claims:
|
|
34
|
+
- key: replace-requirement
|
|
35
|
+
source_ref: plans/replace-me.md#replace-requirement
|
|
36
|
+
statement: Preserve one atomic source requirement.
|
|
37
|
+
disposition:
|
|
38
|
+
type: claim
|
|
39
|
+
refs: [replace-outcome.requirement.replace-requirement]
|
|
40
|
+
risk:
|
|
41
|
+
facts: {}
|
|
42
|
+
global: {}
|
|
43
|
+
outcomes:
|
|
44
|
+
- key: replace-outcome
|
|
45
|
+
title: Replace outcome
|
|
46
|
+
product:
|
|
47
|
+
observable_result: Describe what a user or system can observe.
|
|
48
|
+
owner:
|
|
49
|
+
label: replace-owner
|
|
50
|
+
context_refs: [project_context/areas/replace-me.md]
|
|
51
|
+
path_globs: ["src/**", "tests/**"]
|
|
52
|
+
requirements:
|
|
53
|
+
- key: replace-requirement
|
|
54
|
+
statement: Preserve one atomic source requirement.
|
|
55
|
+
required_proof_surfaces: [runtime_behavior]
|
|
56
|
+
technical:
|
|
57
|
+
expected_change_paths: ["src/**"]
|
|
58
|
+
bindings:
|
|
59
|
+
- key: replace-carrier
|
|
60
|
+
kind: file
|
|
61
|
+
target: src/replace-me.ts
|
|
62
|
+
carrier_paths: [src/replace-me.ts]
|
|
63
|
+
existence: planned
|
|
64
|
+
acceptance:
|
|
65
|
+
checks:
|
|
66
|
+
- key: replace-check
|
|
67
|
+
proof_surface: runtime_behavior
|
|
68
|
+
runner:
|
|
69
|
+
type: node_oracle
|
|
70
|
+
target: tests/replace-oracle.mjs
|
|
71
|
+
effect: read_only
|
|
72
|
+
verification_inputs: ["tests/replace-oracle.mjs"]
|
|
73
|
+
input_paths: [src/replace-me.ts]
|
|
74
|
+
expected_output_paths: [src/replace-me.ts]
|
|
75
|
+
positive_assertions:
|
|
76
|
+
- key: replace-success
|
|
77
|
+
criterion: The declared outcome and requirement are observable.
|
|
78
|
+
claims: [result, requirement.replace-requirement]
|
|
79
|
+
observation: result
|
|
80
|
+
operator: equals
|
|
81
|
+
expected: true
|
|
82
|
+
counterfactual_controls:
|
|
83
|
+
- key: remove-replace-carrier
|
|
84
|
+
binding_key: replace-carrier
|
|
85
|
+
claims: [result, requirement.replace-requirement]
|
|
86
|
+
check_key: replace-check
|
|
87
|
+
mutation:
|
|
88
|
+
type: remove_paths
|
|
89
|
+
paths: [src/replace-me.ts]
|
|
90
|
+
expected_assertion_failures: [replace-success]
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function explainLongTask(workdir: string): Promise<void>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { compileProductClaimCoverage } from "../lib/long-task-claims.js";
|
|
2
|
+
import { sourceCoverage } from "../lib/long-task-authoring-preflight-diagnostics.js";
|
|
3
|
+
import { parseDeliveryContractBundle } from "../lib/long-task-delivery-parser.js";
|
|
4
|
+
import { explainSourceLinks } from "../lib/long-task-explain-source-links.js";
|
|
5
|
+
import { classifyLongTaskRisk } from "../lib/long-task-risk.js";
|
|
6
|
+
import { compileSourceInventory } from "../lib/long-task-source-inventory.js";
|
|
7
|
+
import { validateSourceContinuity } from "../lib/long-task-source-continuity.js";
|
|
8
|
+
import { validateSourceTargetContinuity } from "../lib/long-task-source-target-continuity.js";
|
|
9
|
+
import { repositoryRoot } from "../lib/long-task-workspace.js";
|
|
10
|
+
export async function explainLongTask(workdir) {
|
|
11
|
+
const parsed = await parseDeliveryContractBundle(workdir);
|
|
12
|
+
const repository = await repositoryRoot(process.cwd());
|
|
13
|
+
const sourceInventory = await compileSourceInventory(repository, parsed.contract.task.source_paths);
|
|
14
|
+
validateSourceContinuity(parsed.contract, sourceInventory);
|
|
15
|
+
validateSourceTargetContinuity(parsed.contract, sourceInventory);
|
|
16
|
+
const coverage = compileProductClaimCoverage(parsed.contract);
|
|
17
|
+
const risk = classifyLongTaskRisk(parsed.contract);
|
|
18
|
+
const globalClaims = Object.entries(coverage.summary.claims_by_global).map(([claimKey, value]) => ({
|
|
19
|
+
claim: `GLOBAL.${claimKey}`,
|
|
20
|
+
covered: value.covered,
|
|
21
|
+
checks: value.proofs.map((proof) => proof.check_key),
|
|
22
|
+
assertions: value.proofs.map((proof) => proof.assertion_key),
|
|
23
|
+
polarity: value.proofs.map((proof) => proof.polarity),
|
|
24
|
+
proof_surfaces: value.proofs.map((proof) => proof.proof_surface),
|
|
25
|
+
strict_risk_obligations: [],
|
|
26
|
+
}));
|
|
27
|
+
const outcomeClaims = Object.entries(coverage.summary.claims_by_outcome).flatMap(([outcomeKey, rows]) => Object.entries(rows).map(([claimKey, value]) => ({
|
|
28
|
+
claim: `OUTCOME.${outcomeKey}.${claimKey}`,
|
|
29
|
+
covered: value.covered,
|
|
30
|
+
checks: value.proofs.map((proof) => proof.check_key),
|
|
31
|
+
assertions: value.proofs.map((proof) => proof.assertion_key),
|
|
32
|
+
polarity: value.proofs.map((proof) => proof.polarity),
|
|
33
|
+
proof_surfaces: value.proofs.map((proof) => proof.proof_surface),
|
|
34
|
+
strict_risk_obligations: risk.reasons_by_outcome[outcomeKey],
|
|
35
|
+
})));
|
|
36
|
+
console.log(JSON.stringify({
|
|
37
|
+
schema_version: "long-task-explain-v2",
|
|
38
|
+
claims: [...globalClaims, ...outcomeClaims],
|
|
39
|
+
coverage: coverage.summary,
|
|
40
|
+
source_coverage: sourceCoverage(parsed.contract),
|
|
41
|
+
source_items: sourceInventory.map((item) => {
|
|
42
|
+
const source = parsed.contract.source_claims.find((claim) => claim.key === item.key);
|
|
43
|
+
return {
|
|
44
|
+
...item,
|
|
45
|
+
source_ref: source.source_ref,
|
|
46
|
+
statement: source.statement,
|
|
47
|
+
disposition: source.disposition,
|
|
48
|
+
links: explainSourceLinks(parsed.contract, coverage.summary, source),
|
|
49
|
+
};
|
|
50
|
+
}),
|
|
51
|
+
}, null, 2));
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function longTask(args: string[]): Promise<void>;
|