@cassiomc1/forgeloop 1.12.0 → 1.14.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/.github/copilot-instructions.md +1 -1
- package/AGENTS.md +1 -1
- package/AGENT_COMPATIBILITY.md +8 -0
- package/CLAUDE.md +1 -1
- package/CONTRIBUTING.md +90 -0
- package/DOCS_INDEX.md +46 -12
- package/ENG/c-development-eng.md +112 -0
- package/ENG/cpp-development-eng.md +109 -0
- package/ENG/dotnet-aspnetcore-development-eng.md +401 -0
- package/ENG/go-development-eng.md +103 -0
- package/ENG/java-development-eng.md +125 -0
- package/ENG/nodejs-backend-development-eng.md +605 -0
- package/ENG/php-development-eng.md +104 -0
- package/ENG/rust-development-eng.md +422 -0
- package/ENG/sec-code-eng.md +7 -7
- package/ENG/sql-development-eng.md +108 -0
- package/ENG/swift-development-eng.md +111 -0
- package/ENG/typescript-development-eng.md +108 -0
- package/EXECUTION_STATE.md +12 -0
- package/GUIDE_ROUTER.md +418 -9
- package/LOOP_ENGINEERING.md +28 -2
- package/ORCHESTRATOR_INTEGRATION.md +9 -5
- package/PROTOCOL_INTEGRATION.md +55 -2
- package/QUALITY_SCORECARD.md +1 -0
- package/README.md +78 -52
- package/TERMINOLOGY.md +2 -0
- package/THIRD_PARTY_NOTICES.md +19 -7
- package/THREAT_MODEL.md +140 -1
- package/completions/_forgeloop +22 -4
- package/completions/forgeloop.bash +40 -4
- package/completions/forgeloop.fish +130 -1
- package/docs/ADVISORY_CONTEXT.md +25 -0
- package/docs/AGENT_BROWSER_ADAPTER.md +81 -0
- package/docs/AGENT_BROWSER_VERIFICATION.md +6 -0
- package/docs/AGENT_PROTOCOL_SUMMARY.md +81 -3
- package/docs/AGENT_SKILL.md +66 -0
- package/docs/ARTIFACT_REFERENCE.md +123 -0
- package/docs/AUDIT_UX.md +46 -0
- package/docs/BROWSER_VERIFICATION.md +136 -0
- package/docs/CLI_REFERENCE.md +392 -10
- package/docs/CODE_ATTESTATION.md +2 -2
- package/docs/DOCUMENTATION_GUIDE.md +34 -12
- package/docs/GETTING_STARTED.md +59 -0
- package/docs/JEV_BENCHMARKS.md +31 -0
- package/docs/MODEL_ROUTING.md +37 -0
- package/docs/OPENSRC_ADAPTER.md +241 -0
- package/docs/PACKAGE_CONTENTS.md +60 -19
- package/docs/PROVIDERS.md +126 -0
- package/docs/PROVIDER_ARCHITECTURE.md +199 -0
- package/docs/RECIPES.md +32 -0
- package/docs/RELEASE_CHECKLIST.md +66 -5
- package/docs/SECURITY_REVIEW.md +71 -0
- package/docs/SEMANTIC_DECISION_PLANE.md +71 -0
- package/docs/TEST_INTELLIGENCE.md +29 -0
- package/docs/TEST_PRUNING.md +14 -0
- package/docs/TROUBLESHOOTING.md +298 -3
- package/docs/UNIVERSAL_INTEGRATION.md +31 -0
- package/docs/assets/diagrams/forgeloop-code-attestation-flow.html +2 -2
- package/docs/assets/diagrams/forgeloop-code-attestation-flow.receipt.json +5 -5
- package/docs/assets/diagrams/forgeloop-code-attestation-flow.svg +1 -1
- package/docs/assets/diagrams/forgeloop-engineering-flow.html +39 -26
- package/docs/assets/diagrams/forgeloop-engineering-flow.receipt.json +6 -6
- package/docs/assets/diagrams/forgeloop-engineering-flow.svg +26 -26
- package/docs/assets/diagrams/forgeloop-verification-trust-flow.html +2 -1
- package/docs/assets/diagrams/forgeloop-verification-trust-flow.receipt.json +5 -5
- package/docs/assets/diagrams/forgeloop-verification-trust-flow.svg +1 -1
- package/docs/diagrams/README.md +13 -9
- package/docs/diagrams/forgeloop-code-attestation-flow.workflow.json +1 -1
- package/docs/diagrams/forgeloop-engineering-flow.workflow.json +24 -19
- package/docs/diagrams/forgeloop-verification-trust-flow.workflow.json +1 -0
- package/docs/diagrams/reviews/forgeloop-code-attestation-flow.review.json +4 -4
- package/docs/diagrams/reviews/forgeloop-engineering-flow.review.json +4 -4
- package/docs/diagrams/reviews/forgeloop-verification-trust-flow.review.json +4 -4
- package/docs/documentation-manifest.json +1397 -0
- package/docs/protocol-requirements.json +101 -0
- package/package.json +46 -4
- package/schemas/config.schema.json +14 -0
- package/schemas/context-plan.schema.json +18 -0
- package/schemas/routing-input.schema.json +1 -1
- package/schemas/semantic-decision.schema.json +46 -0
- package/schemas/test-utility.schema.json +44 -0
- package/scripts/CI_VALIDATORS.md +84 -11
- package/scripts/benchmark-jev.mjs +5 -0
- package/scripts/benchmark-test-intelligence.mjs +4 -0
- package/scripts/generate-agent-protocol-summary.mjs +40 -1
- package/scripts/generate-forgeloop-skill.mjs +133 -0
- package/scripts/jev-smoke.mjs +19 -0
- package/skills/forgeloop/README.md +9 -0
- package/skills/forgeloop/SKILL.md +77 -0
- package/skills/forgeloop/references/lifecycle.md +9 -0
- package/skills/forgeloop/references/recovery.md +7 -0
- package/skills/forgeloop/references/verification.md +7 -0
- package/src/adapters/agent-browser/assertions.js +47 -0
- package/src/adapters/agent-browser/commands.js +54 -0
- package/src/adapters/agent-browser/index.js +3 -0
- package/src/adapters/agent-browser/locator.js +40 -0
- package/src/adapters/agent-browser/process.js +215 -0
- package/src/adapters/agent-browser/provider.js +313 -0
- package/src/adapters/emulated-services/constants.js +24 -0
- package/src/adapters/emulated-services/index.js +7 -0
- package/src/adapters/emulated-services/process.js +162 -0
- package/src/adapters/emulated-services/provider.js +282 -0
- package/src/adapters/opensrc/normalize.js +90 -0
- package/src/adapters/opensrc/process.js +248 -0
- package/src/adapters/opensrc/provider.js +338 -0
- package/src/adapters/opensrc/search.js +264 -0
- package/src/adapters/typesafe/client.js +28 -0
- package/src/adapters/typesafe/engine.js +63 -0
- package/src/adapters/typesafe/normalize.js +41 -0
- package/src/cli.js +108 -0
- package/src/commands/checkpoint-revalidate.js +176 -0
- package/src/commands/context-plan.js +38 -0
- package/src/commands/contract-create.js +264 -0
- package/src/commands/contract-revise.js +236 -0
- package/src/commands/decision-show.js +14 -0
- package/src/commands/decision-status.js +22 -0
- package/src/commands/discover.js +41 -0
- package/src/commands/doctor.js +15 -0
- package/src/commands/gate-record.js +205 -0
- package/src/commands/gate-revalidate.js +137 -0
- package/src/commands/model-route.js +32 -0
- package/src/commands/next.js +19 -7
- package/src/commands/route.js +146 -18
- package/src/commands/semantic-plan.js +17 -0
- package/src/commands/task-abandon.js +224 -0
- package/src/commands/task-create.js +84 -25
- package/src/commands/task-list.js +22 -2
- package/src/commands/task-migrate-contract-bootstrap-repair.js +288 -0
- package/src/commands/task-repair-contract-bootstrap.js +263 -0
- package/src/commands/test-inventory.js +5 -0
- package/src/commands/test-prune-plan.js +5 -0
- package/src/commands/test-prune-probe.js +5 -0
- package/src/commands/test-utility.js +5 -0
- package/src/commands/validate-protocol.js +10 -1
- package/src/config/guides.json +44 -0
- package/src/core/artifact-registry.js +24 -0
- package/src/core/audit-ux.js +514 -0
- package/src/core/browser-verification/constants.js +149 -0
- package/src/core/browser-verification/normalize.js +254 -0
- package/src/core/browser-verification/provider.js +519 -0
- package/src/core/browser-verification/service.js +115 -0
- package/src/core/build-script.js +151 -0
- package/src/core/c-cpp-project.js +143 -0
- package/src/core/checkpoint-revalidation.js +319 -0
- package/src/core/cli-command-definitions.js +249 -1
- package/src/core/command-executors.js +115 -3
- package/src/core/command-input.js +212 -102
- package/src/core/completion-artifacts.js +14 -5
- package/src/core/completion.js +4 -6
- package/src/core/config.js +3 -0
- package/src/core/context-compiler/budget.js +9 -0
- package/src/core/context-compiler/candidates.js +39 -0
- package/src/core/context-compiler/compiler.js +63 -0
- package/src/core/context-compiler/fingerprint.js +11 -0
- package/src/core/context-compiler/policy.js +13 -0
- package/src/core/context-compiler/result.js +23 -0
- package/src/core/contract-bootstrap-recovery.js +655 -0
- package/src/core/contract-presets.js +82 -0
- package/src/core/contract-revision.js +210 -0
- package/src/core/decision/artifact.js +69 -0
- package/src/core/decision/benchmarks.js +103 -0
- package/src/core/decision/cache.js +27 -0
- package/src/core/decision/constants.js +58 -0
- package/src/core/decision/cutover.js +34 -0
- package/src/core/decision/engine.js +22 -0
- package/src/core/decision/errors.js +68 -0
- package/src/core/decision/events.js +101 -0
- package/src/core/decision/freshness.js +19 -0
- package/src/core/decision/normalizers/index.js +115 -0
- package/src/core/decision/policy.js +18 -0
- package/src/core/decision/projection.js +16 -0
- package/src/core/decision/question-registry.js +201 -0
- package/src/core/decision/request.js +26 -0
- package/src/core/decision/resolver.js +130 -0
- package/src/core/decision/result.js +58 -0
- package/src/core/decision/service.js +156 -0
- package/src/core/decision/state-builder.js +65 -0
- package/src/core/decision/task-bindings.js +30 -0
- package/src/core/decision/test-provider.js +32 -0
- package/src/core/decision/thresholds.js +15 -0
- package/src/core/error-codes.js +281 -3
- package/src/core/events.js +226 -57
- package/src/core/evidence-readiness.js +9 -0
- package/src/core/execution-prerequisites.js +14 -0
- package/src/core/execution-profile.js +63 -38
- package/src/core/filesystem.js +1 -10
- package/src/core/gate-provenance.js +124 -0
- package/src/core/go-project.js +206 -0
- package/src/core/integration-invocation-policy.js +27 -4
- package/src/core/integration-resources.js +86 -61
- package/src/core/java-project.js +403 -0
- package/src/core/model-router/constants.js +10 -0
- package/src/core/model-router/policy.js +103 -0
- package/src/core/model-router/router.js +37 -0
- package/src/core/multi-language-project.js +117 -0
- package/src/core/next-action-model.js +58 -0
- package/src/core/next-action-phases.js +130 -42
- package/src/core/next-action-refresh.js +43 -9
- package/src/core/next-action-review-phase.js +7 -2
- package/src/core/next-action.js +35 -7
- package/src/core/next-explanation.js +63 -0
- package/src/core/phase.js +128 -10
- package/src/core/php-project.js +85 -0
- package/src/core/preflight-consistency.js +23 -9
- package/src/core/preflight-loaders.js +37 -5
- package/src/core/project-detection.js +1760 -52
- package/src/core/protocol-info.js +65 -0
- package/src/core/protocol.js +20 -0
- package/src/core/reconcile-closure.js +132 -53
- package/src/core/recovery-history.js +1 -0
- package/src/core/resumability.js +154 -44
- package/src/core/route-artifact.js +15 -1
- package/src/core/router.js +223 -4
- package/src/core/runtime-context.js +118 -61
- package/src/core/rust-project.js +400 -0
- package/src/core/schema-validation.js +3 -0
- package/src/core/security-review/constants.js +64 -0
- package/src/core/security-review/normalize.js +245 -0
- package/src/core/security-review/provider.js +204 -0
- package/src/core/security-review/service.js +134 -0
- package/src/core/semantic-planning/constants.js +19 -0
- package/src/core/semantic-planning/projection.js +94 -0
- package/src/core/semantic-planning/service.js +15 -0
- package/src/core/sources.js +37 -0
- package/src/core/sql-project.js +141 -0
- package/src/core/swift-project.js +200 -0
- package/src/core/task-claim-state.js +201 -1
- package/src/core/task-conflict-inspection.js +31 -5
- package/src/core/task-paths.js +13 -0
- package/src/core/task-recovery.js +1 -0
- package/src/core/templates.js +3 -0
- package/src/core/test-intelligence/benchmarks.js +68 -0
- package/src/core/test-intelligence/inventory.js +73 -0
- package/src/core/test-intelligence/prune.js +90 -0
- package/src/core/test-intelligence/semantic-state.js +15 -0
- package/src/core/test-intelligence/service.js +40 -0
- package/src/core/test-intelligence/utility.js +50 -0
- package/src/core/trace.js +11 -7
- package/src/core/transaction.js +1 -0
- package/src/core/typescript-project.js +349 -0
- package/src/core/xml-structure.js +123 -0
- package/src/integration.d.ts +492 -0
- package/src/integration.js +54 -0
- package/src/providers/README.md +47 -0
- package/src/providers/capabilities.js +46 -0
- package/src/providers/errors.js +15 -0
- package/src/providers/index.js +29 -0
- package/src/providers/json-snapshot.js +105 -0
- package/src/providers/registry.js +152 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"requirements": {
|
|
4
|
+
"FL-CONT-001": {
|
|
5
|
+
"source": "LOOP_ENGINEERING.md",
|
|
6
|
+
"statement": "A receiving harness MUST reconcile continuity against the current work state and checkout before acting on it.",
|
|
7
|
+
"tests": ["tests/continuity.test.js", "tests/documentation-conformance.test.js"],
|
|
8
|
+
"validator": "src/core/continuity.js"
|
|
9
|
+
},
|
|
10
|
+
"FL-CLAIM-001": {
|
|
11
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
12
|
+
"statement": "Every harness MUST consume the canonical validated claim-state resolver.",
|
|
13
|
+
"tests": ["tests/task-claim-state.test.js", "tests/task-recovery-tamper.test.js"],
|
|
14
|
+
"validator": "src/core/task-claim-state.js"
|
|
15
|
+
},
|
|
16
|
+
"FL-CLAIM-002": {
|
|
17
|
+
"source": "LOOP_ENGINEERING.md",
|
|
18
|
+
"statement": "Readers without task-recovery schema v1 support MUST refuse claim ownership mutation.",
|
|
19
|
+
"tests": ["tests/protocol-info.test.js", "tests/documentation-conformance.test.js"],
|
|
20
|
+
"validator": "scripts/validate_documentation_conformance.mjs"
|
|
21
|
+
},
|
|
22
|
+
"FL-CLAIM-003": {
|
|
23
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
24
|
+
"statement": "A reader without validated claim projection MUST fail closed.",
|
|
25
|
+
"tests": ["tests/protocol-info.test.js", "tests/package.test.js"],
|
|
26
|
+
"validator": "src/core/protocol-info.js"
|
|
27
|
+
},
|
|
28
|
+
"FL-WS-001": {
|
|
29
|
+
"source": "LOOP_ENGINEERING.md",
|
|
30
|
+
"statement": "A bound task MUST validate the current workspace before a task mutation or ForgeLoop-owned verification launch.",
|
|
31
|
+
"tests": ["tests/workspace-binding.test.js", "tests/workspace-binding-run-check.test.js"],
|
|
32
|
+
"validator": "src/core/workspace-binding.js"
|
|
33
|
+
},
|
|
34
|
+
"FL-HANDOFF-001": {
|
|
35
|
+
"source": "LOOP_ENGINEERING.md",
|
|
36
|
+
"statement": "A canonical handoff MUST remain an immutable protocol-derived snapshot.",
|
|
37
|
+
"tests": ["tests/handoff-envelope.test.js"],
|
|
38
|
+
"validator": "src/core/handoff.js"
|
|
39
|
+
},
|
|
40
|
+
"FL-SCOPE-001": {
|
|
41
|
+
"source": "LOOP_ENGINEERING.md",
|
|
42
|
+
"statement": "A verification scope MUST narrow execution only from current canonical evidence.",
|
|
43
|
+
"tests": ["tests/verification-scope.test.js", "tests/verification-scope-freshness.test.js"],
|
|
44
|
+
"validator": "src/core/verification-scope.js"
|
|
45
|
+
},
|
|
46
|
+
"FL-ATTEST-001": {
|
|
47
|
+
"source": "LOOP_ENGINEERING.md",
|
|
48
|
+
"statement": "A code attestation MUST bind exact source content to a valid completion receipt and event-ledger checkpoint.",
|
|
49
|
+
"tests": ["tests/code-manifest.test.js", "tests/attestation.test.js", "tests/attestation-verifier.test.js"],
|
|
50
|
+
"validator": "src/core/attestation-verifier.js"
|
|
51
|
+
},
|
|
52
|
+
"FL-ATTEST-002": {
|
|
53
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
54
|
+
"statement": "An integration MUST consume the canonical attestation result and preserve its trust distinctions.",
|
|
55
|
+
"tests": ["tests/generic-ci-attestation.test.js", "tests/integration-runtime.test.js"],
|
|
56
|
+
"validator": "src/core/command-runtime.js"
|
|
57
|
+
},
|
|
58
|
+
"FL-ATTEST-003": {
|
|
59
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
60
|
+
"statement": "A signing integration MUST keep private keys, OIDC tokens, and credentials outside ForgeLoop artifacts.",
|
|
61
|
+
"tests": ["tests/signing-provider.test.js"],
|
|
62
|
+
"validator": "src/core/signing/"
|
|
63
|
+
},
|
|
64
|
+
"FL-SQ-001": {
|
|
65
|
+
"source": "LOOP_ENGINEERING.md",
|
|
66
|
+
"statement": "Structural-quality evidence MUST remain provider-neutral, task-bound, delta-first, and separate from behavioral, security, performance, accessibility, and publication truth.",
|
|
67
|
+
"tests": ["tests/structural-quality-policy.test.js", "tests/structural-quality-lifecycle.test.js"],
|
|
68
|
+
"validator": "src/core/structural-quality/service.js"
|
|
69
|
+
},
|
|
70
|
+
"FL-SQ-002": {
|
|
71
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
72
|
+
"statement": "A structural-quality integration MUST preserve unavailable, malformed, stale, incomparable, and blocked provider results without promoting them to PASS.",
|
|
73
|
+
"tests": ["tests/sentrux-structural-quality-provider.test.js", "tests/structural-quality-artifacts.test.js"],
|
|
74
|
+
"validator": "src/core/structural-quality/provider.js"
|
|
75
|
+
},
|
|
76
|
+
"FL-PROVIDER-001": {
|
|
77
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
78
|
+
"statement": "The providerExtensions capability MUST remain provider-neutral and experimental, and MUST NOT imply a public generic provider registry API.",
|
|
79
|
+
"tests": ["tests/protocol-info.test.js", "tests/provider-capabilities.test.js"],
|
|
80
|
+
"validator": "src/core/protocol-info.js"
|
|
81
|
+
},
|
|
82
|
+
"FL-PROVIDER-002": {
|
|
83
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
84
|
+
"statement": "Every advertised provider kind MUST deny lifecycle, completion, and evidence authority.",
|
|
85
|
+
"tests": ["tests/provider-capabilities.test.js"],
|
|
86
|
+
"validator": "src/providers/capabilities.js"
|
|
87
|
+
},
|
|
88
|
+
"FL-PROVIDER-003": {
|
|
89
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
90
|
+
"statement": "Provider results MUST cross a strict JSON snapshot boundary before consumer use.",
|
|
91
|
+
"tests": ["tests/provider-architecture.test.js"],
|
|
92
|
+
"validator": "src/providers/json-snapshot.js"
|
|
93
|
+
},
|
|
94
|
+
"FL-PROVIDER-004": {
|
|
95
|
+
"source": "PROTOCOL_INTEGRATION.md",
|
|
96
|
+
"statement": "The generic provider registry MUST remain absent from the public package subpath exports.",
|
|
97
|
+
"tests": ["tests/provider-architecture.test.js", "tests/package.test.js"],
|
|
98
|
+
"validator": "package.json"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cassiomc1/forgeloop",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Portable, verifiable engineering protocol for AI coding environments and developer workflows",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -51,12 +51,16 @@
|
|
|
51
51
|
".github/copilot-instructions.md",
|
|
52
52
|
"README.md",
|
|
53
53
|
"DOCS_INDEX.md",
|
|
54
|
+
"CONTRIBUTING.md",
|
|
55
|
+
"docs/documentation-manifest.json",
|
|
56
|
+
"docs/protocol-requirements.json",
|
|
54
57
|
"docs/diagrams",
|
|
55
58
|
"docs/assets/diagrams",
|
|
56
59
|
"docs/GETTING_STARTED.md",
|
|
57
60
|
"docs/CROSS_HARNESS_CONTINUITY.md",
|
|
58
61
|
"docs/ADVISORY_CONTEXT.md",
|
|
59
62
|
"docs/RIPWIRE_ADAPTER.md",
|
|
63
|
+
"docs/OPENSRC_ADAPTER.md",
|
|
60
64
|
"docs/CLI_REFERENCE.md",
|
|
61
65
|
"docs/ARTIFACT_REFERENCE.md",
|
|
62
66
|
"docs/TROUBLESHOOTING.md",
|
|
@@ -65,9 +69,21 @@
|
|
|
65
69
|
"docs/DOCUMENTATION_GUIDE.md",
|
|
66
70
|
"docs/RELEASE_CHECKLIST.md",
|
|
67
71
|
"docs/PACKAGE_CONTENTS.md",
|
|
72
|
+
"docs/PROVIDER_ARCHITECTURE.md",
|
|
73
|
+
"docs/PROVIDERS.md",
|
|
74
|
+
"docs/SECURITY_REVIEW.md",
|
|
75
|
+
"docs/BROWSER_VERIFICATION.md",
|
|
76
|
+
"docs/AGENT_BROWSER_ADAPTER.md",
|
|
77
|
+
"docs/AGENT_BROWSER_VERIFICATION.md",
|
|
78
|
+
"docs/JEV_BENCHMARKS.md",
|
|
79
|
+
"docs/MODEL_ROUTING.md",
|
|
80
|
+
"docs/SEMANTIC_DECISION_PLANE.md",
|
|
81
|
+
"docs/TEST_INTELLIGENCE.md",
|
|
82
|
+
"docs/TEST_PRUNING.md",
|
|
68
83
|
"scripts/CI_VALIDATORS.md",
|
|
69
84
|
"docs/MCP.md",
|
|
70
85
|
"docs/UNIVERSAL_INTEGRATION.md",
|
|
86
|
+
"docs/AUDIT_UX.md",
|
|
71
87
|
"docs/DIAGNOSTIC_MODEL.md",
|
|
72
88
|
"docs/EXECUTION_TRACE.md",
|
|
73
89
|
"docs/CODE_ATTESTATION.md",
|
|
@@ -75,12 +91,18 @@
|
|
|
75
91
|
"docs/SIGNING_PROVIDERS.md",
|
|
76
92
|
"docs/PLATFORM_ADAPTERS.md",
|
|
77
93
|
"docs/AGENT_PROTOCOL_SUMMARY.md",
|
|
94
|
+
"docs/AGENT_SKILL.md",
|
|
78
95
|
"docs/EXECUTION_PROFILE_BENCHMARKS.md",
|
|
79
96
|
"docs/REPOSITORY_INDEX.md",
|
|
80
97
|
"docs/PERSISTENT_SEARCH_TRANSPORT.md",
|
|
81
98
|
"docs/KNOWLEDGE_SOURCES.md",
|
|
82
99
|
"scripts/generate-shell-completions.mjs",
|
|
83
100
|
"scripts/generate-agent-protocol-summary.mjs",
|
|
101
|
+
"scripts/generate-forgeloop-skill.mjs",
|
|
102
|
+
"scripts/jev-smoke.mjs",
|
|
103
|
+
"scripts/benchmark-jev.mjs",
|
|
104
|
+
"scripts/benchmark-test-intelligence.mjs",
|
|
105
|
+
"skills/forgeloop",
|
|
84
106
|
"scripts/run-execution-profile-benchmarks.mjs",
|
|
85
107
|
"scripts/summarize-execution-profile-benchmarks.mjs",
|
|
86
108
|
"scripts/validate-execution-profile-benchmarks.mjs",
|
|
@@ -103,6 +125,10 @@
|
|
|
103
125
|
],
|
|
104
126
|
"scripts": {
|
|
105
127
|
"test": "node scripts/run-tests.js",
|
|
128
|
+
"test:ci": "node scripts/run-tests.js --test-concurrency=2",
|
|
129
|
+
"test:watch": "node scripts/run-tests.js --watch",
|
|
130
|
+
"coverage:shard": "c8 --all --include=src/**/*.js --temp-directory=coverage-data npm run test:ci",
|
|
131
|
+
"coverage:report": "c8 --all --include=src/**/*.js --reporter=text --reporter=lcov --reporter=json-summary --temp-directory=coverage-data --check-coverage --lines=80 --functions=75 --branches=70 --statements=80 report",
|
|
106
132
|
"pack:check": "node --test tests/package.test.js",
|
|
107
133
|
"pack:smoke": "node scripts/package_smoke.mjs",
|
|
108
134
|
"release:identity": "node scripts/verify_release_identity.mjs",
|
|
@@ -116,18 +142,20 @@
|
|
|
116
142
|
"docs:report": "node scripts/report_documentation_health.mjs",
|
|
117
143
|
"docs:check": "node scripts/run-docs-check.js",
|
|
118
144
|
"lint": "eslint .",
|
|
119
|
-
"coverage": "c8 --all --include=src/**/*.js --reporter=text --reporter=lcov --reporter=json-summary --check-coverage --lines=80 --functions=75 --branches=70 --statements=80
|
|
145
|
+
"coverage": "c8 --all --include=src/**/*.js --reporter=text --reporter=lcov --reporter=json-summary --check-coverage --lines=80 --functions=75 --branches=70 --statements=80 npm run test:ci",
|
|
120
146
|
"dependency:policy": "node scripts/check-dependency-policy.mjs",
|
|
121
147
|
"mcp:test": "node scripts/run-mcp-tests.mjs",
|
|
122
148
|
"completions:generate": "node scripts/generate-shell-completions.mjs --write",
|
|
123
149
|
"completions:check": "node scripts/generate-shell-completions.mjs --check",
|
|
124
|
-
"test:quick": "node --test tests/cli.test.js tests/schema-health.test.js tests/schema-golden.test.js tests/protocol-info.test.js tests/integration-capabilities.test.js",
|
|
150
|
+
"test:quick": "node --import=./scripts/test-semantic-provider-loader.mjs --test tests/cli.test.js tests/schema-health.test.js tests/schema-golden.test.js tests/protocol-info.test.js tests/integration-capabilities.test.js tests/ci-classify.test.js tests/validation-tiers.test.js",
|
|
125
151
|
"performance:check": "node scripts/benchmark-cli-startup.mjs",
|
|
126
152
|
"critical-coverage:check": "node scripts/check-critical-coverage.mjs",
|
|
127
153
|
"changelog:check": "node scripts/check-changelog-freshness.mjs",
|
|
128
154
|
"attestation:summary": "node scripts/write-forgeloop-attestation-summary.mjs",
|
|
129
155
|
"summary:generate": "node scripts/generate-agent-protocol-summary.mjs --write",
|
|
130
156
|
"summary:check": "node scripts/generate-agent-protocol-summary.mjs --check",
|
|
157
|
+
"skill:generate": "node scripts/generate-forgeloop-skill.mjs --write",
|
|
158
|
+
"skill:check": "node scripts/generate-forgeloop-skill.mjs --check",
|
|
131
159
|
"mcp:setup": "node scripts/mcp-setup.mjs",
|
|
132
160
|
"mcp:pack:check": "node scripts/mcp-package-smoke.mjs",
|
|
133
161
|
"poc:evidence:verify": "node scripts/verify_poc_evidence.mjs",
|
|
@@ -140,7 +168,17 @@
|
|
|
140
168
|
"benchmark:profiles:regression": "node scripts/check-efficiency-regression.mjs",
|
|
141
169
|
"transactions:compact": "node scripts/compact-transactions.mjs",
|
|
142
170
|
"complexity:check": "node scripts/check-complexity.mjs",
|
|
143
|
-
"repository-index:manifest": "node scripts/verify-tgrep-manifest.mjs"
|
|
171
|
+
"repository-index:manifest": "node scripts/verify-tgrep-manifest.mjs",
|
|
172
|
+
"repository:hygiene": "node scripts/check-repository-hygiene.mjs",
|
|
173
|
+
"task-discovery:benchmark": "node scripts/benchmark-task-discovery.mjs",
|
|
174
|
+
"verify:fast": "node scripts/run-validation.mjs --tier fast",
|
|
175
|
+
"verify:local": "node scripts/run-validation.mjs --tier local",
|
|
176
|
+
"verify:prepush": "node scripts/run-validation.mjs --tier prepush",
|
|
177
|
+
"verify:release": "node scripts/run-validation.mjs --tier release",
|
|
178
|
+
"jev:smoke": "node scripts/jev-smoke.mjs",
|
|
179
|
+
"benchmark:jev": "node scripts/benchmark-jev.mjs",
|
|
180
|
+
"benchmark:jev:live": "node scripts/benchmark-jev.mjs --live",
|
|
181
|
+
"benchmark:test-intelligence": "node scripts/benchmark-test-intelligence.mjs"
|
|
144
182
|
},
|
|
145
183
|
"devDependencies": {
|
|
146
184
|
"c8": "^12.0.0",
|
|
@@ -148,6 +186,10 @@
|
|
|
148
186
|
"typescript": "7.0.2",
|
|
149
187
|
"yaml": "2.9.0"
|
|
150
188
|
},
|
|
189
|
+
"dependencies": {
|
|
190
|
+
"@typesafe-ai/sdk": "0.6.0",
|
|
191
|
+
"smol-toml": "1.8.0"
|
|
192
|
+
},
|
|
151
193
|
"exports": {
|
|
152
194
|
".": "./src/cli.js",
|
|
153
195
|
"./integration": {
|
|
@@ -12,6 +12,20 @@
|
|
|
12
12
|
"policy": { "type": "string", "minLength": 1 },
|
|
13
13
|
"requiredGates": { "type": "array", "items": { "type": "string", "minLength": 1 } },
|
|
14
14
|
"requiredEvidence": { "type": "array", "items": { "type": "string", "minLength": 1 } },
|
|
15
|
+
"decisionEngine": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"required": ["required", "provider", "model", "policyVersion", "requestTimeoutMs", "maxRetries", "cache"],
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"properties": {
|
|
20
|
+
"required": { "const": true },
|
|
21
|
+
"provider": { "const": "typesafe-jev" },
|
|
22
|
+
"model": { "const": "jev-1.13.0" },
|
|
23
|
+
"policyVersion": { "const": 1 },
|
|
24
|
+
"requestTimeoutMs": { "type": "integer", "minimum": 500, "maximum": 60000 },
|
|
25
|
+
"maxRetries": { "type": "integer", "minimum": 0, "maximum": 3 },
|
|
26
|
+
"cache": { "type": "boolean" }
|
|
27
|
+
}
|
|
28
|
+
},
|
|
15
29
|
"structuralQuality": {
|
|
16
30
|
"type": "object",
|
|
17
31
|
"additionalProperties": false,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forgeloop://schemas/context-plan.schema.json",
|
|
4
|
+
"title": "ForgeLoop bounded context plan",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "protocolVersion", "profile", "budget", "candidateItems", "selectedItems", "candidateChars", "selectedChars", "selected", "omitted", "mandatoryIds", "promptInjectionIds", "candidateSetFingerprint", "tokenUsage", "decisionFingerprint", "authority", "evidenceAuthority", "lifecycleAuthority", "completionAuthority"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": { "const": 1 }, "protocolVersion": { "const": 1 },
|
|
9
|
+
"profile": { "enum": ["light", "balanced", "full"] },
|
|
10
|
+
"budget": { "type": "object", "required": ["maxItems", "maxChars"], "properties": { "maxItems": { "type": "integer", "minimum": 1 }, "maxChars": { "type": "integer", "minimum": 1 } }, "additionalProperties": false },
|
|
11
|
+
"candidateItems": { "type": "integer", "minimum": 0 }, "selectedItems": { "type": "integer", "minimum": 0 }, "candidateChars": { "type": "integer", "minimum": 0 }, "selectedChars": { "type": "integer", "minimum": 0 },
|
|
12
|
+
"selected": { "type": "array", "items": { "type": "object" } }, "omitted": { "type": "array", "items": { "type": "object" } },
|
|
13
|
+
"mandatoryIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "promptInjectionIds": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "candidateSetFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
14
|
+
"tokenUsage": { "type": "object", "required": ["inputTokens", "outputTokens", "reportedBy"], "properties": { "inputTokens": { "type": ["integer", "null"] }, "outputTokens": { "type": ["integer", "null"] }, "reportedBy": { "enum": ["PROVIDER", "HOST", "UNKNOWN"] } }, "additionalProperties": false },
|
|
15
|
+
"decisionFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "authority": { "const": "SEMANTIC_DECISION" }, "evidenceAuthority": { "const": "NONE" }, "lifecycleAuthority": { "const": false }, "completionAuthority": { "const": false }
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": false
|
|
18
|
+
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"properties": {
|
|
19
19
|
"schemaVersion": { "const": 1 },
|
|
20
20
|
"scope": { "enum": ["MATCH", "UNSCOPED", "NO_MATCH", "NONE"] },
|
|
21
|
-
"frameworks": { "type": "array", "items": { "enum": ["flutter"] } },
|
|
21
|
+
"frameworks": { "type": "array", "items": { "enum": ["flutter", "dotnet", "aspnetcore", "abp", "nodejs", "rust", "c", "cpp", "java", "sql", "go", "typescript", "php", "swift"] } },
|
|
22
22
|
"projectRoots": { "type": "array", "items": { "type": "string", "minLength": 1 } },
|
|
23
23
|
"primarySignals": { "type": "array", "items": { "type": "string", "minLength": 1 } },
|
|
24
24
|
"supportingSignals": { "type": "array", "items": { "type": "string", "minLength": 1 } }
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forgeloop://schemas/semantic-decision.schema.json",
|
|
4
|
+
"title": "ForgeLoop semantic decision",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "protocolVersion", "taskId", "decisionId", "decisionKind", "engine", "model", "questionSetId", "questionSetVersion", "questionSetFingerprint", "policyVersion", "stateFingerprint", "policyFingerprint", "answers", "confidence", "decision", "usage", "authority", "evidenceAuthority", "lifecycleAuthority", "completionAuthority", "ownershipAuthority", "installationAuthority", "recordedAt"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": { "const": 1 },
|
|
9
|
+
"protocolVersion": { "const": 1 },
|
|
10
|
+
"taskId": { "type": "string", "minLength": 1 },
|
|
11
|
+
"decisionId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$" },
|
|
12
|
+
"decisionKind": { "type": "string", "minLength": 1 },
|
|
13
|
+
"engine": { "const": "typesafe-jev" },
|
|
14
|
+
"model": { "const": "jev-1.13.0" },
|
|
15
|
+
"questionSetId": { "type": "string", "minLength": 1 },
|
|
16
|
+
"questionSetVersion": { "type": "integer", "minimum": 1 },
|
|
17
|
+
"questionSetFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
18
|
+
"questionSet": { "type": "object", "required": ["id", "version", "decisionKind", "questions", "fingerprint"], "properties": { "id": { "type": "string", "minLength": 1 }, "version": { "type": "integer", "minimum": 1 }, "decisionKind": { "type": "string", "minLength": 1 }, "questions": { "type": "object" }, "fingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "candidateIds": { "type": "array", "items": { "type": "string" } }, "metadata": { "type": "object" } }, "additionalProperties": true },
|
|
19
|
+
"policyVersion": { "const": 1 },
|
|
20
|
+
"stateFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
21
|
+
"taskStateFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
|
|
22
|
+
"semanticStateFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
|
|
23
|
+
"policyFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
24
|
+
"repositoryFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "object" }, { "type": "null" }] },
|
|
25
|
+
"contractFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
|
|
26
|
+
"routeFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
|
|
27
|
+
"verificationCycle": { "oneOf": [{ "type": "integer", "minimum": 1 }, { "type": "null" }] },
|
|
28
|
+
"candidateSetFingerprint": { "oneOf": [{ "type": "string", "pattern": "^[a-f0-9]{64}$" }, { "type": "null" }] },
|
|
29
|
+
"answers": { "type": "object" },
|
|
30
|
+
"confidence": { "type": "object" },
|
|
31
|
+
"decision": { "type": "object" },
|
|
32
|
+
"usage": {
|
|
33
|
+
"type": "object", "required": ["inputTokens", "outputTokens", "reportedBy"], "additionalProperties": false,
|
|
34
|
+
"properties": { "inputTokens": { "oneOf": [{ "type": "integer", "minimum": 0 }, { "type": "null" }] }, "outputTokens": { "oneOf": [{ "type": "integer", "minimum": 0 }, { "type": "null" }] }, "reportedBy": { "enum": ["PROVIDER", "HOST", "UNKNOWN"] } }
|
|
35
|
+
},
|
|
36
|
+
"latencyMs": { "oneOf": [{ "type": "integer", "minimum": 0 }, { "type": "null" }] },
|
|
37
|
+
"authority": { "const": "SEMANTIC_DECISION" },
|
|
38
|
+
"evidenceAuthority": { "const": "NONE" },
|
|
39
|
+
"lifecycleAuthority": { "const": false },
|
|
40
|
+
"completionAuthority": { "const": false },
|
|
41
|
+
"ownershipAuthority": { "const": false },
|
|
42
|
+
"installationAuthority": { "const": false },
|
|
43
|
+
"recordedAt": { "type": "string", "minLength": 1 }
|
|
44
|
+
},
|
|
45
|
+
"additionalProperties": false
|
|
46
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "forgeloop://schemas/test-utility.schema.json",
|
|
4
|
+
"title": "ForgeLoop test utility analysis",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "protocolVersion", "taskId", "generatedAt", "inventoryFingerprint", "semanticStatus", "tests"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": { "const": 1 },
|
|
9
|
+
"protocolVersion": { "const": 1 },
|
|
10
|
+
"taskId": { "type": "string", "minLength": 1 },
|
|
11
|
+
"generatedAt": { "type": "string", "minLength": 1 },
|
|
12
|
+
"inventoryFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
13
|
+
"semanticStatus": { "enum": ["PROVIDER_REPORTED", "UNAVAILABLE", "NOT_REQUESTED"] },
|
|
14
|
+
"decisionId": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$" },
|
|
15
|
+
"semanticDecisionFingerprint": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
16
|
+
"decisionIds": { "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$" } },
|
|
17
|
+
"semanticDecisionFingerprints": { "type": "array", "items": { "type": "string", "pattern": "^[a-f0-9]{64}$" } },
|
|
18
|
+
"tests": {
|
|
19
|
+
"type": "array",
|
|
20
|
+
"items": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"required": ["testId", "file", "framework", "name", "classification", "recommendation", "protected"],
|
|
23
|
+
"properties": {
|
|
24
|
+
"testId": { "type": "string", "pattern": "^test-[a-f0-9]{24}$" },
|
|
25
|
+
"file": { "type": "string", "minLength": 1 },
|
|
26
|
+
"framework": { "type": "string", "minLength": 1 },
|
|
27
|
+
"suite": { "type": "string" },
|
|
28
|
+
"name": { "type": "string", "minLength": 1 },
|
|
29
|
+
"line": { "type": "integer", "minimum": 1 },
|
|
30
|
+
"sourceSummary": { "type": "string" },
|
|
31
|
+
"targets": { "type": "array", "items": { "type": "string" } },
|
|
32
|
+
"runtimeMs": { "type": ["number", "null"], "minimum": 0 },
|
|
33
|
+
"uniqueBranches": { "type": ["integer", "null"], "minimum": 0 },
|
|
34
|
+
"classification": { "enum": ["KEEP_REQUIRED", "KEEP_UNIQUE", "KEEP_RISK_GUARD", "KEEP_AUTHORITY_BOUNDARY", "KEEP_RECOVERY_INVARIANT", "KEEP_RELEASE_SMOKE", "KEEP_MIGRATION_COMPATIBILITY", "KEEP_PLATFORM_BEHAVIOR", "KEEP_DOCUMENTATION_VALUE", "KEEP_INTEGRATION_GUARD", "OBSOLETE_CANDIDATE", "FLAKY_LOW_SIGNAL", "EXPENSIVE_LOW_SIGNAL", "UNKNOWN", "REDUNDANT_CANDIDATE"] },
|
|
35
|
+
"recommendation": { "enum": ["KEEP", "REWRITE", "PROBE_REMOVAL", "BLOCKED", "REVIEW"] },
|
|
36
|
+
"protected": { "type": "boolean" },
|
|
37
|
+
"signals": { "type": "object", "additionalProperties": true }
|
|
38
|
+
},
|
|
39
|
+
"additionalProperties": false
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"additionalProperties": false
|
|
44
|
+
}
|
package/scripts/CI_VALIDATORS.md
CHANGED
|
@@ -41,26 +41,99 @@ Maintainers should distinguish between actual documentation link failures and ex
|
|
|
41
41
|
- **Link-content failure (`Lychee`)**: The link checking step runs with `--verbose` and outputs the exact failing URL along with the HTTP status code (e.g. 404, 403). If a documentation URL is broken, update the link in the source Markdown. If a legitimate external host blocks shared CI runners or aggressively rate-limits CI automation, add a minimal, targeted exclusion in `.lychee.toml` with an explanatory comment.
|
|
42
42
|
- **Action-download / Runner infrastructure failure (GitHub 429/502/503)**: When GitHub Actions fails during action checkout or tool download before running the test steps, this is a transient infrastructure issue rather than a project defect. Rerun the workflow without modifying project files.
|
|
43
43
|
|
|
44
|
-
##
|
|
44
|
+
## Validation tiers
|
|
45
45
|
|
|
46
|
-
The
|
|
47
|
-
|
|
48
|
-
with no repeated platform/version pair in that workflow. Node 24 Linux also
|
|
49
|
-
collects coverage. Package-content tests share one pack listing within their
|
|
50
|
-
process. The dedicated Windows main-branch workflow remains separate.
|
|
46
|
+
The local runner makes the validation boundary explicit and never installs a
|
|
47
|
+
missing tool implicitly:
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
| Tier | Command | Intended use |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| Fast | `npm run verify:fast` | feedback while editing; quick Node, lint, dependency-policy, generated-doc, and repository-hygiene checks |
|
|
52
|
+
| Local | `npm run verify:local` | full deterministic source, documentation, manifest, and frozen Python checks |
|
|
53
|
+
| Pre-push | `npm run verify:prepush` | coverage, critical coverage, package/MCP checks, PoC checks, and the local suite expected before a PR |
|
|
54
|
+
| Release | `npm run verify:release` | pre-push checks plus package smoke, benchmark/profile checks, performance, release-identity prerequisites, and `npm pack --dry-run --json` |
|
|
55
|
+
|
|
56
|
+
Run `npm run mcp:setup` explicitly when the MCP package is not installed and
|
|
57
|
+
the MCP checks are in scope. If Python or another external validator is
|
|
58
|
+
unavailable, report `NOT_VERIFIED`; do not turn an unavailable check into a
|
|
59
|
+
pass by installing an unapproved tool.
|
|
60
|
+
|
|
61
|
+
The release tier reports `NOT_VERIFIED` until both
|
|
62
|
+
`FORGELOOP_RELEASE_VERSION` and `FORGELOOP_RELEASE_COMMIT` are supplied. When
|
|
63
|
+
present, those values are passed to the canonical `release:identity` command;
|
|
64
|
+
the runner never invents a release SHA or treats a pre-publication identity as
|
|
65
|
+
valid.
|
|
66
|
+
|
|
67
|
+
`npm run verify:prepush` deliberately runs coverage once and does not repeat
|
|
68
|
+
the full suite as a second `npm test`. `npm run lint`,
|
|
69
|
+
`npm run complexity:check`, and `npm run critical-coverage:check` retain
|
|
70
|
+
independent purposes: syntax and usage correctness, hotspot growth, and
|
|
71
|
+
coverage of critical modules. Packed TypeScript consumers validate the public
|
|
72
|
+
declarations; YAML-based tests validate workflow semantics. The approved exact
|
|
73
|
+
runtime dependencies are `@typesafe-ai/sdk` and `smol-toml`.
|
|
74
|
+
|
|
75
|
+
## GitHub Actions boundary
|
|
76
|
+
|
|
77
|
+
Ordinary pull requests use `.github/workflows/pr-core.yml`. It preserves the
|
|
78
|
+
ruleset's exact required contexts:
|
|
79
|
+
|
|
80
|
+
- `audit`
|
|
81
|
+
- `CodeQL`
|
|
82
|
+
- `Verify generated Archify diagram`
|
|
83
|
+
- `validate (22)`
|
|
84
|
+
- `tarball smoke (ubuntu-latest)`
|
|
85
|
+
- `dependency-review`
|
|
86
|
+
|
|
87
|
+
`validate (22)` is an always-present, fail-closed aggregator over the core
|
|
88
|
+
matrix and the path-applicable documentation, audit, package, and native
|
|
89
|
+
Repository Index jobs. An optional Repository Index job may be skipped only
|
|
90
|
+
when the classifier says that the change cannot affect it; the aggregator
|
|
91
|
+
rejects every unexpected skip, failure, or cancellation. The aggregator is
|
|
92
|
+
the status required by the branch ruleset, not a second copy of the Node
|
|
93
|
+
suite.
|
|
94
|
+
|
|
95
|
+
The path classifier is deterministic and testable locally:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
node scripts/ci-scenario-check.mjs
|
|
99
|
+
node scripts/ci-classify.mjs --paths README.md --json
|
|
100
|
+
node scripts/ci-classify.mjs --all --json
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Documentation-only pull requests use quick core validation plus the
|
|
104
|
+
documentation/diagram path; the Node 20 matrix steps do not install or run for
|
|
105
|
+
docs-only changes. Runtime and package changes use Node 20 compatibility checks
|
|
106
|
+
and four Node 24 unit shards wrapped by the coverage gate, followed by a
|
|
107
|
+
coverage-only aggregation. Repository Index changes retain the native reusable
|
|
108
|
+
workflow and its platform matrix. Package
|
|
109
|
+
smoke is Ubuntu-only on ordinary PRs and expands to macOS/Windows through the
|
|
110
|
+
explicit release matrix. The main branch retains dedicated documentation,
|
|
111
|
+
Node compatibility, package smoke, audit, and Windows full-suite workflows;
|
|
112
|
+
those workflows are the place for broader post-merge or release validation.
|
|
113
|
+
|
|
114
|
+
CodeQL and dependency review remain independent GitHub security gates. The
|
|
115
|
+
repository's GitHub secret scanning and push protection remain enabled; the
|
|
116
|
+
custom `scan_secrets.py` check is a local/pre-push compatibility validator and
|
|
117
|
+
is not duplicated in every ordinary PR job.
|
|
118
|
+
|
|
119
|
+
## Receipts and infrastructure failures
|
|
56
120
|
|
|
57
121
|
`npm run lint`, `npm run complexity:check`, and
|
|
58
122
|
`npm run critical-coverage:check` retain independent purposes: syntax and
|
|
59
123
|
usage correctness, hotspot growth, and coverage of critical modules. Packed
|
|
60
124
|
TypeScript consumers validate the public declarations; YAML-based tests
|
|
61
|
-
validate workflow semantics. The
|
|
125
|
+
validate workflow semantics. The approved exact runtime dependencies are
|
|
126
|
+
`@typesafe-ai/sdk` and `smol-toml`; dependency policy keeps all other runtime
|
|
127
|
+
dependencies out.
|
|
62
128
|
|
|
63
129
|
`scripts/audit-receipts.mjs` runs after checkout. It audits supplied scoped
|
|
64
130
|
receipts with explicit task IDs, fails on an invalid audit, and reports
|
|
65
131
|
`NOT_VERIFIED` when none are supplied. This repository job does not create
|
|
66
132
|
lifecycle evidence from CI test results.
|
|
133
|
+
|
|
134
|
+
Maintainers should distinguish actual validation failures from external
|
|
135
|
+
CI/action infrastructure errors. A Lychee link failure identifies the exact
|
|
136
|
+
URL and status; update Markdown or add only a targeted, explained exclusion
|
|
137
|
+
for a legitimate shared-runner restriction. An action-download or runner
|
|
138
|
+
failure before project steps begin (for example GitHub 429/502/503) is
|
|
139
|
+
infrastructure and should be retried without changing project files.
|
|
@@ -7,6 +7,8 @@ import { fileURLToPath } from "node:url";
|
|
|
7
7
|
import { ARTIFACT_REGISTRY } from "../src/core/artifact-registry.js";
|
|
8
8
|
import { CLI_COMMAND_DEFINITIONS } from "../src/core/cli-command-definitions.js";
|
|
9
9
|
import { PUBLIC_ERROR_REGISTRY } from "../src/core/error-codes.js";
|
|
10
|
+
import { PROJECT_DETECTION_LIMITS, PROJECT_EVIDENCE_SCHEMA_VERSION } from "../src/core/project-detection.js";
|
|
11
|
+
import { GUIDE_REGISTRY } from "../src/core/guide-registry.js";
|
|
10
12
|
import { protocolInfo } from "../src/core/protocol-info.js";
|
|
11
13
|
|
|
12
14
|
const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
@@ -43,6 +45,12 @@ function commandCatalog() {
|
|
|
43
45
|
.join("\n\n");
|
|
44
46
|
}
|
|
45
47
|
|
|
48
|
+
function guideCatalog() {
|
|
49
|
+
const rows = Object.entries(GUIDE_REGISTRY)
|
|
50
|
+
.map(([id, definition]) => [id, definition.path, definition.install ? "yes" : "no"]);
|
|
51
|
+
return `## Guide registry\n\n${table(["Guide", "Path", "Installable"], rows)}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
46
54
|
async function render() {
|
|
47
55
|
const packageJson = JSON.parse(await readFile(path.join(repositoryRoot, "package.json"), "utf8"));
|
|
48
56
|
const info = protocolInfo({ packageVersion: packageJson.version });
|
|
@@ -51,6 +59,7 @@ async function render() {
|
|
|
51
59
|
.map(([name, feature]) => [name, feature.version ?? "n/a", feature.supported === false ? "no" : "yes"]);
|
|
52
60
|
const handoffs = info.features.canonicalHandoffs;
|
|
53
61
|
const advisory = info.features.advisoryContextProviders;
|
|
62
|
+
const providerExtensions = info.features.providerExtensions;
|
|
54
63
|
const capabilityContracts = `## Capability contracts
|
|
55
64
|
|
|
56
65
|
- \`canonicalHandoffs\` v${handoffs.version}: immutable, supported, and
|
|
@@ -62,6 +71,8 @@ async function render() {
|
|
|
62
71
|
Integration-API-only, lazy, and opt-in. Provider results are not persisted by
|
|
63
72
|
ForgeLoop and are never lifecycle state, evidence, authority, or executable
|
|
64
73
|
instructions.
|
|
74
|
+
- \`providerExtensions\` v${providerExtensions.version} is provider-neutral and
|
|
75
|
+
experimental. The generic provider registry remains internal and unexported.
|
|
65
76
|
|
|
66
77
|
Protocol v1, schema v1, and Integration API v1 remain independent of these
|
|
67
78
|
capability-family versions.`;
|
|
@@ -95,6 +106,32 @@ Package version: ${packageJson.version}
|
|
|
95
106
|
6. Run forgeloop complete; accept completion only when the validator returns VALID.
|
|
96
107
|
7. Run forgeloop next again and follow the returned lifecycle action to a terminal state or an explicit blocker.
|
|
97
108
|
|
|
109
|
+
## Project evidence and guide routing
|
|
110
|
+
|
|
111
|
+
- The canonical guide registry is \`src/config/guides.json\`; the .NET
|
|
112
|
+
specialist has guide ID \`dotnet\` and resolves to
|
|
113
|
+
\`ENG/dotnet-aspnetcore-development-eng.md\`.
|
|
114
|
+
- Project evidence schema v${PROJECT_EVIDENCE_SCHEMA_VERSION} recognizes
|
|
115
|
+
structurally parsed Flutter, SDK-style .NET, Node.js, Rust, C, C++, Java,
|
|
116
|
+
SQL, Go, TypeScript, PHP, and Swift project evidence. SQL remains a bounded
|
|
117
|
+
owned-file overlay, while same-root language identities compose. ASP.NET Core
|
|
118
|
+
and ABP are conditional overlays recorded as reasons on \`dotnet\`; they
|
|
119
|
+
are not standalone guide IDs, and route validation requires each overlay to
|
|
120
|
+
include \`dotnet\`.
|
|
121
|
+
- Project detection is bounded by ${PROJECT_DETECTION_LIMITS.maxManifests}
|
|
122
|
+
manifests, ${PROJECT_DETECTION_LIMITS.maxSolutionFiles} solution files,
|
|
123
|
+
${PROJECT_DETECTION_LIMITS.maxManifestBytes} bytes per manifest,
|
|
124
|
+
${PROJECT_DETECTION_LIMITS.maxSourceFiles} supporting source files,
|
|
125
|
+
${PROJECT_DETECTION_LIMITS.maxSourceBytes} bytes per source file,
|
|
126
|
+
${PROJECT_DETECTION_LIMITS.maxVisitedDirectories} visited directories, and
|
|
127
|
+
${PROJECT_DETECTION_LIMITS.maxVisitedEntries} visited entries. It skips
|
|
128
|
+
symlinks and configured generated/vendor directories; exhausted budgets fail
|
|
129
|
+
closed rather than producing unbounded discovery.
|
|
130
|
+
- Task ownership discovery is a separate exhaustive operation. Task-list
|
|
131
|
+
filters and pagination project the validated discovery result and do not
|
|
132
|
+
remove ledger or recovery evidence. See \`GUIDE_ROUTER.md\` and
|
|
133
|
+
\`docs/CLI_REFERENCE.md\` for the operator-facing contracts.
|
|
134
|
+
|
|
98
135
|
## Adaptive execution profiles
|
|
99
136
|
|
|
100
137
|
\`complianceMode\` controls how strongly project policy is enforced. The
|
|
@@ -139,7 +176,7 @@ or \`NOT_COMPARABLE\` when evidence is absent or incompatible. See
|
|
|
139
176
|
- Responsibility contracts constrain paths, checks, and frozen inputs; they do not prove identity or authorship.
|
|
140
177
|
- Verification scope describes planned verification breadth. Attestation coverage proves content for a concrete revision. These are separate claims.
|
|
141
178
|
- Attestation manifests exclude ForgeLoop protocol metadata and bind to the completion receipt and append-only ledger without circular references.
|
|
142
|
-
- Verification
|
|
179
|
+
- Verification command execution is external and provenance-bearing; ForgeLoop records the exact argv and result, while the authorized command may perform its declared effects. Signing is external; private keys and credentials are never persisted by ForgeLoop.
|
|
143
180
|
|
|
144
181
|
## Lifecycle
|
|
145
182
|
|
|
@@ -151,6 +188,8 @@ ${table(["Feature", "Version", "Supported"], features)}
|
|
|
151
188
|
|
|
152
189
|
${capabilityContracts}
|
|
153
190
|
|
|
191
|
+
${guideCatalog()}
|
|
192
|
+
|
|
154
193
|
## Public artifact registry
|
|
155
194
|
|
|
156
195
|
${table(["Key", "Scope", "Path", "Schema", "Trust role"], artifacts)}
|