@vyuhlabs/dxkit 2.4.7 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +456 -30
- package/README.md +360 -439
- package/dist/analyzers/bom/gather.d.ts +3 -3
- package/dist/analyzers/bom/gather.js +3 -3
- package/dist/analyzers/bom/index.js +2 -2
- package/dist/analyzers/bom/index.js.map +1 -1
- package/dist/analyzers/dashboard/index.d.ts.map +1 -1
- package/dist/analyzers/dashboard/index.js +4 -3
- package/dist/analyzers/dashboard/index.js.map +1 -1
- package/dist/analyzers/developer/index.d.ts.map +1 -1
- package/dist/analyzers/developer/index.js +2 -1
- package/dist/analyzers/developer/index.js.map +1 -1
- package/dist/analyzers/dispatcher.d.ts +15 -0
- package/dist/analyzers/dispatcher.d.ts.map +1 -1
- package/dist/analyzers/dispatcher.js +42 -6
- package/dist/analyzers/dispatcher.js.map +1 -1
- package/dist/analyzers/health.d.ts.map +1 -1
- package/dist/analyzers/health.js +11 -1
- package/dist/analyzers/health.js.map +1 -1
- package/dist/analyzers/licenses/gather.d.ts +1 -1
- package/dist/analyzers/licenses/gather.d.ts.map +1 -1
- package/dist/analyzers/licenses/gather.js +18 -2
- package/dist/analyzers/licenses/gather.js.map +1 -1
- package/dist/analyzers/quality/index.d.ts.map +1 -1
- package/dist/analyzers/quality/index.js +10 -2
- package/dist/analyzers/quality/index.js.map +1 -1
- package/dist/analyzers/security/aggregator.d.ts.map +1 -1
- package/dist/analyzers/security/aggregator.js +8 -48
- package/dist/analyzers/security/aggregator.js.map +1 -1
- package/dist/analyzers/security/gather.d.ts +4 -3
- package/dist/analyzers/security/gather.d.ts.map +1 -1
- package/dist/analyzers/security/gather.js +23 -5
- package/dist/analyzers/security/gather.js.map +1 -1
- package/dist/analyzers/security/index.d.ts +1 -1
- package/dist/analyzers/security/index.js +2 -2
- package/dist/analyzers/security/index.js.map +1 -1
- package/dist/analyzers/tools/autogen-header.js +1 -1
- package/dist/analyzers/tools/cloc.js +3 -3
- package/dist/analyzers/tools/cloc.js.map +1 -1
- package/dist/analyzers/tools/deadline.d.ts +67 -0
- package/dist/analyzers/tools/deadline.d.ts.map +1 -0
- package/dist/analyzers/tools/deadline.js +81 -0
- package/dist/analyzers/tools/deadline.js.map +1 -0
- package/dist/analyzers/tools/exclusions.d.ts +6 -6
- package/dist/analyzers/tools/exclusions.js +6 -6
- package/dist/analyzers/tools/fingerprint.d.ts +91 -26
- package/dist/analyzers/tools/fingerprint.d.ts.map +1 -1
- package/dist/analyzers/tools/fingerprint.js +111 -22
- package/dist/analyzers/tools/fingerprint.js.map +1 -1
- package/dist/analyzers/tools/generic.d.ts.map +1 -1
- package/dist/analyzers/tools/generic.js +7 -2
- package/dist/analyzers/tools/generic.js.map +1 -1
- package/dist/analyzers/tools/gitleaks.d.ts +24 -1
- package/dist/analyzers/tools/gitleaks.d.ts.map +1 -1
- package/dist/analyzers/tools/gitleaks.js +21 -12
- package/dist/analyzers/tools/gitleaks.js.map +1 -1
- package/dist/analyzers/tools/graphify.js +1 -1
- package/dist/analyzers/tools/jscpd.js +1 -1
- package/dist/analyzers/tools/jscpd.js.map +1 -1
- package/dist/analyzers/tools/lint-label.d.ts +29 -0
- package/dist/analyzers/tools/lint-label.d.ts.map +1 -0
- package/dist/analyzers/tools/lint-label.js +23 -0
- package/dist/analyzers/tools/lint-label.js.map +1 -0
- package/dist/analyzers/tools/nuget-package-reference.d.ts +6 -4
- package/dist/analyzers/tools/nuget-package-reference.d.ts.map +1 -1
- package/dist/analyzers/tools/nuget-package-reference.js +7 -5
- package/dist/analyzers/tools/nuget-package-reference.js.map +1 -1
- package/dist/analyzers/tools/report-date.d.ts +17 -0
- package/dist/analyzers/tools/report-date.d.ts.map +1 -0
- package/dist/analyzers/tools/report-date.js +26 -0
- package/dist/analyzers/tools/report-date.js.map +1 -0
- package/dist/analyzers/tools/runner.js +3 -3
- package/dist/analyzers/tools/runner.js.map +1 -1
- package/dist/analyzers/tools/vendored-advisor.js +1 -1
- package/dist/analyzers/tools/walk-paths.d.ts +1 -1
- package/dist/analyzers/tools/walk-paths.js +1 -1
- package/dist/analyzers/tools/walk-source-files.js +1 -1
- package/dist/analyzers/types.d.ts +6 -4
- package/dist/analyzers/types.d.ts.map +1 -1
- package/dist/baseline/baseline-file.d.ts +104 -0
- package/dist/baseline/baseline-file.d.ts.map +1 -0
- package/dist/baseline/baseline-file.js +110 -0
- package/dist/baseline/baseline-file.js.map +1 -0
- package/dist/baseline/check-renderers.d.ts +108 -0
- package/dist/baseline/check-renderers.d.ts.map +1 -0
- package/dist/baseline/check-renderers.js +379 -0
- package/dist/baseline/check-renderers.js.map +1 -0
- package/dist/baseline/check.d.ts +127 -0
- package/dist/baseline/check.d.ts.map +1 -0
- package/dist/baseline/check.js +462 -0
- package/dist/baseline/check.js.map +1 -0
- package/dist/baseline/content-hash.d.ts +83 -0
- package/dist/baseline/content-hash.d.ts.map +1 -0
- package/dist/baseline/content-hash.js +131 -0
- package/dist/baseline/content-hash.js.map +1 -0
- package/dist/baseline/create.d.ts +96 -0
- package/dist/baseline/create.d.ts.map +1 -0
- package/dist/baseline/create.js +339 -0
- package/dist/baseline/create.js.map +1 -0
- package/dist/baseline/entry-to-located.d.ts +35 -0
- package/dist/baseline/entry-to-located.d.ts.map +1 -0
- package/dist/baseline/entry-to-located.js +72 -0
- package/dist/baseline/entry-to-located.js.map +1 -0
- package/dist/baseline/finding-identity.d.ts +47 -0
- package/dist/baseline/finding-identity.d.ts.map +1 -0
- package/dist/baseline/finding-identity.js +292 -0
- package/dist/baseline/finding-identity.js.map +1 -0
- package/dist/baseline/git-aware-match.d.ts +146 -0
- package/dist/baseline/git-aware-match.d.ts.map +1 -0
- package/dist/baseline/git-aware-match.js +439 -0
- package/dist/baseline/git-aware-match.js.map +1 -0
- package/dist/baseline/policy.d.ts +171 -0
- package/dist/baseline/policy.d.ts.map +1 -0
- package/dist/baseline/policy.js +206 -0
- package/dist/baseline/policy.js.map +1 -0
- package/dist/baseline/producers/health.d.ts +30 -0
- package/dist/baseline/producers/health.d.ts.map +1 -0
- package/dist/baseline/producers/health.js +42 -0
- package/dist/baseline/producers/health.js.map +1 -0
- package/dist/baseline/producers/index.d.ts +164 -0
- package/dist/baseline/producers/index.d.ts.map +1 -0
- package/dist/baseline/producers/index.js +200 -0
- package/dist/baseline/producers/index.js.map +1 -0
- package/dist/baseline/producers/licenses.d.ts +23 -0
- package/dist/baseline/producers/licenses.d.ts.map +1 -0
- package/dist/baseline/producers/licenses.js +46 -0
- package/dist/baseline/producers/licenses.js.map +1 -0
- package/dist/baseline/producers/quality.d.ts +39 -0
- package/dist/baseline/producers/quality.d.ts.map +1 -0
- package/dist/baseline/producers/quality.js +84 -0
- package/dist/baseline/producers/quality.js.map +1 -0
- package/dist/baseline/producers/secret-hmac.d.ts +45 -0
- package/dist/baseline/producers/secret-hmac.d.ts.map +1 -0
- package/dist/baseline/producers/secret-hmac.js +70 -0
- package/dist/baseline/producers/secret-hmac.js.map +1 -0
- package/dist/baseline/producers/security.d.ts +59 -0
- package/dist/baseline/producers/security.d.ts.map +1 -0
- package/dist/baseline/producers/security.js +135 -0
- package/dist/baseline/producers/security.js.map +1 -0
- package/dist/baseline/producers/tests.d.ts +36 -0
- package/dist/baseline/producers/tests.d.ts.map +1 -0
- package/dist/baseline/producers/tests.js +69 -0
- package/dist/baseline/producers/tests.js.map +1 -0
- package/dist/baseline/salt.d.ts +45 -0
- package/dist/baseline/salt.d.ts.map +1 -0
- package/dist/baseline/salt.js +113 -0
- package/dist/baseline/salt.js.map +1 -0
- package/dist/baseline/show.d.ts +79 -0
- package/dist/baseline/show.d.ts.map +1 -0
- package/dist/baseline/show.js +233 -0
- package/dist/baseline/show.js.map +1 -0
- package/dist/baseline/types.d.ts +482 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +53 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +395 -92
- package/dist/cli.js.map +1 -1
- package/dist/codebase-scanner.d.ts.map +1 -1
- package/dist/codebase-scanner.js +0 -1
- package/dist/codebase-scanner.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +0 -4
- package/dist/constants.js.map +1 -1
- package/dist/detect.js +3 -3
- package/dist/detect.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +22 -25
- package/dist/doctor.js.map +1 -1
- package/dist/fail-on.d.ts +84 -0
- package/dist/fail-on.d.ts.map +1 -0
- package/dist/fail-on.js +128 -0
- package/dist/fail-on.js.map +1 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +2 -141
- package/dist/generator.js.map +1 -1
- package/dist/languages/capabilities/provider.d.ts +4 -4
- package/dist/languages/capabilities/types.d.ts +1 -1
- package/dist/languages/csharp.d.ts.map +1 -1
- package/dist/languages/csharp.js +15 -24
- package/dist/languages/csharp.js.map +1 -1
- package/dist/languages/go.d.ts.map +1 -1
- package/dist/languages/go.js +0 -15
- package/dist/languages/go.js.map +1 -1
- package/dist/languages/index.d.ts +4 -3
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +3 -2
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/java.d.ts.map +1 -1
- package/dist/languages/java.js +0 -6
- package/dist/languages/java.js.map +1 -1
- package/dist/languages/kotlin.d.ts.map +1 -1
- package/dist/languages/kotlin.js +0 -11
- package/dist/languages/kotlin.js.map +1 -1
- package/dist/languages/python.d.ts.map +1 -1
- package/dist/languages/python.js +0 -15
- package/dist/languages/python.js.map +1 -1
- package/dist/languages/ruby.d.ts.map +1 -1
- package/dist/languages/ruby.js +0 -6
- package/dist/languages/ruby.js.map +1 -1
- package/dist/languages/rust.d.ts.map +1 -1
- package/dist/languages/rust.js +0 -4
- package/dist/languages/rust.js.map +1 -1
- package/dist/languages/types.d.ts +9 -35
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +26 -4
- package/dist/languages/typescript.js.map +1 -1
- package/dist/lib.d.ts +2 -3
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +3 -6
- package/dist/lib.js.map +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +0 -10
- package/dist/prompts.js.map +1 -1
- package/dist/report-schema.d.ts +42 -0
- package/dist/report-schema.d.ts.map +1 -0
- package/dist/report-schema.js +54 -0
- package/dist/report-schema.js.map +1 -0
- package/dist/ship-installers.d.ts +106 -0
- package/dist/ship-installers.d.ts.map +1 -0
- package/dist/ship-installers.js +415 -0
- package/dist/ship-installers.js.map +1 -0
- package/dist/types.d.ts +0 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js +0 -4
- package/dist/update.js.map +1 -1
- package/package.json +17 -11
- package/templates/.claude/agents/onboarding.md +5 -4
- package/templates/.claude/agents-available/codebase-explorer.md +1 -1
- package/templates/.claude/agents-available/debugger.md +2 -2
- package/templates/.claude/agents-available/health-auditor.md +2 -2
- package/templates/.claude/commands/doctor.md +20 -12
- package/templates/.claude/skills/build/SKILL.md.template +22 -30
- package/templates/.claude/skills/deploy/SKILL.md.template +5 -25
- package/templates/.claude/skills/doctor/SKILL.md +24 -47
- package/templates/.claude/skills/gcloud/SKILL.md +5 -5
- package/templates/.claude/skills/learned/SKILL.md +1 -1
- package/templates/.claude/skills/pulumi/SKILL.md +2 -2
- package/templates/.claude/skills/quality/SKILL.md.template +4 -23
- package/templates/.claude/skills/review/SKILL.md.template +4 -3
- package/templates/.claude/skills/scaffold/SKILL.md.template +5 -15
- package/templates/.claude/skills/secrets/SKILL.md +20 -21
- package/templates/.claude/skills/session/SKILL.md +20 -31
- package/templates/.claude/skills/test/SKILL.md.template +1 -7
- package/templates/.devcontainer/devcontainer.json +81 -0
- package/templates/.devcontainer/install-agent-clis.sh +42 -0
- package/templates/.devcontainer/post-create.sh +67 -0
- package/templates/.githooks/pre-commit +55 -0
- package/templates/.githooks/pre-push +63 -0
- package/templates/.github/workflows/dxkit-baseline-refresh.yml +78 -0
- package/templates/.github/workflows/dxkit-guardrails.yml +98 -0
- package/templates/CLAUDE.md.template +62 -196
- package/dist/project-yaml.d.ts +0 -13
- package/dist/project-yaml.d.ts.map +0 -1
- package/dist/project-yaml.js +0 -188
- package/dist/project-yaml.js.map +0 -1
- package/templates/.ai/README.md +0 -117
- package/templates/.ai/prompts/execution-prompt.md +0 -9
- package/templates/.ai/prompts/planning-prompt.md +0 -18
- package/templates/.ai/prompts/session-end-template.md +0 -182
- package/templates/.ai/prompts/session-end.md +0 -132
- package/templates/.ai/prompts/session-start.md +0 -109
- package/templates/.ai/prompts/step-by-step.md +0 -113
- package/templates/.ai/sessions/.gitkeep +0 -0
- package/templates/.claude/commands/setup-pr-review.md +0 -72
- package/templates/.devcontainer/Dockerfile.dev.template +0 -89
- package/templates/.devcontainer/devcontainer.json.template +0 -184
- package/templates/.devcontainer/docker-compose.yml.template +0 -105
- package/templates/.devcontainer/init-scripts/01-init.sql.template +0 -12
- package/templates/.devcontainer/post-create.sh.template +0 -298
- package/templates/.github/workflows/ci.yml.template +0 -399
- package/templates/.github/workflows/quality.yml.template +0 -376
- package/templates/.pre-commit-config.yaml.template +0 -106
- package/templates/.project/config/edit_config.py +0 -275
- package/templates/.project/config/project_config.py +0 -894
- package/templates/.project/scripts/codegen/generate-all.sh +0 -20
- package/templates/.project/scripts/codegen/validate-all.sh +0 -17
- package/templates/.project/scripts/docs/generate-all.sh +0 -30
- package/templates/.project/scripts/docs/serve.sh +0 -20
- package/templates/.project/scripts/quality/fix-all.sh +0 -138
- package/templates/.project/scripts/quality/lint-go.sh +0 -34
- package/templates/.project/scripts/quality/lint-python.sh +0 -54
- package/templates/.project/scripts/quality/run-all.sh +0 -497
- package/templates/.project/scripts/session/commit.sh +0 -70
- package/templates/.project/scripts/session/create-pr.sh +0 -165
- package/templates/.project/scripts/session/end.sh +0 -207
- package/templates/.project/scripts/session/start.sh +0 -233
- package/templates/.project/scripts/setup/doctor.sh +0 -404
- package/templates/.project/scripts/setup/interactive-setup.sh +0 -585
- package/templates/.project/scripts/sync/sync-template.sh +0 -328
- package/templates/.project/scripts/test/run-all.sh +0 -179
- package/templates/.project/scripts/test/run-quick.sh +0 -25
- package/templates/Makefile +0 -514
- package/templates/config/versions.yaml +0 -57
- package/templates/configs/go/.golangci.yml.template +0 -172
- package/templates/configs/go/go.mod.template +0 -15
- package/templates/configs/java/README.md +0 -6
- package/templates/configs/kotlin/README.md +0 -6
- package/templates/configs/node/package.json.template +0 -67
- package/templates/configs/node/tsconfig.json.template +0 -53
- package/templates/configs/python/pyproject.toml.template +0 -92
- package/templates/configs/python/pytest.ini.template +0 -64
- package/templates/configs/python/ruff.toml.template +0 -79
- package/templates/configs/ruby/README.md +0 -6
- package/templates/configs/rust/Cargo.toml.template +0 -51
- package/templates/configs/shared/.editorconfig +0 -67
- package/templates/scripts/validate-templates.sh +0 -449
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* On-disk baseline file — `.dxkit/baselines/<name>.json`.
|
|
4
|
+
*
|
|
5
|
+
* The baseline file is the durable contract between today's scan
|
|
6
|
+
* and tomorrow's guardrail check. It carries:
|
|
7
|
+
*
|
|
8
|
+
* - Per-finding identities (`BaselineEntry[]`) for cross-run
|
|
9
|
+
* matching.
|
|
10
|
+
* - Repo state at capture time (commit SHA, branch) so the
|
|
11
|
+
* git-aware matcher knows what to diff against.
|
|
12
|
+
* - Analysis-environment metadata (dxkit version, tool versions,
|
|
13
|
+
* policy hash, config hashes) so the policy classifier can
|
|
14
|
+
* reclassify newly-detected findings as `tooling_drift` or
|
|
15
|
+
* `config_drift` rather than blocking them as regressions.
|
|
16
|
+
* - The salt-resolution mode used to derive any secret-HMAC
|
|
17
|
+
* entries, so the matcher knows whether HMAC comparison is
|
|
18
|
+
* available on the current run.
|
|
19
|
+
*
|
|
20
|
+
* Raw finding payloads (titles, secret values, source excerpts) are
|
|
21
|
+
* NEVER stored. The file is committable to git: a leak surfaces
|
|
22
|
+
* identity fingerprints + locations, but no exploitable content.
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.DEFAULT_BASELINE_DIR = exports.DEFAULT_BASELINE_NAME = exports.BASELINE_SCHEMA_VERSION = void 0;
|
|
59
|
+
exports.pathForBaseline = pathForBaseline;
|
|
60
|
+
exports.writeBaselineFile = writeBaselineFile;
|
|
61
|
+
exports.readBaselineFile = readBaselineFile;
|
|
62
|
+
const fs = __importStar(require("fs"));
|
|
63
|
+
const path = __importStar(require("path"));
|
|
64
|
+
/** Banner stamped on every baseline file. Bump when the on-disk
|
|
65
|
+
* shape changes incompatibly so readers can refuse old / new files
|
|
66
|
+
* rather than silently mis-parse them. */
|
|
67
|
+
exports.BASELINE_SCHEMA_VERSION = 'dxkit-baseline/v1';
|
|
68
|
+
/** Default baseline name when the user doesn't pass `--name`. */
|
|
69
|
+
exports.DEFAULT_BASELINE_NAME = 'main';
|
|
70
|
+
/** Default storage directory. Lives under `.dxkit/` alongside the
|
|
71
|
+
* generated reports + the salt file. */
|
|
72
|
+
exports.DEFAULT_BASELINE_DIR = path.join('.dxkit', 'baselines');
|
|
73
|
+
/** Absolute path for a named baseline inside `cwd`. */
|
|
74
|
+
function pathForBaseline(cwd, name) {
|
|
75
|
+
return path.join(cwd, exports.DEFAULT_BASELINE_DIR, `${name}.json`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Write a baseline file. Creates the parent directory when missing.
|
|
79
|
+
* Pretty-printed JSON for git-friendly diffs.
|
|
80
|
+
*/
|
|
81
|
+
function writeBaselineFile(filePath, file) {
|
|
82
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
83
|
+
fs.writeFileSync(filePath, JSON.stringify(file, null, 2) + '\n', 'utf8');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Read + validate a baseline file. Throws when the schema banner is
|
|
87
|
+
* missing or unrecognized — fail fast rather than letting the
|
|
88
|
+
* matcher consume a malformed file and produce wrong verdicts.
|
|
89
|
+
*/
|
|
90
|
+
function readBaselineFile(filePath) {
|
|
91
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
92
|
+
let parsed;
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(raw);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
throw new Error(`baseline file is not valid JSON: ${filePath} (${err.message})`);
|
|
98
|
+
}
|
|
99
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
100
|
+
throw new Error(`baseline file root is not an object: ${filePath}`);
|
|
101
|
+
}
|
|
102
|
+
const obj = parsed;
|
|
103
|
+
if (obj.schemaVersion !== exports.BASELINE_SCHEMA_VERSION) {
|
|
104
|
+
throw new Error(`baseline file schemaVersion is ${JSON.stringify(obj.schemaVersion)}; ` +
|
|
105
|
+
`this dxkit understands ${JSON.stringify(exports.BASELINE_SCHEMA_VERSION)} only ` +
|
|
106
|
+
`(${filePath})`);
|
|
107
|
+
}
|
|
108
|
+
return parsed;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=baseline-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseline-file.js","sourceRoot":"","sources":["../../src/baseline/baseline-file.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFH,0CAEC;AAMD,8CAGC;AAOD,4CAoBC;AApHD,uCAAyB;AACzB,2CAA6B;AAI7B;;2CAE2C;AAC9B,QAAA,uBAAuB,GAAG,mBAA4B,CAAC;AAGpE,iEAAiE;AACpD,QAAA,qBAAqB,GAAG,MAAe,CAAC;AA6DrD;yCACyC;AAC5B,QAAA,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAErE,uDAAuD;AACvD,SAAgB,eAAe,CAAC,GAAW,EAAE,IAAY;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,4BAAoB,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,QAAgB,EAAE,IAAkB;IACpE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,KAAM,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,GAAG,GAAG,MAAqC,CAAC;IAClD,IAAI,GAAG,CAAC,aAAa,KAAK,+BAAuB,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,kCAAkC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI;YACrE,0BAA0B,IAAI,CAAC,SAAS,CAAC,+BAAuB,CAAC,QAAQ;YACzE,IAAI,QAAQ,GAAG,CAClB,CAAC;IACJ,CAAC;IACD,OAAO,MAAsB,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output renderers for `vyuh-dxkit guardrail check`.
|
|
3
|
+
*
|
|
4
|
+
* Three target surfaces, one shared `GuardrailCheckResult`:
|
|
5
|
+
*
|
|
6
|
+
* - **Console** (`renderConsole`) — human-readable text for
|
|
7
|
+
* terminal output. Grouped by verdict (blocking / warning /
|
|
8
|
+
* informational), each pair showing status + kind + locator +
|
|
9
|
+
* severity + reason chain. Color codes via the shared logger
|
|
10
|
+
* palette so output blends with the rest of dxkit's CLI.
|
|
11
|
+
*
|
|
12
|
+
* - **JSON** (`renderJson`) — schema-stable machine-readable
|
|
13
|
+
* payload (top-level `schema: 'dxkit.guardrail-check.v1'`).
|
|
14
|
+
* Designed for AI agents and CI runners that need to programmatically
|
|
15
|
+
* decide what to do. Includes the matcher's per-pair detail,
|
|
16
|
+
* classifier verdicts, envelope drift, and the resolved policy.
|
|
17
|
+
*
|
|
18
|
+
* - **Markdown** (`renderMarkdown`) — Phase 4 PR-comment template.
|
|
19
|
+
* Compact, table-heavy, status-banner-first. Renders into the
|
|
20
|
+
* `dxkit-guardrails.yml` workflow's PR comment unchanged. No
|
|
21
|
+
* emojis (bot-friendly; Phase 4 templates can layer presentation
|
|
22
|
+
* on top).
|
|
23
|
+
*
|
|
24
|
+
* Pure modules. No I/O — callers handle stdout writing, file
|
|
25
|
+
* writing, or PR-comment posting.
|
|
26
|
+
*/
|
|
27
|
+
import type { EnvelopeDrift, GuardrailCheckResult } from './check';
|
|
28
|
+
import type { BrownfieldPolicy } from './policy';
|
|
29
|
+
import type { FindingStatus, MatchReason } from './types';
|
|
30
|
+
/**
|
|
31
|
+
* Render the check result as a human-readable text block. Returns a
|
|
32
|
+
* single multi-line string; callers route it to stdout.
|
|
33
|
+
*/
|
|
34
|
+
export declare function renderConsole(result: GuardrailCheckResult): string;
|
|
35
|
+
export declare const GUARDRAIL_JSON_SCHEMA: "dxkit.guardrail-check.v1";
|
|
36
|
+
/**
|
|
37
|
+
* Schema-stable machine-readable payload. `schema` at the top level
|
|
38
|
+
* lets downstream tooling version-gate before reading further fields;
|
|
39
|
+
* bump it when the shape changes incompatibly.
|
|
40
|
+
*/
|
|
41
|
+
export interface GuardrailJsonPayload {
|
|
42
|
+
readonly schema: typeof GUARDRAIL_JSON_SCHEMA;
|
|
43
|
+
readonly verdict: {
|
|
44
|
+
readonly blocks: boolean;
|
|
45
|
+
readonly warns: boolean;
|
|
46
|
+
readonly exitCode: 0 | 1;
|
|
47
|
+
};
|
|
48
|
+
readonly baseline: {
|
|
49
|
+
readonly path: string;
|
|
50
|
+
readonly name: string;
|
|
51
|
+
readonly createdAt: string;
|
|
52
|
+
readonly commitSha: string;
|
|
53
|
+
readonly branch: string;
|
|
54
|
+
readonly findingsCount: number;
|
|
55
|
+
};
|
|
56
|
+
readonly current: {
|
|
57
|
+
readonly commitSha: string;
|
|
58
|
+
readonly branch: string;
|
|
59
|
+
readonly findingsCount: number;
|
|
60
|
+
};
|
|
61
|
+
readonly matcher: {
|
|
62
|
+
readonly gitAware: boolean;
|
|
63
|
+
readonly degradedReason?: string;
|
|
64
|
+
};
|
|
65
|
+
readonly envelopeDrift: EnvelopeDrift;
|
|
66
|
+
readonly policy: {
|
|
67
|
+
readonly mode: BrownfieldPolicy['mode'];
|
|
68
|
+
readonly block: ReadonlyArray<FindingStatus>;
|
|
69
|
+
readonly warn: ReadonlyArray<FindingStatus>;
|
|
70
|
+
readonly confidence: BrownfieldPolicy['confidence'];
|
|
71
|
+
readonly blockRules: BrownfieldPolicy['blockRules'];
|
|
72
|
+
};
|
|
73
|
+
readonly summary: {
|
|
74
|
+
readonly pairs: number;
|
|
75
|
+
readonly blocking: number;
|
|
76
|
+
readonly warning: number;
|
|
77
|
+
readonly persisted: number;
|
|
78
|
+
readonly resolved: number;
|
|
79
|
+
};
|
|
80
|
+
readonly pairs: ReadonlyArray<{
|
|
81
|
+
readonly status: FindingStatus;
|
|
82
|
+
readonly blocks: boolean;
|
|
83
|
+
readonly warns: boolean;
|
|
84
|
+
readonly priorId?: string;
|
|
85
|
+
readonly currentId?: string;
|
|
86
|
+
readonly confidence: number;
|
|
87
|
+
readonly kind: string;
|
|
88
|
+
readonly severity?: string;
|
|
89
|
+
readonly file?: string;
|
|
90
|
+
readonly line?: number;
|
|
91
|
+
readonly overlapsChangedLines?: boolean;
|
|
92
|
+
readonly reasons: ReadonlyArray<MatchReason>;
|
|
93
|
+
}>;
|
|
94
|
+
}
|
|
95
|
+
export declare function renderJson(result: GuardrailCheckResult): GuardrailJsonPayload;
|
|
96
|
+
/**
|
|
97
|
+
* PR-comment-friendly markdown. Phase 4's GitHub Actions workflow
|
|
98
|
+
* pastes the output verbatim into a PR comment. Format:
|
|
99
|
+
*
|
|
100
|
+
* ## Guardrail: PASSED / BLOCKED
|
|
101
|
+
* one-line summary
|
|
102
|
+
* <blocking findings table, when any>
|
|
103
|
+
* <warnings collapsible section, when any>
|
|
104
|
+
* <drift signal callout, when envelope drifted>
|
|
105
|
+
* <provenance footnote>
|
|
106
|
+
*/
|
|
107
|
+
export declare function renderMarkdown(result: GuardrailCheckResult): string;
|
|
108
|
+
//# sourceMappingURL=check-renderers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-renderers.d.ts","sourceRoot":"","sources":["../../src/baseline/check-renderers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Output renderers for `vyuh-dxkit guardrail check`.
|
|
4
|
+
*
|
|
5
|
+
* Three target surfaces, one shared `GuardrailCheckResult`:
|
|
6
|
+
*
|
|
7
|
+
* - **Console** (`renderConsole`) — human-readable text for
|
|
8
|
+
* terminal output. Grouped by verdict (blocking / warning /
|
|
9
|
+
* informational), each pair showing status + kind + locator +
|
|
10
|
+
* severity + reason chain. Color codes via the shared logger
|
|
11
|
+
* palette so output blends with the rest of dxkit's CLI.
|
|
12
|
+
*
|
|
13
|
+
* - **JSON** (`renderJson`) — schema-stable machine-readable
|
|
14
|
+
* payload (top-level `schema: 'dxkit.guardrail-check.v1'`).
|
|
15
|
+
* Designed for AI agents and CI runners that need to programmatically
|
|
16
|
+
* decide what to do. Includes the matcher's per-pair detail,
|
|
17
|
+
* classifier verdicts, envelope drift, and the resolved policy.
|
|
18
|
+
*
|
|
19
|
+
* - **Markdown** (`renderMarkdown`) — Phase 4 PR-comment template.
|
|
20
|
+
* Compact, table-heavy, status-banner-first. Renders into the
|
|
21
|
+
* `dxkit-guardrails.yml` workflow's PR comment unchanged. No
|
|
22
|
+
* emojis (bot-friendly; Phase 4 templates can layer presentation
|
|
23
|
+
* on top).
|
|
24
|
+
*
|
|
25
|
+
* Pure modules. No I/O — callers handle stdout writing, file
|
|
26
|
+
* writing, or PR-comment posting.
|
|
27
|
+
*/
|
|
28
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
31
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
32
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
33
|
+
}
|
|
34
|
+
Object.defineProperty(o, k2, desc);
|
|
35
|
+
}) : (function(o, m, k, k2) {
|
|
36
|
+
if (k2 === undefined) k2 = k;
|
|
37
|
+
o[k2] = m[k];
|
|
38
|
+
}));
|
|
39
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
40
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
41
|
+
}) : function(o, v) {
|
|
42
|
+
o["default"] = v;
|
|
43
|
+
});
|
|
44
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
45
|
+
var ownKeys = function(o) {
|
|
46
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
47
|
+
var ar = [];
|
|
48
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
49
|
+
return ar;
|
|
50
|
+
};
|
|
51
|
+
return ownKeys(o);
|
|
52
|
+
};
|
|
53
|
+
return function (mod) {
|
|
54
|
+
if (mod && mod.__esModule) return mod;
|
|
55
|
+
var result = {};
|
|
56
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
57
|
+
__setModuleDefault(result, mod);
|
|
58
|
+
return result;
|
|
59
|
+
};
|
|
60
|
+
})();
|
|
61
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
62
|
+
exports.GUARDRAIL_JSON_SCHEMA = void 0;
|
|
63
|
+
exports.renderConsole = renderConsole;
|
|
64
|
+
exports.renderJson = renderJson;
|
|
65
|
+
exports.renderMarkdown = renderMarkdown;
|
|
66
|
+
const logger = __importStar(require("../logger"));
|
|
67
|
+
// ─── Console renderer ─────────────────────────────────────────────────────
|
|
68
|
+
/**
|
|
69
|
+
* Render the check result as a human-readable text block. Returns a
|
|
70
|
+
* single multi-line string; callers route it to stdout.
|
|
71
|
+
*/
|
|
72
|
+
function renderConsole(result) {
|
|
73
|
+
const lines = [];
|
|
74
|
+
// Verdict banner. Single line at the top so a developer skimming
|
|
75
|
+
// terminal output sees pass/fail without scrolling.
|
|
76
|
+
lines.push(verdictBanner(result));
|
|
77
|
+
lines.push('');
|
|
78
|
+
// Provenance: what was compared against what. Inline so the user
|
|
79
|
+
// can verify they're checking against the intended baseline.
|
|
80
|
+
lines.push(logger.bold('Baseline'));
|
|
81
|
+
lines.push(` Path: ${result.baselinePath}`);
|
|
82
|
+
lines.push(` Name: ${result.baseline.name}`);
|
|
83
|
+
lines.push(` Captured: ${result.baseline.createdAt}`);
|
|
84
|
+
lines.push(` Commit: ${shortSha(result.baseline.repo.commitSha)} (${result.baseline.repo.branch || 'detached'})`);
|
|
85
|
+
lines.push(` Findings: ${result.baseline.findings.length}`);
|
|
86
|
+
lines.push('');
|
|
87
|
+
lines.push(logger.bold('Current'));
|
|
88
|
+
lines.push(` Commit: ${shortSha(result.current.repoState.commitSha)}`);
|
|
89
|
+
lines.push(` Findings: ${result.current.findings.length}`);
|
|
90
|
+
lines.push(` Matcher: ${result.matchResult.gitAware ? 'git-aware' : `degraded (${result.matchResult.degradedReason ?? 'unknown reason'})`}`);
|
|
91
|
+
lines.push('');
|
|
92
|
+
const driftLines = formatDrift(result.envelopeDrift);
|
|
93
|
+
if (driftLines.length > 0) {
|
|
94
|
+
lines.push(logger.bold('Envelope drift'));
|
|
95
|
+
for (const l of driftLines)
|
|
96
|
+
lines.push(` ${l}`);
|
|
97
|
+
lines.push('');
|
|
98
|
+
}
|
|
99
|
+
// Group + render pairs by verdict bucket. Buckets ordered so the
|
|
100
|
+
// most actionable surfaces first.
|
|
101
|
+
const blocking = result.pairs.filter((p) => p.classification.blocks);
|
|
102
|
+
const warning = result.pairs.filter((p) => !p.classification.blocks && p.classification.warns);
|
|
103
|
+
const persisted = result.pairs.filter((p) => !p.classification.blocks &&
|
|
104
|
+
!p.classification.warns &&
|
|
105
|
+
(p.classification.status === 'persisted' || p.classification.status === 'relocated'));
|
|
106
|
+
const removed = result.pairs.filter((p) => p.classification.status === 'removed');
|
|
107
|
+
if (blocking.length > 0) {
|
|
108
|
+
lines.push(logger.bold(`Blocking (${blocking.length})`));
|
|
109
|
+
for (const p of blocking)
|
|
110
|
+
lines.push(...formatPairLines(p, ' '));
|
|
111
|
+
lines.push('');
|
|
112
|
+
}
|
|
113
|
+
if (warning.length > 0) {
|
|
114
|
+
lines.push(logger.bold(`Warnings (${warning.length})`));
|
|
115
|
+
for (const p of warning)
|
|
116
|
+
lines.push(...formatPairLines(p, ' '));
|
|
117
|
+
lines.push('');
|
|
118
|
+
}
|
|
119
|
+
if (removed.length > 0) {
|
|
120
|
+
lines.push(logger.bold(`Resolved (${removed.length})`));
|
|
121
|
+
for (const p of removed)
|
|
122
|
+
lines.push(...formatPairLines(p, ' '));
|
|
123
|
+
lines.push('');
|
|
124
|
+
}
|
|
125
|
+
// Always show a summary footer — sets expectations for what
|
|
126
|
+
// happens next (exit code, what to read on a fail).
|
|
127
|
+
lines.push(logger.bold('Summary'));
|
|
128
|
+
lines.push(` Pairs: ${result.pairs.length} (blocking: ${blocking.length}, ` +
|
|
129
|
+
`warning: ${warning.length}, persisted: ${persisted.length}, ` +
|
|
130
|
+
`resolved: ${removed.length})`);
|
|
131
|
+
lines.push(` Verdict: ${result.blocks ? 'BLOCKED' : result.warns ? 'PASSED (with warnings)' : 'PASSED'}`);
|
|
132
|
+
lines.push(` Exit code: ${result.blocks ? 1 : 0}`);
|
|
133
|
+
if (result.blocks) {
|
|
134
|
+
lines.push('');
|
|
135
|
+
lines.push(` Re-run with --json for a machine-readable payload, or --markdown to capture a PR-comment-friendly report.`);
|
|
136
|
+
}
|
|
137
|
+
return lines.join('\n');
|
|
138
|
+
}
|
|
139
|
+
function verdictBanner(result) {
|
|
140
|
+
if (result.blocks) {
|
|
141
|
+
const count = result.pairs.filter((p) => p.classification.blocks).length;
|
|
142
|
+
return logger.bold(`Guardrail BLOCKED — ${count} new regression${count === 1 ? '' : 's'}`);
|
|
143
|
+
}
|
|
144
|
+
if (result.warns) {
|
|
145
|
+
const count = result.pairs.filter((p) => p.classification.warns).length;
|
|
146
|
+
return logger.bold(`Guardrail PASSED — ${count} warning${count === 1 ? '' : 's'}`);
|
|
147
|
+
}
|
|
148
|
+
return logger.bold('Guardrail PASSED');
|
|
149
|
+
}
|
|
150
|
+
function formatPairLines(p, indent) {
|
|
151
|
+
const out = [];
|
|
152
|
+
const loc = locatorProse(p);
|
|
153
|
+
const sev = p.severity ? `[${p.severity}]` : '';
|
|
154
|
+
const conf = p.pair.confidence < 1 ? ` (${p.pair.confidence.toFixed(2)})` : '';
|
|
155
|
+
out.push(`${indent}${statusLabel(p.classification.status)} ${sev} ${p.kind} ${loc}${conf}`
|
|
156
|
+
.replace(/\s+/g, ' ')
|
|
157
|
+
.trim());
|
|
158
|
+
for (const r of p.classification.reasons) {
|
|
159
|
+
out.push(`${indent} · ${r.code}: ${r.detail}`);
|
|
160
|
+
}
|
|
161
|
+
return out;
|
|
162
|
+
}
|
|
163
|
+
function statusLabel(status) {
|
|
164
|
+
switch (status) {
|
|
165
|
+
case 'added':
|
|
166
|
+
return 'ADDED';
|
|
167
|
+
case 'removed':
|
|
168
|
+
return 'RESOLVED';
|
|
169
|
+
case 'persisted':
|
|
170
|
+
return 'PERSISTED';
|
|
171
|
+
case 'relocated':
|
|
172
|
+
return 'RELOCATED';
|
|
173
|
+
case 'tooling_drift':
|
|
174
|
+
return 'TOOLING-DRIFT';
|
|
175
|
+
case 'config_drift':
|
|
176
|
+
return 'CONFIG-DRIFT';
|
|
177
|
+
case 'newly_detected':
|
|
178
|
+
return 'NEWLY-DETECTED';
|
|
179
|
+
case 'probable_existing':
|
|
180
|
+
return 'PROBABLE-EXISTING';
|
|
181
|
+
case 'uncertain':
|
|
182
|
+
return 'UNCERTAIN';
|
|
183
|
+
case 'fixed':
|
|
184
|
+
return 'FIXED';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function locatorProse(p) {
|
|
188
|
+
if (p.file === undefined)
|
|
189
|
+
return '';
|
|
190
|
+
return p.line !== undefined && p.line > 0 ? `${p.file}:${p.line}` : p.file;
|
|
191
|
+
}
|
|
192
|
+
function shortSha(sha) {
|
|
193
|
+
if (!sha)
|
|
194
|
+
return '(no-commit)';
|
|
195
|
+
return sha.slice(0, 8);
|
|
196
|
+
}
|
|
197
|
+
function formatDrift(drift) {
|
|
198
|
+
const out = [];
|
|
199
|
+
if (drift.dxkitVersionChanged)
|
|
200
|
+
out.push('dxkit version changed since baseline capture');
|
|
201
|
+
if (drift.toolchainHashChanged)
|
|
202
|
+
out.push('toolchainHash changed');
|
|
203
|
+
if (drift.policyHashChanged)
|
|
204
|
+
out.push('policy hash changed');
|
|
205
|
+
if (drift.ignoreHashChanged)
|
|
206
|
+
out.push('.dxkit-ignore changed');
|
|
207
|
+
if (drift.configHashChanged)
|
|
208
|
+
out.push('.vyuh-dxkit.json changed');
|
|
209
|
+
for (const d of drift.toolVersionDiffs) {
|
|
210
|
+
out.push(`tool drift: ${d.tool} ${d.baselineVersion ?? '(absent)'} → ${d.currentVersion ?? '(absent)'}`);
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
// ─── JSON renderer ────────────────────────────────────────────────────────
|
|
215
|
+
exports.GUARDRAIL_JSON_SCHEMA = 'dxkit.guardrail-check.v1';
|
|
216
|
+
function renderJson(result) {
|
|
217
|
+
const blocking = result.pairs.filter((p) => p.classification.blocks).length;
|
|
218
|
+
const warning = result.pairs.filter((p) => !p.classification.blocks && p.classification.warns).length;
|
|
219
|
+
const persisted = result.pairs.filter((p) => !p.classification.blocks &&
|
|
220
|
+
!p.classification.warns &&
|
|
221
|
+
(p.classification.status === 'persisted' || p.classification.status === 'relocated')).length;
|
|
222
|
+
const resolved = result.pairs.filter((p) => p.classification.status === 'removed').length;
|
|
223
|
+
return {
|
|
224
|
+
schema: exports.GUARDRAIL_JSON_SCHEMA,
|
|
225
|
+
verdict: { blocks: result.blocks, warns: result.warns, exitCode: result.blocks ? 1 : 0 },
|
|
226
|
+
baseline: {
|
|
227
|
+
path: result.baselinePath,
|
|
228
|
+
name: result.baseline.name,
|
|
229
|
+
createdAt: result.baseline.createdAt,
|
|
230
|
+
commitSha: result.baseline.repo.commitSha,
|
|
231
|
+
branch: result.baseline.repo.branch,
|
|
232
|
+
findingsCount: result.baseline.findings.length,
|
|
233
|
+
},
|
|
234
|
+
current: {
|
|
235
|
+
commitSha: result.current.repoState.commitSha,
|
|
236
|
+
branch: result.current.repoState.branch,
|
|
237
|
+
findingsCount: result.current.findings.length,
|
|
238
|
+
},
|
|
239
|
+
matcher: {
|
|
240
|
+
gitAware: result.matchResult.gitAware,
|
|
241
|
+
...(result.matchResult.degradedReason
|
|
242
|
+
? { degradedReason: result.matchResult.degradedReason }
|
|
243
|
+
: {}),
|
|
244
|
+
},
|
|
245
|
+
envelopeDrift: result.envelopeDrift,
|
|
246
|
+
policy: {
|
|
247
|
+
mode: result.policy.mode,
|
|
248
|
+
block: result.policy.block,
|
|
249
|
+
warn: result.policy.warn,
|
|
250
|
+
confidence: result.policy.confidence,
|
|
251
|
+
blockRules: result.policy.blockRules,
|
|
252
|
+
},
|
|
253
|
+
summary: {
|
|
254
|
+
pairs: result.pairs.length,
|
|
255
|
+
blocking,
|
|
256
|
+
warning,
|
|
257
|
+
persisted,
|
|
258
|
+
resolved,
|
|
259
|
+
},
|
|
260
|
+
pairs: result.pairs.map((p) => ({
|
|
261
|
+
status: p.classification.status,
|
|
262
|
+
blocks: p.classification.blocks,
|
|
263
|
+
warns: p.classification.warns,
|
|
264
|
+
...(p.pair.priorId !== undefined ? { priorId: p.pair.priorId } : {}),
|
|
265
|
+
...(p.pair.currentId !== undefined ? { currentId: p.pair.currentId } : {}),
|
|
266
|
+
confidence: p.pair.confidence,
|
|
267
|
+
kind: p.kind,
|
|
268
|
+
...(p.severity !== undefined ? { severity: p.severity } : {}),
|
|
269
|
+
...(p.file !== undefined ? { file: p.file } : {}),
|
|
270
|
+
...(p.line !== undefined ? { line: p.line } : {}),
|
|
271
|
+
...(p.overlapsChangedLines !== undefined
|
|
272
|
+
? { overlapsChangedLines: p.overlapsChangedLines }
|
|
273
|
+
: {}),
|
|
274
|
+
reasons: p.classification.reasons,
|
|
275
|
+
})),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
// ─── Markdown renderer ────────────────────────────────────────────────────
|
|
279
|
+
/**
|
|
280
|
+
* PR-comment-friendly markdown. Phase 4's GitHub Actions workflow
|
|
281
|
+
* pastes the output verbatim into a PR comment. Format:
|
|
282
|
+
*
|
|
283
|
+
* ## Guardrail: PASSED / BLOCKED
|
|
284
|
+
* one-line summary
|
|
285
|
+
* <blocking findings table, when any>
|
|
286
|
+
* <warnings collapsible section, when any>
|
|
287
|
+
* <drift signal callout, when envelope drifted>
|
|
288
|
+
* <provenance footnote>
|
|
289
|
+
*/
|
|
290
|
+
function renderMarkdown(result) {
|
|
291
|
+
const lines = [];
|
|
292
|
+
const blocking = result.pairs.filter((p) => p.classification.blocks);
|
|
293
|
+
const warning = result.pairs.filter((p) => !p.classification.blocks && p.classification.warns);
|
|
294
|
+
const resolved = result.pairs.filter((p) => p.classification.status === 'removed');
|
|
295
|
+
const verdict = result.blocks ? 'BLOCKED' : result.warns ? 'PASSED (with warnings)' : 'PASSED';
|
|
296
|
+
lines.push(`## Guardrail: ${verdict}`);
|
|
297
|
+
lines.push('');
|
|
298
|
+
lines.push(summarySentence(result, blocking.length, warning.length, resolved.length));
|
|
299
|
+
lines.push('');
|
|
300
|
+
if (blocking.length > 0) {
|
|
301
|
+
lines.push('### Blocking findings');
|
|
302
|
+
lines.push('');
|
|
303
|
+
lines.push('| Status | Kind | Severity | Location | Reason |');
|
|
304
|
+
lines.push('|---|---|---|---|---|');
|
|
305
|
+
for (const p of blocking)
|
|
306
|
+
lines.push(markdownPairRow(p));
|
|
307
|
+
lines.push('');
|
|
308
|
+
}
|
|
309
|
+
if (warning.length > 0) {
|
|
310
|
+
lines.push('<details>');
|
|
311
|
+
lines.push(`<summary>Warnings (${warning.length})</summary>`);
|
|
312
|
+
lines.push('');
|
|
313
|
+
lines.push('| Status | Kind | Severity | Location | Reason |');
|
|
314
|
+
lines.push('|---|---|---|---|---|');
|
|
315
|
+
for (const p of warning)
|
|
316
|
+
lines.push(markdownPairRow(p));
|
|
317
|
+
lines.push('');
|
|
318
|
+
lines.push('</details>');
|
|
319
|
+
lines.push('');
|
|
320
|
+
}
|
|
321
|
+
const driftLines = formatDrift(result.envelopeDrift);
|
|
322
|
+
if (driftLines.length > 0) {
|
|
323
|
+
lines.push('### Envelope drift');
|
|
324
|
+
lines.push('');
|
|
325
|
+
for (const l of driftLines)
|
|
326
|
+
lines.push(`- ${l}`);
|
|
327
|
+
lines.push('');
|
|
328
|
+
}
|
|
329
|
+
if (resolved.length > 0) {
|
|
330
|
+
lines.push('<details>');
|
|
331
|
+
lines.push(`<summary>Resolved (${resolved.length})</summary>`);
|
|
332
|
+
lines.push('');
|
|
333
|
+
lines.push('| Kind | Location |');
|
|
334
|
+
lines.push('|---|---|');
|
|
335
|
+
for (const p of resolved) {
|
|
336
|
+
lines.push(`| ${escapeMd(p.kind)} | ${escapeMd(locatorProse(p) || '—')} |`);
|
|
337
|
+
}
|
|
338
|
+
lines.push('');
|
|
339
|
+
lines.push('</details>');
|
|
340
|
+
lines.push('');
|
|
341
|
+
}
|
|
342
|
+
lines.push('---');
|
|
343
|
+
lines.push('');
|
|
344
|
+
lines.push(`_Baseline_: \`${escapeMd(result.baseline.name)}\` @ ${shortSha(result.baseline.repo.commitSha)} · ` +
|
|
345
|
+
`_Current_: ${shortSha(result.current.repoState.commitSha)} · ` +
|
|
346
|
+
`_Matcher_: ${result.matchResult.gitAware ? 'git-aware' : 'degraded'} · ` +
|
|
347
|
+
`_dxkit_: ${escapeMd(result.current.analysisMeta.dxkitVersion)}`);
|
|
348
|
+
return lines.join('\n');
|
|
349
|
+
}
|
|
350
|
+
function summarySentence(result, blockingCount, warningCount, resolvedCount) {
|
|
351
|
+
const parts = [];
|
|
352
|
+
if (blockingCount > 0) {
|
|
353
|
+
parts.push(`${blockingCount} new regression${blockingCount === 1 ? '' : 's'}`);
|
|
354
|
+
}
|
|
355
|
+
if (warningCount > 0)
|
|
356
|
+
parts.push(`${warningCount} warning${warningCount === 1 ? '' : 's'}`);
|
|
357
|
+
if (resolvedCount > 0)
|
|
358
|
+
parts.push(`${resolvedCount} resolved`);
|
|
359
|
+
if (parts.length === 0) {
|
|
360
|
+
return `No changes from baseline (${result.pairs.length} pair${result.pairs.length === 1 ? '' : 's'} checked).`;
|
|
361
|
+
}
|
|
362
|
+
return parts.join(', ') + '.';
|
|
363
|
+
}
|
|
364
|
+
function markdownPairRow(p) {
|
|
365
|
+
const status = escapeMd(statusLabel(p.classification.status));
|
|
366
|
+
const kind = escapeMd(p.kind);
|
|
367
|
+
const sev = escapeMd(p.severity ?? '—');
|
|
368
|
+
const loc = escapeMd(locatorProse(p) || '—');
|
|
369
|
+
const reasonProse = p.classification.reasons.map((r) => `${r.code}: ${r.detail}`).join('; ');
|
|
370
|
+
return `| ${status} | ${kind} | ${sev} | ${loc} | ${escapeMd(reasonProse) || '—'} |`;
|
|
371
|
+
}
|
|
372
|
+
function escapeMd(s) {
|
|
373
|
+
// Pipe and backtick are the table-breaking characters; escape only
|
|
374
|
+
// those to keep the rendered output readable. Backslash-escape
|
|
375
|
+
// doesn't survive inside table cells in some renderers, so use a
|
|
376
|
+
// visually-similar replacement for pipes.
|
|
377
|
+
return s.replace(/\|/g, '\\|').replace(/`/g, "'");
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=check-renderers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-renderers.js","sourceRoot":"","sources":["../../src/baseline/check-renderers.ts"],"names":[],"mappings":"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"}
|