project-tiny-context-harness 0.2.84 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -428
- package/assets/README.md +283 -455
- package/assets/README.zh-CN.md +199 -123
- package/assets/agents/AGENTS_CORE.md +54 -67
- package/assets/context_templates/context.toml +3 -0
- package/assets/context_templates/global.md +6 -6
- package/assets/github/harness.yml +2 -2
- package/assets/skills/context_development_engineer/SKILL.md +91 -107
- package/assets/skills/context_product_plan/SKILL.md +18 -28
- package/assets/skills/context_surface_contract/SKILL.md +35 -38
- package/assets/skills/context_uiux_design/SKILL.md +31 -30
- package/assets/skills/long-task-workflow/SKILL.md +76 -0
- package/assets/skills/long-task-workflow/agents/openai.yaml +4 -0
- package/assets/skills/long-task-workflow/references/authority-lifecycle.md +41 -0
- package/assets/skills/long-task-workflow/references/contract-authoring.md +62 -0
- package/assets/skills/long-task-workflow/references/evidence-design.md +45 -0
- package/assets/skills/normal-long-task/SKILL.md +12 -489
- package/assets/skills/source-plan-authoring/SKILL.md +379 -0
- package/assets/tools/validate_context.py +293 -127
- package/dist/cli.js +3 -1
- package/dist/commands/check-modularity.js +33 -10
- package/dist/commands/composite-campaign.d.ts +1 -0
- package/dist/commands/composite-campaign.js +8 -0
- package/dist/commands/composite-long-task.d.ts +1 -6
- package/dist/commands/composite-long-task.js +7 -157
- package/dist/commands/delivery-set.d.ts +1 -0
- package/dist/commands/delivery-set.js +8 -0
- package/dist/commands/disable.d.ts +1 -0
- package/dist/commands/disable.js +15 -0
- package/dist/commands/enable.d.ts +1 -0
- package/dist/commands/enable.js +14 -0
- package/dist/commands/export-context-args.js +13 -4
- package/dist/commands/export-context.js +18 -7
- package/dist/commands/index.js +42 -30
- package/dist/commands/init.js +12 -6
- package/dist/commands/long-task-authoring.d.ts +3 -0
- package/dist/commands/long-task-authoring.js +92 -0
- package/dist/commands/long-task-explain.d.ts +1 -0
- package/dist/commands/long-task-explain.js +52 -0
- package/dist/commands/long-task.d.ts +1 -0
- package/dist/commands/long-task.js +226 -0
- package/dist/commands/package-source.js +2 -2
- package/dist/commands/upgrade.js +10 -10
- package/dist/index.d.ts +11 -1
- package/dist/index.js +8 -0
- package/dist/lib/config.js +34 -8
- package/dist/lib/context-default-footprint.d.ts +16 -0
- package/dist/lib/context-default-footprint.js +107 -0
- package/dist/lib/context-export.js +105 -41
- package/dist/lib/context-graph-snapshot.d.ts +18 -0
- package/dist/lib/context-graph-snapshot.js +171 -0
- package/dist/lib/context-manifest-schema.d.ts +28 -0
- package/dist/lib/context-manifest-schema.js +150 -0
- package/dist/lib/context-manifest.js +28 -20
- package/dist/lib/context-templates.js +5 -5
- package/dist/lib/design-md.js +1 -1
- package/dist/lib/doctor.js +54 -1
- package/dist/lib/harness-root.js +25 -8
- package/dist/lib/init.js +6 -3
- package/dist/lib/legacy-managed-scan.js +23 -7
- package/dist/lib/legacy-sdlc-migration.js +21 -11
- package/dist/lib/long-task-acceptance-reference.d.ts +22 -0
- package/dist/lib/long-task-acceptance-reference.js +46 -0
- package/dist/lib/long-task-acceptance-shape.d.ts +5 -0
- package/dist/lib/long-task-acceptance-shape.js +131 -0
- package/dist/lib/long-task-activation-validation.d.ts +21 -0
- package/dist/lib/long-task-activation-validation.js +136 -0
- package/dist/lib/long-task-artifacts.d.ts +5 -0
- package/dist/lib/long-task-artifacts.js +34 -0
- package/dist/lib/long-task-assertions-v2.d.ts +22 -0
- package/dist/lib/long-task-assertions-v2.js +212 -0
- package/dist/lib/long-task-authoring-authority-preview.d.ts +5 -0
- package/dist/lib/long-task-authoring-authority-preview.js +85 -0
- package/dist/lib/long-task-authoring-preflight-diagnostics.d.ts +8 -0
- package/dist/lib/long-task-authoring-preflight-diagnostics.js +179 -0
- package/dist/lib/long-task-authoring-preflight-repair-order.d.ts +8 -0
- package/dist/lib/long-task-authoring-preflight-repair-order.js +95 -0
- package/dist/lib/long-task-authoring-preflight-types.d.ts +46 -0
- package/dist/lib/long-task-authoring-preflight-types.js +38 -0
- package/dist/lib/long-task-authoring-preflight.d.ts +3 -0
- package/dist/lib/long-task-authoring-preflight.js +44 -0
- package/dist/lib/long-task-authority-material-diff.d.ts +17 -0
- package/dist/lib/long-task-authority-material-diff.js +152 -0
- package/dist/lib/long-task-authority-materials.d.ts +7 -0
- package/dist/lib/long-task-authority-materials.js +83 -0
- package/dist/lib/long-task-authority-policy.d.ts +168 -0
- package/dist/lib/long-task-authority-policy.js +181 -0
- package/dist/lib/long-task-authority-revision-details.d.ts +19 -0
- package/dist/lib/long-task-authority-revision-details.js +192 -0
- package/dist/lib/long-task-authority-revision-enforcement.d.ts +3 -0
- package/dist/lib/long-task-authority-revision-enforcement.js +41 -0
- package/dist/lib/long-task-authority-revision-types.d.ts +50 -0
- package/dist/lib/long-task-authority-revision-types.js +1 -0
- package/dist/lib/long-task-authority-revision.d.ts +4 -0
- package/dist/lib/long-task-authority-revision.js +188 -0
- package/dist/lib/long-task-authority-transition-policy.d.ts +62 -0
- package/dist/lib/long-task-authority-transition-policy.js +62 -0
- package/dist/lib/long-task-authority-types.d.ts +96 -0
- package/dist/lib/long-task-authority-types.js +1 -0
- package/dist/lib/long-task-authority.d.ts +7 -0
- package/dist/lib/long-task-authority.js +142 -0
- package/dist/lib/long-task-boundary-check.d.ts +15 -0
- package/dist/lib/long-task-boundary-check.js +9 -0
- package/dist/lib/long-task-check-evidence-decoder.d.ts +3 -0
- package/dist/lib/long-task-check-evidence-decoder.js +74 -0
- package/dist/lib/long-task-check-execution-policy.d.ts +18 -0
- package/dist/lib/long-task-check-execution-policy.js +36 -0
- package/dist/lib/long-task-check-runner.d.ts +2 -0
- package/dist/lib/long-task-check-runner.js +181 -0
- package/dist/lib/long-task-check-shape.d.ts +2 -0
- package/dist/lib/long-task-check-shape.js +136 -0
- package/dist/lib/long-task-claim-definitions.d.ts +7 -0
- package/dist/lib/long-task-claim-definitions.js +78 -0
- package/dist/lib/long-task-claim-proof-policy.d.ts +4 -0
- package/dist/lib/long-task-claim-proof-policy.js +57 -0
- package/dist/lib/long-task-claims.d.ts +10 -0
- package/dist/lib/long-task-claims.js +187 -0
- package/dist/lib/long-task-context-authority-topology.d.ts +7 -0
- package/dist/lib/long-task-context-authority-topology.js +37 -0
- package/dist/lib/long-task-context-authority.d.ts +14 -0
- package/dist/lib/long-task-context-authority.js +66 -0
- package/dist/lib/long-task-contract-types.d.ts +203 -0
- package/dist/lib/long-task-contract-types.js +1 -0
- package/dist/lib/long-task-counterfactual-claim-policy.d.ts +10 -0
- package/dist/lib/long-task-counterfactual-claim-policy.js +57 -0
- package/dist/lib/long-task-counterfactual-sandbox.d.ts +6 -0
- package/dist/lib/long-task-counterfactual-sandbox.js +87 -0
- package/dist/lib/long-task-counterfactual-types.d.ts +24 -0
- package/dist/lib/long-task-counterfactual-types.js +1 -0
- package/dist/lib/long-task-delivery-compiler.d.ts +10 -0
- package/dist/lib/long-task-delivery-compiler.js +129 -0
- package/dist/lib/long-task-delivery-parser.d.ts +13 -0
- package/dist/lib/long-task-delivery-parser.js +90 -0
- package/dist/lib/long-task-delivery-preflight.d.ts +5 -0
- package/dist/lib/long-task-delivery-preflight.js +151 -0
- package/dist/lib/long-task-delivery-shape.d.ts +5 -0
- package/dist/lib/long-task-delivery-shape.js +5 -0
- package/dist/lib/long-task-delivery-types.d.ts +8 -0
- package/dist/lib/long-task-delivery-types.js +8 -0
- package/dist/lib/long-task-delivery-validation.d.ts +3 -0
- package/dist/lib/long-task-delivery-validation.js +175 -0
- package/dist/lib/long-task-evidence-adapter-policy.d.ts +4 -0
- package/dist/lib/long-task-evidence-adapter-policy.js +15 -0
- package/dist/lib/long-task-evidence-adapter-types.d.ts +1 -0
- package/dist/lib/long-task-evidence-adapter-types.js +1 -0
- package/dist/lib/long-task-evidence-findings.d.ts +5 -0
- package/dist/lib/long-task-evidence-findings.js +113 -0
- package/dist/lib/long-task-evidence-sensitivity-policy.d.ts +4 -0
- package/dist/lib/long-task-evidence-sensitivity-policy.js +98 -0
- package/dist/lib/long-task-evidence-v2.d.ts +5 -0
- package/dist/lib/long-task-evidence-v2.js +226 -0
- package/dist/lib/long-task-explain-acceptance-link.d.ts +46 -0
- package/dist/lib/long-task-explain-acceptance-link.js +96 -0
- package/dist/lib/long-task-explain-claim-links.d.ts +45 -0
- package/dist/lib/long-task-explain-claim-links.js +88 -0
- package/dist/lib/long-task-explain-source-links.d.ts +93 -0
- package/dist/lib/long-task-explain-source-links.js +51 -0
- package/dist/lib/long-task-final-v2.d.ts +2 -0
- package/dist/lib/long-task-final-v2.js +124 -0
- package/dist/lib/long-task-finding-context.d.ts +3 -0
- package/dist/lib/long-task-finding-context.js +63 -0
- package/dist/lib/long-task-freshness.d.ts +3 -0
- package/dist/lib/long-task-freshness.js +80 -0
- package/dist/lib/long-task-hook-install.d.ts +9 -0
- package/dist/lib/long-task-hook-install.js +184 -0
- package/dist/lib/long-task-hook-preflight.d.ts +7 -0
- package/dist/lib/long-task-hook-preflight.js +58 -0
- package/dist/lib/long-task-observation-ownership.d.ts +2 -0
- package/dist/lib/long-task-observation-ownership.js +22 -0
- package/dist/lib/long-task-outcome-parser.d.ts +4 -0
- package/dist/lib/long-task-outcome-parser.js +100 -0
- package/dist/lib/long-task-paths.d.ts +49 -0
- package/dist/lib/long-task-paths.js +418 -0
- package/dist/lib/long-task-playwright-counterfactual-policy.d.ts +7 -0
- package/dist/lib/long-task-playwright-counterfactual-policy.js +125 -0
- package/dist/lib/long-task-playwright-evidence.d.ts +6 -0
- package/dist/lib/long-task-playwright-evidence.js +244 -0
- package/dist/lib/long-task-product-shape.d.ts +6 -0
- package/dist/lib/long-task-product-shape.js +73 -0
- package/dist/lib/long-task-progress.d.ts +4 -0
- package/dist/lib/long-task-progress.js +114 -0
- package/dist/lib/long-task-protected-files.d.ts +1 -0
- package/dist/lib/long-task-protected-files.js +30 -0
- package/dist/lib/long-task-required-proof-surfaces.d.ts +2 -0
- package/dist/lib/long-task-required-proof-surfaces.js +13 -0
- package/dist/lib/long-task-requirement-shape.d.ts +2 -0
- package/dist/lib/long-task-requirement-shape.js +18 -0
- package/dist/lib/long-task-risk-surfaces.d.ts +2 -0
- package/dist/lib/long-task-risk-surfaces.js +60 -0
- package/dist/lib/long-task-risk-types.d.ts +5 -0
- package/dist/lib/long-task-risk-types.js +12 -0
- package/dist/lib/long-task-risk.d.ts +9 -0
- package/dist/lib/long-task-risk.js +132 -0
- package/dist/lib/long-task-root-shape.d.ts +4 -0
- package/dist/lib/long-task-root-shape.js +86 -0
- package/dist/lib/long-task-runner-environment.d.ts +7 -0
- package/dist/lib/long-task-runner-environment.js +57 -0
- package/dist/lib/long-task-runner-files.d.ts +3 -0
- package/dist/lib/long-task-runner-files.js +39 -0
- package/dist/lib/long-task-runner-freeze.d.ts +2 -0
- package/dist/lib/long-task-runner-freeze.js +168 -0
- package/dist/lib/long-task-runtime-types.d.ts +214 -0
- package/dist/lib/long-task-runtime-types.js +1 -0
- package/dist/lib/long-task-shape-primitives.d.ts +17 -0
- package/dist/lib/long-task-shape-primitives.js +81 -0
- package/dist/lib/long-task-source-authority-types.d.ts +13 -0
- package/dist/lib/long-task-source-authority-types.js +1 -0
- package/dist/lib/long-task-source-claim-validation.d.ts +5 -0
- package/dist/lib/long-task-source-claim-validation.js +96 -0
- package/dist/lib/long-task-source-continuity.d.ts +4 -0
- package/dist/lib/long-task-source-continuity.js +57 -0
- package/dist/lib/long-task-source-inventory.d.ts +2 -0
- package/dist/lib/long-task-source-inventory.js +21 -0
- package/dist/lib/long-task-source-item-parser.d.ts +3 -0
- package/dist/lib/long-task-source-item-parser.js +112 -0
- package/dist/lib/long-task-source-shape.d.ts +2 -0
- package/dist/lib/long-task-source-shape.js +56 -0
- package/dist/lib/long-task-source-target-continuity.d.ts +4 -0
- package/dist/lib/long-task-source-target-continuity.js +80 -0
- package/dist/lib/long-task-source-target-index.d.ts +12 -0
- package/dist/lib/long-task-source-target-index.js +76 -0
- package/dist/lib/long-task-source-validation.d.ts +3 -0
- package/dist/lib/long-task-source-validation.js +46 -0
- package/dist/lib/long-task-state.d.ts +91 -0
- package/dist/lib/long-task-state.js +611 -0
- package/dist/lib/long-task-status-projection.d.ts +21 -0
- package/dist/lib/long-task-status-projection.js +116 -0
- package/dist/lib/long-task-status-v2.d.ts +37 -0
- package/dist/lib/long-task-status-v2.js +306 -0
- package/dist/lib/long-task-technical-shape.d.ts +3 -0
- package/dist/lib/long-task-technical-shape.js +44 -0
- package/dist/lib/long-task-verifier-authority.d.ts +12 -0
- package/dist/lib/long-task-verifier-authority.js +47 -0
- package/dist/lib/long-task-verifier-identity.d.ts +2 -0
- package/dist/lib/long-task-verifier-identity.js +55 -0
- package/dist/lib/long-task-verifier-v2.d.ts +13 -0
- package/dist/lib/long-task-verifier-v2.js +266 -0
- package/dist/lib/long-task-workspace-runtime-types.d.ts +23 -0
- package/dist/lib/long-task-workspace-runtime-types.js +1 -0
- package/dist/lib/long-task-workspace.d.ts +25 -0
- package/dist/lib/long-task-workspace.js +366 -0
- package/dist/lib/managed-file.js +20 -5
- package/dist/lib/migrations.js +156 -32
- package/dist/lib/modularity.d.ts +27 -1
- package/dist/lib/modularity.js +499 -23
- package/dist/lib/package-json-config.js +14 -5
- package/dist/lib/package-source.js +15 -3
- package/dist/lib/profiles.d.ts +13 -0
- package/dist/lib/profiles.js +66 -0
- package/dist/lib/schema-guard.js +4 -2
- package/dist/lib/source-files.js +14 -7
- package/dist/lib/source-pack-classify.js +91 -19
- package/dist/lib/source-pack-config.js +25 -8
- package/dist/lib/source-pack-export.js +84 -25
- package/dist/lib/source-pack-manifest.js +18 -6
- package/dist/lib/source-pack-records.js +35 -11
- package/dist/lib/source-pack-render.js +47 -18
- package/dist/lib/stable-json.d.ts +2 -0
- package/dist/lib/stable-json.js +21 -0
- package/dist/lib/strict-codec.d.ts +4 -0
- package/dist/lib/strict-codec.js +65 -0
- package/dist/lib/sync-engine.js +76 -24
- package/dist/lib/types.d.ts +8 -1
- package/dist/lib/upgrade.js +4 -3
- package/dist/lib/validators.js +218 -191
- package/dist/long-task-hook.d.ts +2 -0
- package/dist/long-task-hook.js +55 -0
- package/dist/schemas/long-task-delivery-v2/long-task-delivery-v2.schema.json +340 -0
- package/dist/schemas/long-task-delivery-v2/long-task-outcomes-v2.schema.json +18 -0
- package/migrations/README.md +8 -3
- package/package.json +17 -6
- package/source-mappings.yaml +0 -3
- package/assets/protected-harness-baseline.json +0 -20
- package/assets/skills/composite-long-task-workflow/SKILL.md +0 -244
- package/assets/skills/composite-long-task-workflow/assets/execution-binding.template.md +0 -57
- package/assets/skills/composite-long-task-workflow/assets/goal-objective.template.md +0 -17
- package/assets/skills/composite-long-task-workflow/references/composite-long-task-workflow-protocol.md +0 -675
- package/dist/commands/superpowers.d.ts +0 -1
- package/dist/commands/superpowers.js +0 -8
- package/dist/lib/composite-long-task-renderer.d.ts +0 -12
- package/dist/lib/composite-long-task-renderer.js +0 -109
- package/dist/lib/plan-acceptance-artifacts.d.ts +0 -1
- package/dist/lib/plan-acceptance-artifacts.js +0 -220
- package/dist/lib/plan-acceptance-evidence.d.ts +0 -2
- package/dist/lib/plan-acceptance-evidence.js +0 -108
- package/dist/lib/plan-acceptance-json.d.ts +0 -15
- package/dist/lib/plan-acceptance-json.js +0 -133
- package/dist/lib/plan-acceptance-validator.d.ts +0 -2
- package/dist/lib/plan-acceptance-validator.js +0 -209
- package/dist/lib/plan-contract-validator.d.ts +0 -2
- package/dist/lib/plan-contract-validator.js +0 -127
- package/dist/lib/plan-validator-common.d.ts +0 -24
- package/dist/lib/plan-validator-common.js +0 -196
- package/dist/lib/superpowers-task-ac010.d.ts +0 -6
- package/dist/lib/superpowers-task-ac010.js +0 -26
- package/dist/lib/superpowers-task-assertion-normalizers.d.ts +0 -3
- package/dist/lib/superpowers-task-assertion-normalizers.js +0 -74
- package/dist/lib/superpowers-task-assertions.d.ts +0 -20
- package/dist/lib/superpowers-task-assertions.js +0 -257
- package/dist/lib/superpowers-task-attempt.d.ts +0 -4
- package/dist/lib/superpowers-task-attempt.js +0 -102
- package/dist/lib/superpowers-task-command-run-correlation.d.ts +0 -8
- package/dist/lib/superpowers-task-command-run-correlation.js +0 -103
- package/dist/lib/superpowers-task-command-specs.d.ts +0 -3
- package/dist/lib/superpowers-task-command-specs.js +0 -52
- package/dist/lib/superpowers-task-compile-diagnostics.d.ts +0 -5
- package/dist/lib/superpowers-task-compile-diagnostics.js +0 -20
- package/dist/lib/superpowers-task-compile-guards.d.ts +0 -2
- package/dist/lib/superpowers-task-compile-guards.js +0 -66
- package/dist/lib/superpowers-task-compile.d.ts +0 -6
- package/dist/lib/superpowers-task-compile.js +0 -133
- package/dist/lib/superpowers-task-completion-output.d.ts +0 -52
- package/dist/lib/superpowers-task-completion-output.js +0 -228
- package/dist/lib/superpowers-task-conformance.d.ts +0 -2
- package/dist/lib/superpowers-task-conformance.js +0 -24
- package/dist/lib/superpowers-task-contradictions.d.ts +0 -6
- package/dist/lib/superpowers-task-contradictions.js +0 -126
- package/dist/lib/superpowers-task-current-evidence.d.ts +0 -3
- package/dist/lib/superpowers-task-current-evidence.js +0 -176
- package/dist/lib/superpowers-task-delivery.d.ts +0 -4
- package/dist/lib/superpowers-task-delivery.js +0 -96
- package/dist/lib/superpowers-task-derive.d.ts +0 -14
- package/dist/lib/superpowers-task-derive.js +0 -382
- package/dist/lib/superpowers-task-events.d.ts +0 -1
- package/dist/lib/superpowers-task-events.js +0 -13
- package/dist/lib/superpowers-task-evidence-kernel.d.ts +0 -19
- package/dist/lib/superpowers-task-evidence-kernel.js +0 -347
- package/dist/lib/superpowers-task-evidence-records.d.ts +0 -2
- package/dist/lib/superpowers-task-evidence-records.js +0 -55
- package/dist/lib/superpowers-task-evidence.d.ts +0 -10
- package/dist/lib/superpowers-task-evidence.js +0 -147
- package/dist/lib/superpowers-task-fields.d.ts +0 -22
- package/dist/lib/superpowers-task-fields.js +0 -276
- package/dist/lib/superpowers-task-final-card.d.ts +0 -3
- package/dist/lib/superpowers-task-final-card.js +0 -24
- package/dist/lib/superpowers-task-gates.d.ts +0 -12
- package/dist/lib/superpowers-task-gates.js +0 -155
- package/dist/lib/superpowers-task-harness-drift.d.ts +0 -11
- package/dist/lib/superpowers-task-harness-drift.js +0 -90
- package/dist/lib/superpowers-task-next-slices.d.ts +0 -1
- package/dist/lib/superpowers-task-next-slices.js +0 -12
- package/dist/lib/superpowers-task-protected-baseline.d.ts +0 -10
- package/dist/lib/superpowers-task-protected-baseline.js +0 -66
- package/dist/lib/superpowers-task-source-compile.d.ts +0 -5
- package/dist/lib/superpowers-task-source-compile.js +0 -226
- package/dist/lib/superpowers-task-source-parser.d.ts +0 -23
- package/dist/lib/superpowers-task-source-parser.js +0 -218
- package/dist/lib/superpowers-task-state-schema.d.ts +0 -440
- package/dist/lib/superpowers-task-state-schema.js +0 -66
- package/dist/lib/superpowers-task-state-shape.d.ts +0 -3
- package/dist/lib/superpowers-task-state-shape.js +0 -50
- package/dist/lib/superpowers-task-state.d.ts +0 -16
- package/dist/lib/superpowers-task-state.js +0 -246
- package/dist/lib/superpowers-task-status.d.ts +0 -2
- package/dist/lib/superpowers-task-status.js +0 -24
- package/dist/lib/superpowers-task-under-specified.d.ts +0 -7
- package/dist/lib/superpowers-task-under-specified.js +0 -61
- package/dist/lib/superpowers-task-unregistered-evidence.d.ts +0 -11
- package/dist/lib/superpowers-task-unregistered-evidence.js +0 -72
- package/dist/lib/superpowers-task-validator.d.ts +0 -5
- package/dist/lib/superpowers-task-validator.js +0 -290
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { ensureDir, listFiles, pathExists, readText, writeTextIfChanged } from "./fs.js";
|
|
4
|
+
import { ensureDir, listFiles, pathExists, readText, writeTextIfChanged, } from "./fs.js";
|
|
5
5
|
import { AGENTS_BLOCK_MARKERS } from "./managed-file.js";
|
|
6
6
|
import { SOURCE_MAPPINGS_PATH } from "./paths.js";
|
|
7
7
|
import { parseYaml } from "./yaml.js";
|
|
@@ -29,7 +29,9 @@ export async function checkSource(projectRoot) {
|
|
|
29
29
|
for (const item of expected) {
|
|
30
30
|
sourceHashes.set(item.relative, hash(item.content));
|
|
31
31
|
const targetFile = path.join(target, item.relative);
|
|
32
|
-
const existing = (await pathExists(targetFile))
|
|
32
|
+
const existing = (await pathExists(targetFile))
|
|
33
|
+
? await readText(targetFile)
|
|
34
|
+
: "";
|
|
33
35
|
if (hash(existing) !== hash(item.content)) {
|
|
34
36
|
drift.push(`${mapping.target}/${item.relative}`);
|
|
35
37
|
}
|
|
@@ -58,15 +60,25 @@ async function applyMapping(projectRoot, mapping) {
|
|
|
58
60
|
if (typeof rendered === "string") {
|
|
59
61
|
return (await writeTextIfChanged(target, rendered)) ? [mapping.target] : [];
|
|
60
62
|
}
|
|
61
|
-
await fs.rm(target, { recursive: true, force: true });
|
|
62
63
|
await ensureDir(target);
|
|
63
64
|
const changed = [];
|
|
65
|
+
const expectedRelatives = new Set(rendered.map((item) => item.relative));
|
|
64
66
|
for (const item of rendered) {
|
|
65
67
|
const targetFile = path.join(target, item.relative);
|
|
66
68
|
if (await writeTextIfChanged(targetFile, item.content)) {
|
|
67
69
|
changed.push(`${mapping.target}/${item.relative}`);
|
|
68
70
|
}
|
|
69
71
|
}
|
|
72
|
+
for (const targetFile of await listFiles(target)) {
|
|
73
|
+
if (path.basename(targetFile) === ".gitkeep") {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const relative = path.relative(target, targetFile);
|
|
77
|
+
if (!expectedRelatives.has(relative)) {
|
|
78
|
+
await fs.rm(targetFile, { force: true });
|
|
79
|
+
changed.push(`${mapping.target}/${relative}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
70
82
|
return changed;
|
|
71
83
|
}
|
|
72
84
|
async function renderMapping(projectRoot, mapping) {
|
|
@@ -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
|