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
|
@@ -44,6 +44,15 @@ export interface ProjectToolsConfig {
|
|
|
44
44
|
/** Layer boundary check. e.g. "npx madge --circular src/" or language-equivalent */
|
|
45
45
|
readonly layercheck?: string;
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Environment tier classification.
|
|
49
|
+
* - dev: local development
|
|
50
|
+
* - qae: quality assurance / basic performance testing
|
|
51
|
+
* - lte: load test environment — ephemeral, anonymized prod-like data
|
|
52
|
+
* - cae: customer acceptance environment — production hypervisor, may hold PII, tracks PRD version
|
|
53
|
+
* - prd: production
|
|
54
|
+
*/
|
|
55
|
+
export type EnvironmentClass = "dev" | "qae" | "lte" | "cae" | "prd";
|
|
47
56
|
/**
|
|
48
57
|
* Deployment environment configuration for a single environment.
|
|
49
58
|
*/
|
|
@@ -54,6 +63,37 @@ export interface DeploymentEnvironmentConfig {
|
|
|
54
63
|
readonly url?: string;
|
|
55
64
|
/** Health check endpoint path. Defaults to "/health". */
|
|
56
65
|
readonly health?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Environment tier classification. Drives which quality gates are activated.
|
|
68
|
+
* dev | qae | lte | cae | prd
|
|
69
|
+
*/
|
|
70
|
+
readonly class?: EnvironmentClass;
|
|
71
|
+
/**
|
|
72
|
+
* Whether this environment can hold real personally identifiable information.
|
|
73
|
+
* When true: PII logging gate, data masking gate, and audit logging gate are activated.
|
|
74
|
+
*/
|
|
75
|
+
readonly containsPii?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Whether this environment is reachable from the public internet.
|
|
78
|
+
* When true: security headers gate, WAF gate, and CSP gate are activated.
|
|
79
|
+
*/
|
|
80
|
+
readonly externallyAccessible?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Whether changes to this environment require a change control document before deploy.
|
|
83
|
+
* When true: prd-change-control gate is activated.
|
|
84
|
+
*/
|
|
85
|
+
readonly underChangeControl?: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Whether this environment is ephemeral (must be created and torn down by IaC).
|
|
88
|
+
* When true: lte-ephemeral-infra gate is activated.
|
|
89
|
+
* Always true for class: lte.
|
|
90
|
+
*/
|
|
91
|
+
readonly ephemeral?: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Email relay tier. "test" environments must not use production relay.
|
|
94
|
+
* "prod" relay is only permitted in cae and prd environments.
|
|
95
|
+
*/
|
|
96
|
+
readonly smtpRelay?: "test" | "prod";
|
|
57
97
|
}
|
|
58
98
|
/**
|
|
59
99
|
* Load test parameters — stated before the test runs, not after.
|
|
@@ -158,6 +198,32 @@ export interface OutputTargetConfig {
|
|
|
158
198
|
export declare const OUTPUT_TARGET_CONFIGS: Record<OutputTarget, OutputTargetConfig>;
|
|
159
199
|
/** Default output target when none specified. */
|
|
160
200
|
export declare const DEFAULT_OUTPUT_TARGET: OutputTarget;
|
|
201
|
+
/** A single AI-instruction file detected on disk. */
|
|
202
|
+
export interface SentinelFoundFile {
|
|
203
|
+
/** Path relative to the repo root (POSIX-style separators). */
|
|
204
|
+
readonly path: string;
|
|
205
|
+
/** File size in bytes; for directories, the sum of immediate file sizes. */
|
|
206
|
+
readonly sizeBytes: number;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Result of scanning a repo for existing AI behavioral instruction files
|
|
210
|
+
* (CLAUDE.md, agents.md, .cursor/rules, etc.).
|
|
211
|
+
*
|
|
212
|
+
* Used to gate writes to instruction files so forgecraft never silently
|
|
213
|
+
* overwrites a sentinel a human or another tool already established.
|
|
214
|
+
*
|
|
215
|
+
* `recommendation` summarises the safe next action:
|
|
216
|
+
* - `none-found` no sentinel exists; safe to write fresh
|
|
217
|
+
* - `map` exactly one sentinel exists; map / augment it
|
|
218
|
+
* - `override-required` multiple sentinels exist; caller must opt in explicitly
|
|
219
|
+
*/
|
|
220
|
+
export interface SentinelDetectionResult {
|
|
221
|
+
/** All matching files, in canonical priority order. */
|
|
222
|
+
readonly foundFiles: readonly SentinelFoundFile[];
|
|
223
|
+
/** Highest-priority file present, or null if none. */
|
|
224
|
+
readonly primaryFile: string | null;
|
|
225
|
+
readonly recommendation: "map" | "override-required" | "none-found";
|
|
226
|
+
}
|
|
161
227
|
/**
|
|
162
228
|
* Resolve the full output file path for a target relative to project root.
|
|
163
229
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/shared/types/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iDAAiD;AACjD,eAAO,MAAM,QAAQ,8UA4BX,CAAC;AAEX,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAC/B,MAAM,EACN;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAC3C,CAAC;IACF,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CACtC,MAAM,EACN;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAC3C,CAAC;IACF,QAAQ,CAAC,aAAa,EAAE,SAAS,GAAG,EAAE,CAAC;IACvC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,mFAAmF;IACnF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,kGAAkG;IAClG,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6GAA6G;IAC7G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/shared/types/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/shared/types/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,WAAW;IACX,WAAW;IACX,YAAY;IACZ,KAAK;IACL,eAAe;IACf,IAAI;IACJ,YAAY;IACZ,SAAS;IACT,MAAM;IACN,UAAU;IACV,eAAe;IACf,MAAM;IACN,QAAQ;IACR,KAAK;IACL,SAAS;IACT,OAAO;IACP,QAAQ;IACR,WAAW;IACX,OAAO;IACP,MAAM;IACN,cAAc;IACd,oBAAoB;IACpB,wBAAwB;IACxB,YAAY;IACZ,MAAM;IACN,UAAU;IACV,MAAM;CACE,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/shared/types/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,WAAW;IACX,WAAW;IACX,YAAY;IACZ,KAAK;IACL,eAAe;IACf,IAAI;IACJ,YAAY;IACZ,SAAS;IACT,MAAM;IACN,UAAU;IACV,eAAe;IACf,MAAM;IACN,QAAQ;IACR,KAAK;IACL,SAAS;IACT,OAAO;IACP,QAAQ;IACR,WAAW;IACX,OAAO;IACP,MAAM;IACN,cAAc;IACd,oBAAoB;IACpB,wBAAwB;IACxB,YAAY;IACZ,MAAM;IACN,UAAU;IACV,MAAM;CACE,CAAC;AAuLX,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAA2B;IACnD,MAAM;IACN,aAAa;IACb,UAAU;CACF,CAAC;AAEX,wEAAwE;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;CACC,CAAC;AAoBX,8DAA8D;AAC9D,MAAM,CAAC,MAAM,qBAAqB,GAA6C;IAC7E,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,aAAa;QACtB,WAAW,EAAE,aAAa;KAC3B;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,uBAAuB;QACjC,SAAS,EAAE,eAAe;QAC1B,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,QAAQ;QACrB,eAAe,EAAE,IAAI;KACtB;IACD,OAAO,EAAE;QACP,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,yBAAyB;QACnC,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,wBAAwB;QACjC,WAAW,EAAE,gBAAgB;KAC9B;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,UAAU;KACxB;IACD,KAAK,EAAE;QACL,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,OAAO;KACrB;IACD,KAAK,EAAE;QACL,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,gBAAgB;QAC1B,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,OAAO;KACrB;CACF,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAiB,QAAQ,CAAC;AAgC5D;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,MAAoB;IAEpB,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -3,11 +3,59 @@
|
|
|
3
3
|
*/
|
|
4
4
|
/** GS property name as defined in §4.3 of the experiment design. */
|
|
5
5
|
export type GsProperty = "self-describing" | "bounded" | "verifiable" | "defended" | "auditable" | "composable" | "executable";
|
|
6
|
+
/**
|
|
7
|
+
* GS maturity tier — five-level adoption model from the Generative Specification white paper.
|
|
8
|
+
*
|
|
9
|
+
* Maps to the 14-point GS scoring scale (7 properties × 0–2):
|
|
10
|
+
*
|
|
11
|
+
* Tier 1 — Unstructured (0–3): Prompting only. No persistent artifacts, no discipline.
|
|
12
|
+
* Tier 2 — Grounded (4–6): Has CLAUDE.md or equivalent ground rules. Basic tests.
|
|
13
|
+
* Tier 3 — Specified (7–10): Full spec artifacts — use-cases, ADRs, bounded architecture.
|
|
14
|
+
* Tier 4 — Verified (11–13): Executable tests passing, CI, audit trail, all properties partial+.
|
|
15
|
+
* Tier 5 — Orchestrated (14): Perfect score across all 7 properties. Full discipline.
|
|
16
|
+
*
|
|
17
|
+
* ForgeCraft detects the current tier on every verify run. Projects can declare a
|
|
18
|
+
* target tier in forgecraft.yaml (gs_maturity_tier_target) to gate PRs below it.
|
|
19
|
+
*/
|
|
20
|
+
export type GsMaturityTier = 1 | 2 | 3 | 4 | 5;
|
|
21
|
+
/** Tier metadata for display and gating. */
|
|
22
|
+
export interface GsMaturityTierInfo {
|
|
23
|
+
readonly tier: GsMaturityTier;
|
|
24
|
+
readonly name: "Unstructured" | "Grounded" | "Specified" | "Verified" | "Orchestrated";
|
|
25
|
+
readonly scoreRange: readonly [number, number];
|
|
26
|
+
readonly description: string;
|
|
27
|
+
}
|
|
28
|
+
/** Compute maturity tier from a raw GS total score (0–14). */
|
|
29
|
+
export declare function computeMaturityTier(totalScore: number): GsMaturityTierInfo;
|
|
30
|
+
/**
|
|
31
|
+
* Reference to a calibration anchor file used to justify a score level.
|
|
32
|
+
* When `provisional` is true the anchor was missing for this property/level pair.
|
|
33
|
+
*/
|
|
34
|
+
export interface AnchorReference {
|
|
35
|
+
readonly property: GsProperty;
|
|
36
|
+
readonly level: 0 | 1 | 2;
|
|
37
|
+
/** Absolute or relative path to the anchor markdown file (when found). */
|
|
38
|
+
readonly path?: string;
|
|
39
|
+
/** Title parsed from the anchor file (when found). */
|
|
40
|
+
readonly title?: string;
|
|
41
|
+
/** Repo + commit hash being anchored (when found). */
|
|
42
|
+
readonly anchoredRepo?: string;
|
|
43
|
+
/** Specific feature being anchored (when found). */
|
|
44
|
+
readonly feature?: string;
|
|
45
|
+
/** Why the anchored example sits at this score level (when found). */
|
|
46
|
+
readonly rationale?: string;
|
|
47
|
+
/** What would move it to the next level (when found). */
|
|
48
|
+
readonly nextLevelDelta?: string;
|
|
49
|
+
}
|
|
6
50
|
/** Score (0–2) for a single GS property with supporting evidence. */
|
|
7
51
|
export interface GsPropertyScore {
|
|
8
52
|
readonly property: GsProperty;
|
|
9
53
|
readonly score: 0 | 1 | 2;
|
|
10
54
|
readonly evidence: string[];
|
|
55
|
+
/** True when no anchor exists for this property/level pair. */
|
|
56
|
+
readonly provisional?: boolean;
|
|
57
|
+
/** Calibration anchor referenced for this score, when available. */
|
|
58
|
+
readonly anchor?: AnchorReference;
|
|
11
59
|
}
|
|
12
60
|
/** Outcome of executing the project's test suite. */
|
|
13
61
|
export interface TestSuiteResult {
|
|
@@ -37,7 +85,9 @@ export interface VerifyResult {
|
|
|
37
85
|
readonly totalScore: number;
|
|
38
86
|
readonly layerViolations: LayerViolation[];
|
|
39
87
|
readonly missingTestFiles: MissingTestFile[];
|
|
40
|
-
/** True when tests pass AND totalScore ≥
|
|
88
|
+
/** True when tests pass AND totalScore ≥ pass_threshold. */
|
|
41
89
|
readonly overallPass: boolean;
|
|
90
|
+
/** GS maturity tier computed from totalScore. */
|
|
91
|
+
readonly maturityTier: GsMaturityTierInfo;
|
|
42
92
|
}
|
|
43
93
|
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/shared/types/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oEAAoE;AACpE,MAAM,MAAM,UAAU,GAClB,iBAAiB,GACjB,SAAS,GACT,YAAY,GACZ,UAAU,GACV,WAAW,GACX,YAAY,GACZ,YAAY,CAAC;AAEjB,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/shared/types/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GS verification and scoring types: properties, test suite results, and layer violations.
|
|
3
3
|
*/
|
|
4
|
-
|
|
4
|
+
/** Compute maturity tier from a raw GS total score (0–14). */
|
|
5
|
+
export function computeMaturityTier(totalScore) {
|
|
6
|
+
if (totalScore >= 14)
|
|
7
|
+
return {
|
|
8
|
+
tier: 5,
|
|
9
|
+
name: "Orchestrated",
|
|
10
|
+
scoreRange: [14, 14],
|
|
11
|
+
description: "Perfect GS score — all 7 properties at maximum. Full spec-first discipline.",
|
|
12
|
+
};
|
|
13
|
+
if (totalScore >= 11)
|
|
14
|
+
return {
|
|
15
|
+
tier: 4,
|
|
16
|
+
name: "Verified",
|
|
17
|
+
scoreRange: [11, 13],
|
|
18
|
+
description: "Executable tests passing, CI configured, audit trail present.",
|
|
19
|
+
};
|
|
20
|
+
if (totalScore >= 7)
|
|
21
|
+
return {
|
|
22
|
+
tier: 3,
|
|
23
|
+
name: "Specified",
|
|
24
|
+
scoreRange: [7, 10],
|
|
25
|
+
description: "Full spec artifacts: use-cases, ADRs, bounded architecture.",
|
|
26
|
+
};
|
|
27
|
+
if (totalScore >= 4)
|
|
28
|
+
return {
|
|
29
|
+
tier: 2,
|
|
30
|
+
name: "Grounded",
|
|
31
|
+
scoreRange: [4, 6],
|
|
32
|
+
description: "Ground rules established (CLAUDE.md). Basic test coverage.",
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
tier: 1,
|
|
36
|
+
name: "Unstructured",
|
|
37
|
+
scoreRange: [0, 3],
|
|
38
|
+
description: "Prompting only. No persistent spec artifacts.",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
5
41
|
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/shared/types/verify.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/shared/types/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyCH,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,IAAI,UAAU,IAAI,EAAE;QAClB,OAAO;YACL,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,cAAc;YACpB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YACpB,WAAW,EACT,6EAA6E;SAChF,CAAC;IACJ,IAAI,UAAU,IAAI,EAAE;QAClB,OAAO;YACL,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YACpB,WAAW,EACT,+DAA+D;SAClE,CAAC;IACJ,IAAI,UAAU,IAAI,CAAC;QACjB,OAAO;YACL,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACnB,WAAW,EACT,6DAA6D;SAChE,CAAC;IACJ,IAAI,UAAU,IAAI,CAAC;QACjB,OAAO;YACL,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAClB,WAAW,EAAE,4DAA4D;SAC1E,CAAC;IACJ,OAAO;QACL,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,cAAc;QACpB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClB,WAAW,EAAE,+CAA+C;KAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advice generation for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Converts a ProjectSignals snapshot into a prioritised list of
|
|
5
|
+
* AdviceItems, then formats them as human-readable markdown.
|
|
6
|
+
* Plain-English first — GS vocabulary only when the project is configured.
|
|
7
|
+
*/
|
|
8
|
+
import type { ProjectSignals } from "./advise-session-signals.js";
|
|
9
|
+
export interface AdviceItem {
|
|
10
|
+
readonly priority: "critical" | "high" | "medium" | "low";
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly action?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildAdviceItems(signals: ProjectSignals, maxItems: number): AdviceItem[];
|
|
15
|
+
export declare function formatAdvice(items: AdviceItem[], recentActivity: string | null): string;
|
|
16
|
+
//# sourceMappingURL=advise-session-advisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session-advisor.d.ts","sourceRoot":"","sources":["../../src/tools/advise-session-advisor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAIlE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAwED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,UAAU,EAAE,CAWd;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,CAaR"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advice generation for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Converts a ProjectSignals snapshot into a prioritised list of
|
|
5
|
+
* AdviceItems, then formats them as human-readable markdown.
|
|
6
|
+
* Plain-English first — GS vocabulary only when the project is configured.
|
|
7
|
+
*/
|
|
8
|
+
// ── Priority labels ───────────────────────────────────────────────────
|
|
9
|
+
const LABEL = {
|
|
10
|
+
critical: "[CRITICAL]",
|
|
11
|
+
high: "[HIGH]",
|
|
12
|
+
medium: "[MEDIUM]",
|
|
13
|
+
low: "[LOW]",
|
|
14
|
+
};
|
|
15
|
+
// ── Advice rules ─────────────────────────────────────────────────────
|
|
16
|
+
function violationItems(signals) {
|
|
17
|
+
return signals.topViolations.map((msg) => ({
|
|
18
|
+
priority: "critical",
|
|
19
|
+
message: `Gate violation: ${msg}`,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
function constitutionItem(signals) {
|
|
23
|
+
if (signals.hasConstitution)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
priority: "high",
|
|
27
|
+
message: "No AI rules file found (CLAUDE.md / .clinerules / .windsurfrules / copilot-instructions.md / CONVENTIONS.md) — the assistant has no project rules to follow.",
|
|
28
|
+
action: 'Run forgecraft_actions { action: "setup_project" } to generate the right file for your agent.',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function testItem(signals) {
|
|
32
|
+
if (!signals.hasSourceCode || signals.hasTests)
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
priority: "high",
|
|
36
|
+
message: "No test directory found — bugs accumulate silently without a test suite.",
|
|
37
|
+
action: "Add a tests/ directory and write at least one test before the next commit.",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function schemaItem(signals) {
|
|
41
|
+
if (!signals.hasSourceCode || signals.hasSchema)
|
|
42
|
+
return null;
|
|
43
|
+
return {
|
|
44
|
+
priority: "medium",
|
|
45
|
+
message: "No schema artifact found — the system vocabulary (API, DB, events) is implicit.",
|
|
46
|
+
action: "Add openapi.yaml, prisma/schema.prisma, or docs/schemas/ to make contracts explicit.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function specItem(signals) {
|
|
50
|
+
if (signals.hasSpec)
|
|
51
|
+
return null;
|
|
52
|
+
return {
|
|
53
|
+
priority: "medium",
|
|
54
|
+
message: "No spec or PRD found — intent exists only in contributor heads.",
|
|
55
|
+
action: "Add docs/specs/PRD.md describing what the project does and why.",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function greenItem() {
|
|
59
|
+
return {
|
|
60
|
+
priority: "low",
|
|
61
|
+
message: "Project looks healthy — no missing artifacts or active gate violations detected.",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ── Public API ───────────────────────────────────────────────────────
|
|
65
|
+
export function buildAdviceItems(signals, maxItems) {
|
|
66
|
+
const candidates = [
|
|
67
|
+
...violationItems(signals),
|
|
68
|
+
constitutionItem(signals),
|
|
69
|
+
testItem(signals),
|
|
70
|
+
schemaItem(signals),
|
|
71
|
+
specItem(signals),
|
|
72
|
+
].filter((i) => i !== null);
|
|
73
|
+
if (candidates.length === 0)
|
|
74
|
+
return [greenItem()];
|
|
75
|
+
return candidates.slice(0, maxItems);
|
|
76
|
+
}
|
|
77
|
+
export function formatAdvice(items, recentActivity) {
|
|
78
|
+
const lines = ["## Session Advisor", ""];
|
|
79
|
+
if (recentActivity) {
|
|
80
|
+
lines.push(`**Last commit:** ${recentActivity}`, "");
|
|
81
|
+
}
|
|
82
|
+
for (const item of items) {
|
|
83
|
+
lines.push(`${LABEL[item.priority]} ${item.message}`);
|
|
84
|
+
if (item.action)
|
|
85
|
+
lines.push(` → ${item.action}`);
|
|
86
|
+
}
|
|
87
|
+
return lines.join("\n");
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=advise-session-advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session-advisor.js","sourceRoot":"","sources":["../../src/tools/advise-session-advisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project signal reader for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Reads filesystem state and active gate violations to produce a
|
|
5
|
+
* ProjectSignals snapshot. Intentionally fast — no git subprocess,
|
|
6
|
+
* no cascade execution. Used both by the MCP action and the shell hook.
|
|
7
|
+
*/
|
|
8
|
+
export interface ProjectSignals {
|
|
9
|
+
readonly hasConfig: boolean;
|
|
10
|
+
readonly hasConstitution: boolean;
|
|
11
|
+
readonly hasSpec: boolean;
|
|
12
|
+
readonly hasAdrs: boolean;
|
|
13
|
+
readonly hasTests: boolean;
|
|
14
|
+
readonly hasSchema: boolean;
|
|
15
|
+
readonly hasSourceCode: boolean;
|
|
16
|
+
readonly activeViolationCount: number;
|
|
17
|
+
readonly topViolations: readonly string[];
|
|
18
|
+
readonly recentActivity: string | null;
|
|
19
|
+
}
|
|
20
|
+
export declare function readProjectSignals(projectDir: string): ProjectSignals;
|
|
21
|
+
//# sourceMappingURL=advise-session-signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session-signals.d.ts","sourceRoot":"","sources":["../../src/tools/advise-session-signals.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AA6FD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAcrE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project signal reader for the session advisor.
|
|
3
|
+
*
|
|
4
|
+
* Reads filesystem state and active gate violations to produce a
|
|
5
|
+
* ProjectSignals snapshot. Intentionally fast — no git subprocess,
|
|
6
|
+
* no cascade execution. Used both by the MCP action and the shell hook.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { execSync } from "node:child_process";
|
|
11
|
+
import { readViolationsFile } from "./gate-violations.js";
|
|
12
|
+
// ── Constants ────────────────────────────────────────────────────────
|
|
13
|
+
const SCHEMA_PATHS = [
|
|
14
|
+
"openapi.yaml",
|
|
15
|
+
"openapi.yml",
|
|
16
|
+
"openapi.json",
|
|
17
|
+
"api-spec.yaml",
|
|
18
|
+
"api-spec.yml",
|
|
19
|
+
"api-spec.json",
|
|
20
|
+
"schema.graphql",
|
|
21
|
+
"prisma/schema.prisma",
|
|
22
|
+
"docs/schema.md",
|
|
23
|
+
"docs/schemas",
|
|
24
|
+
"src/schema",
|
|
25
|
+
"src/schemas",
|
|
26
|
+
"schemas",
|
|
27
|
+
"database/schema.sql",
|
|
28
|
+
"db/schema.sql",
|
|
29
|
+
"db/schema.rb",
|
|
30
|
+
];
|
|
31
|
+
const TEST_DIRS = ["tests", "test", "spec", "__tests__"];
|
|
32
|
+
const SOURCE_FILES = [
|
|
33
|
+
"package.json",
|
|
34
|
+
"pyproject.toml",
|
|
35
|
+
"setup.py",
|
|
36
|
+
"Cargo.toml",
|
|
37
|
+
"go.mod",
|
|
38
|
+
];
|
|
39
|
+
const CONSTITUTION_PATHS = [
|
|
40
|
+
"CLAUDE.md", // Claude Code
|
|
41
|
+
".cursor/rules/project-standards.mdc", // Cursor
|
|
42
|
+
".github/copilot-instructions.md", // GitHub Copilot
|
|
43
|
+
".windsurfrules", // Windsurf
|
|
44
|
+
".clinerules", // Cline
|
|
45
|
+
"CONVENTIONS.md", // Aider
|
|
46
|
+
];
|
|
47
|
+
const SPEC_PATHS = [
|
|
48
|
+
"docs/specs/PRD.md",
|
|
49
|
+
"docs/specs/spec.md",
|
|
50
|
+
"docs/PRD.md",
|
|
51
|
+
"docs/spec.md",
|
|
52
|
+
"SPEC.md",
|
|
53
|
+
"README.md",
|
|
54
|
+
];
|
|
55
|
+
// ── Readers ──────────────────────────────────────────────────────────
|
|
56
|
+
function hasAny(dir, paths) {
|
|
57
|
+
return paths.some((p) => existsSync(join(dir, p)));
|
|
58
|
+
}
|
|
59
|
+
function hasAdrFiles(dir) {
|
|
60
|
+
const adrCandidates = [
|
|
61
|
+
join(dir, "docs", "adrs", "active"),
|
|
62
|
+
join(dir, "docs", "adrs"),
|
|
63
|
+
];
|
|
64
|
+
for (const adrsDir of adrCandidates) {
|
|
65
|
+
if (!existsSync(adrsDir))
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
const found = readdirSync(adrsDir).some((f) => f.endsWith(".md"));
|
|
69
|
+
if (found)
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// ignore and try next candidate
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
function readRecentActivity(dir) {
|
|
79
|
+
try {
|
|
80
|
+
const subject = execSync("git log --oneline -1 --format=%s", {
|
|
81
|
+
cwd: dir,
|
|
82
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
83
|
+
timeout: 2000,
|
|
84
|
+
})
|
|
85
|
+
.toString()
|
|
86
|
+
.trim();
|
|
87
|
+
return subject.length > 0 ? subject : null;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function readActiveViolations(dir) {
|
|
94
|
+
const all = readViolationsFile(dir);
|
|
95
|
+
return all.map((v) => v.message).filter((m) => m.length > 0);
|
|
96
|
+
}
|
|
97
|
+
// ── Public API ───────────────────────────────────────────────────────
|
|
98
|
+
export function readProjectSignals(projectDir) {
|
|
99
|
+
const violations = readActiveViolations(projectDir);
|
|
100
|
+
return {
|
|
101
|
+
hasConfig: existsSync(join(projectDir, "forgecraft.yaml")),
|
|
102
|
+
hasConstitution: hasAny(projectDir, CONSTITUTION_PATHS),
|
|
103
|
+
hasSpec: hasAny(projectDir, SPEC_PATHS),
|
|
104
|
+
hasAdrs: hasAdrFiles(projectDir),
|
|
105
|
+
hasTests: TEST_DIRS.some((d) => existsSync(join(projectDir, d))),
|
|
106
|
+
hasSchema: hasAny(projectDir, SCHEMA_PATHS),
|
|
107
|
+
hasSourceCode: hasAny(projectDir, SOURCE_FILES),
|
|
108
|
+
activeViolationCount: violations.length,
|
|
109
|
+
topViolations: violations.slice(0, 3),
|
|
110
|
+
recentActivity: readRecentActivity(projectDir),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=advise-session-signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session-signals.js","sourceRoot":"","sources":["../../src/tools/advise-session-signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* advise_session — session-start advisor.
|
|
3
|
+
*
|
|
4
|
+
* Reads project signals (artifacts, violations, recent git activity) and
|
|
5
|
+
* returns a short advisory the LLM surfaces to the user at session start.
|
|
6
|
+
* Works on any project — GS configuration is not required.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import type { ToolResult } from "../shared/types.js";
|
|
10
|
+
export declare const adviseSessionSchema: z.ZodObject<{
|
|
11
|
+
project_dir: z.ZodString;
|
|
12
|
+
max_items: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
project_dir: string;
|
|
15
|
+
max_items?: number | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
project_dir: string;
|
|
18
|
+
max_items?: number | undefined;
|
|
19
|
+
}>;
|
|
20
|
+
export type AdviseSessionInput = z.infer<typeof adviseSessionSchema>;
|
|
21
|
+
export declare function adviseSessionHandler(args: AdviseSessionInput): Promise<ToolResult>;
|
|
22
|
+
//# sourceMappingURL=advise-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session.d.ts","sourceRoot":"","sources":["../../src/tools/advise-session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMrD,eAAO,MAAM,mBAAmB;;;;;;;;;EAY9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIrE,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,UAAU,CAAC,CAMrB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* advise_session — session-start advisor.
|
|
3
|
+
*
|
|
4
|
+
* Reads project signals (artifacts, violations, recent git activity) and
|
|
5
|
+
* returns a short advisory the LLM surfaces to the user at session start.
|
|
6
|
+
* Works on any project — GS configuration is not required.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { readProjectSignals } from "./advise-session-signals.js";
|
|
10
|
+
import { buildAdviceItems, formatAdvice } from "./advise-session-advisor.js";
|
|
11
|
+
// ── Schema ────────────────────────────────────────────────────────────
|
|
12
|
+
export const adviseSessionSchema = z.object({
|
|
13
|
+
project_dir: z.string().describe("Absolute path to the project root."),
|
|
14
|
+
max_items: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.min(1)
|
|
18
|
+
.max(10)
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Maximum advice items to return. Default: 5. " +
|
|
21
|
+
"Agent-agnostic: works with Claude Code, Cursor, Cline, Windsurf, Copilot, Aider — any MCP-capable client."),
|
|
22
|
+
});
|
|
23
|
+
// ── Handler ───────────────────────────────────────────────────────────
|
|
24
|
+
export async function adviseSessionHandler(args) {
|
|
25
|
+
const { project_dir, max_items = 5 } = args;
|
|
26
|
+
const signals = readProjectSignals(project_dir);
|
|
27
|
+
const items = buildAdviceItems(signals, max_items);
|
|
28
|
+
const text = formatAdvice(items, signals.recentActivity);
|
|
29
|
+
return { content: [{ type: "text", text }] };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=advise-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-session.js","sourceRoot":"","sources":["../../src/tools/advise-session.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE7E,yEAAyE;AAEzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACtE,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CACP,8CAA8C;QAC5C,2GAA2G,CAC9G;CACJ,CAAC,CAAC;AAIH,yEAAyE;AAEzE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAwB;IAExB,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* change_request and list_changes handlers.
|
|
3
|
+
*
|
|
4
|
+
* change_request: Opens a formal change record in .forgecraft/changes/<slug>.yaml.
|
|
5
|
+
* Captures intent, auto-detects affected artifacts, and lists gates that must pass.
|
|
6
|
+
*
|
|
7
|
+
* list_changes: Surfaces open/implementing/blocked changes with staleness flags.
|
|
8
|
+
*/
|
|
9
|
+
import type { ToolResult } from "../shared/types.js";
|
|
10
|
+
export type ChangeType = "spec-change" | "breaking-api" | "adr-supersession" | "gate-change" | "dependency-update";
|
|
11
|
+
export type ChangeStatus = "open" | "implementing" | "blocked" | "verified" | "closed";
|
|
12
|
+
export interface ChangeRecord {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly title: string;
|
|
15
|
+
readonly status: ChangeStatus;
|
|
16
|
+
readonly type: ChangeType;
|
|
17
|
+
readonly created: string;
|
|
18
|
+
readonly description: string;
|
|
19
|
+
readonly breaking: boolean;
|
|
20
|
+
readonly breaking_details?: string;
|
|
21
|
+
readonly affected_artifacts: string[];
|
|
22
|
+
readonly supersedes_adr?: string;
|
|
23
|
+
readonly required_gates: string[];
|
|
24
|
+
readonly blocked_reason?: string;
|
|
25
|
+
readonly verified_at?: string;
|
|
26
|
+
readonly closed_at?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ChangeRequestInput {
|
|
29
|
+
readonly project_dir: string;
|
|
30
|
+
readonly title: string;
|
|
31
|
+
readonly description: string;
|
|
32
|
+
readonly type: ChangeType;
|
|
33
|
+
readonly breaking?: boolean;
|
|
34
|
+
readonly breaking_details?: string;
|
|
35
|
+
readonly supersedes_adr?: string;
|
|
36
|
+
readonly affected_artifacts?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface ListChangesInput {
|
|
39
|
+
readonly project_dir: string;
|
|
40
|
+
readonly status?: ChangeStatus | "all";
|
|
41
|
+
}
|
|
42
|
+
export declare function slugify(title: string, date: string): string;
|
|
43
|
+
export declare function detectAffectedArtifacts(projectDir: string, title: string, description: string, type: ChangeType): string[];
|
|
44
|
+
export declare function detectRequiredGates(projectDir: string, type: ChangeType, breaking: boolean): string[];
|
|
45
|
+
export declare function serializeChangeRecord(record: ChangeRecord): string;
|
|
46
|
+
export declare function parseChangeRecord(content: string, id: string): ChangeRecord | null;
|
|
47
|
+
export declare function changesDir(projectDir: string): string;
|
|
48
|
+
export declare function loadAllChanges(projectDir: string): ChangeRecord[];
|
|
49
|
+
/** Returns changes in implementing status — used by close_cycle gate. */
|
|
50
|
+
export declare function getImplementingChanges(projectDir: string): ChangeRecord[];
|
|
51
|
+
export declare function changeRequestHandler(args: ChangeRequestInput): Promise<ToolResult>;
|
|
52
|
+
export declare function listChangesHandler(args: ListChangesInput): Promise<ToolResult>;
|
|
53
|
+
//# sourceMappingURL=change-request.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-request.d.ts","sourceRoot":"","sources":["../../src/tools/change-request.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,MAAM,UAAU,GAClB,aAAa,GACb,cAAc,GACd,kBAAkB,GAClB,aAAa,GACb,mBAAmB,CAAC;AAExB,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,cAAc,GACd,SAAS,GACT,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC;CACxC;AAID,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS3D;AAID,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,UAAU,GACf,MAAM,EAAE,CAiEV;AAID,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,OAAO,GAChB,MAAM,EAAE,CAmCV;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA8ClE;AAID,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,YAAY,GAAG,IAAI,CAiErB;AAMD,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAejE;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAEzE;AAID,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,UAAU,CAAC,CA2FrB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CAwFrB"}
|