@sun-asterisk/sungen 3.2.34-beta.1 → 3.3.0-alpha.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/dist/basis/anchor-grammar.d.ts +32 -0
- package/dist/basis/anchor-grammar.d.ts.map +1 -0
- package/dist/basis/anchor-grammar.js +82 -0
- package/dist/basis/anchor-grammar.js.map +1 -0
- package/dist/basis/anchor-hash.d.ts +6 -0
- package/dist/basis/anchor-hash.d.ts.map +1 -0
- package/dist/basis/anchor-hash.js +28 -0
- package/dist/basis/anchor-hash.js.map +1 -0
- package/dist/basis/bm51-tables.d.ts +20 -0
- package/dist/basis/bm51-tables.d.ts.map +1 -0
- package/dist/basis/bm51-tables.js +71 -0
- package/dist/basis/bm51-tables.js.map +1 -0
- package/dist/basis/extract-spec-anchors.d.ts +39 -0
- package/dist/basis/extract-spec-anchors.d.ts.map +1 -0
- package/dist/basis/extract-spec-anchors.js +81 -0
- package/dist/basis/extract-spec-anchors.js.map +1 -0
- package/dist/basis/migration-sentinel.d.ts +47 -0
- package/dist/basis/migration-sentinel.d.ts.map +1 -0
- package/dist/basis/migration-sentinel.js +219 -0
- package/dist/basis/migration-sentinel.js.map +1 -0
- package/dist/basis/spec-frontmatter.d.ts +18 -0
- package/dist/basis/spec-frontmatter.d.ts.map +1 -0
- package/dist/basis/spec-frontmatter.js +55 -0
- package/dist/basis/spec-frontmatter.js.map +1 -0
- package/dist/basis/spec-sections.d.ts +18 -0
- package/dist/basis/spec-sections.d.ts.map +1 -0
- package/dist/basis/spec-sections.js +27 -0
- package/dist/basis/spec-sections.js.map +1 -0
- package/dist/basis/test-basis-schema.d.ts +28 -0
- package/dist/basis/test-basis-schema.d.ts.map +1 -0
- package/dist/basis/test-basis-schema.js +141 -0
- package/dist/basis/test-basis-schema.js.map +1 -0
- package/dist/capabilities/registry.d.ts +15 -0
- package/dist/capabilities/registry.d.ts.map +1 -1
- package/dist/capabilities/registry.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +3 -29
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/capability.js +1 -1
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/contract-derive-command.d.ts +10 -0
- package/dist/cli/commands/contract-derive-command.d.ts.map +1 -0
- package/dist/cli/commands/contract-derive-command.js +99 -0
- package/dist/cli/commands/contract-derive-command.js.map +1 -0
- package/dist/cli/commands/contract.d.ts +17 -0
- package/dist/cli/commands/contract.d.ts.map +1 -0
- package/dist/cli/commands/contract.js +162 -0
- package/dist/cli/commands/contract.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +52 -3
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +3 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/journey.d.ts.map +1 -1
- package/dist/cli/commands/journey.js +41 -13
- package/dist/cli/commands/journey.js.map +1 -1
- package/dist/cli/commands/next.d.ts +8 -0
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +64 -6
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/update.d.ts +11 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +31 -6
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +20 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/contract/approve-contract.d.ts +31 -0
- package/dist/contract/approve-contract.d.ts.map +1 -0
- package/dist/contract/approve-contract.js +87 -0
- package/dist/contract/approve-contract.js.map +1 -0
- package/dist/contract/assertion-matcher-vocabulary.d.ts +24 -0
- package/dist/contract/assertion-matcher-vocabulary.d.ts.map +1 -0
- package/dist/contract/assertion-matcher-vocabulary.js +100 -0
- package/dist/contract/assertion-matcher-vocabulary.js.map +1 -0
- package/dist/contract/build-contract-verdict.d.ts +32 -0
- package/dist/contract/build-contract-verdict.d.ts.map +1 -0
- package/dist/contract/build-contract-verdict.js +123 -0
- package/dist/contract/build-contract-verdict.js.map +1 -0
- package/dist/contract/build-trace-conformance.d.ts +18 -0
- package/dist/contract/build-trace-conformance.d.ts.map +1 -0
- package/dist/contract/build-trace-conformance.js +153 -0
- package/dist/contract/build-trace-conformance.js.map +1 -0
- package/dist/contract/classify-contract-change.d.ts +23 -0
- package/dist/contract/classify-contract-change.d.ts.map +1 -0
- package/dist/contract/classify-contract-change.js +98 -0
- package/dist/contract/classify-contract-change.js.map +1 -0
- package/dist/contract/classify-contract-unit.d.ts +18 -0
- package/dist/contract/classify-contract-unit.d.ts.map +1 -0
- package/dist/contract/classify-contract-unit.js +49 -0
- package/dist/contract/classify-contract-unit.js.map +1 -0
- package/dist/contract/classify-trace-conformance.d.ts +32 -0
- package/dist/contract/classify-trace-conformance.d.ts.map +1 -0
- package/dist/contract/classify-trace-conformance.js +117 -0
- package/dist/contract/classify-trace-conformance.js.map +1 -0
- package/dist/contract/contract-git.d.ts +24 -0
- package/dist/contract/contract-git.d.ts.map +1 -0
- package/dist/contract/contract-git.js +144 -0
- package/dist/contract/contract-git.js.map +1 -0
- package/dist/contract/contract-hash.d.ts +7 -0
- package/dist/contract/contract-hash.d.ts.map +1 -0
- package/dist/contract/contract-hash.js +38 -0
- package/dist/contract/contract-hash.js.map +1 -0
- package/dist/contract/contract-report-file.d.ts +4 -0
- package/dist/contract/contract-report-file.d.ts.map +1 -0
- package/dist/contract/contract-report-file.js +60 -0
- package/dist/contract/contract-report-file.js.map +1 -0
- package/dist/contract/contract-schema.d.ts +71 -0
- package/dist/contract/contract-schema.d.ts.map +1 -0
- package/dist/contract/contract-schema.js +102 -0
- package/dist/contract/contract-schema.js.map +1 -0
- package/dist/contract/contract-units.d.ts +12 -0
- package/dist/contract/contract-units.d.ts.map +1 -0
- package/dist/contract/contract-units.js +96 -0
- package/dist/contract/contract-units.js.map +1 -0
- package/dist/contract/contracts-lock-file.d.ts +24 -0
- package/dist/contract/contracts-lock-file.d.ts.map +1 -0
- package/dist/contract/contracts-lock-file.js +140 -0
- package/dist/contract/contracts-lock-file.js.map +1 -0
- package/dist/contract/data-normalize.d.ts +10 -0
- package/dist/contract/data-normalize.d.ts.map +1 -0
- package/dist/contract/data-normalize.js +110 -0
- package/dist/contract/data-normalize.js.map +1 -0
- package/dist/contract/derive-free-feature.d.ts +30 -0
- package/dist/contract/derive-free-feature.d.ts.map +1 -0
- package/dist/contract/derive-free-feature.js +145 -0
- package/dist/contract/derive-free-feature.js.map +1 -0
- package/dist/contract/field-semantic-redaction.d.ts +21 -0
- package/dist/contract/field-semantic-redaction.d.ts.map +1 -0
- package/dist/contract/field-semantic-redaction.js +118 -0
- package/dist/contract/field-semantic-redaction.js.map +1 -0
- package/dist/contract/free-feature-blocks.d.ts +10 -0
- package/dist/contract/free-feature-blocks.d.ts.map +1 -0
- package/dist/contract/free-feature-blocks.js +94 -0
- package/dist/contract/free-feature-blocks.js.map +1 -0
- package/dist/contract/lock-secret-guard.d.ts +22 -0
- package/dist/contract/lock-secret-guard.d.ts.map +1 -0
- package/dist/contract/lock-secret-guard.js +134 -0
- package/dist/contract/lock-secret-guard.js.map +1 -0
- package/dist/contract/lock-vs-git-head.d.ts +26 -0
- package/dist/contract/lock-vs-git-head.d.ts.map +1 -0
- package/dist/contract/lock-vs-git-head.js +28 -0
- package/dist/contract/lock-vs-git-head.js.map +1 -0
- package/dist/contract/normalize-contract-step.d.ts +21 -0
- package/dist/contract/normalize-contract-step.d.ts.map +1 -0
- package/dist/contract/normalize-contract-step.js +70 -0
- package/dist/contract/normalize-contract-step.js.map +1 -0
- package/dist/contract/normalize-feature-steps.d.ts +7 -0
- package/dist/contract/normalize-feature-steps.d.ts.map +1 -0
- package/dist/contract/normalize-feature-steps.js +127 -0
- package/dist/contract/normalize-feature-steps.js.map +1 -0
- package/dist/contract/oracle-strength.d.ts +12 -0
- package/dist/contract/oracle-strength.d.ts.map +1 -0
- package/dist/contract/oracle-strength.js +88 -0
- package/dist/contract/oracle-strength.js.map +1 -0
- package/dist/contract/project-contract-blockers.d.ts +10 -0
- package/dist/contract/project-contract-blockers.d.ts.map +1 -0
- package/dist/contract/project-contract-blockers.js +73 -0
- package/dist/contract/project-contract-blockers.js.map +1 -0
- package/dist/contract/record-contract-approval.d.ts +21 -0
- package/dist/contract/record-contract-approval.d.ts.map +1 -0
- package/dist/contract/record-contract-approval.js +98 -0
- package/dist/contract/record-contract-approval.js.map +1 -0
- package/dist/contract/render-free-gherkin.d.ts +40 -0
- package/dist/contract/render-free-gherkin.d.ts.map +1 -0
- package/dist/contract/render-free-gherkin.js +141 -0
- package/dist/contract/render-free-gherkin.js.map +1 -0
- package/dist/contract/render-trace-sentence.d.ts +20 -0
- package/dist/contract/render-trace-sentence.d.ts.map +1 -0
- package/dist/contract/render-trace-sentence.js +109 -0
- package/dist/contract/render-trace-sentence.js.map +1 -0
- package/dist/contract/render-trace-target.d.ts +14 -0
- package/dist/contract/render-trace-target.d.ts.map +1 -0
- package/dist/contract/render-trace-target.js +70 -0
- package/dist/contract/render-trace-target.js.map +1 -0
- package/dist/contract/resolve-unit-trace-identities.d.ts +8 -0
- package/dist/contract/resolve-unit-trace-identities.d.ts.map +1 -0
- package/dist/contract/resolve-unit-trace-identities.js +78 -0
- package/dist/contract/resolve-unit-trace-identities.js.map +1 -0
- package/dist/contract/trace/collect-trace-evidence.d.ts +33 -0
- package/dist/contract/trace/collect-trace-evidence.d.ts.map +1 -0
- package/dist/contract/trace/collect-trace-evidence.js +161 -0
- package/dist/contract/trace/collect-trace-evidence.js.map +1 -0
- package/dist/contract/trace/identity-cache.d.ts +19 -0
- package/dist/contract/trace/identity-cache.d.ts.map +1 -0
- package/dist/contract/trace/identity-cache.js +104 -0
- package/dist/contract/trace/identity-cache.js.map +1 -0
- package/dist/contract/trace/select-final-attempt.d.ts +27 -0
- package/dist/contract/trace/select-final-attempt.d.ts.map +1 -0
- package/dist/contract/trace/select-final-attempt.js +116 -0
- package/dist/contract/trace/select-final-attempt.js.map +1 -0
- package/dist/contract/trace/snapshot-html-renderer.d.ts +31 -0
- package/dist/contract/trace/snapshot-html-renderer.d.ts.map +1 -0
- package/dist/contract/trace/snapshot-html-renderer.js +172 -0
- package/dist/contract/trace/snapshot-html-renderer.js.map +1 -0
- package/dist/contract/trace/snapshot-resolver.d.ts +21 -0
- package/dist/contract/trace/snapshot-resolver.d.ts.map +1 -0
- package/dist/contract/trace/snapshot-resolver.js +65 -0
- package/dist/contract/trace/snapshot-resolver.js.map +1 -0
- package/dist/contract/trace/snapshot-store.d.ts +66 -0
- package/dist/contract/trace/snapshot-store.d.ts.map +1 -0
- package/dist/contract/trace/snapshot-store.js +173 -0
- package/dist/contract/trace/snapshot-store.js.map +1 -0
- package/dist/contract/trace/target-identity.d.ts +74 -0
- package/dist/contract/trace/target-identity.d.ts.map +1 -0
- package/dist/contract/trace/target-identity.js +68 -0
- package/dist/contract/trace/target-identity.js.map +1 -0
- package/dist/contract/trace/test-step-join.d.ts +65 -0
- package/dist/contract/trace/test-step-join.d.ts.map +1 -0
- package/dist/contract/trace/test-step-join.js +80 -0
- package/dist/contract/trace/test-step-join.js.map +1 -0
- package/dist/contract/trace/trace-binding.d.ts +21 -0
- package/dist/contract/trace/trace-binding.d.ts.map +1 -0
- package/dist/contract/trace/trace-binding.js +88 -0
- package/dist/contract/trace/trace-binding.js.map +1 -0
- package/dist/contract/trace/trace-file-reader.d.ts +35 -0
- package/dist/contract/trace/trace-file-reader.d.ts.map +1 -0
- package/dist/contract/trace/trace-file-reader.js +155 -0
- package/dist/contract/trace/trace-file-reader.js.map +1 -0
- package/dist/contract/trace/trace-fingerprint.d.ts +22 -0
- package/dist/contract/trace/trace-fingerprint.d.ts.map +1 -0
- package/dist/contract/trace/trace-fingerprint.js +96 -0
- package/dist/contract/trace/trace-fingerprint.js.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts +26 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.js +84 -0
- package/dist/contract/trace/trace-identity-resolution.js.map +1 -0
- package/dist/contract/trace/trace-run-record.d.ts +27 -0
- package/dist/contract/trace/trace-run-record.d.ts.map +1 -0
- package/dist/contract/trace/trace-run-record.js +115 -0
- package/dist/contract/trace/trace-run-record.js.map +1 -0
- package/dist/contract/trace/trace-steps.d.ts +19 -0
- package/dist/contract/trace/trace-steps.d.ts.map +1 -0
- package/dist/contract/trace/trace-steps.js +79 -0
- package/dist/contract/trace/trace-steps.js.map +1 -0
- package/dist/contract/trace/trace-zip-limits.d.ts +41 -0
- package/dist/contract/trace/trace-zip-limits.d.ts.map +1 -0
- package/dist/contract/trace/trace-zip-limits.js +48 -0
- package/dist/contract/trace/trace-zip-limits.js.map +1 -0
- package/dist/contract/trace/trace-zip-reader.d.ts +10 -0
- package/dist/contract/trace/trace-zip-reader.d.ts.map +1 -0
- package/dist/contract/trace/trace-zip-reader.js +186 -0
- package/dist/contract/trace/trace-zip-reader.js.map +1 -0
- package/dist/contract/verify-approval-decisions.d.ts +5 -0
- package/dist/contract/verify-approval-decisions.d.ts.map +1 -0
- package/dist/contract/verify-approval-decisions.js +104 -0
- package/dist/contract/verify-approval-decisions.js.map +1 -0
- package/dist/decisions/append-decision.d.ts +12 -0
- package/dist/decisions/append-decision.d.ts.map +1 -0
- package/dist/decisions/append-decision.js +73 -0
- package/dist/decisions/append-decision.js.map +1 -0
- package/dist/decisions/confirmed-decision-commands.d.ts +30 -0
- package/dist/decisions/confirmed-decision-commands.d.ts.map +1 -0
- package/dist/decisions/confirmed-decision-commands.js +172 -0
- package/dist/decisions/confirmed-decision-commands.js.map +1 -0
- package/dist/decisions/decision-file.d.ts +31 -0
- package/dist/decisions/decision-file.d.ts.map +1 -0
- package/dist/decisions/decision-file.js +139 -0
- package/dist/decisions/decision-file.js.map +1 -0
- package/dist/decisions/decision-identity.d.ts +12 -0
- package/dist/decisions/decision-identity.d.ts.map +1 -0
- package/dist/decisions/decision-identity.js +78 -0
- package/dist/decisions/decision-identity.js.map +1 -0
- package/dist/decisions/decision-integrity-check.d.ts +12 -0
- package/dist/decisions/decision-integrity-check.d.ts.map +1 -0
- package/dist/decisions/decision-integrity-check.js +102 -0
- package/dist/decisions/decision-integrity-check.js.map +1 -0
- package/dist/decisions/decision-schema.d.ts +42 -0
- package/dist/decisions/decision-schema.d.ts.map +1 -0
- package/dist/decisions/decision-schema.js +75 -0
- package/dist/decisions/decision-schema.js.map +1 -0
- package/dist/decisions/decision-source.d.ts +2 -0
- package/dist/decisions/decision-source.d.ts.map +1 -0
- package/dist/decisions/decision-source.js +18 -0
- package/dist/decisions/decision-source.js.map +1 -0
- package/dist/decisions/exclusive-file-create.d.ts +3 -0
- package/dist/decisions/exclusive-file-create.d.ts.map +1 -0
- package/dist/decisions/exclusive-file-create.js +84 -0
- package/dist/decisions/exclusive-file-create.js.map +1 -0
- package/dist/decisions/git-head-trust.d.ts +7 -0
- package/dist/decisions/git-head-trust.d.ts.map +1 -0
- package/dist/decisions/git-head-trust.js +76 -0
- package/dist/decisions/git-head-trust.js.map +1 -0
- package/dist/decisions/human-confirmation.d.ts +33 -0
- package/dist/decisions/human-confirmation.d.ts.map +1 -0
- package/dist/decisions/human-confirmation.js +155 -0
- package/dist/decisions/human-confirmation.js.map +1 -0
- package/dist/decisions/legacy-waiver-migration.d.ts +31 -0
- package/dist/decisions/legacy-waiver-migration.d.ts.map +1 -0
- package/dist/decisions/legacy-waiver-migration.js +170 -0
- package/dist/decisions/legacy-waiver-migration.js.map +1 -0
- package/dist/decisions/read-decisions.d.ts +19 -0
- package/dist/decisions/read-decisions.d.ts.map +1 -0
- package/dist/decisions/read-decisions.js +90 -0
- package/dist/decisions/read-decisions.js.map +1 -0
- package/dist/decisions/viewpoint-baseline-adapter.d.ts +7 -0
- package/dist/decisions/viewpoint-baseline-adapter.d.ts.map +1 -0
- package/dist/decisions/viewpoint-baseline-adapter.js +109 -0
- package/dist/decisions/viewpoint-baseline-adapter.js.map +1 -0
- package/dist/decisions/waiver-decisions.d.ts +24 -0
- package/dist/decisions/waiver-decisions.d.ts.map +1 -0
- package/dist/decisions/waiver-decisions.js +46 -0
- package/dist/decisions/waiver-decisions.js.map +1 -0
- package/dist/exporters/matrix/build.d.ts +3 -0
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +10 -9
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +3 -0
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +2 -0
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/matrix/gates.d.ts +6 -1
- package/dist/exporters/matrix/gates.d.ts.map +1 -1
- package/dist/exporters/matrix/gates.js +57 -128
- package/dist/exporters/matrix/gates.js.map +1 -1
- package/dist/exporters/matrix/render-csv.d.ts.map +1 -1
- package/dist/exporters/matrix/render-csv.js +3 -0
- package/dist/exporters/matrix/render-csv.js.map +1 -1
- package/dist/exporters/matrix/render-gate-overrides-sheet.d.ts +13 -0
- package/dist/exporters/matrix/render-gate-overrides-sheet.d.ts.map +1 -0
- package/dist/exporters/matrix/render-gate-overrides-sheet.js +44 -0
- package/dist/exporters/matrix/render-gate-overrides-sheet.js.map +1 -0
- package/dist/exporters/matrix/render-xlsx.d.ts +1 -0
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
- package/dist/exporters/matrix/render-xlsx.js +3 -0
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +4 -1
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.map +1 -1
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +13 -0
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/graph/evaluate-graph.d.ts +21 -0
- package/dist/graph/evaluate-graph.d.ts.map +1 -0
- package/dist/graph/evaluate-graph.js +49 -0
- package/dist/graph/evaluate-graph.js.map +1 -0
- package/dist/graph/locate-finding.d.ts +20 -0
- package/dist/graph/locate-finding.d.ts.map +1 -0
- package/dist/graph/locate-finding.js +137 -0
- package/dist/graph/locate-finding.js.map +1 -0
- package/dist/graph/node-decl.d.ts +59 -0
- package/dist/graph/node-decl.d.ts.map +1 -0
- package/dist/graph/node-decl.js +8 -0
- package/dist/graph/node-decl.js.map +1 -0
- package/dist/graph/nodes/core-node-catalog.d.ts +7 -0
- package/dist/graph/nodes/core-node-catalog.d.ts.map +1 -0
- package/dist/graph/nodes/core-node-catalog.js +13 -0
- package/dist/graph/nodes/core-node-catalog.js.map +1 -0
- package/dist/graph/nodes/test-case-contract-nodes.d.ts +19 -0
- package/dist/graph/nodes/test-case-contract-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/test-case-contract-nodes.js +56 -0
- package/dist/graph/nodes/test-case-contract-nodes.js.map +1 -0
- package/dist/graph/nodes/test-case-nodes.d.ts +26 -0
- package/dist/graph/nodes/test-case-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/test-case-nodes.js +66 -0
- package/dist/graph/nodes/test-case-nodes.js.map +1 -0
- package/dist/graph/nodes/unit-audit-nodes.d.ts +18 -0
- package/dist/graph/nodes/unit-audit-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/unit-audit-nodes.js +95 -0
- package/dist/graph/nodes/unit-audit-nodes.js.map +1 -0
- package/dist/graph/nodes/unit-contract-node.d.ts +20 -0
- package/dist/graph/nodes/unit-contract-node.d.ts.map +1 -0
- package/dist/graph/nodes/unit-contract-node.js +81 -0
- package/dist/graph/nodes/unit-contract-node.js.map +1 -0
- package/dist/graph/nodes/unit-design-nodes.d.ts +14 -0
- package/dist/graph/nodes/unit-design-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/unit-design-nodes.js +90 -0
- package/dist/graph/nodes/unit-design-nodes.js.map +1 -0
- package/dist/graph/nodes/unit-execution-nodes.d.ts +16 -0
- package/dist/graph/nodes/unit-execution-nodes.d.ts.map +1 -0
- package/dist/graph/nodes/unit-execution-nodes.js +79 -0
- package/dist/graph/nodes/unit-execution-nodes.js.map +1 -0
- package/dist/graph/test-case-identity.d.ts +13 -0
- package/dist/graph/test-case-identity.d.ts.map +1 -0
- package/dist/graph/test-case-identity.js +106 -0
- package/dist/graph/test-case-identity.js.map +1 -0
- package/dist/graph/test-case-results.d.ts +11 -0
- package/dist/graph/test-case-results.d.ts.map +1 -0
- package/dist/graph/test-case-results.js +137 -0
- package/dist/graph/test-case-results.js.map +1 -0
- package/dist/graph/test-case-satisfied.d.ts +25 -0
- package/dist/graph/test-case-satisfied.d.ts.map +1 -0
- package/dist/graph/test-case-satisfied.js +51 -0
- package/dist/graph/test-case-satisfied.js.map +1 -0
- package/dist/graph/test-case-state-shape.d.ts +67 -0
- package/dist/graph/test-case-state-shape.d.ts.map +1 -0
- package/dist/graph/test-case-state-shape.js +3 -0
- package/dist/graph/test-case-state-shape.js.map +1 -0
- package/dist/graph/test-case-states.d.ts +9 -0
- package/dist/graph/test-case-states.d.ts.map +1 -0
- package/dist/graph/test-case-states.js +116 -0
- package/dist/graph/test-case-states.js.map +1 -0
- package/dist/graph/unit-artifact-probes.d.ts +19 -0
- package/dist/graph/unit-artifact-probes.d.ts.map +1 -0
- package/dist/graph/unit-artifact-probes.js +133 -0
- package/dist/graph/unit-artifact-probes.js.map +1 -0
- package/dist/graph/unit-state-facts.d.ts +43 -0
- package/dist/graph/unit-state-facts.d.ts.map +1 -0
- package/dist/graph/unit-state-facts.js +87 -0
- package/dist/graph/unit-state-facts.js.map +1 -0
- package/dist/harness/audit.d.ts +11 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +18 -17
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/catalog/gate-rules.yaml +647 -0
- package/dist/harness/gates/audit-gate-terms.d.ts +41 -0
- package/dist/harness/gates/audit-gate-terms.d.ts.map +1 -0
- package/dist/harness/gates/audit-gate-terms.js +72 -0
- package/dist/harness/gates/audit-gate-terms.js.map +1 -0
- package/dist/harness/gates/audit-gate-verdict.d.ts +31 -0
- package/dist/harness/gates/audit-gate-verdict.d.ts.map +1 -0
- package/dist/harness/gates/audit-gate-verdict.js +101 -0
- package/dist/harness/gates/audit-gate-verdict.js.map +1 -0
- package/dist/harness/gates/audit-input-hash.d.ts +4 -0
- package/dist/harness/gates/audit-input-hash.d.ts.map +1 -0
- package/dist/harness/gates/audit-input-hash.js +96 -0
- package/dist/harness/gates/audit-input-hash.js.map +1 -0
- package/dist/harness/gates/audit-report-verification.d.ts +32 -0
- package/dist/harness/gates/audit-report-verification.d.ts.map +1 -0
- package/dist/harness/gates/audit-report-verification.js +207 -0
- package/dist/harness/gates/audit-report-verification.js.map +1 -0
- package/dist/harness/gates/decisions-hash.d.ts +13 -0
- package/dist/harness/gates/decisions-hash.d.ts.map +1 -0
- package/dist/harness/gates/decisions-hash.js +72 -0
- package/dist/harness/gates/decisions-hash.js.map +1 -0
- package/dist/harness/gates/delivery-checklist.d.ts +21 -0
- package/dist/harness/gates/delivery-checklist.d.ts.map +1 -0
- package/dist/harness/gates/delivery-checklist.js +128 -0
- package/dist/harness/gates/delivery-checklist.js.map +1 -0
- package/dist/harness/gates/delivery-decision-gate.d.ts +29 -0
- package/dist/harness/gates/delivery-decision-gate.d.ts.map +1 -0
- package/dist/harness/gates/delivery-decision-gate.js +91 -0
- package/dist/harness/gates/delivery-decision-gate.js.map +1 -0
- package/dist/harness/gates/delivery-decision-step.d.ts +16 -0
- package/dist/harness/gates/delivery-decision-step.d.ts.map +1 -0
- package/dist/harness/gates/delivery-decision-step.js +71 -0
- package/dist/harness/gates/delivery-decision-step.js.map +1 -0
- package/dist/harness/gates/gate-override-report.d.ts +59 -0
- package/dist/harness/gates/gate-override-report.d.ts.map +1 -0
- package/dist/harness/gates/gate-override-report.js +86 -0
- package/dist/harness/gates/gate-override-report.js.map +1 -0
- package/dist/harness/gates/gate-override-scope.d.ts +18 -0
- package/dist/harness/gates/gate-override-scope.d.ts.map +1 -0
- package/dist/harness/gates/gate-override-scope.js +98 -0
- package/dist/harness/gates/gate-override-scope.js.map +1 -0
- package/dist/harness/gates/gate-override-validation.d.ts +25 -0
- package/dist/harness/gates/gate-override-validation.d.ts.map +1 -0
- package/dist/harness/gates/gate-override-validation.js +81 -0
- package/dist/harness/gates/gate-override-validation.js.map +1 -0
- package/dist/harness/gates/gate-rule-catalog.d.ts +24 -0
- package/dist/harness/gates/gate-rule-catalog.d.ts.map +1 -0
- package/dist/harness/gates/gate-rule-catalog.js +112 -0
- package/dist/harness/gates/gate-rule-catalog.js.map +1 -0
- package/dist/harness/gates/gate-terms.d.ts +33 -0
- package/dist/harness/gates/gate-terms.d.ts.map +1 -0
- package/dist/harness/gates/gate-terms.js +41 -0
- package/dist/harness/gates/gate-terms.js.map +1 -0
- package/dist/harness/gates/in-run-decision-check.d.ts +21 -0
- package/dist/harness/gates/in-run-decision-check.d.ts.map +1 -0
- package/dist/harness/gates/in-run-decision-check.js +138 -0
- package/dist/harness/gates/in-run-decision-check.js.map +1 -0
- package/dist/harness/gates/journey-gate-inputs.d.ts +37 -0
- package/dist/harness/gates/journey-gate-inputs.d.ts.map +1 -0
- package/dist/harness/gates/journey-gate-inputs.js +81 -0
- package/dist/harness/gates/journey-gate-inputs.js.map +1 -0
- package/dist/harness/gates/migrated-waiver-review.d.ts +6 -0
- package/dist/harness/gates/migrated-waiver-review.d.ts.map +1 -0
- package/dist/harness/gates/migrated-waiver-review.js +116 -0
- package/dist/harness/gates/migrated-waiver-review.js.map +1 -0
- package/dist/harness/gates/resolve-rule.d.ts +59 -0
- package/dist/harness/gates/resolve-rule.d.ts.map +1 -0
- package/dist/harness/gates/resolve-rule.js +41 -0
- package/dist/harness/gates/resolve-rule.js.map +1 -0
- package/dist/harness/gates/unit-gate-overrides.d.ts +25 -0
- package/dist/harness/gates/unit-gate-overrides.d.ts.map +1 -0
- package/dist/harness/gates/unit-gate-overrides.js +122 -0
- package/dist/harness/gates/unit-gate-overrides.js.map +1 -0
- package/dist/harness/journey.d.ts +24 -1
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +114 -23
- package/dist/harness/journey.js.map +1 -1
- package/dist/harness/manifest.d.ts +12 -0
- package/dist/harness/manifest.d.ts.map +1 -1
- package/dist/harness/manifest.js +71 -43
- package/dist/harness/manifest.js.map +1 -1
- package/dist/harness/next-step.d.ts +39 -6
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +34 -218
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/parse.d.ts +10 -6
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +22 -11
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +22 -5
- package/dist/harness/script-check.js.map +1 -1
- package/dist/harness/sensors.d.ts +14 -3
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +50 -49
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/viewpoint-baseline.d.ts.map +1 -1
- package/dist/harness/viewpoint-baseline.js +1 -7
- package/dist/harness/viewpoint-baseline.js.map +1 -1
- package/dist/harness/viewpoint-ledger.d.ts +3 -13
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +8 -38
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/hooks/bash-write-targets.d.ts +15 -0
- package/dist/hooks/bash-write-targets.d.ts.map +1 -0
- package/dist/hooks/bash-write-targets.js +173 -0
- package/dist/hooks/bash-write-targets.js.map +1 -0
- package/dist/hooks/claude-hook-entry.d.ts +11 -0
- package/dist/hooks/claude-hook-entry.d.ts.map +1 -0
- package/dist/hooks/claude-hook-entry.js +137 -0
- package/dist/hooks/claude-hook-entry.js.map +1 -0
- package/dist/hooks/claude-transcript-turn.d.ts +11 -0
- package/dist/hooks/claude-transcript-turn.d.ts.map +1 -0
- package/dist/hooks/claude-transcript-turn.js +143 -0
- package/dist/hooks/claude-transcript-turn.js.map +1 -0
- package/dist/hooks/guard-delivery-contract-rule.d.ts +10 -0
- package/dist/hooks/guard-delivery-contract-rule.d.ts.map +1 -0
- package/dist/hooks/guard-delivery-contract-rule.js +152 -0
- package/dist/hooks/guard-delivery-contract-rule.js.map +1 -0
- package/dist/hooks/guard-protected-paths.d.ts +9 -0
- package/dist/hooks/guard-protected-paths.d.ts.map +1 -0
- package/dist/hooks/guard-protected-paths.js +106 -0
- package/dist/hooks/guard-protected-paths.js.map +1 -0
- package/dist/hooks/guard-rules.d.ts +37 -0
- package/dist/hooks/guard-rules.d.ts.map +1 -0
- package/dist/hooks/guard-rules.js +61 -0
- package/dist/hooks/guard-rules.js.map +1 -0
- package/dist/hooks/guard-tty-spoof-rule.d.ts +15 -0
- package/dist/hooks/guard-tty-spoof-rule.d.ts.map +1 -0
- package/dist/hooks/guard-tty-spoof-rule.js +21 -0
- package/dist/hooks/guard-tty-spoof-rule.js.map +1 -0
- package/dist/hooks/hand-back-core.d.ts +37 -0
- package/dist/hooks/hand-back-core.d.ts.map +1 -0
- package/dist/hooks/hand-back-core.js +115 -0
- package/dist/hooks/hand-back-core.js.map +1 -0
- package/dist/hooks/hook-cli-command.d.ts +9 -0
- package/dist/hooks/hook-cli-command.d.ts.map +1 -0
- package/dist/hooks/hook-cli-command.js +46 -0
- package/dist/hooks/hook-cli-command.js.map +1 -0
- package/dist/hooks/hook-registry.d.ts +10 -0
- package/dist/hooks/hook-registry.d.ts.map +1 -0
- package/dist/hooks/hook-registry.js +24 -0
- package/dist/hooks/hook-registry.js.map +1 -0
- package/dist/hooks/hook-result-contract.d.ts +50 -0
- package/dist/hooks/hook-result-contract.d.ts.map +1 -0
- package/dist/hooks/hook-result-contract.js +80 -0
- package/dist/hooks/hook-result-contract.js.map +1 -0
- package/dist/hooks/hook-toggles.d.ts +10 -0
- package/dist/hooks/hook-toggles.d.ts.map +1 -0
- package/dist/hooks/hook-toggles.js +107 -0
- package/dist/hooks/hook-toggles.js.map +1 -0
- package/dist/hooks/pre-tool-guard-hook.d.ts +10 -0
- package/dist/hooks/pre-tool-guard-hook.d.ts.map +1 -0
- package/dist/hooks/pre-tool-guard-hook.js +105 -0
- package/dist/hooks/pre-tool-guard-hook.js.map +1 -0
- package/dist/hooks/session-start-unit-state-hook.d.ts +13 -0
- package/dist/hooks/session-start-unit-state-hook.d.ts.map +1 -0
- package/dist/hooks/session-start-unit-state-hook.js +55 -0
- package/dist/hooks/session-start-unit-state-hook.js.map +1 -0
- package/dist/hooks/stop-next-step-hook.d.ts +16 -0
- package/dist/hooks/stop-next-step-hook.d.ts.map +1 -0
- package/dist/hooks/stop-next-step-hook.js +42 -0
- package/dist/hooks/stop-next-step-hook.js.map +1 -0
- package/dist/hooks/sungen-project-root.d.ts +19 -0
- package/dist/hooks/sungen-project-root.d.ts.map +1 -0
- package/dist/hooks/sungen-project-root.js +130 -0
- package/dist/hooks/sungen-project-root.js.map +1 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.d.ts +15 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.js +106 -0
- package/dist/orchestrator/ai-skills/command-partial-includes.js.map +1 -0
- package/dist/orchestrator/ai-skills/commands.d.ts +5 -1
- package/dist/orchestrator/ai-skills/commands.d.ts.map +1 -1
- package/dist/orchestrator/ai-skills/commands.js +16 -6
- package/dist/orchestrator/ai-skills/commands.js.map +1 -1
- package/dist/orchestrator/ai-skills/golden-skills.test.js +29 -0
- package/dist/orchestrator/ai-skills/golden-skills.test.js.map +1 -1
- package/dist/orchestrator/claude-hooks-install.d.ts +27 -0
- package/dist/orchestrator/claude-hooks-install.d.ts.map +1 -0
- package/dist/orchestrator/claude-hooks-install.js +203 -0
- package/dist/orchestrator/claude-hooks-install.js.map +1 -0
- package/dist/orchestrator/flow-manager.d.ts +1 -0
- package/dist/orchestrator/flow-manager.d.ts.map +1 -1
- package/dist/orchestrator/flow-manager.js +52 -3
- package/dist/orchestrator/flow-manager.js.map +1 -1
- package/dist/orchestrator/lockstep-version.d.ts +15 -5
- package/dist/orchestrator/lockstep-version.d.ts.map +1 -1
- package/dist/orchestrator/lockstep-version.js +30 -17
- package/dist/orchestrator/lockstep-version.js.map +1 -1
- package/dist/orchestrator/project-initializer.d.ts +6 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +23 -0
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +52 -4
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/add-api.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/add-flow.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/add-screen.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/create-data-test.md +1 -0
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +36 -46
- package/dist/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/design.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/feedback.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/locale.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/review.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +6 -8
- package/dist/orchestrator/templates/ai-src/config/claude.md +20 -7
- package/dist/orchestrator/templates/ai-src/config/copilot.md +20 -7
- package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.claude.md +20 -0
- package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.codex.md +20 -0
- package/dist/orchestrator/templates/ai-src/partials/hand-back-rule.copilot.md +20 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-api-coverage-model/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md +3 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +9 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +1 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +0 -18
- package/dist/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts +1 -4
- package/dist/orchestrator/viewpoint-pattern-catalog.d.ts.map +1 -1
- package/dist/orchestrator/viewpoint-pattern-catalog.js +2 -5
- package/dist/orchestrator/viewpoint-pattern-catalog.js.map +1 -1
- package/dist/utils/safe-yaml-parse.d.ts +8 -0
- package/dist/utils/safe-yaml-parse.d.ts.map +1 -0
- package/dist/utils/safe-yaml-parse.js +51 -0
- package/dist/utils/safe-yaml-parse.js.map +1 -0
- package/package.json +3 -3
- package/src/basis/anchor-grammar.ts +83 -0
- package/src/basis/anchor-hash.ts +27 -0
- package/src/basis/bm51-tables.ts +65 -0
- package/src/basis/extract-spec-anchors.ts +95 -0
- package/src/basis/migration-sentinel.ts +175 -0
- package/src/basis/spec-frontmatter.ts +68 -0
- package/src/basis/spec-sections.ts +35 -0
- package/src/basis/test-basis-schema.ts +81 -0
- package/src/capabilities/registry.ts +16 -0
- package/src/cli/commands/audit.ts +3 -26
- package/src/cli/commands/capability.ts +1 -1
- package/src/cli/commands/contract-derive-command.ts +60 -0
- package/src/cli/commands/contract.ts +130 -0
- package/src/cli/commands/delivery.ts +52 -3
- package/src/cli/commands/generate.ts +3 -1
- package/src/cli/commands/journey.ts +39 -14
- package/src/cli/commands/next.ts +60 -8
- package/src/cli/commands/update.ts +35 -8
- package/src/cli/index.ts +20 -32
- package/src/contract/approve-contract.ts +94 -0
- package/src/contract/assertion-matcher-vocabulary.ts +93 -0
- package/src/contract/build-contract-verdict.ts +108 -0
- package/src/contract/build-trace-conformance.ts +100 -0
- package/src/contract/classify-contract-change.ts +92 -0
- package/src/contract/classify-contract-unit.ts +47 -0
- package/src/contract/classify-trace-conformance.ts +116 -0
- package/src/contract/contract-git.ts +106 -0
- package/src/contract/contract-hash.ts +34 -0
- package/src/contract/contract-report-file.ts +25 -0
- package/src/contract/contract-schema.ts +137 -0
- package/src/contract/contract-units.ts +52 -0
- package/src/contract/contracts-lock-file.ts +97 -0
- package/src/contract/data-normalize.ts +66 -0
- package/src/contract/derive-free-feature.ts +110 -0
- package/src/contract/field-semantic-redaction.ts +80 -0
- package/src/contract/free-feature-blocks.ts +56 -0
- package/src/contract/lock-secret-guard.ts +95 -0
- package/src/contract/lock-vs-git-head.ts +38 -0
- package/src/contract/normalize-contract-step.ts +74 -0
- package/src/contract/normalize-feature-steps.ts +93 -0
- package/src/contract/oracle-strength.ts +80 -0
- package/src/contract/project-contract-blockers.ts +36 -0
- package/src/contract/record-contract-approval.ts +70 -0
- package/src/contract/render-free-gherkin.ts +113 -0
- package/src/contract/render-trace-sentence.ts +98 -0
- package/src/contract/render-trace-target.ts +68 -0
- package/src/contract/resolve-unit-trace-identities.ts +35 -0
- package/src/contract/trace/collect-trace-evidence.ts +109 -0
- package/src/contract/trace/identity-cache.ts +61 -0
- package/src/contract/trace/select-final-attempt.ts +70 -0
- package/src/contract/trace/snapshot-html-renderer.ts +136 -0
- package/src/contract/trace/snapshot-resolver.ts +66 -0
- package/src/contract/trace/snapshot-store.ts +151 -0
- package/src/contract/trace/target-identity.ts +104 -0
- package/src/contract/trace/test-step-join.ts +103 -0
- package/src/contract/trace/trace-binding.ts +56 -0
- package/src/contract/trace/trace-file-reader.ts +123 -0
- package/src/contract/trace/trace-fingerprint.ts +68 -0
- package/src/contract/trace/trace-identity-resolution.ts +74 -0
- package/src/contract/trace/trace-run-record.ts +74 -0
- package/src/contract/trace/trace-steps.ts +88 -0
- package/src/contract/trace/trace-zip-limits.ts +73 -0
- package/src/contract/trace/trace-zip-reader.ts +127 -0
- package/src/contract/verify-approval-decisions.ts +60 -0
- package/src/decisions/append-decision.ts +35 -0
- package/src/decisions/confirmed-decision-commands.ts +128 -0
- package/src/decisions/decision-file.ts +93 -0
- package/src/decisions/decision-identity.ts +73 -0
- package/src/decisions/decision-integrity-check.ts +61 -0
- package/src/decisions/decision-schema.ts +76 -0
- package/src/decisions/decision-source.ts +14 -0
- package/src/decisions/exclusive-file-create.ts +42 -0
- package/src/decisions/git-head-trust.ts +32 -0
- package/src/decisions/human-confirmation.ts +114 -0
- package/src/decisions/legacy-waiver-migration.ts +135 -0
- package/src/decisions/read-decisions.ts +61 -0
- package/src/decisions/viewpoint-baseline-adapter.ts +74 -0
- package/src/decisions/waiver-decisions.ts +56 -0
- package/src/exporters/matrix/build.ts +11 -9
- package/src/exporters/matrix/export.ts +5 -0
- package/src/exporters/matrix/gates.ts +62 -129
- package/src/exporters/matrix/render-csv.ts +3 -0
- package/src/exporters/matrix/render-gate-overrides-sheet.ts +50 -0
- package/src/exporters/matrix/render-xlsx.ts +3 -0
- package/src/exporters/matrix/types.ts +4 -1
- package/src/generators/test-generator/code-generator.ts +13 -0
- package/src/graph/evaluate-graph.ts +62 -0
- package/src/graph/locate-finding.ts +93 -0
- package/src/graph/node-decl.ts +65 -0
- package/src/graph/nodes/core-node-catalog.ts +15 -0
- package/src/graph/nodes/test-case-contract-nodes.ts +69 -0
- package/src/graph/nodes/test-case-nodes.ts +68 -0
- package/src/graph/nodes/unit-audit-nodes.ts +95 -0
- package/src/graph/nodes/unit-contract-node.ts +82 -0
- package/src/graph/nodes/unit-design-nodes.ts +88 -0
- package/src/graph/nodes/unit-execution-nodes.ts +77 -0
- package/src/graph/test-case-identity.ts +75 -0
- package/src/graph/test-case-results.ts +90 -0
- package/src/graph/test-case-satisfied.ts +55 -0
- package/src/graph/test-case-state-shape.ts +62 -0
- package/src/graph/test-case-states.ts +84 -0
- package/src/graph/unit-artifact-probes.ts +77 -0
- package/src/graph/unit-state-facts.ts +112 -0
- package/src/harness/audit.ts +29 -18
- package/src/harness/catalog/gate-rules.yaml +647 -0
- package/src/harness/gates/audit-gate-terms.ts +80 -0
- package/src/harness/gates/audit-gate-verdict.ts +78 -0
- package/src/harness/gates/audit-input-hash.ts +55 -0
- package/src/harness/gates/audit-report-verification.ts +173 -0
- package/src/harness/gates/decisions-hash.ts +42 -0
- package/src/harness/gates/delivery-checklist.ts +120 -0
- package/src/harness/gates/delivery-decision-gate.ts +111 -0
- package/src/harness/gates/delivery-decision-step.ts +73 -0
- package/src/harness/gates/gate-override-report.ts +114 -0
- package/src/harness/gates/gate-override-scope.ts +66 -0
- package/src/harness/gates/gate-override-validation.ts +75 -0
- package/src/harness/gates/gate-rule-catalog.ts +82 -0
- package/src/harness/gates/gate-terms.ts +59 -0
- package/src/harness/gates/in-run-decision-check.ts +99 -0
- package/src/harness/gates/journey-gate-inputs.ts +89 -0
- package/src/harness/gates/migrated-waiver-review.ts +68 -0
- package/src/harness/gates/resolve-rule.ts +94 -0
- package/src/harness/gates/unit-gate-overrides.ts +99 -0
- package/src/harness/journey.ts +122 -27
- package/src/harness/manifest.ts +67 -43
- package/src/harness/next-step.ts +59 -210
- package/src/harness/parse.ts +25 -15
- package/src/harness/script-check.ts +20 -5
- package/src/harness/sensors.ts +55 -49
- package/src/harness/viewpoint-baseline.ts +1 -7
- package/src/harness/viewpoint-ledger.ts +11 -52
- package/src/hooks/bash-write-targets.ts +109 -0
- package/src/hooks/claude-hook-entry.ts +85 -0
- package/src/hooks/claude-transcript-turn.ts +96 -0
- package/src/hooks/guard-delivery-contract-rule.ts +110 -0
- package/src/hooks/guard-protected-paths.ts +70 -0
- package/src/hooks/guard-rules.ts +98 -0
- package/src/hooks/guard-tty-spoof-rule.ts +31 -0
- package/src/hooks/hand-back-core.ts +106 -0
- package/src/hooks/hook-cli-command.ts +17 -0
- package/src/hooks/hook-registry.ts +24 -0
- package/src/hooks/hook-result-contract.ts +114 -0
- package/src/hooks/hook-toggles.ts +66 -0
- package/src/hooks/pre-tool-guard-hook.ts +67 -0
- package/src/hooks/session-start-unit-state-hook.ts +54 -0
- package/src/hooks/stop-next-step-hook.ts +37 -0
- package/src/hooks/sungen-project-root.ts +80 -0
- package/src/orchestrator/ai-skills/command-partial-includes.ts +72 -0
- package/src/orchestrator/ai-skills/commands.ts +22 -8
- package/src/orchestrator/ai-skills/golden-skills.test.ts +23 -0
- package/src/orchestrator/claude-hooks-install.ts +168 -0
- package/src/orchestrator/flow-manager.ts +53 -3
- package/src/orchestrator/lockstep-version.ts +28 -15
- package/src/orchestrator/project-initializer.ts +21 -0
- package/src/orchestrator/screen-manager.ts +52 -4
- package/src/orchestrator/templates/ai-src/commands/add-api.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/add-flow.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/add-screen.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/create-data-test.md +1 -0
- package/src/orchestrator/templates/ai-src/commands/create-test.md +36 -46
- package/src/orchestrator/templates/ai-src/commands/dashboard.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/delivery.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/design.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/feedback.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/locale.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/review.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/run-test.md +6 -8
- package/src/orchestrator/templates/ai-src/config/claude.md +20 -7
- package/src/orchestrator/templates/ai-src/config/copilot.md +20 -7
- package/src/orchestrator/templates/ai-src/partials/hand-back-rule.claude.md +20 -0
- package/src/orchestrator/templates/ai-src/partials/hand-back-rule.codex.md +20 -0
- package/src/orchestrator/templates/ai-src/partials/hand-back-rule.copilot.md +20 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-api-coverage-model/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md +3 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-data-factory/SKILL.md +9 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +1 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +0 -18
- package/src/orchestrator/templates/claude-hooks/sungen-hook.cjs +64 -0
- package/src/orchestrator/viewpoint-pattern-catalog.ts +2 -5
- package/src/utils/safe-yaml-parse.ts +44 -0
- package/dist/cli/commands/viewpoint.d.ts +0 -7
- package/dist/cli/commands/viewpoint.d.ts.map +0 -1
- package/dist/cli/commands/viewpoint.js +0 -70
- package/dist/cli/commands/viewpoint.js.map +0 -1
- package/dist/harness/viewpoint-draft-header.d.ts +0 -7
- package/dist/harness/viewpoint-draft-header.d.ts.map +0 -1
- package/dist/harness/viewpoint-draft-header.js +0 -100
- package/dist/harness/viewpoint-draft-header.js.map +0 -1
- package/dist/harness/viewpoint-mode.d.ts +0 -9
- package/dist/harness/viewpoint-mode.d.ts.map +0 -1
- package/dist/harness/viewpoint-mode.js +0 -52
- package/dist/harness/viewpoint-mode.js.map +0 -1
- package/dist/harness/viewpoint-priority.d.ts +0 -19
- package/dist/harness/viewpoint-priority.d.ts.map +0 -1
- package/dist/harness/viewpoint-priority.js +0 -36
- package/dist/harness/viewpoint-priority.js.map +0 -1
- package/dist/harness/viewpoint-review-open.d.ts +0 -6
- package/dist/harness/viewpoint-review-open.d.ts.map +0 -1
- package/dist/harness/viewpoint-review-open.js +0 -90
- package/dist/harness/viewpoint-review-open.js.map +0 -1
- package/dist/harness/viewpoint-scan-refs.d.ts +0 -50
- package/dist/harness/viewpoint-scan-refs.d.ts.map +0 -1
- package/dist/harness/viewpoint-scan-refs.js +0 -200
- package/dist/harness/viewpoint-scan-refs.js.map +0 -1
- package/dist/harness/viewpoint-scan.d.ts +0 -41
- package/dist/harness/viewpoint-scan.d.ts.map +0 -1
- package/dist/harness/viewpoint-scan.js +0 -118
- package/dist/harness/viewpoint-scan.js.map +0 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +0 -63
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +0 -158
- package/dist/orchestrator/viewpoint-scaffold.d.ts +0 -3
- package/dist/orchestrator/viewpoint-scaffold.d.ts.map +0 -1
- package/dist/orchestrator/viewpoint-scaffold.js +0 -70
- package/dist/orchestrator/viewpoint-scaffold.js.map +0 -1
- package/src/cli/commands/viewpoint.ts +0 -58
- package/src/harness/viewpoint-draft-header.ts +0 -55
- package/src/harness/viewpoint-mode.ts +0 -49
- package/src/harness/viewpoint-priority.ts +0 -38
- package/src/harness/viewpoint-review-open.ts +0 -51
- package/src/harness/viewpoint-scan-refs.ts +0 -154
- package/src/harness/viewpoint-scan.ts +0 -111
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/review-checklist.md +0 -63
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/viewpoint-template.md +0 -158
- package/src/orchestrator/viewpoint-scaffold.ts +0 -36
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install sungen's Claude Code hooks into `.claude/settings.json` — by MERGING (P0.1, takumi T1).
|
|
3
|
+
*
|
|
4
|
+
* A team commits that file, so it holds the user's own hooks, permissions and env. The installer
|
|
5
|
+
* owns exactly one thing in it: hook entries that run the sungen launcher
|
|
6
|
+
* (`.claude/hooks/sungen-hook.cjs`, matched exactly — a user's `my-sungen-hook.cjs` is not ours).
|
|
7
|
+
* Each run removes every such entry and appends the wanted ones, so a hook turned off in
|
|
8
|
+
* `qa/sungen.config.yaml`, or dropped by a later version, leaves — and nothing else does. That is
|
|
9
|
+
* also the rollback path: `sungen update` takes out sungen's entries without touching anyone's.
|
|
10
|
+
*
|
|
11
|
+
* The first change backs the file up byte for byte, and that pristine backup is never overwritten;
|
|
12
|
+
* the file keeps its own indentation; an unreadable file is never rewritten; a run that changes
|
|
13
|
+
* nothing writes nothing.
|
|
14
|
+
*
|
|
15
|
+
* Entries use EXEC FORM — `{ command: 'node', args: ['${CLAUDE_PROJECT_DIR}/…/sungen-hook.cjs', hook] }`
|
|
16
|
+
* (Claude Code ≥ 2.1.139). No shell is involved and Claude Code substitutes the placeholder itself.
|
|
17
|
+
* A shell-form `node "$CLAUDE_PROJECT_DIR/…"` runs in PowerShell on Windows without Git Bash, where
|
|
18
|
+
* that variable is empty, and since 2.1.299 a FAILING shell-form PreToolUse hook there blocks every
|
|
19
|
+
* tool call. `onFailure` is left unset: its default (continue) is the fail-open one, and versions
|
|
20
|
+
* before 2.1.295 do not know the field.
|
|
21
|
+
*/
|
|
22
|
+
import * as fs from 'fs';
|
|
23
|
+
import * as path from 'path';
|
|
24
|
+
import { allHooks } from '../hooks/hook-registry';
|
|
25
|
+
import { configDisabledHooks } from '../hooks/hook-toggles';
|
|
26
|
+
import type { SungenHook } from '../hooks/hook-result-contract';
|
|
27
|
+
import { readTextFile } from '../harness/read-text';
|
|
28
|
+
import { writeFileAtomic } from '../harness/write-atomic';
|
|
29
|
+
|
|
30
|
+
export const LAUNCHER_REL = path.join('.claude', 'hooks', 'sungen-hook.cjs');
|
|
31
|
+
/** The launcher as the hook entry names it: Claude Code substitutes the placeholder, no shell does. */
|
|
32
|
+
export const LAUNCHER_ARG = '${CLAUDE_PROJECT_DIR}/.claude/hooks/sungen-hook.cjs';
|
|
33
|
+
const SETTINGS_REL = path.join('.claude', 'settings.json');
|
|
34
|
+
const BACKUP_SUFFIX = '.sungen-backup';
|
|
35
|
+
const LAUNCHER_SRC = path.join(__dirname, 'templates', 'claude-hooks', 'sungen-hook.cjs');
|
|
36
|
+
/** What marks an entry as sungen's: it runs exactly this launcher (exec form `args[0]` or a shell command). */
|
|
37
|
+
const OWNED = /\.claude\/hooks\/sungen-hook\.cjs(?:["'\s]|$)/;
|
|
38
|
+
|
|
39
|
+
type Settings = Record<string, unknown> & { hooks?: Record<string, unknown> };
|
|
40
|
+
type Entry = { command?: unknown; args?: unknown };
|
|
41
|
+
const entriesOf = (g: unknown): Entry[] | null =>
|
|
42
|
+
g && typeof g === 'object' && Array.isArray((g as { hooks?: unknown }).hooks) ? (g as { hooks: Entry[] }).hooks : null;
|
|
43
|
+
const argsOf = (e: Entry): string[] => (Array.isArray(e?.args) ? e.args.filter((a): a is string => typeof a === 'string') : []);
|
|
44
|
+
const isOwned = (e: Entry): boolean =>
|
|
45
|
+
(typeof e?.command === 'string' && OWNED.test(e.command)) || OWNED.test(argsOf(e)[0] ?? '');
|
|
46
|
+
const keyOf = (e: Entry): string => [String(e?.command ?? ''), ...argsOf(e)].join(' ');
|
|
47
|
+
|
|
48
|
+
export interface HooksInstallReport {
|
|
49
|
+
settings: 'created' | 'updated' | 'unchanged' | 'unreadable';
|
|
50
|
+
launcher: 'written' | 'unchanged' | 'removed' | 'absent';
|
|
51
|
+
/** Hooks registered after this run. */
|
|
52
|
+
installed: string[];
|
|
53
|
+
/** sungen entries no longer registered (stale, or turned off). */
|
|
54
|
+
removed: number;
|
|
55
|
+
/** The backup written THIS run (only the first change writes one). */
|
|
56
|
+
backup?: string;
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function hookEntry(hook: SungenHook): Record<string, unknown> {
|
|
61
|
+
return { type: 'command', command: 'node', args: [LAUNCHER_ARG, hook.name], ...(hook.meta.timeout ? { timeout: hook.meta.timeout } : {}) };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Pure: every sungen-owned entry removed, the wanted hooks appended, everything else as it was. */
|
|
65
|
+
export function mergeSungenHooks(settings: Settings, wanted: SungenHook[]): Settings {
|
|
66
|
+
const hooks: Record<string, unknown> = { ...(settings.hooks ?? {}) };
|
|
67
|
+
for (const [event, groups] of Object.entries(hooks)) {
|
|
68
|
+
if (!Array.isArray(groups)) continue; // readSettings refuses this shape; never rewrite it here
|
|
69
|
+
const kept = groups.flatMap((g) => {
|
|
70
|
+
const entries = entriesOf(g);
|
|
71
|
+
if (!entries || !entries.some(isOwned)) return [g];
|
|
72
|
+
const rest = entries.filter((e) => !isOwned(e));
|
|
73
|
+
return rest.length ? [{ ...(g as object), hooks: rest }] : [];
|
|
74
|
+
});
|
|
75
|
+
if (kept.length || !groups.length) hooks[event] = kept; else delete hooks[event];
|
|
76
|
+
}
|
|
77
|
+
for (const hook of wanted) {
|
|
78
|
+
for (const event of hook.meta.events) {
|
|
79
|
+
const matcher = hook.meta.matchers?.[event];
|
|
80
|
+
hooks[event] = [...(Array.isArray(hooks[event]) ? hooks[event] as unknown[] : []), { ...(matcher ? { matcher } : {}), hooks: [hookEntry(hook)] }];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const out: Settings = { ...settings };
|
|
84
|
+
if (Object.keys(hooks).length || settings.hooks !== undefined) out.hooks = hooks;
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const ownedKeys = (s: Settings): string[] => Object.values(s.hooks ?? {})
|
|
89
|
+
.flatMap((groups) => (Array.isArray(groups) ? groups : []).flatMap((g) => entriesOf(g) ?? []))
|
|
90
|
+
.filter(isOwned).map(keyOf);
|
|
91
|
+
|
|
92
|
+
/** The file's own indentation (a tab, or N spaces); 2 for a file that has none yet. */
|
|
93
|
+
function indentOf(raw: string): string | number {
|
|
94
|
+
const m = raw.match(/^[{[][^\S\n]*\r?\n([ \t]+)\S/);
|
|
95
|
+
if (!m) return 2;
|
|
96
|
+
return m[1].startsWith('\t') ? '\t' : m[1].length;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function readSettings(file: string): { settings: Settings; indent: string | number } {
|
|
100
|
+
const raw = readTextFile(file);
|
|
101
|
+
const parsed: unknown = JSON.parse(raw);
|
|
102
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('not a JSON object');
|
|
103
|
+
const hooks = (parsed as Settings).hooks;
|
|
104
|
+
if (hooks !== undefined && (!hooks || typeof hooks !== 'object' || Array.isArray(hooks))) throw new Error('"hooks" is not an object');
|
|
105
|
+
// An event that is not a list is a shape we cannot merge into without replacing it.
|
|
106
|
+
const odd = Object.entries(hooks ?? {}).find(([, groups]) => !Array.isArray(groups));
|
|
107
|
+
if (odd) throw new Error(`"hooks.${odd[0]}" is not a list`);
|
|
108
|
+
return { settings: parsed as Settings, indent: indentOf(raw) };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function installClaudeHooks(cwd: string, opts: { dryRun?: boolean } = {}): HooksInstallReport {
|
|
112
|
+
const settingsPath = path.join(cwd, SETTINGS_REL);
|
|
113
|
+
const existed = fs.existsSync(settingsPath);
|
|
114
|
+
let current: Settings = {};
|
|
115
|
+
let indent: string | number = 2;
|
|
116
|
+
if (existed) {
|
|
117
|
+
try { ({ settings: current, indent } = readSettings(settingsPath)); } catch (e) {
|
|
118
|
+
return { settings: 'unreadable', launcher: 'absent', installed: [], removed: 0, error: `${SETTINGS_REL}: ${(e as Error).message.split('\n')[0]}` };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const off = configDisabledHooks(cwd);
|
|
122
|
+
const wanted = off === 'all' ? [] : allHooks().filter((h) => !off.has(h.name));
|
|
123
|
+
const merged = mergeSungenHooks(current, wanted);
|
|
124
|
+
const after = ownedKeys(merged);
|
|
125
|
+
const changed = existed ? JSON.stringify(merged) !== JSON.stringify(current) : wanted.length > 0;
|
|
126
|
+
const report: HooksInstallReport = {
|
|
127
|
+
settings: !changed ? 'unchanged' : existed ? 'updated' : 'created',
|
|
128
|
+
launcher: 'absent',
|
|
129
|
+
installed: wanted.map((h) => h.name),
|
|
130
|
+
removed: ownedKeys(current).filter((k) => !after.includes(k)).length,
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const launcherPath = path.join(cwd, LAUNCHER_REL);
|
|
134
|
+
const onDisk = fs.existsSync(launcherPath) ? fs.readFileSync(launcherPath, 'utf8') : null;
|
|
135
|
+
const src = wanted.length ? fs.readFileSync(LAUNCHER_SRC, 'utf8') : null;
|
|
136
|
+
if (src !== null) report.launcher = onDisk === src ? 'unchanged' : 'written';
|
|
137
|
+
else if (onDisk !== null) report.launcher = 'removed';
|
|
138
|
+
if (opts.dryRun) return report;
|
|
139
|
+
|
|
140
|
+
const writeSettings = (): void => {
|
|
141
|
+
if (!changed) return;
|
|
142
|
+
fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
143
|
+
const backup = settingsPath + BACKUP_SUFFIX;
|
|
144
|
+
if (existed && !fs.existsSync(backup)) { // keep the pristine original: never overwrite it
|
|
145
|
+
fs.copyFileSync(settingsPath, backup);
|
|
146
|
+
report.backup = SETTINGS_REL + BACKUP_SUFFIX;
|
|
147
|
+
}
|
|
148
|
+
writeFileAtomic(settingsPath, `${JSON.stringify(merged, null, indent)}\n`);
|
|
149
|
+
};
|
|
150
|
+
// settings.json must never point at a launcher that is not there: install the launcher BEFORE the
|
|
151
|
+
// entries that run it, and remove it only AFTER the entries are gone.
|
|
152
|
+
if (src !== null) {
|
|
153
|
+
if (onDisk !== src) { fs.mkdirSync(path.dirname(launcherPath), { recursive: true }); writeFileAtomic(launcherPath, src); }
|
|
154
|
+
writeSettings();
|
|
155
|
+
} else {
|
|
156
|
+
writeSettings();
|
|
157
|
+
if (onDisk !== null) fs.rmSync(launcherPath, { force: true });
|
|
158
|
+
}
|
|
159
|
+
return report;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** One summary line for init/update output. */
|
|
163
|
+
export function describeHooksInstall(r: HooksInstallReport): string {
|
|
164
|
+
if (r.settings === 'unreadable') return `${r.error} — Claude Code hooks not installed; fix the JSON and re-run`;
|
|
165
|
+
const what = r.installed.length ? `Claude Code hooks: ${r.installed.join(', ')}` : 'Claude Code hooks: none (turned off in qa/sungen.config.yaml)';
|
|
166
|
+
const extra = [r.removed ? `${r.removed} stale removed` : '', r.backup ? `backup ${r.backup}` : ''].filter(Boolean).join(', ');
|
|
167
|
+
return `${SETTINGS_REL} (${what}${extra ? `; ${extra}` : ''})`;
|
|
168
|
+
}
|
|
@@ -8,7 +8,6 @@ import * as fs from 'fs';
|
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
import { readCapabilities } from '../harness/capability';
|
|
10
10
|
import { testDataHeader, ensureTestDataGuideFiles } from './test-data-guide';
|
|
11
|
-
import { viewpointScaffold } from './viewpoint-scaffold';
|
|
12
11
|
|
|
13
12
|
export interface FlowOptions {
|
|
14
13
|
name: string;
|
|
@@ -144,7 +143,7 @@ export class FlowManager {
|
|
|
144
143
|
fs.writeFileSync(specPath, this.generateSpecTemplate(options, flowName, isMobile), 'utf-8');
|
|
145
144
|
|
|
146
145
|
const viewpointPath = path.join(requirementsDir, 'test-viewpoint.md');
|
|
147
|
-
fs.writeFileSync(viewpointPath,
|
|
146
|
+
fs.writeFileSync(viewpointPath, this.generateViewpointTemplate(options), 'utf-8');
|
|
148
147
|
|
|
149
148
|
console.log(`Created files:`);
|
|
150
149
|
console.log(` ${path.relative(this.cwd, featurePath)}`);
|
|
@@ -218,7 +217,7 @@ export class FlowManager {
|
|
|
218
217
|
restored.push(file);
|
|
219
218
|
};
|
|
220
219
|
ensure(path.join(paths.requirementsDir, 'spec.md'), () => this.generateSpecTemplate(options, flowName, isMobile));
|
|
221
|
-
ensure(path.join(paths.requirementsDir, 'test-viewpoint.md'), () =>
|
|
220
|
+
ensure(path.join(paths.requirementsDir, 'test-viewpoint.md'), () => this.generateViewpointTemplate(options));
|
|
222
221
|
ensure(paths.featurePath, () => this.generateFeatureTemplate(options, flowName, isMobile));
|
|
223
222
|
return restored;
|
|
224
223
|
}
|
|
@@ -288,6 +287,57 @@ export class FlowManager {
|
|
|
288
287
|
`;
|
|
289
288
|
}
|
|
290
289
|
|
|
290
|
+
private generateViewpointTemplate(options: FlowOptions): string {
|
|
291
|
+
return [
|
|
292
|
+
`# ${options.name} Flow — Test Viewpoints`,
|
|
293
|
+
'',
|
|
294
|
+
'## Edge Cases',
|
|
295
|
+
'',
|
|
296
|
+
'<!-- Sample — replace with actual edge cases for this flow:',
|
|
297
|
+
'- Network drops between screen transitions — should resume or show error?',
|
|
298
|
+
'- Session expires mid-flow — should redirect to login and preserve progress?',
|
|
299
|
+
'- Browser back button at step 3 — should return to step 2 with data intact?',
|
|
300
|
+
'- Complete flow twice rapidly — should prevent duplicate submissions',
|
|
301
|
+
'-->',
|
|
302
|
+
'',
|
|
303
|
+
'## Known Issues',
|
|
304
|
+
'',
|
|
305
|
+
'<!-- Sample — replace with actual known issues:',
|
|
306
|
+
'- [BUG-001] Form data lost if user navigates away and returns',
|
|
307
|
+
'- [BUG-002] Confirmation page shows stale data on slow connections',
|
|
308
|
+
'-->',
|
|
309
|
+
'',
|
|
310
|
+
'## Design Decisions',
|
|
311
|
+
'',
|
|
312
|
+
'<!-- Sample — replace with actual design decisions:',
|
|
313
|
+
'- Flow requires completing all steps in order (no skip)',
|
|
314
|
+
'- Draft is auto-saved at each step transition',
|
|
315
|
+
'- Cancel at any step discards the entire flow',
|
|
316
|
+
'-->',
|
|
317
|
+
'',
|
|
318
|
+
'## Cross-Screen Concerns',
|
|
319
|
+
'',
|
|
320
|
+
'<!-- Sample — replace with actual cross-screen concerns:',
|
|
321
|
+
'- Auth role must remain consistent across all screens',
|
|
322
|
+
'- Data entered in step 1 must be visible in confirmation (step 3)',
|
|
323
|
+
'- Error in step 2 should allow returning to step 1 without re-entering data',
|
|
324
|
+
'-->',
|
|
325
|
+
'',
|
|
326
|
+
'## Priority Viewpoints',
|
|
327
|
+
'',
|
|
328
|
+
'<!-- Rate importance for this flow (High / Medium / Low / Skip):',
|
|
329
|
+
'',
|
|
330
|
+
'| VP | Priority | Reason |',
|
|
331
|
+
'|---|----------|--------|',
|
|
332
|
+
'| VP-UI | Medium | Standard forms across screens |',
|
|
333
|
+
'| VP-VAL | High | Cross-screen validation rules |',
|
|
334
|
+
'| VP-LOGIC | High | Multi-step business logic, state transitions |',
|
|
335
|
+
'| VP-SEC | Medium | Auth must persist, role-based access at each screen |',
|
|
336
|
+
'-->',
|
|
337
|
+
'',
|
|
338
|
+
].join('\n');
|
|
339
|
+
}
|
|
340
|
+
|
|
291
341
|
private generateFeatureTemplate(options: FlowOptions, flowName: string, isMobile: boolean): string {
|
|
292
342
|
const description = options.description || `complete the ${options.name} flow`;
|
|
293
343
|
|
|
@@ -18,29 +18,42 @@ export function coreVersion(): string {
|
|
|
18
18
|
/**
|
|
19
19
|
* Resolve the version to install for a family package, given the running `core` version.
|
|
20
20
|
*
|
|
21
|
-
* Lockstep wants the EXACT `core` version. But the
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
21
|
+
* Lockstep wants the EXACT `core` version. But the prerelease channels publish `<core>-beta.N`
|
|
22
|
+
* (beta branch) and `<core>-alpha.N` (alpha branch) before a stable `<core>` ever exists — so a
|
|
23
|
+
* released core (e.g. 3.2.10) asking for `@3.2.10` hits ETARGET out-of-the-box when npm only has
|
|
24
|
+
* `3.2.10-beta.2` (`sungen capability add` then fails for a fresh user). Fall back on the SAME
|
|
25
|
+
* version line — see `pickDriverVersion`. Keeps the driver's pinned core-dep on the same line.
|
|
26
26
|
*/
|
|
27
27
|
export function resolveDriverVersion(pkg: string, core: string): string {
|
|
28
28
|
if (core === 'latest') return 'beta';
|
|
29
29
|
try {
|
|
30
30
|
const out = spawnSync('npm', ['view', pkg, 'versions', '--json'], { encoding: 'utf-8', shell: true });
|
|
31
31
|
if (out.status !== 0 || !out.stdout) return core; // can't query → let the exact install try/fail
|
|
32
|
-
let versions: string[] = [];
|
|
33
32
|
const parsed = JSON.parse(out.stdout);
|
|
34
|
-
|
|
35
|
-
if (versions.includes(core)) return core; // exact exists → lockstep
|
|
36
|
-
const prefix = `${core}-beta.`;
|
|
37
|
-
const betas = versions
|
|
38
|
-
.filter((v) => typeof v === 'string' && v.startsWith(prefix))
|
|
39
|
-
.map((v) => parseInt(v.slice(prefix.length), 10))
|
|
40
|
-
.filter((n) => Number.isInteger(n));
|
|
41
|
-
if (betas.length) return `${core}-beta.${Math.max(...betas)}`; // highest same-line prerelease
|
|
42
|
-
return 'beta'; // nothing on this line → newest beta dist-tag
|
|
33
|
+
return pickDriverVersion(Array.isArray(parsed) ? parsed : [parsed], core);
|
|
43
34
|
} catch {
|
|
44
35
|
return core;
|
|
45
36
|
}
|
|
46
37
|
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Pick from a package's published `versions`: the exact `core`, else the highest same-line
|
|
41
|
+
* prerelease of core's OWN channel, else that channel's dist-tag. The channel is `alpha` for an
|
|
42
|
+
* alpha core and `beta` for any other (stable or beta): a stable or beta core never takes an alpha
|
|
43
|
+
* driver — alpha builds are the next big update, and an alpha driver pins an alpha core.
|
|
44
|
+
*
|
|
45
|
+
* The line is core without its prerelease suffix (as `sameVersionLine` in capabilities/discover.ts
|
|
46
|
+
* reads it), so `3.3.0-alpha.4` with no exact driver still finds `3.3.0-alpha.3`.
|
|
47
|
+
*/
|
|
48
|
+
export function pickDriverVersion(versions: readonly string[], core: string): string {
|
|
49
|
+
if (versions.includes(core)) return core; // exact exists → lockstep
|
|
50
|
+
const channel = /-alpha(\.|$)/.test(core) ? 'alpha' : 'beta';
|
|
51
|
+
const line = core.split('-')[0];
|
|
52
|
+
const prefix = `${line}-${channel}.`;
|
|
53
|
+
const indexes = versions
|
|
54
|
+
.filter((v) => typeof v === 'string' && v.startsWith(prefix))
|
|
55
|
+
.map((v) => parseInt(v.slice(prefix.length), 10))
|
|
56
|
+
.filter((n) => Number.isInteger(n));
|
|
57
|
+
if (indexes.length) return `${line}-${channel}.${Math.max(...indexes)}`; // highest same-line prerelease
|
|
58
|
+
return channel; // nothing on this line → newest build of core's channel
|
|
59
|
+
}
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from './mobile-runtime-scaffolder';
|
|
19
19
|
import { emitAppiumEnvironment, runAppiumEnvironmentSetup, appiumEnvironmentRerunCommand } from './appium-environment-setup';
|
|
20
20
|
import { ensureSecurityOverrides, reportSecurityOverrides } from './security-overrides';
|
|
21
|
+
import { installClaudeHooks, describeHooksInstall } from './claude-hooks-install';
|
|
21
22
|
import { readTextFile } from '../harness/read-text';
|
|
22
23
|
|
|
23
24
|
export { MobileInitOptions };
|
|
@@ -198,6 +199,12 @@ export class ProjectInitializer {
|
|
|
198
199
|
// Create root .mcp.json for Claude Code
|
|
199
200
|
this.createClaudeMCPConfig();
|
|
200
201
|
|
|
202
|
+
// Claude Code hooks (hand-back on Stop, unit state on SessionStart, approval-path guard),
|
|
203
|
+
// merged into .claude/settings.json — only when Claude is a selected assistant.
|
|
204
|
+
if (this.agents.includes('claude')) {
|
|
205
|
+
this.createClaudeHooks();
|
|
206
|
+
}
|
|
207
|
+
|
|
201
208
|
// Create .codex/config.toml for Codex CLI — only when Codex is a selected assistant
|
|
202
209
|
// (`sungen init --assistant codex`), since it is Codex-specific config.
|
|
203
210
|
if (this.agents.includes('codex')) {
|
|
@@ -397,6 +404,20 @@ export class ProjectInitializer {
|
|
|
397
404
|
);
|
|
398
405
|
}
|
|
399
406
|
|
|
407
|
+
/**
|
|
408
|
+
* Merge sungen's Claude Code hooks into `.claude/settings.json` (user hooks kept, backup before
|
|
409
|
+
* any change, unreadable file left alone — see claude-hooks-install.ts). A no-op for a project
|
|
410
|
+
* without Claude.
|
|
411
|
+
*/
|
|
412
|
+
private createClaudeHooks(): void {
|
|
413
|
+
if (!this.agents.includes('claude')) return;
|
|
414
|
+
const r = installClaudeHooks(this.cwd);
|
|
415
|
+
const line = describeHooksInstall(r);
|
|
416
|
+
if (r.settings === 'unreadable') this.notDoneItems.push(line);
|
|
417
|
+
else if (r.settings === 'unchanged') this.skippedItems.push(line);
|
|
418
|
+
else this.createdItems.push(line);
|
|
419
|
+
}
|
|
420
|
+
|
|
400
421
|
/**
|
|
401
422
|
* Create `.codex/config.toml` for Codex CLI — the Codex analog of `.mcp.json` (Claude) and
|
|
402
423
|
* `.vscode/mcp.json` (Copilot), so `sungen run-test` under Codex drives the same live Playwright
|
|
@@ -8,7 +8,7 @@ import * as path from 'path';
|
|
|
8
8
|
import { readCapabilities } from '../harness/capability';
|
|
9
9
|
import { testDataHeader, ensureTestDataGuideFiles } from './test-data-guide';
|
|
10
10
|
import { resolveWebBaseUrl } from '../exporters/env-qa';
|
|
11
|
-
import {
|
|
11
|
+
import { uiPatternRows } from './viewpoint-pattern-catalog';
|
|
12
12
|
|
|
13
13
|
export interface ScreenOptions {
|
|
14
14
|
name: string;
|
|
@@ -158,11 +158,59 @@ export class ScreenManager {
|
|
|
158
158
|
fs.writeFileSync(specPath, this.generateSpecTemplate(options, screenName), 'utf-8');
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
-
// Generate requirements test-viewpoint.md (only on first screen creation)
|
|
162
|
-
// samples inside comments, so an untouched file declares nothing (see viewpoint-scaffold.ts).
|
|
161
|
+
// Generate requirements test-viewpoint.md (only on first screen creation)
|
|
163
162
|
const viewpointPath = path.join(requirementsDir, 'test-viewpoint.md');
|
|
164
163
|
if (!fs.existsSync(viewpointPath)) {
|
|
165
|
-
fs.writeFileSync(viewpointPath,
|
|
164
|
+
fs.writeFileSync(viewpointPath, [
|
|
165
|
+
`# ${options.name} — Test Viewpoints`,
|
|
166
|
+
'',
|
|
167
|
+
'## Edge Cases',
|
|
168
|
+
'',
|
|
169
|
+
'<!-- Sample — replace with actual edge cases for this screen:',
|
|
170
|
+
'- Paste emoji into text fields (e.g., 🎉👋) — should accept or sanitize?',
|
|
171
|
+
'- Input 10,000+ characters into free text — truncate or reject?',
|
|
172
|
+
'- Double-click Submit rapidly — should only create 1 record',
|
|
173
|
+
'- Browser back button after successful submit — should not re-submit',
|
|
174
|
+
'-->',
|
|
175
|
+
'',
|
|
176
|
+
'## Known Issues',
|
|
177
|
+
'',
|
|
178
|
+
'<!-- Sample — replace with actual known issues:',
|
|
179
|
+
'- [BUG-001] Date picker does not work on Safari < 16',
|
|
180
|
+
'- [BUG-002] File upload silently fails for files > 20MB (no error shown)',
|
|
181
|
+
'- Search does not handle Vietnamese accents correctly ("Nguyên" ≠ "Nguyen")',
|
|
182
|
+
'-->',
|
|
183
|
+
'',
|
|
184
|
+
'## Design Decisions',
|
|
185
|
+
'',
|
|
186
|
+
'<!-- Sample — replace with actual design decisions:',
|
|
187
|
+
'- Show all validation errors at once (not one at a time) — per UX review',
|
|
188
|
+
'- Cancel button resets form completely (no draft saving)',
|
|
189
|
+
'- Anonymous mode hides sender name but keeps department visible',
|
|
190
|
+
'-->',
|
|
191
|
+
'',
|
|
192
|
+
'## UI Patterns Identified',
|
|
193
|
+
'',
|
|
194
|
+
'<!-- Check applicable patterns for this screen (numbered as in the sungen-viewpoint skill):',
|
|
195
|
+
'',
|
|
196
|
+
'| # | Pattern | Applicable? | Notes |',
|
|
197
|
+
'|---|---------|-------------|-------|',
|
|
198
|
+
...uiPatternRows(isMobile),
|
|
199
|
+
'-->',
|
|
200
|
+
'',
|
|
201
|
+
'## Priority Viewpoints',
|
|
202
|
+
'',
|
|
203
|
+
'<!-- Rate importance for this screen (High / Medium / Low / Skip):',
|
|
204
|
+
'',
|
|
205
|
+
'| VP | Priority | Reason |',
|
|
206
|
+
'|---|----------|--------|',
|
|
207
|
+
'| VP-UI | High | Complex form with many states |',
|
|
208
|
+
'| VP-VAL | High | 14 validation rules from spec |',
|
|
209
|
+
'| VP-LOGIC | Medium | Standard CRUD, no complex business rules |',
|
|
210
|
+
'| VP-SEC | Low | Internal tool, basic auth only |',
|
|
211
|
+
'-->',
|
|
212
|
+
'',
|
|
213
|
+
].join('\n'), 'utf-8');
|
|
166
214
|
}
|
|
167
215
|
|
|
168
216
|
// Auto-screenshot: capture page only when --capture is set and not mobile (requires --path)
|
|
@@ -7,6 +7,8 @@ claude-tools: "Read, Grep, Bash, Glob, Edit, Write, AskUserQuestion"
|
|
|
7
7
|
copilot-tools: "[vscode, execute, read, agent, edit, search, todo]"
|
|
8
8
|
codex-trigger: "Run when the user asks to add or scaffold a NEW API area/resource or an API flow to test (REST/HTTP endpoints, not a UI screen). Step 1 of the API workflow. Do NOT use for UI screens, flows across screens, creating test cases, or running tests."
|
|
9
9
|
---
|
|
10
|
+
<!-- include: hand-back-rule -->
|
|
11
|
+
|
|
10
12
|
{{^cap parallel-subagents}}
|
|
11
13
|
**Input**: an API area name (a resource/tag, e.g. `orders`, `users`) and the base URL:
|
|
12
14
|
`/sungen-add-api orders --base-url https://api.example.com`.
|
|
@@ -7,6 +7,8 @@ claude-tools: "Read, Grep, Bash, Glob, Edit, Write, AskUserQuestion, mcp__playwr
|
|
|
7
7
|
copilot-tools: "[vscode, execute, read, agent, edit, search, todo]"
|
|
8
8
|
codex-trigger: "Run when the user asks to add a NEW cross-screen end-to-end flow. Step 1 (flow variant). Do NOT use for a single screen, creating test cases, or running tests."
|
|
9
9
|
---
|
|
10
|
+
<!-- include: hand-back-rule -->
|
|
11
|
+
|
|
10
12
|
{{^cap parallel-subagents}}
|
|
11
13
|
**Input**: Flow name and optional starting URL (e.g., `/sungen-add-flow award-submission --path /login`).
|
|
12
14
|
|
|
@@ -7,6 +7,8 @@ claude-tools: "Read, Grep, Bash, Glob, Edit, Write, AskUserQuestion, mcp__playwr
|
|
|
7
7
|
copilot-tools: "[vscode, execute, read, agent, edit, search, web, browser, todo, 'playwright/*']"
|
|
8
8
|
codex-trigger: "Run when the user asks to add or scaffold a NEW screen/page to test. Step 1 of the sungen workflow. Do NOT use for flows, creating test cases, or running tests."
|
|
9
9
|
---
|
|
10
|
+
<!-- include: hand-back-rule -->
|
|
11
|
+
|
|
10
12
|
{{^cap parallel-subagents}}
|
|
11
13
|
**Input**: Screen name and URL path (e.g., `/sungen-add-screen login /login`).
|
|
12
14
|
Optionally include a Figma URL: `/sungen-add-screen login /login --figma https://www.figma.com/design/...`.
|
|
@@ -7,6 +7,7 @@ claude-tools: "Read, Grep, Bash, Glob, Write, Edit, AskUserQuestion, Skill"
|
|
|
7
7
|
copilot-tools: "[vscode, execute, read, agent, edit, search, todo]"
|
|
8
8
|
codex-trigger: "Run when the user asks to CREATE, generate, or standardize TEST DATA / test values for a screen or flow (valid/boundary/invalid, boundary values, negative data). Uses the Data Factory driver. Not for generating the .feature scenarios themselves (that is create-test)."
|
|
9
9
|
---
|
|
10
|
+
<!-- include: hand-back-rule -->
|
|
10
11
|
|
|
11
12
|
**Input**: A screen or flow name (e.g., `/sungen:create-data-test login`), OR **no name** to do every unit (with a confirmation — see ALL mode). Load the `sungen-data-factory` skill for the full method.
|
|
12
13
|
|