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
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentinel-respecting writer for AI behavioral instruction files.
|
|
3
|
+
*
|
|
4
|
+
* Pairs with `./detect.ts`: detection is the read-only check, this is the
|
|
5
|
+
* gated write. Default behaviour is the safe one — if any sentinel exists
|
|
6
|
+
* (at the target path or anywhere on the canonical priority list), the
|
|
7
|
+
* write is *skipped* and the caller decides what to do.
|
|
8
|
+
*
|
|
9
|
+
* Three opt-ins are available:
|
|
10
|
+
* - `override: true` → write the target unconditionally.
|
|
11
|
+
* - `appendIfMatchTarget: true` → append the new content under a dated
|
|
12
|
+
* `## GS Discipline` header, but only
|
|
13
|
+
* when the target file already exists
|
|
14
|
+
* and is itself one of the recognised
|
|
15
|
+
* sentinels. Cross-file appends are not
|
|
16
|
+
* permitted from this helper.
|
|
17
|
+
*
|
|
18
|
+
* This module performs no integration with existing CLAUDE.md generation
|
|
19
|
+
* flows — that wiring is a separate refactor.
|
|
20
|
+
*/
|
|
21
|
+
export interface WriteWithSentinelRespectOptions {
|
|
22
|
+
/** Absolute path to the repo root used for sentinel scanning. */
|
|
23
|
+
readonly repoPath: string;
|
|
24
|
+
/** Absolute path of the file forgecraft wants to write. */
|
|
25
|
+
readonly targetPath: string;
|
|
26
|
+
/** New content to write. */
|
|
27
|
+
readonly content: string;
|
|
28
|
+
/** Force-write even when sentinels exist. Default `false`. */
|
|
29
|
+
readonly override?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* If `true` and the target itself is a recognised sentinel that already
|
|
32
|
+
* exists, append the content under a dated header instead of skipping.
|
|
33
|
+
* Has no effect when `override` is `true`.
|
|
34
|
+
*/
|
|
35
|
+
readonly appendIfMatchTarget?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export type WriteWithSentinelRespectResult = {
|
|
38
|
+
readonly action: "written";
|
|
39
|
+
readonly bytesWritten: number;
|
|
40
|
+
} | {
|
|
41
|
+
readonly action: "appended";
|
|
42
|
+
readonly existingFile: string;
|
|
43
|
+
readonly bytesWritten: number;
|
|
44
|
+
} | {
|
|
45
|
+
readonly action: "skipped";
|
|
46
|
+
readonly reason: string;
|
|
47
|
+
readonly existingFile: string;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Write `content` to `targetPath`, respecting any sentinel files already
|
|
51
|
+
* in the repo. See module docstring for the full policy.
|
|
52
|
+
*/
|
|
53
|
+
export declare function writeWithSentinelRespect(opts: WriteWithSentinelRespectOptions): WriteWithSentinelRespectResult;
|
|
54
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/sentinel/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,+BAA+B;IAC9C,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,MAAM,8BAA8B,GACtC;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7D;IACE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEN;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,+BAA+B,GACpC,8BAA8B,CAuChC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentinel-respecting writer for AI behavioral instruction files.
|
|
3
|
+
*
|
|
4
|
+
* Pairs with `./detect.ts`: detection is the read-only check, this is the
|
|
5
|
+
* gated write. Default behaviour is the safe one — if any sentinel exists
|
|
6
|
+
* (at the target path or anywhere on the canonical priority list), the
|
|
7
|
+
* write is *skipped* and the caller decides what to do.
|
|
8
|
+
*
|
|
9
|
+
* Three opt-ins are available:
|
|
10
|
+
* - `override: true` → write the target unconditionally.
|
|
11
|
+
* - `appendIfMatchTarget: true` → append the new content under a dated
|
|
12
|
+
* `## GS Discipline` header, but only
|
|
13
|
+
* when the target file already exists
|
|
14
|
+
* and is itself one of the recognised
|
|
15
|
+
* sentinels. Cross-file appends are not
|
|
16
|
+
* permitted from this helper.
|
|
17
|
+
*
|
|
18
|
+
* This module performs no integration with existing CLAUDE.md generation
|
|
19
|
+
* flows — that wiring is a separate refactor.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
22
|
+
import { dirname, relative, resolve } from "node:path";
|
|
23
|
+
import { detectSentinel, SENTINEL_PRIORITY_PATHS } from "./detect.js";
|
|
24
|
+
/**
|
|
25
|
+
* Write `content` to `targetPath`, respecting any sentinel files already
|
|
26
|
+
* in the repo. See module docstring for the full policy.
|
|
27
|
+
*/
|
|
28
|
+
export function writeWithSentinelRespect(opts) {
|
|
29
|
+
const { repoPath, targetPath, content, override = false, appendIfMatchTarget = false, } = opts;
|
|
30
|
+
if (override) {
|
|
31
|
+
return writeFresh(targetPath, content);
|
|
32
|
+
}
|
|
33
|
+
const detection = detectSentinel(repoPath);
|
|
34
|
+
const targetExists = existsSync(targetPath);
|
|
35
|
+
if (!targetExists && detection.foundFiles.length === 0) {
|
|
36
|
+
return writeFresh(targetPath, content);
|
|
37
|
+
}
|
|
38
|
+
const targetRel = toRepoRelative(repoPath, targetPath);
|
|
39
|
+
const targetIsSentinel = SENTINEL_PRIORITY_PATHS.includes(targetRel);
|
|
40
|
+
if (appendIfMatchTarget && targetExists && targetIsSentinel) {
|
|
41
|
+
return appendUnderHeader(targetPath, content);
|
|
42
|
+
}
|
|
43
|
+
const blocking = targetExists && targetIsSentinel
|
|
44
|
+
? targetRel
|
|
45
|
+
: (detection.foundFiles[0]?.path ?? targetRel);
|
|
46
|
+
const reason = targetExists
|
|
47
|
+
? `Target ${targetRel} already exists; pass override:true to replace, or appendIfMatchTarget:true to append.`
|
|
48
|
+
: `Sentinel(s) detected: ${detection.foundFiles
|
|
49
|
+
.map((f) => f.path)
|
|
50
|
+
.join(", ")}. Pass override:true to write anyway.`;
|
|
51
|
+
return { action: "skipped", reason, existingFile: blocking };
|
|
52
|
+
}
|
|
53
|
+
function writeFresh(targetPath, content) {
|
|
54
|
+
mkdirSync(dirname(targetPath), { recursive: true });
|
|
55
|
+
writeFileSync(targetPath, content, "utf-8");
|
|
56
|
+
return {
|
|
57
|
+
action: "written",
|
|
58
|
+
bytesWritten: Buffer.byteLength(content, "utf-8"),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function appendUnderHeader(targetPath, content) {
|
|
62
|
+
const original = readFileSync(targetPath, "utf-8");
|
|
63
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
64
|
+
const separator = original.endsWith("\n") ? "\n" : "\n\n";
|
|
65
|
+
const header = `## GS Discipline (appended by forgecraft ${date})\n\n`;
|
|
66
|
+
const merged = `${original}${separator}${header}${content}`;
|
|
67
|
+
writeFileSync(targetPath, merged, "utf-8");
|
|
68
|
+
const bytesWritten = Buffer.byteLength(merged, "utf-8") - Buffer.byteLength(original, "utf-8");
|
|
69
|
+
return { action: "appended", existingFile: targetPath, bytesWritten };
|
|
70
|
+
}
|
|
71
|
+
/** Express `targetPath` relative to `repoPath` using POSIX separators. */
|
|
72
|
+
function toRepoRelative(repoPath, targetPath) {
|
|
73
|
+
return relative(resolve(repoPath), resolve(targetPath)).replace(/\\/g, "/");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/sentinel/write.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cnt-health.d.ts","sourceRoot":"","sources":["../../src/shared/cnt-health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"cnt-health.d.ts","sourceRoot":"","sources":["../../src/shared/cnt-health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAyCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAsBjE;AA6CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAkEjE"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
|
+
import { readExceptions, findMatchingException } from "./exceptions.js";
|
|
10
11
|
/** Ignored directory names when scanning src/ */
|
|
11
12
|
const IGNORED_SRC_DIRS = new Set(["node_modules", "dist", "coverage", ".git"]);
|
|
12
13
|
/**
|
|
@@ -127,12 +128,16 @@ export function auditCntHealth(projectDir) {
|
|
|
127
128
|
issues: ["CNT not initialized — .claude/index.md missing"],
|
|
128
129
|
};
|
|
129
130
|
}
|
|
131
|
+
const exceptions = readExceptions(projectDir);
|
|
130
132
|
const claudeMdLines = countFileLines(join(projectDir, "CLAUDE.md"));
|
|
131
133
|
const coreMdLines = countFileLines(join(projectDir, ".claude", "core.md"));
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
+
// Honor exceptions: if CLAUDE.md or core.md is exempted, treat as passing.
|
|
135
|
+
const claudeMdExempt = !!findMatchingException(exceptions, "audit/cnt_claude_md", "CLAUDE.md");
|
|
136
|
+
const coreMdExempt = !!findMatchingException(exceptions, "audit/cnt_core_md", ".claude/core.md");
|
|
137
|
+
const claudeMdPass = claudeMdExempt || (claudeMdLines !== null && claudeMdLines <= 3);
|
|
138
|
+
const coreMdPass = coreMdExempt || (coreMdLines !== null && coreMdLines <= 50);
|
|
134
139
|
const indexMdPresent = true;
|
|
135
|
-
const leafViolations = findLeafViolations(projectDir);
|
|
140
|
+
const leafViolations = findLeafViolations(projectDir, exceptions);
|
|
136
141
|
const issues = buildAuditIssues(claudeMdLines, claudeMdPass, coreMdLines, coreMdPass, leafViolations);
|
|
137
142
|
const totalChecks = 4; // CLAUDE.md, core.md, index.md, no leaf violations
|
|
138
143
|
const passing = (claudeMdPass ? 1 : 0) +
|
|
@@ -162,7 +167,7 @@ const SCAFFOLD_SENTINEL_PREFIX = "<!-- ForgeCraft sentinel:";
|
|
|
162
167
|
* @param projectDir - Absolute path to project root
|
|
163
168
|
* @returns Array of violations with file name and line count
|
|
164
169
|
*/
|
|
165
|
-
function findLeafViolations(projectDir) {
|
|
170
|
+
function findLeafViolations(projectDir, exceptions = []) {
|
|
166
171
|
const standardsDir = join(projectDir, ".claude", "standards");
|
|
167
172
|
if (!existsSync(standardsDir))
|
|
168
173
|
return [];
|
|
@@ -174,6 +179,9 @@ function findLeafViolations(projectDir) {
|
|
|
174
179
|
const content = readFileSync(fullPath, "utf-8");
|
|
175
180
|
if (content.startsWith(SCAFFOLD_SENTINEL_PREFIX))
|
|
176
181
|
return [];
|
|
182
|
+
const relPath = `.claude/standards/${f}`;
|
|
183
|
+
if (findMatchingException(exceptions, "audit/cnt_leaf_length", relPath))
|
|
184
|
+
return [];
|
|
177
185
|
const lines = countFileLines(fullPath);
|
|
178
186
|
return lines !== null && lines > 30 ? [{ file: f, lines }] : [];
|
|
179
187
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cnt-health.js","sourceRoot":"","sources":["../../src/shared/cnt-health.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cnt-health.js","sourceRoot":"","sources":["../../src/shared/cnt-health.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/config.d.ts
CHANGED
|
@@ -12,4 +12,12 @@ import type { ExperimentConfig } from "./types.js";
|
|
|
12
12
|
* @returns Parsed ExperimentConfig, or undefined if not configured
|
|
13
13
|
*/
|
|
14
14
|
export declare function readExperimentConfig(projectDir: string): ExperimentConfig | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Reads `practitioner_level` from forgecraft.yaml.
|
|
17
|
+
* Returns "experienced" only when explicitly set. Defaults to "novice".
|
|
18
|
+
*
|
|
19
|
+
* @param projectDir - Absolute path to the project root
|
|
20
|
+
* @returns "novice" | "experienced"
|
|
21
|
+
*/
|
|
22
|
+
export declare function readPractitionerLevel(projectDir: string): "novice" | "experienced";
|
|
15
23
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,GACjB,gBAAgB,GAAG,SAAS,CA6B9B"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,GACjB,gBAAgB,GAAG,SAAS,CA6B9B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,GACjB,QAAQ,GAAG,aAAa,CAc1B"}
|
package/dist/shared/config.js
CHANGED
|
@@ -42,6 +42,29 @@ export function readExperimentConfig(projectDir) {
|
|
|
42
42
|
group: isValidExperimentGroup(group) ? group : "gs",
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Reads `practitioner_level` from forgecraft.yaml.
|
|
47
|
+
* Returns "experienced" only when explicitly set. Defaults to "novice".
|
|
48
|
+
*
|
|
49
|
+
* @param projectDir - Absolute path to the project root
|
|
50
|
+
* @returns "novice" | "experienced"
|
|
51
|
+
*/
|
|
52
|
+
export function readPractitionerLevel(projectDir) {
|
|
53
|
+
const yamlPath = join(projectDir, "forgecraft.yaml");
|
|
54
|
+
if (!existsSync(yamlPath))
|
|
55
|
+
return "novice";
|
|
56
|
+
let raw;
|
|
57
|
+
try {
|
|
58
|
+
raw = yaml.load(readFileSync(yamlPath, "utf-8"));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return "novice";
|
|
62
|
+
}
|
|
63
|
+
if (!raw || typeof raw !== "object")
|
|
64
|
+
return "novice";
|
|
65
|
+
const config = raw;
|
|
66
|
+
return config["practitioner_level"] === "experienced" ? "experienced" : "novice";
|
|
67
|
+
}
|
|
45
68
|
function isValidExperimentType(value) {
|
|
46
69
|
return (value === "greenfield" ||
|
|
47
70
|
value === "brownfield" ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEpE,MAAM,GAAG,GAAG,UAAqC,CAAC;IAClD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;QACb,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;QACvD,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAc;IAEd,OAAO,CACL,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,WAAW,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAc;IAEd,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/shared/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEpE,MAAM,GAAG,GAAG,UAAqC,CAAC;IAClD,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAEjE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;QACb,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;QACvD,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;KACpD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE3C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,OAAO,MAAM,CAAC,oBAAoB,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;AACnF,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAc;IAEd,OAAO,CACL,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,YAAY;QACtB,KAAK,KAAK,UAAU;QACpB,KAAK,KAAK,WAAW,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAc;IAEd,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Exports pure utilities and low-level I/O used by the public gate API.
|
|
4
4
|
*/
|
|
5
5
|
import type { ProjectGate, ProjectGatesFile, ToolRequirement } from "./types.js";
|
|
6
|
+
import type { DeploymentEnvironmentConfig } from "./types/project.js";
|
|
6
7
|
export declare const FLAT_FILE = ".forgecraft/project-gates.yaml";
|
|
7
8
|
export declare const GATES_BASE = ".forgecraft/gates";
|
|
8
9
|
export declare const PROJECT_ACTIVE = ".forgecraft/gates/project/active";
|
|
@@ -56,4 +57,12 @@ export declare function validateGate(gate: Partial<ProjectGate>): string[];
|
|
|
56
57
|
* @returns Array of ToolRequirements to use for this gate in this project
|
|
57
58
|
*/
|
|
58
59
|
export declare function resolveToolsForLanguage(gate: ProjectGate, language: string): readonly ToolRequirement[];
|
|
60
|
+
/**
|
|
61
|
+
* Returns gate IDs that should be activated based on environment class properties.
|
|
62
|
+
* Called by audit and generate_session_prompt to inject environment-driven gates.
|
|
63
|
+
*
|
|
64
|
+
* @param environments - Record of environment name → config from forgecraft.yaml
|
|
65
|
+
* @returns Array of gate IDs that apply given the declared environment properties
|
|
66
|
+
*/
|
|
67
|
+
export declare function getEnvironmentActivatedGateIds(environments: Record<string, DeploymentEnvironmentConfig>): readonly string[];
|
|
59
68
|
//# sourceMappingURL=project-gates-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-gates-helpers.d.ts","sourceRoot":"","sources":["../../src/shared/project-gates-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"project-gates-helpers.d.ts","sourceRoot":"","sources":["../../src/shared/project-gates-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAItE,eAAO,MAAM,SAAS,mCAAmC,CAAC;AAC1D,eAAO,MAAM,UAAU,sBAAsB,CAAC;AAC9C,eAAO,MAAM,cAAc,qCAAiC,CAAC;AAC7D,eAAO,MAAM,gBAAgB,uCAAmC,CAAC;AACjE,eAAO,MAAM,eAAe,sCAAkC,CAAC;AAC/D,eAAO,MAAM,aAAa,+BAA2B,CAAC;AAEtD,eAAO,MAAM,gBAAgB,EAAE,gBAG9B,CAAC;AAIF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAavE;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAM/D;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAa5E;AAID;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,EAAE,CAejE;AAID;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,MAAM,GACf,SAAS,eAAe,EAAE,CAc5B;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,GACxD,SAAS,MAAM,EAAE,CA6BnB"}
|
|
@@ -147,4 +147,39 @@ export function resolveToolsForLanguage(gate, language) {
|
|
|
147
147
|
}
|
|
148
148
|
return gate.tools ?? [];
|
|
149
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Returns gate IDs that should be activated based on environment class properties.
|
|
152
|
+
* Called by audit and generate_session_prompt to inject environment-driven gates.
|
|
153
|
+
*
|
|
154
|
+
* @param environments - Record of environment name → config from forgecraft.yaml
|
|
155
|
+
* @returns Array of gate IDs that apply given the declared environment properties
|
|
156
|
+
*/
|
|
157
|
+
export function getEnvironmentActivatedGateIds(environments) {
|
|
158
|
+
const activated = new Set();
|
|
159
|
+
for (const env of Object.values(environments)) {
|
|
160
|
+
if (env.class === "lte" || env.ephemeral === true) {
|
|
161
|
+
activated.add("lte-ephemeral-infra");
|
|
162
|
+
activated.add("lte-anonymized-data");
|
|
163
|
+
}
|
|
164
|
+
if (env.class === "cae" || env.class === "prd") {
|
|
165
|
+
activated.add("no-cross-tier-urls");
|
|
166
|
+
}
|
|
167
|
+
if (env.class === "cae") {
|
|
168
|
+
activated.add("cae-version-parity");
|
|
169
|
+
}
|
|
170
|
+
if (env.underChangeControl === true || env.class === "prd") {
|
|
171
|
+
activated.add("prd-change-control");
|
|
172
|
+
}
|
|
173
|
+
if (env.containsPii === true) {
|
|
174
|
+
activated.add("no-cross-tier-urls");
|
|
175
|
+
}
|
|
176
|
+
if (env.smtpRelay === "prod" &&
|
|
177
|
+
env.class !== "cae" &&
|
|
178
|
+
env.class !== "prd") {
|
|
179
|
+
// prod relay used in a non-prod environment — flag it
|
|
180
|
+
activated.add("no-prod-relay-in-nonprod");
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return Array.from(activated);
|
|
184
|
+
}
|
|
150
185
|
//# sourceMappingURL=project-gates-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-gates-helpers.js","sourceRoot":"","sources":["../../src/shared/project-gates-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"project-gates-helpers.js","sourceRoot":"","sources":["../../src/shared/project-gates-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool result size utilities.
|
|
3
|
+
*
|
|
4
|
+
* Prevents silent schema truncation at the MCP transport layer by:
|
|
5
|
+
* - Annotating large results with their size (chars + lines)
|
|
6
|
+
* - Truncating results that exceed the limit with an explicit marker
|
|
7
|
+
* so the caller knows to refine their query rather than acting on
|
|
8
|
+
* incomplete data.
|
|
9
|
+
*/
|
|
10
|
+
/** Maximum characters returned in a single tool result. */
|
|
11
|
+
export declare const MAX_TOOL_RESULT_CHARS = 50000;
|
|
12
|
+
/**
|
|
13
|
+
* Annotate a tool result text with its size and truncate if necessary.
|
|
14
|
+
*
|
|
15
|
+
* - Under `maxChars` and over `SIZE_ANNOTATION_THRESHOLD`: appends a compact
|
|
16
|
+
* footer showing char/line count.
|
|
17
|
+
* - Over `maxChars`: truncates to `maxChars` and appends a `[TRUNCATED]`
|
|
18
|
+
* footer so the caller knows the response is incomplete.
|
|
19
|
+
* - Under `SIZE_ANNOTATION_THRESHOLD`: returned as-is (no footer noise for
|
|
20
|
+
* short replies like "No violations recorded.").
|
|
21
|
+
*
|
|
22
|
+
* @param text - Raw tool result text
|
|
23
|
+
* @param maxChars - Truncation limit (default: MAX_TOOL_RESULT_CHARS)
|
|
24
|
+
* @returns Annotated (and possibly truncated) text
|
|
25
|
+
*/
|
|
26
|
+
export declare function annotateResult(text: string, maxChars?: number): string;
|
|
27
|
+
//# sourceMappingURL=result-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-utils.d.ts","sourceRoot":"","sources":["../../src/shared/result-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAK5C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA8B,GACvC,MAAM,CAgBR"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool result size utilities.
|
|
3
|
+
*
|
|
4
|
+
* Prevents silent schema truncation at the MCP transport layer by:
|
|
5
|
+
* - Annotating large results with their size (chars + lines)
|
|
6
|
+
* - Truncating results that exceed the limit with an explicit marker
|
|
7
|
+
* so the caller knows to refine their query rather than acting on
|
|
8
|
+
* incomplete data.
|
|
9
|
+
*/
|
|
10
|
+
/** Maximum characters returned in a single tool result. */
|
|
11
|
+
export const MAX_TOOL_RESULT_CHARS = 50_000;
|
|
12
|
+
/** Minimum size (chars) before a size annotation is appended. */
|
|
13
|
+
const SIZE_ANNOTATION_THRESHOLD = 1_000;
|
|
14
|
+
/**
|
|
15
|
+
* Annotate a tool result text with its size and truncate if necessary.
|
|
16
|
+
*
|
|
17
|
+
* - Under `maxChars` and over `SIZE_ANNOTATION_THRESHOLD`: appends a compact
|
|
18
|
+
* footer showing char/line count.
|
|
19
|
+
* - Over `maxChars`: truncates to `maxChars` and appends a `[TRUNCATED]`
|
|
20
|
+
* footer so the caller knows the response is incomplete.
|
|
21
|
+
* - Under `SIZE_ANNOTATION_THRESHOLD`: returned as-is (no footer noise for
|
|
22
|
+
* short replies like "No violations recorded.").
|
|
23
|
+
*
|
|
24
|
+
* @param text - Raw tool result text
|
|
25
|
+
* @param maxChars - Truncation limit (default: MAX_TOOL_RESULT_CHARS)
|
|
26
|
+
* @returns Annotated (and possibly truncated) text
|
|
27
|
+
*/
|
|
28
|
+
export function annotateResult(text, maxChars = MAX_TOOL_RESULT_CHARS) {
|
|
29
|
+
const total = text.length;
|
|
30
|
+
if (total <= SIZE_ANNOTATION_THRESHOLD)
|
|
31
|
+
return text;
|
|
32
|
+
if (total <= maxChars) {
|
|
33
|
+
const lines = text.split("\n").length;
|
|
34
|
+
return `${text}\n\n---\n_↩ ${total.toLocaleString()} chars · ${lines.toLocaleString()} lines_`;
|
|
35
|
+
}
|
|
36
|
+
const truncated = text.slice(0, maxChars);
|
|
37
|
+
return (`${truncated}\n\n---\n` +
|
|
38
|
+
`_[TRUNCATED: showing first ${maxChars.toLocaleString()} of ${total.toLocaleString()} chars — ` +
|
|
39
|
+
`use a more specific query or smaller scope to see the rest]_`);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=result-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-utils.js","sourceRoot":"","sources":["../../src/shared/result-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,iEAAiE;AACjE,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,WAAmB,qBAAqB;IAExC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAE1B,IAAI,KAAK,IAAI,yBAAyB;QAAE,OAAO,IAAI,CAAC;IAEpD,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACtC,OAAO,GAAG,IAAI,eAAe,KAAK,CAAC,cAAc,EAAE,YAAY,KAAK,CAAC,cAAc,EAAE,SAAS,CAAC;IACjG,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,CACL,GAAG,SAAS,WAAW;QACvB,8BAA8B,QAAQ,CAAC,cAAc,EAAE,OAAO,KAAK,CAAC,cAAc,EAAE,WAAW;QAC/F,8DAA8D,CAC/D,CAAC;AACJ,CAAC"}
|
|
@@ -48,6 +48,12 @@ export interface ForgeCraftConfig {
|
|
|
48
48
|
readonly disabledHooks?: string[];
|
|
49
49
|
/** Additional tags beyond auto-detected ones. */
|
|
50
50
|
readonly additionalTags?: Tag[];
|
|
51
|
+
/**
|
|
52
|
+
* Practitioner experience level. Controls verbosity of generated session prompts.
|
|
53
|
+
* - `novice` (default): full methodology explanations, step-by-step instructions
|
|
54
|
+
* - `experienced`: compact output — just commit sequence and test command; no methodology teaching
|
|
55
|
+
*/
|
|
56
|
+
readonly practitioner_level?: "novice" | "experienced";
|
|
51
57
|
/**
|
|
52
58
|
* When true, apply compact post-processing to all generated instruction files:
|
|
53
59
|
* strips explanatory tail clauses from bullet points and deduplicates identical lines.
|
|
@@ -66,7 +72,7 @@ export interface ForgeCraftConfig {
|
|
|
66
72
|
readonly deployment?: ProjectDeploymentConfig;
|
|
67
73
|
/** If true, gates marked generalizable: true are queued for community contribution. */
|
|
68
74
|
readonly contribute_gates?: boolean;
|
|
69
|
-
/** URL for the remote quality-gates registry. Defaults to the public
|
|
75
|
+
/** URL for the remote quality-gates registry. Defaults to the public quality-gates registry. */
|
|
70
76
|
readonly gates_registry_url?: string;
|
|
71
77
|
/** URL for the forgecraft-server API. Used by contribute-gate tool. */
|
|
72
78
|
readonly server_url?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shared/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,GAAG,EACH,WAAW,EACX,YAAY,EACZ,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC;IACtE,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC;CAClC;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B,gGAAgG;IAChG,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IACxC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iDAAiD;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC/D,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,yDAAyD;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,uCAAuC;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5D,gCAAgC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,iDAAiD;IACjD,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAClB,aAAa,GACb,aAAa,GACb,mBAAmB,GACnB,YAAY,CAAC;IACjB,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IACpC,0GAA0G;IAC1G,QAAQ,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IAC9C,uFAAuF;IACvF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/shared/types/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,6 +69,26 @@ export interface ToolRequirement {
|
|
|
69
69
|
/** If false, gate can run without this tool at reduced coverage */
|
|
70
70
|
readonly required: boolean;
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* How a quality gate applies at a specific GS abstraction layer.
|
|
74
|
+
* Mirrors the MCP tool description model: tells the AI when to activate this
|
|
75
|
+
* gate and what it contributes to that layer's completeness.
|
|
76
|
+
*/
|
|
77
|
+
export interface GateLayerApplication {
|
|
78
|
+
/** GS abstraction layer. L1=Blueprint, L2=Harness, L3=Environment, L4=Monitoring */
|
|
79
|
+
readonly layer: "L1" | "L2" | "L3" | "L4";
|
|
80
|
+
/**
|
|
81
|
+
* How this gate applies at this layer — the enforcement mechanism.
|
|
82
|
+
* What it contributes to the layer's completeness when it passes.
|
|
83
|
+
* What it reveals as a gap when it fires.
|
|
84
|
+
*/
|
|
85
|
+
readonly description: string;
|
|
86
|
+
/**
|
|
87
|
+
* Trigger condition at this layer — when the gate becomes relevant.
|
|
88
|
+
* What must be true for this gate to fire or be meaningful here.
|
|
89
|
+
*/
|
|
90
|
+
readonly when: string;
|
|
91
|
+
}
|
|
72
92
|
/**
|
|
73
93
|
* A quality gate -- a named, evidence-backed check that defends a GS property.
|
|
74
94
|
* Gates live in .forgecraft/gates/project/active|promoted|retired/ or .forgecraft/gates/registry/{tag}/.
|
|
@@ -88,6 +108,14 @@ export interface ProjectGate {
|
|
|
88
108
|
* "environment-hygiene", "state-machine", "concurrency"
|
|
89
109
|
*/
|
|
90
110
|
readonly domain: string;
|
|
111
|
+
/**
|
|
112
|
+
* GS abstraction layers this gate applies to, with per-layer context.
|
|
113
|
+
* Absent means the gate is layer-agnostic.
|
|
114
|
+
* Like MCP tool descriptions: tells the AI when and how to use this gate
|
|
115
|
+
* at each layer of the automation ladder (L1 Blueprint → L2 Harness →
|
|
116
|
+
* L3 Environment → L4 Monitoring).
|
|
117
|
+
*/
|
|
118
|
+
readonly layers?: readonly GateLayerApplication[];
|
|
91
119
|
/**
|
|
92
120
|
* How this gate is implemented:
|
|
93
121
|
* - logic: pure invariant check, no external tools
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../src/shared/types/gates.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gates.d.ts","sourceRoot":"","sources":["../../../src/shared/types/gates.ts"],"names":[],"mappings":"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"}
|