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,13 @@
|
|
|
1
|
+
import type { HarnessConfig, HarnessProfile } from "./types.js";
|
|
2
|
+
export declare const HARNESS_PROFILES: readonly HarnessProfile[];
|
|
3
|
+
export declare function isProfileEnabled(config: HarnessConfig, profile: HarnessProfile): boolean;
|
|
4
|
+
export declare function assertHarnessProfileEnabled(projectRoot: string, profile: HarnessProfile): Promise<void>;
|
|
5
|
+
export declare function enableHarnessProfile(projectRoot: string, profile: string): Promise<{
|
|
6
|
+
changed: boolean;
|
|
7
|
+
config: HarnessConfig;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function disableHarnessProfile(projectRoot: string, profile: string): Promise<{
|
|
10
|
+
changed: boolean;
|
|
11
|
+
config: HarnessConfig;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function enabledManagedSkillNames(config: HarnessConfig): Set<string>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readConfig, writeConfigIfMissing } from "./config.js";
|
|
3
|
+
import { harnessConfigPath } from "./harness-root.js";
|
|
4
|
+
import { readText, writeTextIfChanged } from "./fs.js";
|
|
5
|
+
import { parseYaml, stringifyYaml } from "./yaml.js";
|
|
6
|
+
export const HARNESS_PROFILES = [
|
|
7
|
+
"core-portable",
|
|
8
|
+
"workflow-default",
|
|
9
|
+
"long-task",
|
|
10
|
+
];
|
|
11
|
+
export function isProfileEnabled(config, profile) {
|
|
12
|
+
return config.profiles.enabled.includes(profile);
|
|
13
|
+
}
|
|
14
|
+
export async function assertHarnessProfileEnabled(projectRoot, profile) {
|
|
15
|
+
const config = await readConfig(projectRoot);
|
|
16
|
+
if (!isProfileEnabled(config, profile)) {
|
|
17
|
+
throw new Error(`profile ${profile} is not enabled; run: ty-context enable ${profile}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function enableHarnessProfile(projectRoot, profile) {
|
|
21
|
+
if (!HARNESS_PROFILES.includes(profile)) {
|
|
22
|
+
throw new Error(`unknown profile ${profile}; expected one of ${HARNESS_PROFILES.join(", ")}`);
|
|
23
|
+
}
|
|
24
|
+
await writeConfigIfMissing(projectRoot);
|
|
25
|
+
const relative = await harnessConfigPath(projectRoot);
|
|
26
|
+
const file = path.join(projectRoot, relative);
|
|
27
|
+
const raw = parseYaml(await readText(file));
|
|
28
|
+
const existing = await readConfig(projectRoot);
|
|
29
|
+
const enabled = [
|
|
30
|
+
...new Set([...existing.profiles.enabled, profile]),
|
|
31
|
+
];
|
|
32
|
+
const next = { ...raw, profiles: { enabled } };
|
|
33
|
+
const changed = await writeTextIfChanged(file, stringifyYaml(next));
|
|
34
|
+
return { changed, config: await readConfig(projectRoot) };
|
|
35
|
+
}
|
|
36
|
+
export async function disableHarnessProfile(projectRoot, profile) {
|
|
37
|
+
if (profile !== "long-task") {
|
|
38
|
+
throw new Error("only long-task can be explicitly disabled");
|
|
39
|
+
}
|
|
40
|
+
await writeConfigIfMissing(projectRoot);
|
|
41
|
+
const relative = await harnessConfigPath(projectRoot);
|
|
42
|
+
const file = path.join(projectRoot, relative);
|
|
43
|
+
const raw = parseYaml(await readText(file));
|
|
44
|
+
const existing = await readConfig(projectRoot);
|
|
45
|
+
const enabled = existing.profiles.enabled.filter((item) => item !== profile);
|
|
46
|
+
const next = { ...raw, profiles: { enabled } };
|
|
47
|
+
const changed = await writeTextIfChanged(file, stringifyYaml(next));
|
|
48
|
+
return { changed, config: await readConfig(projectRoot) };
|
|
49
|
+
}
|
|
50
|
+
export function enabledManagedSkillNames(config) {
|
|
51
|
+
const names = new Set([
|
|
52
|
+
"context_development_engineer",
|
|
53
|
+
"context_full_project_export",
|
|
54
|
+
"context_harness_upgrade",
|
|
55
|
+
"context_product_plan",
|
|
56
|
+
"context_surface_contract",
|
|
57
|
+
"context_uiux_design",
|
|
58
|
+
]);
|
|
59
|
+
if (isProfileEnabled(config, "workflow-default"))
|
|
60
|
+
names.add("normal-long-task");
|
|
61
|
+
if (isProfileEnabled(config, "long-task")) {
|
|
62
|
+
names.add("long-task-workflow");
|
|
63
|
+
names.add("source-plan-authoring");
|
|
64
|
+
}
|
|
65
|
+
return names;
|
|
66
|
+
}
|
package/dist/lib/schema-guard.js
CHANGED
|
@@ -10,13 +10,15 @@ export async function assertSupportedSchema(projectRoot, commandName) {
|
|
|
10
10
|
export function unsupportedSchemaMessage(schemaVersion, commandName) {
|
|
11
11
|
const projectMajor = schemaMajor(schemaVersion);
|
|
12
12
|
const supportedMajor = schemaMajor(CURRENT_SCHEMA_VERSION);
|
|
13
|
-
if (projectMajor === undefined ||
|
|
13
|
+
if (projectMajor === undefined ||
|
|
14
|
+
supportedMajor === undefined ||
|
|
15
|
+
projectMajor <= supportedMajor) {
|
|
14
16
|
return undefined;
|
|
15
17
|
}
|
|
16
18
|
return [
|
|
17
19
|
`unsupported Harness schema version ${schemaVersion}; this CLI supports schema ${CURRENT_SCHEMA_VERSION}`,
|
|
18
20
|
`Refusing to run ${commandName} because older CLI versions must not rewrite newer projects`,
|
|
19
|
-
`Use the canonical latest CLI: ${CANONICAL_NPX_COMMAND} ${commandName}
|
|
21
|
+
`Use the canonical latest CLI: ${CANONICAL_NPX_COMMAND} ${commandName}`,
|
|
20
22
|
].join(". ");
|
|
21
23
|
}
|
|
22
24
|
export function schemaMajor(schemaVersion) {
|
package/dist/lib/source-files.js
CHANGED
|
@@ -23,9 +23,15 @@ const EXCLUDED_DIR_NAMES = new Set([
|
|
|
23
23
|
"temp",
|
|
24
24
|
"test-reports",
|
|
25
25
|
"test-results",
|
|
26
|
-
"tmp"
|
|
26
|
+
"tmp",
|
|
27
|
+
]);
|
|
28
|
+
export const SAFE_EXAMPLE_FILE_NAMES = new Set([
|
|
29
|
+
".env.example",
|
|
30
|
+
".env.sample",
|
|
31
|
+
".env.template",
|
|
32
|
+
"example.env",
|
|
33
|
+
"sample.env",
|
|
27
34
|
]);
|
|
28
|
-
export const SAFE_EXAMPLE_FILE_NAMES = new Set([".env.example", ".env.sample", ".env.template", "example.env", "sample.env"]);
|
|
29
35
|
const EXCLUDED_FILE_PATTERNS = [
|
|
30
36
|
/^\.env(?:\.|$)/i,
|
|
31
37
|
/\.log$/i,
|
|
@@ -36,7 +42,7 @@ const EXCLUDED_FILE_PATTERNS = [
|
|
|
36
42
|
/full-project-context-\d{8}T\d{6}Z\.md$/i,
|
|
37
43
|
/当前项目context-\d{8}T\d{6}Z\.md$/i,
|
|
38
44
|
/当前项目代码实现\.md$/i,
|
|
39
|
-
/(^|[-_.])(code-level-implementation|context-export|context-bundle)([-_.]|$)/i
|
|
45
|
+
/(^|[-_.])(code-level-implementation|context-export|context-bundle)([-_.]|$)/i,
|
|
40
46
|
];
|
|
41
47
|
const CODE_FILE_EXTENSIONS = [
|
|
42
48
|
".bat",
|
|
@@ -59,7 +65,7 @@ const CODE_FILE_EXTENSIONS = [
|
|
|
59
65
|
".tsx",
|
|
60
66
|
".vue",
|
|
61
67
|
".yaml",
|
|
62
|
-
".yml"
|
|
68
|
+
".yml",
|
|
63
69
|
];
|
|
64
70
|
const CODE_FILE_BASE_NAMES = new Set([
|
|
65
71
|
".env.example",
|
|
@@ -71,7 +77,7 @@ const CODE_FILE_BASE_NAMES = new Set([
|
|
|
71
77
|
"pyproject.toml",
|
|
72
78
|
"requirements.txt",
|
|
73
79
|
"setup.cfg",
|
|
74
|
-
"tsconfig.json"
|
|
80
|
+
"tsconfig.json",
|
|
75
81
|
]);
|
|
76
82
|
const CONFIG_JSON_NAMES = new Set([
|
|
77
83
|
"babel.config.json",
|
|
@@ -82,7 +88,7 @@ const CONFIG_JSON_NAMES = new Set([
|
|
|
82
88
|
"jsconfig.json",
|
|
83
89
|
"package.json",
|
|
84
90
|
"tsconfig.json",
|
|
85
|
-
"vite.config.json"
|
|
91
|
+
"vite.config.json",
|
|
86
92
|
]);
|
|
87
93
|
export function shouldIncludeCodeFile(relative) {
|
|
88
94
|
if (shouldExcludeRelativePath(relative)) {
|
|
@@ -111,7 +117,8 @@ export function shouldExcludeRelativePath(relative) {
|
|
|
111
117
|
const base = segments[segments.length - 1] ?? "";
|
|
112
118
|
const lowerBase = base.toLowerCase();
|
|
113
119
|
return EXCLUDED_FILE_PATTERNS.some((pattern) => {
|
|
114
|
-
if (SAFE_EXAMPLE_FILE_NAMES.has(lowerBase) &&
|
|
120
|
+
if (SAFE_EXAMPLE_FILE_NAMES.has(lowerBase) &&
|
|
121
|
+
pattern.source.startsWith("^\\.env")) {
|
|
115
122
|
return false;
|
|
116
123
|
}
|
|
117
124
|
return pattern.test(base) || pattern.test(normalized);
|
|
@@ -12,7 +12,7 @@ export function classifyCodeFile(relative, content, areas) {
|
|
|
12
12
|
tags,
|
|
13
13
|
routes,
|
|
14
14
|
score: scoreFor(tags, relative),
|
|
15
|
-
bucket: routingBucket(relative, areas)
|
|
15
|
+
bucket: routingBucket(relative, areas),
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
function tagsFor(relative, content, language, routes) {
|
|
@@ -27,7 +27,8 @@ function tagsFor(relative, content, language, routes) {
|
|
|
27
27
|
tags.add("cli");
|
|
28
28
|
if (/worker|scheduler|queue|runtime|cron|job/.test(lower))
|
|
29
29
|
tags.add("worker");
|
|
30
|
-
if (/schema|contract|types?\.|\.d\.ts$/.test(lower) ||
|
|
30
|
+
if (/schema|contract|types?\.|\.d\.ts$/.test(lower) ||
|
|
31
|
+
/\b(interface|type|schema)\b/.test(content))
|
|
31
32
|
tags.add("contract");
|
|
32
33
|
if (/pages|views|screens|components|\.vue$|\.tsx$|\.jsx$/.test(lower))
|
|
33
34
|
tags.add("ui");
|
|
@@ -40,12 +41,25 @@ function tagsFor(relative, content, language, routes) {
|
|
|
40
41
|
return [...tags].sort();
|
|
41
42
|
}
|
|
42
43
|
function scoreFor(tags, relative) {
|
|
43
|
-
const weights = {
|
|
44
|
-
|
|
44
|
+
const weights = {
|
|
45
|
+
entry: 50,
|
|
46
|
+
api: 35,
|
|
47
|
+
cli: 32,
|
|
48
|
+
worker: 30,
|
|
49
|
+
contract: 28,
|
|
50
|
+
ui: 24,
|
|
51
|
+
test: 18,
|
|
52
|
+
config: 12,
|
|
53
|
+
oversized: -15,
|
|
54
|
+
};
|
|
55
|
+
return (tags.reduce((sum, tag) => sum + (weights[tag] ?? 0), 0) +
|
|
56
|
+
Math.max(0, 20 - relative.split("/").length));
|
|
45
57
|
}
|
|
46
58
|
function routingBucket(relative, areas) {
|
|
47
59
|
for (const area of areas) {
|
|
48
|
-
if (area.root === "." ||
|
|
60
|
+
if (area.root === "." ||
|
|
61
|
+
relative === area.root ||
|
|
62
|
+
relative.startsWith(`${area.root}/`)) {
|
|
49
63
|
return `area:${area.id}`;
|
|
50
64
|
}
|
|
51
65
|
}
|
|
@@ -62,11 +76,17 @@ function summarizeCodeFile(relative, content, language) {
|
|
|
62
76
|
const symbols = extractSymbolSummary(content, language);
|
|
63
77
|
if (base === "package.json") {
|
|
64
78
|
const packageName = /"name"\s*:\s*"([^"]+)"/.exec(content)?.[1];
|
|
65
|
-
return packageName
|
|
79
|
+
return packageName
|
|
80
|
+
? `Defines npm package ${packageName} metadata, scripts and dependencies.`
|
|
81
|
+
: "Defines npm package metadata, scripts and dependencies.";
|
|
66
82
|
}
|
|
67
83
|
if (base.toLowerCase() === "makefile") {
|
|
68
|
-
const targets = [...content.matchAll(/^([A-Za-z0-9_.-]+):/gm)]
|
|
69
|
-
|
|
84
|
+
const targets = [...content.matchAll(/^([A-Za-z0-9_.-]+):/gm)]
|
|
85
|
+
.map((match) => match[1])
|
|
86
|
+
.slice(0, 6);
|
|
87
|
+
return targets.length > 0
|
|
88
|
+
? `Defines Make targets ${targets.join(", ")}.`
|
|
89
|
+
: "Defines Make targets for local automation.";
|
|
70
90
|
}
|
|
71
91
|
if (symbols.length > 0) {
|
|
72
92
|
return `${describeFilePurpose(relative, language)}; exposes ${symbols.slice(0, 6).join(", ")}.`;
|
|
@@ -75,15 +95,21 @@ function summarizeCodeFile(relative, content, language) {
|
|
|
75
95
|
}
|
|
76
96
|
function extractSymbolSummary(content, language) {
|
|
77
97
|
const patterns = language === "python"
|
|
78
|
-
? [
|
|
98
|
+
? [
|
|
99
|
+
/^(?:async\s+)?def\s+([A-Za-z_][\w]*)/gm,
|
|
100
|
+
/^class\s+([A-Za-z_][\w]*)/gm,
|
|
101
|
+
]
|
|
79
102
|
: language === "go"
|
|
80
|
-
? [
|
|
103
|
+
? [
|
|
104
|
+
/^func\s+(?:\([^)]+\)\s*)?([A-Za-z_][\w]*)/gm,
|
|
105
|
+
/^type\s+([A-Za-z_][\w]*)/gm,
|
|
106
|
+
]
|
|
81
107
|
: [
|
|
82
108
|
/(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/g,
|
|
83
109
|
/(?:export\s+)?class\s+([A-Za-z_$][\w$]*)/g,
|
|
84
110
|
/(?:export\s+)?interface\s+([A-Za-z_$][\w$]*)/g,
|
|
85
111
|
/(?:export\s+)?type\s+([A-Za-z_$][\w$]*)/g,
|
|
86
|
-
/(?:export\s+)?const\s+([A-Za-z_$][\w$]*)/g
|
|
112
|
+
/(?:export\s+)?const\s+([A-Za-z_$][\w$]*)/g,
|
|
87
113
|
];
|
|
88
114
|
const symbols = new Set();
|
|
89
115
|
for (const pattern of patterns) {
|
|
@@ -99,42 +125,88 @@ function extractSymbolSummary(content, language) {
|
|
|
99
125
|
}
|
|
100
126
|
function extractRouteSummary(content) {
|
|
101
127
|
const routes = new Set();
|
|
102
|
-
const patterns = [
|
|
128
|
+
const patterns = [
|
|
129
|
+
/\.(get|post|put|patch|delete|head|options)\s*\(\s*["'`]([^"'`]+)["'`]/gi,
|
|
130
|
+
/\bHandle(?:Func)?\s*\(\s*["'`]([^"'`]+)["'`]/g,
|
|
131
|
+
];
|
|
103
132
|
for (const pattern of patterns) {
|
|
104
133
|
let match;
|
|
105
134
|
while ((match = pattern.exec(content)) && routes.size < 8) {
|
|
106
|
-
routes.add(match.length === 3
|
|
135
|
+
routes.add(match.length === 3
|
|
136
|
+
? `${match[1].toUpperCase()} ${match[2]}`
|
|
137
|
+
: `route ${match[1]}`);
|
|
107
138
|
}
|
|
108
139
|
}
|
|
109
140
|
return [...routes].sort();
|
|
110
141
|
}
|
|
111
142
|
function describeFilePurpose(relative, language) {
|
|
112
143
|
const lower = relative.toLowerCase();
|
|
113
|
-
if (lower.includes("/test") ||
|
|
144
|
+
if (lower.includes("/test") ||
|
|
145
|
+
lower.includes(".test.") ||
|
|
146
|
+
lower.includes(".spec."))
|
|
114
147
|
return `Contains ${language} tests for ${path.posix.basename(relative)}`;
|
|
115
148
|
if (lower.includes("/commands/"))
|
|
116
149
|
return `Implements ${language} command handling for ${path.posix.basename(relative)}`;
|
|
117
|
-
if (lower.includes("/cli") ||
|
|
150
|
+
if (lower.includes("/cli") ||
|
|
151
|
+
lower.endsWith("/cli.ts") ||
|
|
152
|
+
lower.endsWith("/cli.js"))
|
|
118
153
|
return `Implements ${language} CLI behavior for ${path.posix.basename(relative)}`;
|
|
119
|
-
if (lower.includes("/components/") ||
|
|
154
|
+
if (lower.includes("/components/") ||
|
|
155
|
+
lower.includes("/pages/") ||
|
|
156
|
+
lower.includes("/views/"))
|
|
120
157
|
return `Implements ${language} UI behavior for ${path.posix.basename(relative)}`;
|
|
121
158
|
return `Contains ${language} implementation for ${path.posix.basename(relative)}`;
|
|
122
159
|
}
|
|
123
160
|
function isLikelyEntrypoint(relative) {
|
|
124
161
|
const lower = relative.toLowerCase();
|
|
125
162
|
const base = path.posix.basename(lower);
|
|
126
|
-
return
|
|
163
|
+
return ([
|
|
164
|
+
"package.json",
|
|
165
|
+
"makefile",
|
|
166
|
+
"dockerfile",
|
|
167
|
+
"main.go",
|
|
168
|
+
"app.py",
|
|
169
|
+
"server.py",
|
|
170
|
+
"index.ts",
|
|
171
|
+
"index.js",
|
|
172
|
+
"cli.ts",
|
|
173
|
+
"cli.js",
|
|
174
|
+
].includes(base) || /\/src\/(main|app|index)\.[tj]sx?$/.test(lower));
|
|
127
175
|
}
|
|
128
176
|
function languageFor(relative) {
|
|
129
177
|
const lower = relative.toLowerCase();
|
|
130
178
|
const base = path.posix.basename(lower);
|
|
131
179
|
if (base === "makefile")
|
|
132
180
|
return "make";
|
|
133
|
-
if (base === "dockerfile" ||
|
|
181
|
+
if (base === "dockerfile" ||
|
|
182
|
+
base.startsWith("dockerfile.") ||
|
|
183
|
+
lower.endsWith(".dockerfile"))
|
|
134
184
|
return "dockerfile";
|
|
135
185
|
if (SAFE_EXAMPLE_FILE_NAMES.has(base))
|
|
136
186
|
return "dotenv";
|
|
137
|
-
for (const [extension, language] of [
|
|
187
|
+
for (const [extension, language] of [
|
|
188
|
+
[".tsx", "tsx"],
|
|
189
|
+
[".ts", "typescript"],
|
|
190
|
+
[".jsx", "jsx"],
|
|
191
|
+
[".js", "javascript"],
|
|
192
|
+
[".mjs", "javascript"],
|
|
193
|
+
[".py", "python"],
|
|
194
|
+
[".go", "go"],
|
|
195
|
+
[".vue", "vue"],
|
|
196
|
+
[".sql", "sql"],
|
|
197
|
+
[".json", "json"],
|
|
198
|
+
[".jsonc", "jsonc"],
|
|
199
|
+
[".yaml", "yaml"],
|
|
200
|
+
[".yml", "yaml"],
|
|
201
|
+
[".toml", "toml"],
|
|
202
|
+
[".sh", "bash"],
|
|
203
|
+
[".ps1", "powershell"],
|
|
204
|
+
[".cmd", "batch"],
|
|
205
|
+
[".bat", "batch"],
|
|
206
|
+
[".graphql", "graphql"],
|
|
207
|
+
[".gql", "graphql"],
|
|
208
|
+
[".proto", "protobuf"],
|
|
209
|
+
]) {
|
|
138
210
|
if (lower.endsWith(extension))
|
|
139
211
|
return language;
|
|
140
212
|
}
|
|
@@ -12,9 +12,15 @@ export async function readSourcePackProfile(projectRoot, profileId) {
|
|
|
12
12
|
throw new Error(`source pack profile not found: ${profileId}`);
|
|
13
13
|
}
|
|
14
14
|
const parsed = parseYaml(await readText(configPath));
|
|
15
|
-
const sourcePacks = parsed && typeof parsed === "object"
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
const sourcePacks = parsed && typeof parsed === "object"
|
|
16
|
+
? parsed.source_packs
|
|
17
|
+
: undefined;
|
|
18
|
+
const profileValue = sourcePacks && typeof sourcePacks === "object"
|
|
19
|
+
? sourcePacks[profileId]
|
|
20
|
+
: undefined;
|
|
21
|
+
if (!profileValue ||
|
|
22
|
+
typeof profileValue !== "object" ||
|
|
23
|
+
Array.isArray(profileValue)) {
|
|
18
24
|
throw new Error(`source pack profile not found: ${profileId}`);
|
|
19
25
|
}
|
|
20
26
|
const value = profileValue;
|
|
@@ -23,7 +29,7 @@ export async function readSourcePackProfile(projectRoot, profileId) {
|
|
|
23
29
|
code: readPatternList(value.code, `source_packs.${profileId}.code`, "code path"),
|
|
24
30
|
exclude: readPatternList(value.exclude, `source_packs.${profileId}.exclude`, "exclude path"),
|
|
25
31
|
verification: readStringList(value.verification, `source_packs.${profileId}.verification`),
|
|
26
|
-
maxBundleCharacters: readPositiveInteger(value.max_bundle_characters, `source_packs.${profileId}.max_bundle_characters`)
|
|
32
|
+
maxBundleCharacters: readPositiveInteger(value.max_bundle_characters, `source_packs.${profileId}.max_bundle_characters`),
|
|
27
33
|
};
|
|
28
34
|
}
|
|
29
35
|
export async function parseContextAreas(projectRoot) {
|
|
@@ -38,13 +44,21 @@ export async function parseContextAreas(projectRoot) {
|
|
|
38
44
|
const root = /root\s*=\s*"([^"]+)"/.exec(block)?.[1];
|
|
39
45
|
const context = /context\s*=\s*"([^"]+)"/.exec(block)?.[1];
|
|
40
46
|
if (id && root && context) {
|
|
41
|
-
areas.push({
|
|
47
|
+
areas.push({
|
|
48
|
+
id,
|
|
49
|
+
root: normalizeRepoPath(root, "area root"),
|
|
50
|
+
context: normalizeRepoPath(context, "area context"),
|
|
51
|
+
});
|
|
42
52
|
}
|
|
43
53
|
}
|
|
44
54
|
return areas.sort((left, right) => left.id.localeCompare(right.id));
|
|
45
55
|
}
|
|
46
56
|
export function mergePatterns(...groups) {
|
|
47
|
-
return [
|
|
57
|
+
return [
|
|
58
|
+
...new Set(groups
|
|
59
|
+
.flatMap((group) => group ?? [])
|
|
60
|
+
.map((value) => normalizeRepoPath(value, "include path"))),
|
|
61
|
+
].sort();
|
|
48
62
|
}
|
|
49
63
|
export function validatePatternList(values, label) {
|
|
50
64
|
return values.map((value) => normalizeRepoPath(value, label));
|
|
@@ -66,7 +80,8 @@ function readStringList(value, label) {
|
|
|
66
80
|
if (value === undefined) {
|
|
67
81
|
return [];
|
|
68
82
|
}
|
|
69
|
-
if (!Array.isArray(value) ||
|
|
83
|
+
if (!Array.isArray(value) ||
|
|
84
|
+
value.some((item) => typeof item !== "string" || item.trim().length === 0)) {
|
|
70
85
|
throw new Error(`<harnessRoot>/config.yaml ${label} must be an array of non-empty strings`);
|
|
71
86
|
}
|
|
72
87
|
return value.map((item) => item.trim());
|
|
@@ -81,7 +96,9 @@ function readPositiveInteger(value, label) {
|
|
|
81
96
|
return Number(value);
|
|
82
97
|
}
|
|
83
98
|
function isAllowedPatternPath(value) {
|
|
84
|
-
return value.length > 0 &&
|
|
99
|
+
return (value.length > 0 &&
|
|
100
|
+
!path.posix.isAbsolute(value) &&
|
|
101
|
+
!value.split("/").includes(".."));
|
|
85
102
|
}
|
|
86
103
|
function globToRegExp(pattern) {
|
|
87
104
|
const escaped = pattern
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { artifactReport, buildManifest, pruneTimestampedExports, readPackageVersion, writeArtifactSet } from "./source-pack-manifest.js";
|
|
3
|
-
import { mergePatterns, parseContextAreas, readSourcePackProfile, validatePatternList } from "./source-pack-config.js";
|
|
4
|
-
import { collectCodeRecords, collectContextArtifacts, countRedactionWarnings, repoRelative } from "./source-pack-records.js";
|
|
5
|
-
import { renderBundleArtifact, renderCodeIndexArtifact, renderFullProjectContextArtifact, renderTaskContextArtifact } from "./source-pack-render.js";
|
|
2
|
+
import { artifactReport, buildManifest, pruneTimestampedExports, readPackageVersion, writeArtifactSet, } from "./source-pack-manifest.js";
|
|
3
|
+
import { mergePatterns, parseContextAreas, readSourcePackProfile, validatePatternList, } from "./source-pack-config.js";
|
|
4
|
+
import { collectCodeRecords, collectContextArtifacts, countRedactionWarnings, repoRelative, } from "./source-pack-records.js";
|
|
5
|
+
import { renderBundleArtifact, renderCodeIndexArtifact, renderFullProjectContextArtifact, renderTaskContextArtifact, } from "./source-pack-render.js";
|
|
6
6
|
const DEFAULT_EXPORT_DIR = "tmp/ty-context/context-exports";
|
|
7
7
|
const DEFAULT_MAX_PACK_FILES = 5;
|
|
8
8
|
const DEFAULT_MAX_BUNDLE_CHARACTERS = 800_000;
|
|
@@ -18,20 +18,27 @@ export async function runSourcePackExport(projectRoot, options) {
|
|
|
18
18
|
const includeCode = mergePatterns(profile.code, validatePatternList(options.includeCode ?? [], "include code path"));
|
|
19
19
|
const includeContext = mergePatterns(profile.context, validatePatternList(options.includeContext ?? [], "include context path"));
|
|
20
20
|
const exclude = mergePatterns(profile.exclude);
|
|
21
|
-
const maxBundleCharacters = options.maxBundleCharacters ??
|
|
21
|
+
const maxBundleCharacters = options.maxBundleCharacters ??
|
|
22
|
+
profile.maxBundleCharacters ??
|
|
23
|
+
DEFAULT_MAX_BUNDLE_CHARACTERS;
|
|
22
24
|
const bundleStrategy = options.bundleStrategy ?? "auto";
|
|
23
25
|
const records = await collectCodeRecords(projectRoot, warnings, {
|
|
24
26
|
include: includeCode.length > 0 ? includeCode : undefined,
|
|
25
27
|
exclude,
|
|
26
|
-
areas
|
|
28
|
+
areas,
|
|
27
29
|
});
|
|
28
|
-
const contexts = await collectContextArtifacts(projectRoot, warnings, options.mode === "task-context" && includeContext.length > 0
|
|
30
|
+
const contexts = await collectContextArtifacts(projectRoot, warnings, options.mode === "task-context" && includeContext.length > 0
|
|
31
|
+
? includeContext
|
|
32
|
+
: undefined);
|
|
29
33
|
const taskName = options.taskName ?? "";
|
|
30
34
|
const command = options.command ?? commandFor(options);
|
|
31
35
|
const toolVersion = await readPackageVersion();
|
|
32
36
|
const recommendedUploadSets = uploadSets(options.mode, taskName);
|
|
33
37
|
const artifacts = [];
|
|
34
|
-
if (options.mode === "code-index" ||
|
|
38
|
+
if (options.mode === "code-index" ||
|
|
39
|
+
options.mode === "source-pack" ||
|
|
40
|
+
options.mode === "code-bundles" ||
|
|
41
|
+
options.mode === "task-context") {
|
|
35
42
|
assignBundles(records, maxBundleCharacters, bundleStrategy);
|
|
36
43
|
artifacts.push(markdownArtifact("code-index", "code-index.md", renderCodeIndexArtifact(records, areas, warnings, meta(generatedAt, "code-index.md", command, toolVersion)), records.length, sumLines(records), warnings.length));
|
|
37
44
|
}
|
|
@@ -52,10 +59,13 @@ export async function runSourcePackExport(projectRoot, options) {
|
|
|
52
59
|
generatedAt,
|
|
53
60
|
command,
|
|
54
61
|
maxPackFiles,
|
|
55
|
-
artifacts: nonManifestArtifacts.map((artifact) => ({
|
|
62
|
+
artifacts: nonManifestArtifacts.map((artifact) => ({
|
|
63
|
+
...artifact,
|
|
64
|
+
relativePath: `${DEFAULT_EXPORT_DIR}/latest/${artifact.name}`,
|
|
65
|
+
})),
|
|
56
66
|
warnings,
|
|
57
67
|
omitted,
|
|
58
|
-
recommendedUploadSets
|
|
68
|
+
recommendedUploadSets,
|
|
59
69
|
});
|
|
60
70
|
artifacts.unshift({
|
|
61
71
|
kind: "manifest",
|
|
@@ -64,7 +74,7 @@ export async function runSourcePackExport(projectRoot, options) {
|
|
|
64
74
|
content: manifest,
|
|
65
75
|
sourceCount: 0,
|
|
66
76
|
sourceLineCount: 0,
|
|
67
|
-
warningCount: warnings.length
|
|
77
|
+
warningCount: warnings.length,
|
|
68
78
|
});
|
|
69
79
|
for (const artifact of artifacts) {
|
|
70
80
|
if (!artifact.relativePath) {
|
|
@@ -95,7 +105,7 @@ export async function runSourcePackExport(projectRoot, options) {
|
|
|
95
105
|
warnings,
|
|
96
106
|
omitted,
|
|
97
107
|
recommendedUploadSets,
|
|
98
|
-
wrote: !options.check
|
|
108
|
+
wrote: !options.check,
|
|
99
109
|
};
|
|
100
110
|
}
|
|
101
111
|
function addDefaultBundles(artifacts, records, contexts, maxPackFiles, warnings, generatedAt, command, toolVersion) {
|
|
@@ -160,12 +170,18 @@ function assignTaskBundles(records, maxCharacters) {
|
|
|
160
170
|
function sortedRecords(records, bundleStrategy) {
|
|
161
171
|
return [...records].sort((left, right) => {
|
|
162
172
|
if (bundleStrategy === "area" || bundleStrategy === "config") {
|
|
163
|
-
return left.bucket.localeCompare(right.bucket) ||
|
|
173
|
+
return (left.bucket.localeCompare(right.bucket) ||
|
|
174
|
+
right.score - left.score ||
|
|
175
|
+
left.relative.localeCompare(right.relative));
|
|
164
176
|
}
|
|
165
177
|
if (bundleStrategy === "topdir") {
|
|
166
|
-
return topDir(left).localeCompare(topDir(right)) ||
|
|
178
|
+
return (topDir(left).localeCompare(topDir(right)) ||
|
|
179
|
+
right.score - left.score ||
|
|
180
|
+
left.relative.localeCompare(right.relative));
|
|
167
181
|
}
|
|
168
|
-
return right.score - left.score ||
|
|
182
|
+
return (right.score - left.score ||
|
|
183
|
+
left.bucket.localeCompare(right.bucket) ||
|
|
184
|
+
left.relative.localeCompare(right.relative));
|
|
169
185
|
});
|
|
170
186
|
}
|
|
171
187
|
function topDir(record) {
|
|
@@ -173,23 +189,55 @@ function topDir(record) {
|
|
|
173
189
|
}
|
|
174
190
|
function omittedSummary(records) {
|
|
175
191
|
const omitted = records.filter((record) => record.bundle === "omitted");
|
|
176
|
-
return {
|
|
192
|
+
return {
|
|
193
|
+
source_file_count: omitted.length,
|
|
194
|
+
reason_counts: omitted.length > 0 ? { bundle_budget: omitted.length } : {},
|
|
195
|
+
};
|
|
177
196
|
}
|
|
178
197
|
function markdownArtifact(kind, name, content, sourceCount, sourceLineCount, warningCount) {
|
|
179
|
-
return {
|
|
198
|
+
return {
|
|
199
|
+
kind,
|
|
200
|
+
name,
|
|
201
|
+
relativePath: "",
|
|
202
|
+
content,
|
|
203
|
+
sourceCount,
|
|
204
|
+
sourceLineCount,
|
|
205
|
+
warningCount,
|
|
206
|
+
};
|
|
180
207
|
}
|
|
181
208
|
function meta(generatedAt, artifactName, command, toolVersion) {
|
|
182
|
-
return {
|
|
209
|
+
return {
|
|
210
|
+
generatedAt,
|
|
211
|
+
outputPath: `tmp/ty-context/context-exports/latest/${artifactName}`,
|
|
212
|
+
command,
|
|
213
|
+
toolVersion,
|
|
214
|
+
};
|
|
183
215
|
}
|
|
184
216
|
function uploadSets(mode, taskName) {
|
|
185
217
|
const base = `${DEFAULT_EXPORT_DIR}/latest`;
|
|
186
218
|
const sets = {
|
|
187
|
-
daily_planning: [
|
|
188
|
-
|
|
189
|
-
|
|
219
|
+
daily_planning: [
|
|
220
|
+
`${base}/full-project-context.md`,
|
|
221
|
+
`${base}/code-index.md`,
|
|
222
|
+
],
|
|
223
|
+
cross_module_review: [
|
|
224
|
+
`${base}/full-project-context.md`,
|
|
225
|
+
`${base}/code-index.md`,
|
|
226
|
+
`${base}/code-bundle-core.md`,
|
|
227
|
+
`${base}/code-bundle-extended.md`,
|
|
228
|
+
],
|
|
229
|
+
full_fallback: [
|
|
230
|
+
`${base}/full-project-context.md`,
|
|
231
|
+
`${base}/code-index.md`,
|
|
232
|
+
`${DEFAULT_EXPORT_DIR}/code-level-implementation-<timestamp>/code-level-implementation.md`,
|
|
233
|
+
],
|
|
190
234
|
};
|
|
191
235
|
if (mode === "task-context") {
|
|
192
|
-
sets.focused_task_handoff = [
|
|
236
|
+
sets.focused_task_handoff = [
|
|
237
|
+
`${base}/full-project-context.md`,
|
|
238
|
+
`${base}/code-index.md`,
|
|
239
|
+
`${base}/task-contexts/task-context-${taskSlug(taskName)}.md`,
|
|
240
|
+
];
|
|
193
241
|
}
|
|
194
242
|
return sets;
|
|
195
243
|
}
|
|
@@ -200,17 +248,28 @@ function validateMaxPackFiles(mode, maxPackFiles) {
|
|
|
200
248
|
if (maxPackFiles > DEFAULT_MAX_PACK_FILES) {
|
|
201
249
|
throw new Error("export-context --max-pack-files cannot exceed 5 for Source Pack modes");
|
|
202
250
|
}
|
|
203
|
-
const required = mode === "code-index"
|
|
251
|
+
const required = mode === "code-index"
|
|
252
|
+
? 2
|
|
253
|
+
: mode === "task-context"
|
|
254
|
+
? 4
|
|
255
|
+
: mode === "code-bundles"
|
|
256
|
+
? 3
|
|
257
|
+
: 3;
|
|
204
258
|
if (maxPackFiles < required) {
|
|
205
259
|
throw new Error(`export-context ${mode} requires --max-pack-files >= ${required}`);
|
|
206
260
|
}
|
|
207
261
|
}
|
|
208
262
|
function commandFor(options) {
|
|
209
|
-
const flag = options.mode === "task-context"
|
|
263
|
+
const flag = options.mode === "task-context"
|
|
264
|
+
? `--task-context ${options.taskName ?? ""}`
|
|
265
|
+
: `--${options.mode}`;
|
|
210
266
|
return `ty-context export-context ${flag}`;
|
|
211
267
|
}
|
|
212
268
|
function taskSlug(value) {
|
|
213
|
-
return value
|
|
269
|
+
return (value
|
|
270
|
+
.toLowerCase()
|
|
271
|
+
.replace(/[^a-z0-9._-]+/g, "-")
|
|
272
|
+
.replace(/^-+|-+$/g, "") || "task");
|
|
214
273
|
}
|
|
215
274
|
function sumLines(records) {
|
|
216
275
|
return records.reduce((sum, record) => sum + record.lines, 0);
|