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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { canRetainProgressForSupportingContextRevision } from "../lib/long-task-context-authority.js";
|
|
3
|
+
import { compileDeliveryContract } from "../lib/long-task-delivery-compiler.js";
|
|
4
|
+
import { runDeliveryFinalGate } from "../lib/long-task-final-v2.js";
|
|
5
|
+
import { closeDeliveryTask, doctorDeliveryTask, readDeliveryStatus, resumeDeliveryTask, stopCheckDeliveryTask, } from "../lib/long-task-status-v2.js";
|
|
6
|
+
import { abandonLongTaskState, approvePendingAuthorityRevision, clearFinalReceipt, clearAuthorityRevision, commitActiveAuthority, forceClearCorruptActiveState, invalidateDerivedProgress, loadActiveLongTaskAuthority, stageCompiledDeliveryContract, } from "../lib/long-task-state.js";
|
|
7
|
+
import { verifyDeliveryContract } from "../lib/long-task-verifier-v2.js";
|
|
8
|
+
import { repositoryRoot } from "../lib/long-task-workspace.js";
|
|
9
|
+
import { initializeLongTask, preflightLongTask, } from "./long-task-authoring.js";
|
|
10
|
+
import { explainLongTask } from "./long-task-explain.js";
|
|
11
|
+
export async function longTask(args) {
|
|
12
|
+
const subcommand = args[0] ?? "help";
|
|
13
|
+
if (subcommand === "help")
|
|
14
|
+
return help();
|
|
15
|
+
const workdirArgument = args[1];
|
|
16
|
+
if (!workdirArgument)
|
|
17
|
+
throw new Error(`${subcommand} requires <workdir>`);
|
|
18
|
+
const workdir = path.resolve(process.cwd(), workdirArgument);
|
|
19
|
+
if (subcommand === "init") {
|
|
20
|
+
rejectUnknown(args.slice(2), []);
|
|
21
|
+
await initializeLongTask(workdir);
|
|
22
|
+
console.log(JSON.stringify({ status: "initialized", workdir }));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (subcommand === "preflight") {
|
|
26
|
+
rejectUnknown(args.slice(2), []);
|
|
27
|
+
return preflightLongTask(workdir);
|
|
28
|
+
}
|
|
29
|
+
if (subcommand === "compile")
|
|
30
|
+
return compile(workdir, args.slice(2));
|
|
31
|
+
if (subcommand === "approve-authority-revision")
|
|
32
|
+
return approveRevision(workdir, args.slice(2));
|
|
33
|
+
if (subcommand === "explain") {
|
|
34
|
+
rejectUnknown(args.slice(2), []);
|
|
35
|
+
return explainLongTask(workdir);
|
|
36
|
+
}
|
|
37
|
+
if (subcommand === "verify")
|
|
38
|
+
return verify(workdir, args.slice(2));
|
|
39
|
+
if (subcommand === "status") {
|
|
40
|
+
rejectUnknown(args.slice(2), []);
|
|
41
|
+
console.log(JSON.stringify(await readDeliveryStatus(workdir), null, 2));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (subcommand === "resume") {
|
|
45
|
+
rejectUnknown(args.slice(2), []);
|
|
46
|
+
console.log(JSON.stringify(await resumeDeliveryTask(workdir), null, 2));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (subcommand === "doctor") {
|
|
50
|
+
rejectUnknown(args.slice(2), []);
|
|
51
|
+
console.log(JSON.stringify(await doctorDeliveryTask(workdir), null, 2));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (subcommand === "final-gate")
|
|
55
|
+
return finalGate(workdir, args.slice(2));
|
|
56
|
+
if (subcommand === "stop-check") {
|
|
57
|
+
const message = option(args.slice(2), "--message") ?? "";
|
|
58
|
+
rejectOptions(args.slice(2), ["--message"]);
|
|
59
|
+
const result = await stopCheckDeliveryTask(workdir, message);
|
|
60
|
+
console.log(JSON.stringify(result));
|
|
61
|
+
if (!result.continue)
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (subcommand === "close") {
|
|
66
|
+
rejectUnknown(args.slice(2), []);
|
|
67
|
+
const result = await closeDeliveryTask(workdir);
|
|
68
|
+
console.log(JSON.stringify({
|
|
69
|
+
status: result.status,
|
|
70
|
+
workdir,
|
|
71
|
+
workflow_status: result.workflow_status,
|
|
72
|
+
external_confirmations: result.external_confirmations,
|
|
73
|
+
}));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (subcommand === "abandon") {
|
|
77
|
+
const forceCorruptState = args.length === 3 && args[2] === "--force-corrupt-state";
|
|
78
|
+
if (args.length > 2 && !forceCorruptState)
|
|
79
|
+
throw new Error(`Unknown or injected arguments: ${args.slice(2).join(" ")}`);
|
|
80
|
+
const root = await repositoryRoot(process.cwd());
|
|
81
|
+
if (forceCorruptState)
|
|
82
|
+
await forceClearCorruptActiveState(root, workdir);
|
|
83
|
+
else
|
|
84
|
+
await abandonLongTaskState(root, workdir);
|
|
85
|
+
console.log(JSON.stringify({
|
|
86
|
+
status: "abandoned",
|
|
87
|
+
workdir,
|
|
88
|
+
force_corrupt_state: forceCorruptState,
|
|
89
|
+
}));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Unknown long-task subcommand: ${subcommand}`);
|
|
93
|
+
}
|
|
94
|
+
async function compile(workdir, args) {
|
|
95
|
+
const revise = args.length === 1 && args[0] === "--revise";
|
|
96
|
+
if (args.length && !revise)
|
|
97
|
+
throw new Error(`Unknown or injected arguments: ${args.join(" ")}`);
|
|
98
|
+
const root = await repositoryRoot(process.cwd());
|
|
99
|
+
const loaded = await loadActiveLongTaskAuthority(root, {
|
|
100
|
+
migrate_legacy: true,
|
|
101
|
+
});
|
|
102
|
+
const previous = loaded.authority?.authority_snapshot ?? null;
|
|
103
|
+
if (loaded.authority && loaded.authority.workdir !== path.resolve(workdir))
|
|
104
|
+
throw new Error(`active_task_exists:${loaded.authority.workdir}`);
|
|
105
|
+
const compiled = await compileDeliveryContract(workdir, process.cwd(), {
|
|
106
|
+
revise,
|
|
107
|
+
previous_authority: previous,
|
|
108
|
+
});
|
|
109
|
+
if (loaded.authority && loaded.authority.task_id !== compiled.task.id)
|
|
110
|
+
throw new Error(`active_task_exists:${loaded.authority.workdir}`);
|
|
111
|
+
const preserveProgress = previous !== null &&
|
|
112
|
+
canRetainProgressForSupportingContextRevision(previous, compiled);
|
|
113
|
+
const stagedCache = await stageCompiledDeliveryContract(compiled);
|
|
114
|
+
let authorityCommitted = false;
|
|
115
|
+
try {
|
|
116
|
+
await commitActiveAuthority({
|
|
117
|
+
candidate: compiled,
|
|
118
|
+
expected_previous_identity: loaded.authority?.active_authority_identity ?? null,
|
|
119
|
+
});
|
|
120
|
+
authorityCommitted = true;
|
|
121
|
+
try {
|
|
122
|
+
await stagedCache.publish();
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
await stagedCache.discard();
|
|
126
|
+
throw new Error(`compiled_cache_projection_publish_failed:${message(error)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (!authorityCommitted)
|
|
131
|
+
await stagedCache.discard();
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
if (!previous || previous.compiled_identity !== compiled.compiled_identity) {
|
|
135
|
+
if (!preserveProgress)
|
|
136
|
+
await invalidateDerivedProgress(workdir);
|
|
137
|
+
await clearFinalReceipt(compiled.repository_root, workdir);
|
|
138
|
+
}
|
|
139
|
+
await clearAuthorityRevision(workdir);
|
|
140
|
+
console.log(JSON.stringify({
|
|
141
|
+
status: "compiled",
|
|
142
|
+
task_id: compiled.task.id,
|
|
143
|
+
compiled_identity: compiled.compiled_identity,
|
|
144
|
+
authority_revision: compiled.authority_revision,
|
|
145
|
+
effective_risk: compiled.effective_risk,
|
|
146
|
+
outcomes: compiled.outcomes.map((outcome) => outcome.key),
|
|
147
|
+
claim_coverage: compiled.claim_coverage,
|
|
148
|
+
progress_preserved: preserveProgress,
|
|
149
|
+
execution_model_checkpoint: executionModelCheckpoint(previous === null),
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
function executionModelCheckpoint(firstAuthorityLock) {
|
|
153
|
+
if (!firstAuthorityLock)
|
|
154
|
+
return { required: false };
|
|
155
|
+
return {
|
|
156
|
+
required: true,
|
|
157
|
+
phase: "post_authority_lock_pre_implementation",
|
|
158
|
+
options: ["continue_current_model", "switch_model_then_resume"],
|
|
159
|
+
message: "Authority Lock created. Pause before implementation and ask the user whether to continue with the current model or switch models, then resume this active Long-Task.",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function message(error) {
|
|
163
|
+
return error instanceof Error ? error.message : String(error);
|
|
164
|
+
}
|
|
165
|
+
async function approveRevision(workdir, args) {
|
|
166
|
+
const revision = option(args, "--revision");
|
|
167
|
+
rejectOptions(args, ["--revision"]);
|
|
168
|
+
if (!revision)
|
|
169
|
+
throw new Error("--revision requires a value");
|
|
170
|
+
await approvePendingAuthorityRevision(workdir, revision);
|
|
171
|
+
console.log(JSON.stringify({ status: "authority_revision_approved", revision }));
|
|
172
|
+
}
|
|
173
|
+
async function verify(workdir, args) {
|
|
174
|
+
const outcome = option(args, "--outcome");
|
|
175
|
+
const check = option(args, "--check");
|
|
176
|
+
rejectOptions(args, ["--outcome", "--check"]);
|
|
177
|
+
const result = await verifyDeliveryContract(workdir, { outcome, check });
|
|
178
|
+
console.log(JSON.stringify(result));
|
|
179
|
+
if (result.findings.length)
|
|
180
|
+
process.exitCode = 1;
|
|
181
|
+
}
|
|
182
|
+
async function finalGate(workdir, args) {
|
|
183
|
+
rejectUnknown(args, []);
|
|
184
|
+
const result = await runDeliveryFinalGate(workdir);
|
|
185
|
+
console.log(JSON.stringify(result));
|
|
186
|
+
if (result.workflow_status !== "machine_accepted" &&
|
|
187
|
+
result.workflow_status !== "machine_accepted_external_pending")
|
|
188
|
+
process.exitCode = 1;
|
|
189
|
+
}
|
|
190
|
+
function option(args, name) {
|
|
191
|
+
const indexes = args.flatMap((value, index) => value === name ? [index] : []);
|
|
192
|
+
if (indexes.length > 1)
|
|
193
|
+
throw new Error(`duplicate option: ${name}`);
|
|
194
|
+
if (!indexes.length)
|
|
195
|
+
return undefined;
|
|
196
|
+
const value = args[indexes[0] + 1];
|
|
197
|
+
if (!value || value.startsWith("--"))
|
|
198
|
+
throw new Error(`${name} requires a value`);
|
|
199
|
+
return value;
|
|
200
|
+
}
|
|
201
|
+
function rejectOptions(args, allowed) {
|
|
202
|
+
for (let index = 0; index < args.length; index += 2)
|
|
203
|
+
if (!allowed.includes(args[index]) || !args[index + 1])
|
|
204
|
+
throw new Error(`Unknown or injected arguments: ${args.join(" ")}`);
|
|
205
|
+
}
|
|
206
|
+
function rejectUnknown(actual, allowed) {
|
|
207
|
+
if (actual.join("\0") !== allowed.join("\0"))
|
|
208
|
+
throw new Error(`Unknown or injected arguments: ${actual.join(" ")}`);
|
|
209
|
+
}
|
|
210
|
+
function help() {
|
|
211
|
+
console.log(`ty-context long-task commands:
|
|
212
|
+
init <workdir>
|
|
213
|
+
preflight <workdir>
|
|
214
|
+
compile <workdir>
|
|
215
|
+
compile <workdir> --revise
|
|
216
|
+
approve-authority-revision <workdir> --revision <sha>
|
|
217
|
+
explain <workdir>
|
|
218
|
+
verify <workdir> [--outcome <key>] [--check <key>]
|
|
219
|
+
status <workdir>
|
|
220
|
+
resume <workdir>
|
|
221
|
+
doctor <workdir>
|
|
222
|
+
final-gate <workdir>
|
|
223
|
+
stop-check <workdir> [--message <text>]
|
|
224
|
+
close <workdir>
|
|
225
|
+
abandon <workdir> [--force-corrupt-state]`);
|
|
226
|
+
}
|
|
@@ -18,7 +18,7 @@ export async function packageSource(args) {
|
|
|
18
18
|
console.log("package source OK");
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
|
-
console.log(`ty-context package commands:
|
|
22
|
-
sync-source Update package canonical assets from this source workspace
|
|
21
|
+
console.log(`ty-context package commands:
|
|
22
|
+
sync-source Update package canonical assets from this source workspace
|
|
23
23
|
check-source Verify package canonical assets match this source workspace`);
|
|
24
24
|
}
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createUpgradePlan, formatUpgradePlan, hasUpgradePlanWork, updateModeForPlan } from "../lib/migrations.js";
|
|
1
|
+
import { createUpgradePlan, formatUpgradePlan, hasUpgradePlanWork, updateModeForPlan, } from "../lib/migrations.js";
|
|
2
2
|
import { runUpgradeReport } from "../lib/upgrade.js";
|
|
3
3
|
export async function upgrade(args = []) {
|
|
4
4
|
const options = parseArgs(args);
|
|
@@ -55,14 +55,14 @@ function parseArgs(args) {
|
|
|
55
55
|
return options;
|
|
56
56
|
}
|
|
57
57
|
function printHelp() {
|
|
58
|
-
console.log(`ty-context upgrade:
|
|
59
|
-
upgrade Run safe migrations, sync managed assets and doctor
|
|
60
|
-
upgrade --check Print the upgrade plan without writing files
|
|
61
|
-
upgrade --check --json
|
|
62
|
-
Print the upgrade plan as JSON
|
|
63
|
-
|
|
64
|
-
Update modes:
|
|
65
|
-
sync-only No migrations are pending
|
|
66
|
-
upgrade-required Safe migrations are pending
|
|
58
|
+
console.log(`ty-context upgrade:
|
|
59
|
+
upgrade Run safe migrations, sync managed assets and doctor
|
|
60
|
+
upgrade --check Print the upgrade plan without writing files
|
|
61
|
+
upgrade --check --json
|
|
62
|
+
Print the upgrade plan as JSON
|
|
63
|
+
|
|
64
|
+
Update modes:
|
|
65
|
+
sync-only No migrations are pending
|
|
66
|
+
upgrade-required Safe migrations are pending
|
|
67
67
|
manual-required Manual review or blockers are present`);
|
|
68
68
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
export { commands } from "./commands/index.js";
|
|
2
|
-
export
|
|
2
|
+
export { compileDeliveryContract, type CompileDeliveryOptionsV2, } from "./lib/long-task-delivery-compiler.js";
|
|
3
|
+
export { DELIVERY_CONTRACT_FILE, parseDeliveryContract, parseDeliveryContractBundle, } from "./lib/long-task-delivery-parser.js";
|
|
4
|
+
export { evaluateContractBoundary } from "./lib/long-task-boundary-check.js";
|
|
5
|
+
export { classifyLongTaskRisk, validateRiskProof, } from "./lib/long-task-risk.js";
|
|
6
|
+
export { verifyDeliveryContract } from "./lib/long-task-verifier-v2.js";
|
|
7
|
+
export { runDeliveryFinalGate } from "./lib/long-task-final-v2.js";
|
|
8
|
+
export { closeDeliveryTask, type DeliveryStatusV2, doctorDeliveryTask, readDeliveryStatus, resumeDeliveryTask, stopCheckDeliveryTask, } from "./lib/long-task-status-v2.js";
|
|
9
|
+
export { readActiveLongTaskBinding, readCompiledDeliveryContract, readFinalReceipt, } from "./lib/long-task-state.js";
|
|
10
|
+
export type { HarnessConfig, HarnessProfile, ManagedFile, SourceMapping, } from "./lib/types.js";
|
|
11
|
+
export type { CheckExecutionResultV2, CompiledDeliveryContractV2, DeliveryAssertionV2, DeliveryCheckV2, DeliveryContractV2, DeliveryOutcomeV2, EffectiveRiskLevel, ExternalConfirmationV2, FinalReceiptV2, LongTaskFindingV2, LongTaskRiskFacts, ProofSurface, ProgressRecordV2, RequestedRiskLevel, RunnerType, SourceClaimV2, TargetedVerificationResultV2, } from "./lib/long-task-delivery-types.js";
|
|
12
|
+
export type { BoundaryCheckDecisionV2, BoundaryCheckInputV2, } from "./lib/long-task-boundary-check.js";
|
package/dist/index.js
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
1
|
export { commands } from "./commands/index.js";
|
|
2
|
+
export { compileDeliveryContract, } from "./lib/long-task-delivery-compiler.js";
|
|
3
|
+
export { DELIVERY_CONTRACT_FILE, parseDeliveryContract, parseDeliveryContractBundle, } from "./lib/long-task-delivery-parser.js";
|
|
4
|
+
export { evaluateContractBoundary } from "./lib/long-task-boundary-check.js";
|
|
5
|
+
export { classifyLongTaskRisk, validateRiskProof, } from "./lib/long-task-risk.js";
|
|
6
|
+
export { verifyDeliveryContract } from "./lib/long-task-verifier-v2.js";
|
|
7
|
+
export { runDeliveryFinalGate } from "./lib/long-task-final-v2.js";
|
|
8
|
+
export { closeDeliveryTask, doctorDeliveryTask, readDeliveryStatus, resumeDeliveryTask, stopCheckDeliveryTask, } from "./lib/long-task-status-v2.js";
|
|
9
|
+
export { readActiveLongTaskBinding, readCompiledDeliveryContract, readFinalReceipt, } from "./lib/long-task-state.js";
|
package/dist/lib/config.js
CHANGED
|
@@ -7,22 +7,31 @@ export function defaultConfig(root) {
|
|
|
7
7
|
return {
|
|
8
8
|
core: {
|
|
9
9
|
package: CANONICAL_CORE_PACKAGE,
|
|
10
|
-
schema_version: CURRENT_SCHEMA_VERSION
|
|
10
|
+
schema_version: CURRENT_SCHEMA_VERSION,
|
|
11
|
+
},
|
|
12
|
+
profiles: {
|
|
13
|
+
enabled: ["core-portable", "workflow-default"],
|
|
11
14
|
},
|
|
12
15
|
modularity: {
|
|
13
16
|
limit: 300,
|
|
14
|
-
policy: "strict_except_generated"
|
|
17
|
+
policy: "strict_except_generated",
|
|
15
18
|
},
|
|
16
19
|
managed_files: [
|
|
17
20
|
{ path: "AGENTS.md", strategy: "merge-block" },
|
|
18
21
|
{ path: "Makefile", strategy: "merge-block" },
|
|
19
22
|
{ path: harnessPath(root, "skills"), strategy: "managed" },
|
|
20
|
-
{
|
|
21
|
-
|
|
23
|
+
{
|
|
24
|
+
path: harnessPath(root, "ty-context-managed", "context_templates"),
|
|
25
|
+
strategy: "managed",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
path: harnessPath(root, "ty-context-managed", "make", "ty-context.mk"),
|
|
29
|
+
strategy: "managed",
|
|
30
|
+
},
|
|
22
31
|
{ path: "tools", strategy: "managed" },
|
|
23
|
-
{ path: ".github/workflows/harness.yml", strategy: "create-if-missing" }
|
|
32
|
+
{ path: ".github/workflows/harness.yml", strategy: "create-if-missing" },
|
|
24
33
|
],
|
|
25
|
-
never_overwrite: ["project_context/**", "DESIGN.md", "src/**", "tests/**"]
|
|
34
|
+
never_overwrite: ["project_context/**", "DESIGN.md", "src/**", "tests/**"],
|
|
26
35
|
};
|
|
27
36
|
}
|
|
28
37
|
export async function readConfig(projectRoot) {
|
|
@@ -48,10 +57,27 @@ export function normalizeConfig(value, root = ".agent") {
|
|
|
48
57
|
return {
|
|
49
58
|
core: {
|
|
50
59
|
package: value.core?.package ?? fallback.core.package,
|
|
51
|
-
schema_version: value.core?.schema_version ?? fallback.core.schema_version
|
|
60
|
+
schema_version: value.core?.schema_version ?? fallback.core.schema_version,
|
|
61
|
+
},
|
|
62
|
+
profiles: {
|
|
63
|
+
enabled: normalizeProfiles(value.profiles?.enabled),
|
|
52
64
|
},
|
|
53
65
|
modularity: value.modularity,
|
|
54
66
|
managed_files: value.managed_files ?? fallback.managed_files,
|
|
55
|
-
never_overwrite: value.never_overwrite ?? fallback.never_overwrite
|
|
67
|
+
never_overwrite: value.never_overwrite ?? fallback.never_overwrite,
|
|
56
68
|
};
|
|
57
69
|
}
|
|
70
|
+
const VALID_PROFILES = new Set([
|
|
71
|
+
"core-portable",
|
|
72
|
+
"workflow-default",
|
|
73
|
+
"long-task",
|
|
74
|
+
]);
|
|
75
|
+
function normalizeProfiles(value) {
|
|
76
|
+
const source = value ?? ["core-portable", "workflow-default"];
|
|
77
|
+
const enabled = source.filter((profile) => VALID_PROFILES.has(profile));
|
|
78
|
+
for (const required of ["core-portable", "workflow-default"]) {
|
|
79
|
+
if (!enabled.includes(required))
|
|
80
|
+
enabled.push(required);
|
|
81
|
+
}
|
|
82
|
+
return [...new Set(enabled)];
|
|
83
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ContextManifest } from "./context-manifest-schema.js";
|
|
2
|
+
export declare const DEFAULT_CONTEXT_TOTAL_SOFT_BUDGET_BYTES: number;
|
|
3
|
+
export declare const DEFAULT_CONTEXT_FILE_SOFT_BUDGET_BYTES: number;
|
|
4
|
+
export type DefaultContextSelectionReason = "core" | "default_area" | "default_role" | "default_child";
|
|
5
|
+
export interface DefaultContextFileFootprint {
|
|
6
|
+
path: string;
|
|
7
|
+
bytes: number;
|
|
8
|
+
reasons: DefaultContextSelectionReason[];
|
|
9
|
+
}
|
|
10
|
+
export interface DefaultContextFootprint {
|
|
11
|
+
files: DefaultContextFileFootprint[];
|
|
12
|
+
total_bytes: number;
|
|
13
|
+
duplicate_groups: string[][];
|
|
14
|
+
}
|
|
15
|
+
export declare function inspectDefaultContextFootprint(projectRootInput: string): Promise<DefaultContextFootprint>;
|
|
16
|
+
export declare function selectDefaultContextPaths(manifest: ContextManifest): Map<string, Set<DefaultContextSelectionReason>>;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parseContextManifest, } from "./context-manifest-schema.js";
|
|
5
|
+
export const DEFAULT_CONTEXT_TOTAL_SOFT_BUDGET_BYTES = 64 * 1024;
|
|
6
|
+
export const DEFAULT_CONTEXT_FILE_SOFT_BUDGET_BYTES = 16 * 1024;
|
|
7
|
+
export async function inspectDefaultContextFootprint(projectRootInput) {
|
|
8
|
+
const projectRoot = path.resolve(projectRootInput);
|
|
9
|
+
const manifestPath = "project_context/context.toml";
|
|
10
|
+
const manifestContent = await readFile(path.join(projectRoot, ...manifestPath.split("/")), "utf8");
|
|
11
|
+
const parsed = parseContextManifest(manifestContent, manifestPath);
|
|
12
|
+
if (!parsed.manifest || parsed.errors.length > 0) {
|
|
13
|
+
throw new Error(`context_manifest_invalid:${parsed.errors.join("|")}`);
|
|
14
|
+
}
|
|
15
|
+
const selected = selectDefaultContextPaths(parsed.manifest);
|
|
16
|
+
const files = [];
|
|
17
|
+
const hashes = new Map();
|
|
18
|
+
for (const [relativePath, reasons] of [...selected.entries()].sort(([left], [right]) => left.localeCompare(right))) {
|
|
19
|
+
const absolutePath = resolveProjectFile(projectRoot, relativePath);
|
|
20
|
+
const metadata = await lstat(absolutePath);
|
|
21
|
+
if (metadata.isSymbolicLink()) {
|
|
22
|
+
throw new Error(`default_context_path_symlink_not_allowed:${relativePath}`);
|
|
23
|
+
}
|
|
24
|
+
if (!metadata.isFile()) {
|
|
25
|
+
throw new Error(`default_context_path_not_file:${relativePath}`);
|
|
26
|
+
}
|
|
27
|
+
const content = await readFile(absolutePath);
|
|
28
|
+
const digest = createHash("sha256").update(content).digest("hex");
|
|
29
|
+
const group = hashes.get(digest) ?? [];
|
|
30
|
+
group.push(relativePath);
|
|
31
|
+
hashes.set(digest, group);
|
|
32
|
+
files.push({
|
|
33
|
+
path: relativePath,
|
|
34
|
+
bytes: content.byteLength,
|
|
35
|
+
reasons: [...reasons].sort(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
files,
|
|
40
|
+
total_bytes: files.reduce((total, file) => total + file.bytes, 0),
|
|
41
|
+
duplicate_groups: [...hashes.values()]
|
|
42
|
+
.filter((group) => group.length > 1)
|
|
43
|
+
.map((group) => [...group].sort())
|
|
44
|
+
.sort(([left], [right]) => left.localeCompare(right)),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function selectDefaultContextPaths(manifest) {
|
|
48
|
+
const selected = new Map();
|
|
49
|
+
const add = (value, reason) => {
|
|
50
|
+
const normalized = normalizeContextPath(value);
|
|
51
|
+
const reasons = selected.get(normalized) ?? new Set();
|
|
52
|
+
const changed = !reasons.has(reason);
|
|
53
|
+
reasons.add(reason);
|
|
54
|
+
selected.set(normalized, reasons);
|
|
55
|
+
return changed;
|
|
56
|
+
};
|
|
57
|
+
for (const core of [
|
|
58
|
+
"project_context/context.toml",
|
|
59
|
+
"project_context/global.md",
|
|
60
|
+
"project_context/architecture.md",
|
|
61
|
+
])
|
|
62
|
+
add(core, "core");
|
|
63
|
+
for (const area of manifest.areas) {
|
|
64
|
+
if (area.default)
|
|
65
|
+
add(area.context, "default_area");
|
|
66
|
+
}
|
|
67
|
+
const children = new Map(manifest.contexts.map((context) => [
|
|
68
|
+
normalizeContextPath(context.path),
|
|
69
|
+
context.default_children.map(normalizeContextPath),
|
|
70
|
+
]));
|
|
71
|
+
const queue = [];
|
|
72
|
+
const queued = new Set();
|
|
73
|
+
const enqueue = (contextPath) => {
|
|
74
|
+
if (queued.has(contextPath))
|
|
75
|
+
return;
|
|
76
|
+
queued.add(contextPath);
|
|
77
|
+
queue.push(contextPath);
|
|
78
|
+
};
|
|
79
|
+
for (const context of manifest.contexts) {
|
|
80
|
+
if (context.read_policy !== "default")
|
|
81
|
+
continue;
|
|
82
|
+
const normalized = normalizeContextPath(context.path);
|
|
83
|
+
add(normalized, "default_role");
|
|
84
|
+
enqueue(normalized);
|
|
85
|
+
}
|
|
86
|
+
while (queue.length > 0) {
|
|
87
|
+
const parent = queue.shift();
|
|
88
|
+
for (const child of children.get(parent) ?? []) {
|
|
89
|
+
add(child, "default_child");
|
|
90
|
+
enqueue(child);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return selected;
|
|
94
|
+
}
|
|
95
|
+
function resolveProjectFile(projectRoot, relativePath) {
|
|
96
|
+
const absolutePath = path.resolve(projectRoot, ...normalizeContextPath(relativePath).split("/"));
|
|
97
|
+
const relative = path.relative(projectRoot, absolutePath);
|
|
98
|
+
if (relative.startsWith(`..${path.sep}`) ||
|
|
99
|
+
relative === ".." ||
|
|
100
|
+
path.isAbsolute(relative)) {
|
|
101
|
+
throw new Error(`default_context_path_outside_project:${relativePath}`);
|
|
102
|
+
}
|
|
103
|
+
return absolutePath;
|
|
104
|
+
}
|
|
105
|
+
function normalizeContextPath(value) {
|
|
106
|
+
return value.replace(/\\/gu, "/").replace(/^\.\//u, "");
|
|
107
|
+
}
|