forgecraft-mcp 1.3.2 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/analyzers/anchors/anchor-loader.d.ts +47 -0
- package/dist/analyzers/anchors/anchor-loader.d.ts.map +1 -0
- package/dist/analyzers/anchors/anchor-loader.js +113 -0
- package/dist/analyzers/anchors/anchor-loader.js.map +1 -0
- package/dist/analyzers/anti-pattern.d.ts.map +1 -1
- package/dist/analyzers/anti-pattern.js +38 -26
- package/dist/analyzers/anti-pattern.js.map +1 -1
- package/dist/analyzers/completeness-helpers.d.ts +5 -0
- package/dist/analyzers/completeness-helpers.d.ts.map +1 -1
- package/dist/analyzers/completeness-helpers.js +17 -0
- package/dist/analyzers/completeness-helpers.js.map +1 -1
- package/dist/analyzers/completeness.d.ts.map +1 -1
- package/dist/analyzers/completeness.js +4 -4
- package/dist/analyzers/completeness.js.map +1 -1
- package/dist/analyzers/gs-scorer.d.ts +3 -1
- package/dist/analyzers/gs-scorer.d.ts.map +1 -1
- package/dist/analyzers/gs-scorer.js +5 -2
- package/dist/analyzers/gs-scorer.js.map +1 -1
- package/dist/analyzers/scorers/composable-scorer.d.ts +4 -2
- package/dist/analyzers/scorers/composable-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/composable-scorer.js +50 -2
- package/dist/analyzers/scorers/composable-scorer.js.map +1 -1
- package/dist/analyzers/scorers/executable-scorer.d.ts +3 -2
- package/dist/analyzers/scorers/executable-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/executable-scorer.js +64 -4
- package/dist/analyzers/scorers/executable-scorer.js.map +1 -1
- package/dist/analyzers/scorers/scorer-utils.d.ts +5 -3
- package/dist/analyzers/scorers/scorer-utils.d.ts.map +1 -1
- package/dist/analyzers/scorers/scorer-utils.js +34 -9
- package/dist/analyzers/scorers/scorer-utils.js.map +1 -1
- package/dist/analyzers/scorers/self-describing-scorer.d.ts +7 -4
- package/dist/analyzers/scorers/self-describing-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/self-describing-scorer.js +17 -18
- package/dist/analyzers/scorers/self-describing-scorer.js.map +1 -1
- package/dist/artifacts/commit-hooks.d.ts +1 -1
- package/dist/artifacts/commit-hooks.d.ts.map +1 -1
- package/dist/artifacts/commit-hooks.js +2 -0
- package/dist/artifacts/commit-hooks.js.map +1 -1
- package/dist/cli/commands.d.ts +35 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +109 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +7 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/disciplines/catalog.d.ts +16 -0
- package/dist/disciplines/catalog.d.ts.map +1 -0
- package/dist/disciplines/catalog.js +196 -0
- package/dist/disciplines/catalog.js.map +1 -0
- package/dist/disciplines/runner.d.ts +13 -0
- package/dist/disciplines/runner.d.ts.map +1 -0
- package/dist/disciplines/runner.js +35 -0
- package/dist/disciplines/runner.js.map +1 -0
- package/dist/registry/remote-gates.js +1 -1
- package/dist/registry/remote-gates.js.map +1 -1
- package/dist/sentinel/detect.d.ts +41 -0
- package/dist/sentinel/detect.d.ts.map +1 -0
- package/dist/sentinel/detect.js +122 -0
- package/dist/sentinel/detect.js.map +1 -0
- package/dist/sentinel/write.d.ts +54 -0
- package/dist/sentinel/write.d.ts.map +1 -0
- package/dist/sentinel/write.js +75 -0
- package/dist/sentinel/write.js.map +1 -0
- package/dist/shared/cnt-health.d.ts.map +1 -1
- package/dist/shared/cnt-health.js +12 -4
- package/dist/shared/cnt-health.js.map +1 -1
- package/dist/shared/config.d.ts +8 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +23 -0
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/project-gates-helpers.d.ts +9 -0
- package/dist/shared/project-gates-helpers.d.ts.map +1 -1
- package/dist/shared/project-gates-helpers.js +35 -0
- package/dist/shared/project-gates-helpers.js.map +1 -1
- package/dist/shared/result-utils.d.ts +27 -0
- package/dist/shared/result-utils.d.ts.map +1 -0
- package/dist/shared/result-utils.js +41 -0
- package/dist/shared/result-utils.js.map +1 -0
- package/dist/shared/types/config.d.ts +7 -1
- package/dist/shared/types/config.d.ts.map +1 -1
- package/dist/shared/types/gates.d.ts +28 -0
- package/dist/shared/types/gates.d.ts.map +1 -1
- package/dist/shared/types/project.d.ts +66 -0
- package/dist/shared/types/project.d.ts.map +1 -1
- package/dist/shared/types/project.js.map +1 -1
- package/dist/shared/types/verify.d.ts +51 -1
- package/dist/shared/types/verify.d.ts.map +1 -1
- package/dist/shared/types/verify.js +37 -1
- package/dist/shared/types/verify.js.map +1 -1
- package/dist/tools/advise-session-advisor.d.ts +16 -0
- package/dist/tools/advise-session-advisor.d.ts.map +1 -0
- package/dist/tools/advise-session-advisor.js +89 -0
- package/dist/tools/advise-session-advisor.js.map +1 -0
- package/dist/tools/advise-session-signals.d.ts +21 -0
- package/dist/tools/advise-session-signals.d.ts.map +1 -0
- package/dist/tools/advise-session-signals.js +113 -0
- package/dist/tools/advise-session-signals.js.map +1 -0
- package/dist/tools/advise-session.d.ts +22 -0
- package/dist/tools/advise-session.d.ts.map +1 -0
- package/dist/tools/advise-session.js +31 -0
- package/dist/tools/advise-session.js.map +1 -0
- package/dist/tools/change-request.d.ts +53 -0
- package/dist/tools/change-request.d.ts.map +1 -0
- package/dist/tools/change-request.js +375 -0
- package/dist/tools/change-request.js.map +1 -0
- package/dist/tools/check-cascade-contracts.d.ts +13 -0
- package/dist/tools/check-cascade-contracts.d.ts.map +1 -1
- package/dist/tools/check-cascade-contracts.js +73 -2
- package/dist/tools/check-cascade-contracts.js.map +1 -1
- package/dist/tools/check-cascade.d.ts +4 -3
- package/dist/tools/check-cascade.d.ts.map +1 -1
- package/dist/tools/check-cascade.js +30 -12
- package/dist/tools/check-cascade.js.map +1 -1
- package/dist/tools/check-spec-consistency.d.ts +25 -0
- package/dist/tools/check-spec-consistency.d.ts.map +1 -0
- package/dist/tools/check-spec-consistency.js +339 -0
- package/dist/tools/check-spec-consistency.js.map +1 -0
- package/dist/tools/check-t4.d.ts +54 -0
- package/dist/tools/check-t4.d.ts.map +1 -0
- package/dist/tools/check-t4.js +305 -0
- package/dist/tools/check-t4.js.map +1 -0
- package/dist/tools/close-cycle-helpers.d.ts +21 -2
- package/dist/tools/close-cycle-helpers.d.ts.map +1 -1
- package/dist/tools/close-cycle-helpers.js +66 -10
- package/dist/tools/close-cycle-helpers.js.map +1 -1
- package/dist/tools/close-cycle.d.ts +2 -2
- package/dist/tools/close-cycle.d.ts.map +1 -1
- package/dist/tools/close-cycle.js +342 -4
- package/dist/tools/close-cycle.js.map +1 -1
- package/dist/tools/consolidate-status.d.ts +112 -0
- package/dist/tools/consolidate-status.d.ts.map +1 -0
- package/dist/tools/consolidate-status.js +356 -0
- package/dist/tools/consolidate-status.js.map +1 -0
- package/dist/tools/executable-gates.d.ts +52 -0
- package/dist/tools/executable-gates.d.ts.map +1 -0
- package/dist/tools/executable-gates.js +332 -0
- package/dist/tools/executable-gates.js.map +1 -0
- package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch-extended.js +75 -0
- package/dist/tools/forgecraft-dispatch-extended.js.map +1 -1
- package/dist/tools/forgecraft-dispatch.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch.js +21 -0
- package/dist/tools/forgecraft-dispatch.js.map +1 -1
- package/dist/tools/forgecraft-router.d.ts +8 -0
- package/dist/tools/forgecraft-router.d.ts.map +1 -1
- package/dist/tools/forgecraft-router.js +21 -1
- package/dist/tools/forgecraft-router.js.map +1 -1
- package/dist/tools/forgecraft-schema-params.d.ts +61 -4
- package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema-params.js +95 -0
- package/dist/tools/forgecraft-schema-params.js.map +1 -1
- package/dist/tools/forgecraft-schema.d.ts +62 -5
- package/dist/tools/forgecraft-schema.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema.js +24 -0
- package/dist/tools/forgecraft-schema.js.map +1 -1
- package/dist/tools/gate-violations.d.ts +59 -0
- package/dist/tools/gate-violations.d.ts.map +1 -0
- package/dist/tools/gate-violations.js +152 -0
- package/dist/tools/gate-violations.js.map +1 -0
- package/dist/tools/generate-adr.js +6 -6
- package/dist/tools/generate-adr.js.map +1 -1
- package/dist/tools/generate-env-probe.d.ts +49 -0
- package/dist/tools/generate-env-probe.d.ts.map +1 -0
- package/dist/tools/generate-env-probe.js +365 -0
- package/dist/tools/generate-env-probe.js.map +1 -0
- package/dist/tools/generate-harness.d.ts +52 -0
- package/dist/tools/generate-harness.d.ts.map +1 -0
- package/dist/tools/generate-harness.js +333 -0
- package/dist/tools/generate-harness.js.map +1 -0
- package/dist/tools/generate-roadmap.d.ts +1 -1
- package/dist/tools/generate-roadmap.d.ts.map +1 -1
- package/dist/tools/generate-roadmap.js +38 -4
- package/dist/tools/generate-roadmap.js.map +1 -1
- package/dist/tools/generate-session-prompt.d.ts +4 -4
- package/dist/tools/generate-session-prompt.d.ts.map +1 -1
- package/dist/tools/generate-session-prompt.js +66 -16
- package/dist/tools/generate-session-prompt.js.map +1 -1
- package/dist/tools/generate-slo-probe.d.ts +53 -0
- package/dist/tools/generate-slo-probe.d.ts.map +1 -0
- package/dist/tools/generate-slo-probe.js +366 -0
- package/dist/tools/generate-slo-probe.js.map +1 -0
- package/dist/tools/layer-status-gates.d.ts +24 -0
- package/dist/tools/layer-status-gates.d.ts.map +1 -0
- package/dist/tools/layer-status-gates.js +151 -0
- package/dist/tools/layer-status-gates.js.map +1 -0
- package/dist/tools/layer-status.d.ts +133 -0
- package/dist/tools/layer-status.d.ts.map +1 -0
- package/dist/tools/layer-status.js +593 -0
- package/dist/tools/layer-status.js.map +1 -0
- package/dist/tools/postcondition-coverage.d.ts +57 -0
- package/dist/tools/postcondition-coverage.d.ts.map +1 -0
- package/dist/tools/postcondition-coverage.js +256 -0
- package/dist/tools/postcondition-coverage.js.map +1 -0
- package/dist/tools/probe-runners.d.ts +21 -0
- package/dist/tools/probe-runners.d.ts.map +1 -0
- package/dist/tools/probe-runners.js +246 -0
- package/dist/tools/probe-runners.js.map +1 -0
- package/dist/tools/probe-templates.d.ts +27 -0
- package/dist/tools/probe-templates.d.ts.map +1 -0
- package/dist/tools/probe-templates.js +279 -0
- package/dist/tools/probe-templates.js.map +1 -0
- package/dist/tools/propose-session.d.ts +28 -0
- package/dist/tools/propose-session.d.ts.map +1 -0
- package/dist/tools/propose-session.js +333 -0
- package/dist/tools/propose-session.js.map +1 -0
- package/dist/tools/roadmap-builder.d.ts +34 -1
- package/dist/tools/roadmap-builder.d.ts.map +1 -1
- package/dist/tools/roadmap-builder.js +153 -11
- package/dist/tools/roadmap-builder.js.map +1 -1
- package/dist/tools/run-env-probe.d.ts +57 -0
- package/dist/tools/run-env-probe.d.ts.map +1 -0
- package/dist/tools/run-env-probe.js +270 -0
- package/dist/tools/run-env-probe.js.map +1 -0
- package/dist/tools/run-harness.d.ts +52 -0
- package/dist/tools/run-harness.d.ts.map +1 -0
- package/dist/tools/run-harness.js +279 -0
- package/dist/tools/run-harness.js.map +1 -0
- package/dist/tools/run-slo-probe.d.ts +50 -0
- package/dist/tools/run-slo-probe.d.ts.map +1 -0
- package/dist/tools/run-slo-probe.js +281 -0
- package/dist/tools/run-slo-probe.js.map +1 -0
- package/dist/tools/scaffold-writer.d.ts.map +1 -1
- package/dist/tools/scaffold-writer.js +4 -0
- package/dist/tools/scaffold-writer.js.map +1 -1
- package/dist/tools/session-prompt-builders.d.ts +20 -0
- package/dist/tools/session-prompt-builders.d.ts.map +1 -1
- package/dist/tools/session-prompt-builders.js +111 -14
- package/dist/tools/session-prompt-builders.js.map +1 -1
- package/dist/tools/session-prompt-sections.d.ts +4 -2
- package/dist/tools/session-prompt-sections.d.ts.map +1 -1
- package/dist/tools/session-prompt-sections.js +22 -10
- package/dist/tools/session-prompt-sections.js.map +1 -1
- package/dist/tools/setup-monitoring.d.ts +41 -0
- package/dist/tools/setup-monitoring.d.ts.map +1 -0
- package/dist/tools/setup-monitoring.js +364 -0
- package/dist/tools/setup-monitoring.js.map +1 -0
- package/dist/tools/verify-formatter.d.ts.map +1 -1
- package/dist/tools/verify-formatter.js +15 -1
- package/dist/tools/verify-formatter.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +3 -0
- package/dist/tools/verify.js.map +1 -1
- package/package.json +11 -2
- package/templates/api/harness/uc-template.hurl +20 -0
- package/templates/docs-manifest.yaml +224 -0
- package/templates/game/harness/uc-template.sim.ts +29 -0
- package/templates/universal/claude-md-blocks/layer-navigation.md +20 -0
- package/templates/universal/claude-md-blocks/nfr-contracts.md +22 -0
- package/templates/universal/hooks.yaml +212 -20
- package/templates/web-react/harness/uc-template.spec.ts +35 -0
|
@@ -6,23 +6,24 @@
|
|
|
6
6
|
* stateless agent given the artifact set should be able to derive any valid
|
|
7
7
|
* implementation state without further human direction.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Six-step cascade (§6.2):
|
|
10
10
|
* 1. Functional specification — user-facing behavior and domain model
|
|
11
11
|
* 2. Architecture + C4 diagrams — layered structure and component map
|
|
12
12
|
* 3. Architectural constitution — operative grammar (CLAUDE.md / equivalent)
|
|
13
13
|
* 4. ADRs — non-obvious decisions recorded before impl
|
|
14
14
|
* 5. Use cases + behavioral contracts / Status.md next steps
|
|
15
|
+
* 6. Schema definitions — vocabulary of the system (DB, API, event)
|
|
15
16
|
*/
|
|
16
17
|
import { z } from "zod";
|
|
17
18
|
import { resolve, join } from "node:path";
|
|
18
19
|
import { existsSync, readFileSync } from "node:fs";
|
|
19
20
|
import yaml from "js-yaml";
|
|
20
21
|
import { checkFunctionalSpec, checkDiagrams, checkConstitution, } from "./check-cascade-steps.js";
|
|
21
|
-
import { checkAdrs, checkBehavioralContracts, } from "./check-cascade-contracts.js";
|
|
22
|
+
import { checkAdrs, checkBehavioralContracts, checkSchemaDefinitions, } from "./check-cascade-contracts.js";
|
|
22
23
|
import { writeInitialSessionPromptIfAbsent, formatReport, } from "./check-cascade-report.js";
|
|
23
24
|
export { isStub, loadForgeCraftConfig, CONSTITUTION_PATHS, FUNCTIONAL_SPEC_PATHS, ADR_DIRS, USE_CASE_PATHS, CONSTITUTION_LINE_LIMIT, PYTHON_PACKAGE_FILES, checkFunctionalSpec, checkDiagrams, checkConstitution, detectUnsafeDeserializationCast, findFunctionalSpecFallback, } from "./check-cascade-steps.js";
|
|
24
|
-
export { findBehavioralContractFallback, detectPlaceholderTestScript, checkAdrs, checkBehavioralContracts, } from "./check-cascade-contracts.js";
|
|
25
|
-
export { writeInitialSessionPromptIfAbsent, formatReport } from "./check-cascade-report.js";
|
|
25
|
+
export { findBehavioralContractFallback, detectPlaceholderTestScript, checkAdrs, checkBehavioralContracts, checkSchemaDefinitions, SCHEMA_ARTIFACT_PATHS, } from "./check-cascade-contracts.js";
|
|
26
|
+
export { writeInitialSessionPromptIfAbsent, formatReport, } from "./check-cascade-report.js";
|
|
26
27
|
// ── Schema ───────────────────────────────────────────────────────────
|
|
27
28
|
export const checkCascadeSchema = z.object({
|
|
28
29
|
project_dir: z
|
|
@@ -64,6 +65,7 @@ export function runCascadeChecks(projectDir, decisions = []) {
|
|
|
64
65
|
checkConstitution(projectDir),
|
|
65
66
|
checkAdrs(projectDir),
|
|
66
67
|
checkBehavioralContracts(projectDir),
|
|
68
|
+
checkSchemaDefinitions(projectDir),
|
|
67
69
|
];
|
|
68
70
|
if (decisions.length === 0)
|
|
69
71
|
return rawSteps;
|
|
@@ -76,6 +78,7 @@ export const STEP_TO_DECISION_NAME = {
|
|
|
76
78
|
3: "constitution",
|
|
77
79
|
4: "adrs",
|
|
78
80
|
5: "behavioral_contracts",
|
|
81
|
+
6: "schema_definitions",
|
|
79
82
|
};
|
|
80
83
|
/**
|
|
81
84
|
* Apply a cascade decision to a step result.
|
|
@@ -91,7 +94,9 @@ function applyDecision(step, decisions) {
|
|
|
91
94
|
return step;
|
|
92
95
|
if (decision.required)
|
|
93
96
|
return step;
|
|
94
|
-
if (step.status === "FAIL" ||
|
|
97
|
+
if (step.status === "FAIL" ||
|
|
98
|
+
step.status === "STUB" ||
|
|
99
|
+
step.status === "WARN") {
|
|
95
100
|
return {
|
|
96
101
|
step: step.step,
|
|
97
102
|
name: step.name,
|
|
@@ -119,7 +124,12 @@ export async function checkCascadeHandler(args) {
|
|
|
119
124
|
writeInitialSessionPromptIfAbsent(projectDir);
|
|
120
125
|
}
|
|
121
126
|
return {
|
|
122
|
-
content: [
|
|
127
|
+
content: [
|
|
128
|
+
{
|
|
129
|
+
type: "text",
|
|
130
|
+
text: formatReport(steps, passingCount, failingCount, noCascadeConfig),
|
|
131
|
+
},
|
|
132
|
+
],
|
|
123
133
|
};
|
|
124
134
|
}
|
|
125
135
|
// ── Exported Helpers ─────────────────────────────────────────────────
|
|
@@ -171,12 +181,20 @@ export function buildGuidedRemediation(steps) {
|
|
|
171
181
|
*/
|
|
172
182
|
export function getArtifactPath(step) {
|
|
173
183
|
switch (step) {
|
|
174
|
-
case 1:
|
|
175
|
-
|
|
176
|
-
case
|
|
177
|
-
|
|
178
|
-
case
|
|
179
|
-
|
|
184
|
+
case 1:
|
|
185
|
+
return "docs/PRD.md";
|
|
186
|
+
case 2:
|
|
187
|
+
return "docs/diagrams/c4-context.md";
|
|
188
|
+
case 3:
|
|
189
|
+
return "CLAUDE.md";
|
|
190
|
+
case 4:
|
|
191
|
+
return "docs/adrs/ADR-0001.md";
|
|
192
|
+
case 5:
|
|
193
|
+
return "docs/use-cases.md";
|
|
194
|
+
case 6:
|
|
195
|
+
return "openapi.yaml";
|
|
196
|
+
default:
|
|
197
|
+
return "docs/";
|
|
180
198
|
}
|
|
181
199
|
}
|
|
182
200
|
//# sourceMappingURL=check-cascade.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-cascade.js","sourceRoot":"","sources":["../../src/tools/check-cascade.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"check-cascade.js","sourceRoot":"","sources":["../../src/tools/check-cascade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check_spec_consistency tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans all spec artifacts for structural gaps, semantic ambiguities,
|
|
5
|
+
* and derivation chain breaks across the L1-L4 stack.
|
|
6
|
+
*
|
|
7
|
+
* Unlike gate evaluation (which checks file existence) and probe execution
|
|
8
|
+
* (which checks runtime behavior), this checks whether the SPEC ITSELF is
|
|
9
|
+
* internally consistent and complete enough to be acted upon.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import type { ToolResult } from "../shared/types.js";
|
|
13
|
+
export declare const checkSpecConsistencySchema: z.ZodObject<{
|
|
14
|
+
project_dir: z.ZodString;
|
|
15
|
+
strict: z.ZodOptional<z.ZodBoolean>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
project_dir: string;
|
|
18
|
+
strict?: boolean | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
project_dir: string;
|
|
21
|
+
strict?: boolean | undefined;
|
|
22
|
+
}>;
|
|
23
|
+
export type CheckSpecConsistencyInput = z.infer<typeof checkSpecConsistencySchema>;
|
|
24
|
+
export declare function checkSpecConsistencyHandler(args: CheckSpecConsistencyInput): Promise<ToolResult>;
|
|
25
|
+
//# sourceMappingURL=check-spec-consistency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-spec-consistency.d.ts","sourceRoot":"","sources":["../../src/tools/check-spec-consistency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAWrD,eAAO,MAAM,0BAA0B;;;;;;;;;EAQrC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,0BAA0B,CAClC,CAAC;AAgBF,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,UAAU,CAAC,CA2BrB"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check_spec_consistency tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Scans all spec artifacts for structural gaps, semantic ambiguities,
|
|
5
|
+
* and derivation chain breaks across the L1-L4 stack.
|
|
6
|
+
*
|
|
7
|
+
* Unlike gate evaluation (which checks file existence) and probe execution
|
|
8
|
+
* (which checks runtime behavior), this checks whether the SPEC ITSELF is
|
|
9
|
+
* internally consistent and complete enough to be acted upon.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
13
|
+
import { join, resolve } from "node:path";
|
|
14
|
+
import { parseUseCases } from "./layer-status.js";
|
|
15
|
+
import { parsePostconditionCount, countProbeAssertions, splitUcBlocks, } from "./postcondition-coverage.js";
|
|
16
|
+
import { detectClarificationMarkers } from "./session-prompt-builders.js";
|
|
17
|
+
// ── Schema ────────────────────────────────────────────────────────────
|
|
18
|
+
export const checkSpecConsistencySchema = z.object({
|
|
19
|
+
project_dir: z.string().describe("Absolute path to the project root."),
|
|
20
|
+
strict: z
|
|
21
|
+
.boolean()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("Fail on warnings as well as errors (advisory items become blocking). Default: false."),
|
|
24
|
+
});
|
|
25
|
+
// ── Handler ──────────────────────────────────────────────────────────
|
|
26
|
+
export async function checkSpecConsistencyHandler(args) {
|
|
27
|
+
const projectDir = resolve(args.project_dir);
|
|
28
|
+
const strict = args.strict ?? false;
|
|
29
|
+
const findings = [
|
|
30
|
+
...checkUseCases(projectDir),
|
|
31
|
+
...checkProbes(projectDir),
|
|
32
|
+
...checkAdrs(projectDir),
|
|
33
|
+
...checkGates(projectDir),
|
|
34
|
+
...checkClarificationMarkers(projectDir),
|
|
35
|
+
];
|
|
36
|
+
const errors = findings.filter((f) => f.severity === "error");
|
|
37
|
+
const warnings = findings.filter((f) => f.severity === "warning");
|
|
38
|
+
const infos = findings.filter((f) => f.severity === "info");
|
|
39
|
+
const blockerCount = strict ? errors.length + warnings.length : errors.length;
|
|
40
|
+
const report = formatReport(findings, errors, warnings, infos, blockerCount, strict);
|
|
41
|
+
return { content: [{ type: "text", text: report }] };
|
|
42
|
+
}
|
|
43
|
+
// ── Use Case Checks ───────────────────────────────────────────────────
|
|
44
|
+
function checkUseCases(projectDir) {
|
|
45
|
+
const findings = [];
|
|
46
|
+
const path = join(projectDir, "docs", "use-cases.md");
|
|
47
|
+
if (!existsSync(path)) {
|
|
48
|
+
findings.push({
|
|
49
|
+
severity: "error",
|
|
50
|
+
category: "L1 Spec",
|
|
51
|
+
artifact: "docs/use-cases.md",
|
|
52
|
+
message: "Use cases file does not exist",
|
|
53
|
+
fix: "Run setup_project or create docs/use-cases.md with at least one UC-NNN entry",
|
|
54
|
+
});
|
|
55
|
+
return findings;
|
|
56
|
+
}
|
|
57
|
+
const content = readFileSync(path, "utf-8");
|
|
58
|
+
const ucs = parseUseCases(content);
|
|
59
|
+
const blocks = splitUcBlocks(content);
|
|
60
|
+
if (ucs.length === 0) {
|
|
61
|
+
findings.push({
|
|
62
|
+
severity: "error",
|
|
63
|
+
category: "L1 Spec",
|
|
64
|
+
artifact: "docs/use-cases.md",
|
|
65
|
+
message: "No use cases found (no ## UC-NNN: entries)",
|
|
66
|
+
fix: "Add at least one use case with format: ## UC-001: Title",
|
|
67
|
+
});
|
|
68
|
+
return findings;
|
|
69
|
+
}
|
|
70
|
+
// Check for duplicate IDs
|
|
71
|
+
const ids = ucs.map((uc) => uc.id);
|
|
72
|
+
const seen = new Set();
|
|
73
|
+
for (const id of ids) {
|
|
74
|
+
if (seen.has(id)) {
|
|
75
|
+
findings.push({
|
|
76
|
+
severity: "error",
|
|
77
|
+
category: "L1 Spec",
|
|
78
|
+
artifact: "docs/use-cases.md",
|
|
79
|
+
message: `Duplicate use case ID: ${id}`,
|
|
80
|
+
fix: `Renumber one of the ${id} entries`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
seen.add(id);
|
|
84
|
+
}
|
|
85
|
+
// Check each UC for required sections
|
|
86
|
+
for (const uc of ucs) {
|
|
87
|
+
const block = blocks.get(uc.id.toUpperCase()) ?? "";
|
|
88
|
+
const postconditionCount = parsePostconditionCount(block);
|
|
89
|
+
if (postconditionCount === 0) {
|
|
90
|
+
findings.push({
|
|
91
|
+
severity: "error",
|
|
92
|
+
category: "L1 Spec",
|
|
93
|
+
artifact: `docs/use-cases.md#${uc.id}`,
|
|
94
|
+
message: `${uc.id} has no Postcondition or Acceptance Criteria — probes cannot verify what they should`,
|
|
95
|
+
fix: "Add **Postcondition**: ... and/or **Acceptance Criteria** (machine-checkable) bullets",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (!block.includes("**Error Cases**")) {
|
|
99
|
+
findings.push({
|
|
100
|
+
severity: "warning",
|
|
101
|
+
category: "L1 Spec",
|
|
102
|
+
artifact: `docs/use-cases.md#${uc.id}`,
|
|
103
|
+
message: `${uc.id} has no Error Cases section — unhappy path probes cannot be generated`,
|
|
104
|
+
fix: "Add **Error Cases**: section with at least one failure scenario",
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
if (block.includes("[NEEDS CLARIFICATION")) {
|
|
108
|
+
const markers = (block.match(/\[NEEDS CLARIFICATION:[^\]]*\]/g) ?? [])
|
|
109
|
+
.length;
|
|
110
|
+
findings.push({
|
|
111
|
+
severity: "error",
|
|
112
|
+
category: "Ambiguity",
|
|
113
|
+
artifact: `docs/use-cases.md#${uc.id}`,
|
|
114
|
+
message: `${uc.id} has ${markers} unresolved [NEEDS CLARIFICATION] marker(s)`,
|
|
115
|
+
fix: "Replace each [NEEDS CLARIFICATION] with the actual decision before proceeding",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return findings;
|
|
120
|
+
}
|
|
121
|
+
// ── Probe Checks ──────────────────────────────────────────────────────
|
|
122
|
+
function checkProbes(projectDir) {
|
|
123
|
+
const findings = [];
|
|
124
|
+
const harnessDir = join(projectDir, "tests", "harness");
|
|
125
|
+
if (!existsSync(harnessDir)) {
|
|
126
|
+
findings.push({
|
|
127
|
+
severity: "warning",
|
|
128
|
+
category: "L2 Harness",
|
|
129
|
+
artifact: "tests/harness/",
|
|
130
|
+
message: "Harness probe directory does not exist",
|
|
131
|
+
fix: "Run generate_harness to scaffold probe files from UC specs",
|
|
132
|
+
});
|
|
133
|
+
return findings;
|
|
134
|
+
}
|
|
135
|
+
const useCasesPath = join(projectDir, "docs", "use-cases.md");
|
|
136
|
+
if (!existsSync(useCasesPath))
|
|
137
|
+
return findings;
|
|
138
|
+
const ucs = parseUseCases(readFileSync(useCasesPath, "utf-8"));
|
|
139
|
+
const probeFiles = readdirSync(harnessDir).filter((f) => f.endsWith(".sh") ||
|
|
140
|
+
f.endsWith(".spec.ts") ||
|
|
141
|
+
f.endsWith(".hurl") ||
|
|
142
|
+
f.endsWith(".sim.ts"));
|
|
143
|
+
for (const uc of ucs) {
|
|
144
|
+
const lower = uc.id.toLowerCase().replace(/_/g, "-");
|
|
145
|
+
const ucProbes = probeFiles.filter((f) => f.toLowerCase().startsWith(lower + "-") ||
|
|
146
|
+
f.toLowerCase().startsWith(lower + "."));
|
|
147
|
+
if (ucProbes.length === 0) {
|
|
148
|
+
findings.push({
|
|
149
|
+
severity: "warning",
|
|
150
|
+
category: "L2 Harness",
|
|
151
|
+
artifact: `tests/harness/${lower}-happy.*`,
|
|
152
|
+
message: `${uc.id} has no probe files`,
|
|
153
|
+
fix: `Run generate_harness --uc_ids ${uc.id}`,
|
|
154
|
+
});
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
// Check for happy path probe
|
|
158
|
+
const hasHappy = ucProbes.some((f) => f.toLowerCase().includes("-happy"));
|
|
159
|
+
if (!hasHappy) {
|
|
160
|
+
findings.push({
|
|
161
|
+
severity: "warning",
|
|
162
|
+
category: "L2 Harness",
|
|
163
|
+
artifact: `tests/harness/${lower}-happy.*`,
|
|
164
|
+
message: `${uc.id} missing happy-path probe`,
|
|
165
|
+
fix: `Create tests/harness/${lower}-happy.sh (or .spec.ts / .hurl)`,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// Check for hollow probes
|
|
169
|
+
for (const f of ucProbes) {
|
|
170
|
+
const { count, isStub } = countProbeAssertions(join(harnessDir, f));
|
|
171
|
+
if (count === 0 && !isStub) {
|
|
172
|
+
findings.push({
|
|
173
|
+
severity: "error",
|
|
174
|
+
category: "L2 Harness",
|
|
175
|
+
artifact: `tests/harness/${f}`,
|
|
176
|
+
message: `Hollow probe — exits 0 but contains zero assertion signals. Produces false confidence.`,
|
|
177
|
+
fix: "Add grep/expect/assert checks that verify actual postconditions, or remove the probe",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (isStub) {
|
|
181
|
+
findings.push({
|
|
182
|
+
severity: "warning",
|
|
183
|
+
category: "L2 Harness",
|
|
184
|
+
artifact: `tests/harness/${f}`,
|
|
185
|
+
message: `Stub probe — contains TODO markers. Not_implemented probes must be filled before close_cycle.`,
|
|
186
|
+
fix: "Implement the TODO sections with real assertion logic",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Check for orphan probes (no matching UC)
|
|
192
|
+
const ucLowers = new Set(ucs.map((uc) => uc.id.toLowerCase().replace(/_/g, "-")));
|
|
193
|
+
for (const f of probeFiles) {
|
|
194
|
+
const m = /^(uc-\d{3})[\.-]/.exec(f.toLowerCase());
|
|
195
|
+
if (m && !ucLowers.has(m[1])) {
|
|
196
|
+
findings.push({
|
|
197
|
+
severity: "info",
|
|
198
|
+
category: "L2 Harness",
|
|
199
|
+
artifact: `tests/harness/${f}`,
|
|
200
|
+
message: `Orphan probe — no use case with ID ${m[1].toUpperCase()} found in docs/use-cases.md`,
|
|
201
|
+
fix: "Add the corresponding use case or delete the orphan probe",
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return findings;
|
|
206
|
+
}
|
|
207
|
+
// ── ADR Checks ────────────────────────────────────────────────────────
|
|
208
|
+
const ADR_STALE_PROPOSED_DAYS = 30;
|
|
209
|
+
function checkAdrs(projectDir) {
|
|
210
|
+
const findings = [];
|
|
211
|
+
const adrsDir = join(projectDir, "docs", "adrs");
|
|
212
|
+
if (!existsSync(adrsDir))
|
|
213
|
+
return findings;
|
|
214
|
+
const adrFiles = readdirSync(adrsDir).filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
215
|
+
const now = Date.now();
|
|
216
|
+
for (const f of adrFiles) {
|
|
217
|
+
const filePath = join(adrsDir, f);
|
|
218
|
+
const content = readFileSync(filePath, "utf-8");
|
|
219
|
+
// Check stale Proposed status
|
|
220
|
+
if (/\bProposed\b/.test(content)) {
|
|
221
|
+
const stat = statSync(filePath);
|
|
222
|
+
const ageMs = now - stat.mtimeMs;
|
|
223
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
224
|
+
if (ageDays > ADR_STALE_PROPOSED_DAYS) {
|
|
225
|
+
findings.push({
|
|
226
|
+
severity: "warning",
|
|
227
|
+
category: "L1 Spec",
|
|
228
|
+
artifact: `docs/adrs/${f}`,
|
|
229
|
+
message: `ADR has been in Proposed status for ${Math.round(ageDays)} days — either Accept or Supersede`,
|
|
230
|
+
fix: "Change Status to Accepted/Rejected or create a superseding ADR",
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Check for NEEDS CLARIFICATION in ADRs
|
|
235
|
+
const markers = (content.match(/\[NEEDS CLARIFICATION:[^\]]*\]/g) ?? [])
|
|
236
|
+
.length;
|
|
237
|
+
if (markers > 0) {
|
|
238
|
+
findings.push({
|
|
239
|
+
severity: "error",
|
|
240
|
+
category: "Ambiguity",
|
|
241
|
+
artifact: `docs/adrs/${f}`,
|
|
242
|
+
message: `ADR contains ${markers} unresolved [NEEDS CLARIFICATION] marker(s)`,
|
|
243
|
+
fix: "Resolve each marker before accepting the ADR",
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return findings;
|
|
248
|
+
}
|
|
249
|
+
// ── Gate Checks ───────────────────────────────────────────────────────
|
|
250
|
+
function checkGates(projectDir) {
|
|
251
|
+
const findings = [];
|
|
252
|
+
const gateDirs = [
|
|
253
|
+
join(projectDir, ".forgecraft", "gates", "active"),
|
|
254
|
+
join(projectDir, ".forgecraft", "gates", "project", "active"),
|
|
255
|
+
];
|
|
256
|
+
for (const dir of gateDirs) {
|
|
257
|
+
if (!existsSync(dir))
|
|
258
|
+
continue;
|
|
259
|
+
for (const f of readdirSync(dir).filter((n) => n.endsWith(".yaml"))) {
|
|
260
|
+
const content = readFileSync(join(dir, f), "utf-8");
|
|
261
|
+
// Check gates referencing file_system paths that don't exist
|
|
262
|
+
const fileRefMatches = content.matchAll(/path:\s*"?([^"\n]+)"?/g);
|
|
263
|
+
for (const m of fileRefMatches) {
|
|
264
|
+
const refPath = m[1].trim();
|
|
265
|
+
if (refPath.startsWith("/") ||
|
|
266
|
+
refPath.startsWith("./") ||
|
|
267
|
+
refPath.startsWith("docs/")) {
|
|
268
|
+
const fullPath = refPath.startsWith("/")
|
|
269
|
+
? refPath
|
|
270
|
+
: join(projectDir, refPath);
|
|
271
|
+
if (!existsSync(fullPath)) {
|
|
272
|
+
findings.push({
|
|
273
|
+
severity: "info",
|
|
274
|
+
category: "Gate",
|
|
275
|
+
artifact: f,
|
|
276
|
+
message: `Gate references path that does not exist: ${refPath}`,
|
|
277
|
+
fix: "Create the referenced artifact or update the gate path",
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return findings;
|
|
285
|
+
}
|
|
286
|
+
// ── Clarification Checks ──────────────────────────────────────────────
|
|
287
|
+
function checkClarificationMarkers(projectDir) {
|
|
288
|
+
const markers = detectClarificationMarkers(projectDir);
|
|
289
|
+
return markers.map((m) => ({
|
|
290
|
+
severity: "error",
|
|
291
|
+
category: "Ambiguity",
|
|
292
|
+
artifact: m.file,
|
|
293
|
+
message: `Unresolved: ${m.marker}`,
|
|
294
|
+
fix: "Replace the marker with the actual decision",
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
// ── Report Formatter ──────────────────────────────────────────────────
|
|
298
|
+
function formatReport(findings, errors, warnings, infos, blockerCount, strict) {
|
|
299
|
+
const lines = [];
|
|
300
|
+
const verdict = blockerCount === 0 ? "✅ CONSISTENT" : "❌ INCONSISTENT";
|
|
301
|
+
lines.push(`## Spec Consistency Report`, ``);
|
|
302
|
+
lines.push(`**Verdict:** ${verdict}`);
|
|
303
|
+
lines.push(`**Errors:** ${errors.length} **Warnings:** ${warnings.length} **Info:** ${infos.length}`);
|
|
304
|
+
if (strict)
|
|
305
|
+
lines.push(`**Mode:** strict (warnings count as blockers)`);
|
|
306
|
+
lines.push(``);
|
|
307
|
+
const groups = new Map();
|
|
308
|
+
for (const f of findings) {
|
|
309
|
+
if (!groups.has(f.category))
|
|
310
|
+
groups.set(f.category, []);
|
|
311
|
+
groups.get(f.category).push(f);
|
|
312
|
+
}
|
|
313
|
+
for (const [category, items] of groups) {
|
|
314
|
+
lines.push(`### ${category}`, ``);
|
|
315
|
+
for (const item of items) {
|
|
316
|
+
const icon = item.severity === "error"
|
|
317
|
+
? "❌"
|
|
318
|
+
: item.severity === "warning"
|
|
319
|
+
? "⚠️"
|
|
320
|
+
: "ℹ️";
|
|
321
|
+
lines.push(`${icon} **${item.artifact}**`);
|
|
322
|
+
lines.push(` ${item.message}`);
|
|
323
|
+
lines.push(` → Fix: ${item.fix}`);
|
|
324
|
+
lines.push(``);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (findings.length === 0) {
|
|
328
|
+
lines.push(`All spec artifacts are structurally consistent.`, ``);
|
|
329
|
+
}
|
|
330
|
+
lines.push(`---`);
|
|
331
|
+
if (blockerCount === 0) {
|
|
332
|
+
lines.push(`Spec is consistent. Run \`generate_session_prompt\` when ready to implement.`);
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
lines.push(`${blockerCount} blocking issue(s) must be resolved before \`generate_session_prompt\`.`, `Fix each issue and re-run \`check_spec_consistency\`.`);
|
|
336
|
+
}
|
|
337
|
+
return lines.join("\n");
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=check-spec-consistency.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-spec-consistency.js","sourceRoot":"","sources":["../../src/tools/check-spec-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check_t4 tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Surfaces pending T4 production signals at session start. Reads
|
|
5
|
+
* .forgecraft/t4-signals.json written by forgecraft-eye, formats each
|
|
6
|
+
* signal as a spec update candidate, and guides the practitioner through
|
|
7
|
+
* the diagnosis → spec update → rederivation cycle.
|
|
8
|
+
*
|
|
9
|
+
* Run at the start of any development session to check whether production
|
|
10
|
+
* has produced specification-level diagnoses since the last session.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import type { ToolResult } from "../shared/types.js";
|
|
14
|
+
export declare const checkT4Schema: z.ZodObject<{
|
|
15
|
+
project_dir: z.ZodString;
|
|
16
|
+
acknowledge: z.ZodOptional<z.ZodString>;
|
|
17
|
+
resolve: z.ZodOptional<z.ZodString>;
|
|
18
|
+
show_resolved: z.ZodOptional<z.ZodBoolean>;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
project_dir: string;
|
|
21
|
+
acknowledge?: string | undefined;
|
|
22
|
+
resolve?: string | undefined;
|
|
23
|
+
show_resolved?: boolean | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
project_dir: string;
|
|
26
|
+
acknowledge?: string | undefined;
|
|
27
|
+
resolve?: string | undefined;
|
|
28
|
+
show_resolved?: boolean | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export type CheckT4Input = z.infer<typeof checkT4Schema>;
|
|
31
|
+
export type SignalSeverity = "critical" | "warning" | "info";
|
|
32
|
+
export type SignalStatus = "pending" | "acknowledged" | "resolved";
|
|
33
|
+
export interface T4Signal {
|
|
34
|
+
id: string;
|
|
35
|
+
timestamp: string;
|
|
36
|
+
exception_class: string;
|
|
37
|
+
severity: SignalSeverity;
|
|
38
|
+
gs_property: string;
|
|
39
|
+
spec_ref: string;
|
|
40
|
+
diagnosis: string;
|
|
41
|
+
suggested_update: string;
|
|
42
|
+
status: SignalStatus;
|
|
43
|
+
correlation_id?: string;
|
|
44
|
+
service?: string;
|
|
45
|
+
environment?: string;
|
|
46
|
+
acknowledged_at?: string;
|
|
47
|
+
resolved_at?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface T4SignalQueue {
|
|
50
|
+
signals: T4Signal[];
|
|
51
|
+
last_updated?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare function checkT4Handler(args: CheckT4Input): Promise<ToolResult>;
|
|
54
|
+
//# sourceMappingURL=check-t4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-t4.d.ts","sourceRoot":"","sources":["../../src/tools/check-t4.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;EAkBxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAIzD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAC7D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmJD,wBAAsB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAkO5E"}
|