@neurcode-ai/cli 0.10.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.telemetry-bundle/dist/contracts.d.ts +1 -1
- package/README.md +74 -25
- package/dist/commands/governance.d.ts.map +1 -1
- package/dist/commands/governance.js +12 -0
- package/dist/commands/governance.js.map +1 -1
- package/dist/commands/home.d.ts +21 -0
- package/dist/commands/home.d.ts.map +1 -0
- package/dist/commands/home.js +253 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/quickstart.d.ts.map +1 -1
- package/dist/commands/quickstart.js +13 -11
- package/dist/commands/quickstart.js.map +1 -1
- package/dist/commands/remediate-export.d.ts.map +1 -1
- package/dist/commands/remediate-export.js +17 -2
- package/dist/commands/remediate-export.js.map +1 -1
- package/dist/commands/replay.d.ts.map +1 -1
- package/dist/commands/replay.js +36 -0
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/verify-output.d.ts.map +1 -1
- package/dist/commands/verify-output.js +88 -4
- package/dist/commands/verify-output.js.map +1 -1
- package/dist/commands/verify.d.ts +22 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +467 -37
- package/dist/commands/verify.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +4 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/governance/canonical-pipeline.d.ts.map +1 -1
- package/dist/governance/canonical-pipeline.js +29 -3
- package/dist/governance/canonical-pipeline.js.map +1 -1
- package/dist/governance/intent/drift-detector.d.ts +100 -0
- package/dist/governance/intent/drift-detector.d.ts.map +1 -0
- package/dist/governance/intent/drift-detector.js +275 -0
- package/dist/governance/intent/drift-detector.js.map +1 -0
- package/dist/governance/intent/glob-match.d.ts +43 -0
- package/dist/governance/intent/glob-match.d.ts.map +1 -0
- package/dist/governance/intent/glob-match.js +108 -0
- package/dist/governance/intent/glob-match.js.map +1 -0
- package/dist/governance/intent/import-graph.d.ts +56 -0
- package/dist/governance/intent/import-graph.d.ts.map +1 -0
- package/dist/governance/intent/import-graph.js +133 -0
- package/dist/governance/intent/import-graph.js.map +1 -0
- package/dist/governance/intent/index.d.ts +23 -0
- package/dist/governance/intent/index.d.ts.map +1 -0
- package/dist/governance/intent/index.js +48 -0
- package/dist/governance/intent/index.js.map +1 -0
- package/dist/governance/intent/intelligence-boundaries.d.ts +69 -0
- package/dist/governance/intent/intelligence-boundaries.d.ts.map +1 -0
- package/dist/governance/intent/intelligence-boundaries.js +163 -0
- package/dist/governance/intent/intelligence-boundaries.js.map +1 -0
- package/dist/governance/intent/intent-contract.d.ts +76 -0
- package/dist/governance/intent/intent-contract.d.ts.map +1 -0
- package/dist/governance/intent/intent-contract.js +397 -0
- package/dist/governance/intent/intent-contract.js.map +1 -0
- package/dist/governance/intent/intent-graph.d.ts +135 -0
- package/dist/governance/intent/intent-graph.d.ts.map +1 -0
- package/dist/governance/intent/intent-graph.js +67 -0
- package/dist/governance/intent/intent-graph.js.map +1 -0
- package/dist/governance/pipeline/computation-trace.d.ts +52 -0
- package/dist/governance/pipeline/computation-trace.d.ts.map +1 -0
- package/dist/governance/pipeline/computation-trace.js +79 -0
- package/dist/governance/pipeline/computation-trace.js.map +1 -0
- package/dist/governance/pipeline/envelope-assembly.d.ts +132 -0
- package/dist/governance/pipeline/envelope-assembly.d.ts.map +1 -0
- package/dist/governance/pipeline/envelope-assembly.js +140 -0
- package/dist/governance/pipeline/envelope-assembly.js.map +1 -0
- package/dist/governance/pipeline/fingerprint.d.ts +34 -0
- package/dist/governance/pipeline/fingerprint.d.ts.map +1 -0
- package/dist/governance/pipeline/fingerprint.js +78 -0
- package/dist/governance/pipeline/fingerprint.js.map +1 -0
- package/dist/governance/pipeline/helpers.d.ts +74 -0
- package/dist/governance/pipeline/helpers.d.ts.map +1 -0
- package/dist/governance/pipeline/helpers.js +112 -0
- package/dist/governance/pipeline/helpers.js.map +1 -0
- package/dist/governance/pipeline/index.d.ts +27 -0
- package/dist/governance/pipeline/index.d.ts.map +1 -0
- package/dist/governance/pipeline/index.js +63 -0
- package/dist/governance/pipeline/index.js.map +1 -0
- package/dist/governance/pipeline/lineage.d.ts +26 -0
- package/dist/governance/pipeline/lineage.d.ts.map +1 -0
- package/dist/governance/pipeline/lineage.js +51 -0
- package/dist/governance/pipeline/lineage.js.map +1 -0
- package/dist/governance/pipeline/orchestration/advisory-mode-contract.d.ts +15 -0
- package/dist/governance/pipeline/orchestration/advisory-mode-contract.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/advisory-mode-contract.js +44 -0
- package/dist/governance/pipeline/orchestration/advisory-mode-contract.js.map +1 -0
- package/dist/governance/pipeline/orchestration/advisory-mode.d.ts +102 -0
- package/dist/governance/pipeline/orchestration/advisory-mode.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/advisory-mode.js +170 -0
- package/dist/governance/pipeline/orchestration/advisory-mode.js.map +1 -0
- package/dist/governance/pipeline/orchestration/evidence-lifecycle.d.ts +133 -0
- package/dist/governance/pipeline/orchestration/evidence-lifecycle.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/evidence-lifecycle.js +125 -0
- package/dist/governance/pipeline/orchestration/evidence-lifecycle.js.map +1 -0
- package/dist/governance/pipeline/orchestration/index.d.ts +16 -0
- package/dist/governance/pipeline/orchestration/index.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/index.js +30 -0
- package/dist/governance/pipeline/orchestration/index.js.map +1 -0
- package/dist/governance/pipeline/orchestration/intent-drift-orchestration.d.ts +65 -0
- package/dist/governance/pipeline/orchestration/intent-drift-orchestration.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/intent-drift-orchestration.js +102 -0
- package/dist/governance/pipeline/orchestration/intent-drift-orchestration.js.map +1 -0
- package/dist/governance/pipeline/orchestration/plan-structural-analysis.d.ts +41 -0
- package/dist/governance/pipeline/orchestration/plan-structural-analysis.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/plan-structural-analysis.js +74 -0
- package/dist/governance/pipeline/orchestration/plan-structural-analysis.js.map +1 -0
- package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.d.ts +165 -0
- package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.js +160 -0
- package/dist/governance/pipeline/orchestration/policy-evaluation-summaries.js.map +1 -0
- package/dist/governance/pipeline/orchestration/scope-guard-orchestration.d.ts +152 -0
- package/dist/governance/pipeline/orchestration/scope-guard-orchestration.d.ts.map +1 -0
- package/dist/governance/pipeline/orchestration/scope-guard-orchestration.js +188 -0
- package/dist/governance/pipeline/orchestration/scope-guard-orchestration.js.map +1 -0
- package/dist/governance/pipeline/runtime.d.ts +70 -0
- package/dist/governance/pipeline/runtime.d.ts.map +1 -0
- package/dist/governance/pipeline/runtime.js +223 -0
- package/dist/governance/pipeline/runtime.js.map +1 -0
- package/dist/governance/pipeline/shared-types.d.ts +7 -0
- package/dist/governance/pipeline/shared-types.d.ts.map +1 -0
- package/dist/governance/pipeline/shared-types.js +7 -0
- package/dist/governance/pipeline/shared-types.js.map +1 -0
- package/dist/governance/pipeline/stages/compiled-policy-stage.d.ts +28 -0
- package/dist/governance/pipeline/stages/compiled-policy-stage.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/compiled-policy-stage.js +53 -0
- package/dist/governance/pipeline/stages/compiled-policy-stage.js.map +1 -0
- package/dist/governance/pipeline/stages/diff-normalization-stage.d.ts +63 -0
- package/dist/governance/pipeline/stages/diff-normalization-stage.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/diff-normalization-stage.js +140 -0
- package/dist/governance/pipeline/stages/diff-normalization-stage.js.map +1 -0
- package/dist/governance/pipeline/stages/governance-synthesis-stage.d.ts +53 -0
- package/dist/governance/pipeline/stages/governance-synthesis-stage.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/governance-synthesis-stage.js +129 -0
- package/dist/governance/pipeline/stages/governance-synthesis-stage.js.map +1 -0
- package/dist/governance/pipeline/stages/index.d.ts +29 -0
- package/dist/governance/pipeline/stages/index.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/index.js +40 -0
- package/dist/governance/pipeline/stages/index.js.map +1 -0
- package/dist/governance/pipeline/stages/policy-lock-stage.d.ts +31 -0
- package/dist/governance/pipeline/stages/policy-lock-stage.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/policy-lock-stage.js +71 -0
- package/dist/governance/pipeline/stages/policy-lock-stage.js.map +1 -0
- package/dist/governance/pipeline/stages/runtime-guard-stage.d.ts +29 -0
- package/dist/governance/pipeline/stages/runtime-guard-stage.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/runtime-guard-stage.js +65 -0
- package/dist/governance/pipeline/stages/runtime-guard-stage.js.map +1 -0
- package/dist/governance/pipeline/stages/structural-analysis-stage.d.ts +24 -0
- package/dist/governance/pipeline/stages/structural-analysis-stage.d.ts.map +1 -0
- package/dist/governance/pipeline/stages/structural-analysis-stage.js +58 -0
- package/dist/governance/pipeline/stages/structural-analysis-stage.js.map +1 -0
- package/dist/governance/pipeline/summary.d.ts +14 -0
- package/dist/governance/pipeline/summary.d.ts.map +1 -0
- package/dist/governance/pipeline/summary.js +50 -0
- package/dist/governance/pipeline/summary.js.map +1 -0
- package/dist/governance/pipeline/types.d.ts +69 -0
- package/dist/governance/pipeline/types.d.ts.map +1 -0
- package/dist/governance/pipeline/types.js +30 -0
- package/dist/governance/pipeline/types.js.map +1 -0
- package/dist/index.js +44 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/active-engineering-context.d.ts +16 -0
- package/dist/utils/active-engineering-context.d.ts.map +1 -1
- package/dist/utils/active-engineering-context.js +302 -0
- package/dist/utils/active-engineering-context.js.map +1 -1
- package/dist/utils/import-edge-classifier.d.ts +76 -0
- package/dist/utils/import-edge-classifier.d.ts.map +1 -0
- package/dist/utils/import-edge-classifier.js +308 -0
- package/dist/utils/import-edge-classifier.js.map +1 -0
- package/dist/utils/import-edge-extractor.d.ts +52 -0
- package/dist/utils/import-edge-extractor.d.ts.map +1 -0
- package/dist/utils/import-edge-extractor.js +223 -0
- package/dist/utils/import-edge-extractor.js.map +1 -0
- package/dist/utils/import-edge-governance.d.ts +37 -0
- package/dist/utils/import-edge-governance.d.ts.map +1 -0
- package/dist/utils/import-edge-governance.js +56 -0
- package/dist/utils/import-edge-governance.js.map +1 -0
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +19 -10
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/path-boundary-classifier.d.ts +42 -0
- package/dist/utils/path-boundary-classifier.d.ts.map +1 -0
- package/dist/utils/path-boundary-classifier.js +143 -0
- package/dist/utils/path-boundary-classifier.js.map +1 -0
- package/dist/utils/replay-html-report.d.ts +29 -0
- package/dist/utils/replay-html-report.d.ts.map +1 -0
- package/dist/utils/replay-html-report.js +309 -0
- package/dist/utils/replay-html-report.js.map +1 -0
- package/dist/utils/runtime-state.d.ts +44 -0
- package/dist/utils/runtime-state.d.ts.map +1 -0
- package/dist/utils/runtime-state.js +151 -0
- package/dist/utils/runtime-state.js.map +1 -0
- package/package.json +3 -3
- package/dist/utils/box.d.ts +0 -16
- package/dist/utils/box.d.ts.map +0 -1
- package/dist/utils/box.js +0 -85
- package/dist/utils/box.js.map +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic, replay-safe path-boundary classification.
|
|
4
|
+
*
|
|
5
|
+
* Maps a repo-relative file path to one of a small, well-defined set of
|
|
6
|
+
* governance boundary categories (generated-code, infra, ci,
|
|
7
|
+
* dependency-manifest, sensitive). Uses ONLY pattern matching — no file I/O,
|
|
8
|
+
* no AI inference, no probabilistic scoring. Same path string → same
|
|
9
|
+
* classification across machines, runs, and CLI versions. Boundary patterns
|
|
10
|
+
* are intentionally conservative: when in doubt the classifier returns
|
|
11
|
+
* `null`, leaving the path uncategorised rather than asserting an incorrect
|
|
12
|
+
* boundary.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.classifyPathBoundary = classifyPathBoundary;
|
|
16
|
+
exports.classifyAndBucket = classifyAndBucket;
|
|
17
|
+
function exact(needle) {
|
|
18
|
+
return (path) => path === needle;
|
|
19
|
+
}
|
|
20
|
+
function basename(needle) {
|
|
21
|
+
return (path) => path === needle || path.endsWith(`/${needle}`);
|
|
22
|
+
}
|
|
23
|
+
function basenameAny(needles) {
|
|
24
|
+
const set = new Set(needles);
|
|
25
|
+
return (path) => {
|
|
26
|
+
const slash = path.lastIndexOf('/');
|
|
27
|
+
const name = slash === -1 ? path : path.slice(slash + 1);
|
|
28
|
+
return set.has(name);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function suffix(needle) {
|
|
32
|
+
return (path) => path.endsWith(needle);
|
|
33
|
+
}
|
|
34
|
+
function suffixAny(needles) {
|
|
35
|
+
return (path) => needles.some((n) => path.endsWith(n));
|
|
36
|
+
}
|
|
37
|
+
function segment(needle) {
|
|
38
|
+
const fragment = `/${needle}/`;
|
|
39
|
+
return (path) => path === needle || path.startsWith(`${needle}/`) || path.includes(fragment);
|
|
40
|
+
}
|
|
41
|
+
function regex(pattern) {
|
|
42
|
+
return (path) => pattern.test(path);
|
|
43
|
+
}
|
|
44
|
+
const RULES = Object.freeze([
|
|
45
|
+
// ── Generated code ────────────────────────────────────────────────────────
|
|
46
|
+
// Detection prioritised over infra because many generated artefacts live
|
|
47
|
+
// inside infra-adjacent paths (e.g. helm template output), and the
|
|
48
|
+
// "this is generated, do not hand-edit" semantic is the stronger signal.
|
|
49
|
+
{ category: 'generated-code', reasonId: 'gen.protobuf-py', reason: 'Generated protobuf (Python).', test: suffixAny(['_pb2.py', '_pb2_grpc.py']) },
|
|
50
|
+
{ category: 'generated-code', reasonId: 'gen.protobuf-go', reason: 'Generated protobuf (Go).', test: suffixAny(['.pb.go', '_pb.go']) },
|
|
51
|
+
{ category: 'generated-code', reasonId: 'gen.protobuf-ts', reason: 'Generated protobuf (TS/JS).', test: suffixAny(['.pb.ts', '.pb.js']) },
|
|
52
|
+
{ category: 'generated-code', reasonId: 'gen.dts', reason: 'TypeScript declaration file (typically generated).', test: suffix('.d.ts') },
|
|
53
|
+
{ category: 'generated-code', reasonId: 'gen.openapi-segment', reason: 'OpenAPI / Swagger generated client surface.', test: regex(/(^|\/)(openapi-generated|swagger-generated|generated-clients?)\//) },
|
|
54
|
+
{ category: 'generated-code', reasonId: 'gen.generated-segment', reason: 'Conventional generated-code directory.', test: regex(/(^|\/)(__generated__|generated|gen)\//) },
|
|
55
|
+
{ category: 'generated-code', reasonId: 'gen.suffix-generated', reason: 'File explicitly suffixed `.generated.*`.', test: regex(/\.generated\.[A-Za-z0-9]+$/) },
|
|
56
|
+
{ category: 'generated-code', reasonId: 'gen.dist-build', reason: 'Build output directory; never hand-edit.', test: regex(/(^|\/)(dist|build|out|\.next|\.nuxt|\.svelte-kit|\.turbo|target)\//) },
|
|
57
|
+
{ category: 'generated-code', reasonId: 'gen.vendor', reason: 'Vendored / installed dependency tree.', test: regex(/(^|\/)(vendor|node_modules|Pods)\//) },
|
|
58
|
+
{ category: 'generated-code', reasonId: 'gen.snapshots', reason: 'Generated test snapshot.', test: regex(/(^|\/)__snapshots__\//) },
|
|
59
|
+
{ category: 'generated-code', reasonId: 'gen.lockfile', reason: 'Lock file — regenerated by tooling, not hand-authored.', test: basenameAny(['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'Cargo.lock', 'Pipfile.lock', 'poetry.lock', 'composer.lock', 'go.sum']) },
|
|
60
|
+
// ── CI ────────────────────────────────────────────────────────────────────
|
|
61
|
+
{ category: 'ci', reasonId: 'ci.github-workflows', reason: 'GitHub Actions workflow.', test: regex(/^\.github\/workflows\//) },
|
|
62
|
+
{ category: 'ci', reasonId: 'ci.github-action-config', reason: 'GitHub action / repo automation config.', test: regex(/^\.github\/(actions|dependabot\.yml|CODEOWNERS)/) },
|
|
63
|
+
{ category: 'ci', reasonId: 'ci.gitlab', reason: 'GitLab CI config.', test: exact('.gitlab-ci.yml') },
|
|
64
|
+
{ category: 'ci', reasonId: 'ci.circleci', reason: 'CircleCI config.', test: regex(/^\.circleci\//) },
|
|
65
|
+
{ category: 'ci', reasonId: 'ci.jenkins', reason: 'Jenkins pipeline.', test: basenameAny(['Jenkinsfile']) },
|
|
66
|
+
{ category: 'ci', reasonId: 'ci.travis', reason: 'Travis CI config.', test: exact('.travis.yml') },
|
|
67
|
+
{ category: 'ci', reasonId: 'ci.azure-pipelines', reason: 'Azure Pipelines config.', test: basenameAny(['azure-pipelines.yml']) },
|
|
68
|
+
{ category: 'ci', reasonId: 'ci.drone', reason: 'Drone CI config.', test: exact('.drone.yml') },
|
|
69
|
+
{ category: 'ci', reasonId: 'ci.buildkite', reason: 'Buildkite pipeline.', test: regex(/^\.buildkite\//) },
|
|
70
|
+
// ── Infra / deployment ────────────────────────────────────────────────────
|
|
71
|
+
{ category: 'infra', reasonId: 'infra.dockerfile', reason: 'Docker build artefact.', test: basenameAny(['Dockerfile']) },
|
|
72
|
+
{ category: 'infra', reasonId: 'infra.dockerfile-variant', reason: 'Docker build artefact (variant).', test: regex(/(^|\/)Dockerfile(\.[A-Za-z0-9._-]+)?$/) },
|
|
73
|
+
{ category: 'infra', reasonId: 'infra.docker-compose', reason: 'docker-compose deployment file.', test: regex(/(^|\/)docker-compose(\.[A-Za-z0-9._-]+)?\.ya?ml$/) },
|
|
74
|
+
{ category: 'infra', reasonId: 'infra.terraform', reason: 'Terraform infrastructure source.', test: regex(/(^|\/)(terraform|infra\/terraform)\//) },
|
|
75
|
+
{ category: 'infra', reasonId: 'infra.terraform-suffix', reason: 'Terraform source (suffix).', test: suffix('.tf') },
|
|
76
|
+
{ category: 'infra', reasonId: 'infra.helm', reason: 'Helm chart source.', test: regex(/(^|\/)(helm|helm-chart|charts)\//) },
|
|
77
|
+
{ category: 'infra', reasonId: 'infra.kubernetes', reason: 'Kubernetes manifest directory.', test: regex(/(^|\/)(k8s|kubernetes|manifests)\//) },
|
|
78
|
+
{ category: 'infra', reasonId: 'infra.ansible', reason: 'Ansible playbook directory.', test: regex(/(^|\/)(ansible|playbooks)\//) },
|
|
79
|
+
{ category: 'infra', reasonId: 'infra.cloudformation', reason: 'CloudFormation template directory.', test: regex(/(^|\/)cloudformation\//) },
|
|
80
|
+
{ category: 'infra', reasonId: 'infra.serverless', reason: 'Serverless framework config.', test: basenameAny(['serverless.yml', 'serverless.yaml', 'serverless.ts']) },
|
|
81
|
+
{ category: 'infra', reasonId: 'infra.nginx', reason: 'Nginx / reverse-proxy config.', test: regex(/(^|\/)nginx(.*)?\.conf$/) },
|
|
82
|
+
{ category: 'infra', reasonId: 'infra.migration', reason: 'Database migration file.', test: regex(/(^|\/)(migrations|db\/migrations|services\/.+\/migrations)\//) },
|
|
83
|
+
// ── Sensitive ─────────────────────────────────────────────────────────────
|
|
84
|
+
{ category: 'sensitive', reasonId: 'sensitive.env', reason: 'Environment variable file.', test: regex(/(^|\/)\.env(\.[A-Za-z0-9._-]+)?$/) },
|
|
85
|
+
{ category: 'sensitive', reasonId: 'sensitive.keys', reason: 'Key/credential material.', test: regex(/\.(pem|key|crt|p12|pfx|jks|keystore)$/) },
|
|
86
|
+
{ category: 'sensitive', reasonId: 'sensitive.auth-path', reason: 'Auth / IAM / permissions surface.', test: regex(/(^|\/)(auth|iam|permissions|secrets?)\//) },
|
|
87
|
+
// ── Dependency manifest ───────────────────────────────────────────────────
|
|
88
|
+
{ category: 'dependency-manifest', reasonId: 'dep.npm', reason: 'Node package manifest.', test: basename('package.json') },
|
|
89
|
+
{ category: 'dependency-manifest', reasonId: 'dep.python-requirements', reason: 'Python requirements file.', test: regex(/(^|\/)requirements(\/[^/]+)?\.(txt|in)$|^requirements(\/[^/]+)?\.(txt|in)$/) },
|
|
90
|
+
{ category: 'dependency-manifest', reasonId: 'dep.python-requirements-dir', reason: 'Python requirements directory.', test: regex(/(^|\/)requirements\//) },
|
|
91
|
+
{ category: 'dependency-manifest', reasonId: 'dep.pyproject', reason: 'Python project / build manifest.', test: basename('pyproject.toml') },
|
|
92
|
+
{ category: 'dependency-manifest', reasonId: 'dep.pipfile', reason: 'Pipenv manifest.', test: basename('Pipfile') },
|
|
93
|
+
{ category: 'dependency-manifest', reasonId: 'dep.setup-py', reason: 'Legacy setuptools manifest.', test: basename('setup.py') },
|
|
94
|
+
{ category: 'dependency-manifest', reasonId: 'dep.setup-cfg', reason: 'Legacy setuptools config.', test: basename('setup.cfg') },
|
|
95
|
+
{ category: 'dependency-manifest', reasonId: 'dep.cargo', reason: 'Rust crate manifest.', test: basename('Cargo.toml') },
|
|
96
|
+
{ category: 'dependency-manifest', reasonId: 'dep.go-mod', reason: 'Go module manifest.', test: basename('go.mod') },
|
|
97
|
+
{ category: 'dependency-manifest', reasonId: 'dep.maven', reason: 'Maven project manifest.', test: basename('pom.xml') },
|
|
98
|
+
{ category: 'dependency-manifest', reasonId: 'dep.gradle', reason: 'Gradle build script.', test: suffixAny(['/build.gradle', '/build.gradle.kts', '/settings.gradle', '/settings.gradle.kts']) },
|
|
99
|
+
{ category: 'dependency-manifest', reasonId: 'dep.composer', reason: 'PHP composer manifest.', test: basename('composer.json') },
|
|
100
|
+
{ category: 'dependency-manifest', reasonId: 'dep.gemfile', reason: 'Ruby Gemfile.', test: basename('Gemfile') },
|
|
101
|
+
]);
|
|
102
|
+
/**
|
|
103
|
+
* Classify a single repo-relative path. Returns the FIRST matching boundary
|
|
104
|
+
* (rules are ordered by specificity / severity), or `null` when the path
|
|
105
|
+
* does not match any well-known boundary pattern.
|
|
106
|
+
*
|
|
107
|
+
* The classifier is intentionally first-match-wins so the ordering above
|
|
108
|
+
* encodes the priority: generated-code > CI > infra > sensitive > dep-manifest.
|
|
109
|
+
*/
|
|
110
|
+
function classifyPathBoundary(path) {
|
|
111
|
+
if (!path)
|
|
112
|
+
return null;
|
|
113
|
+
const normalised = path.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
114
|
+
for (const rule of RULES) {
|
|
115
|
+
if (rule.test(normalised)) {
|
|
116
|
+
return { category: rule.category, reasonId: rule.reasonId, reason: rule.reason };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Bulk classify and bucket. Returns a deterministic { category → paths } map.
|
|
123
|
+
* Empty buckets are omitted from the result for compactness; consumers should
|
|
124
|
+
* defensively check `result.<category]?.length`.
|
|
125
|
+
*/
|
|
126
|
+
function classifyAndBucket(paths) {
|
|
127
|
+
const buckets = {};
|
|
128
|
+
// Sort + dedupe inputs so the output is replay-stable regardless of caller
|
|
129
|
+
// ordering. This is load-bearing for the canonical replay checksum.
|
|
130
|
+
const seen = new Set();
|
|
131
|
+
const inputs = [...paths]
|
|
132
|
+
.filter((p) => typeof p === 'string' && p.length > 0)
|
|
133
|
+
.filter((p) => (seen.has(p) ? false : (seen.add(p), true)))
|
|
134
|
+
.sort();
|
|
135
|
+
for (const path of inputs) {
|
|
136
|
+
const classification = classifyPathBoundary(path);
|
|
137
|
+
if (!classification)
|
|
138
|
+
continue;
|
|
139
|
+
(buckets[classification.category] ??= []).push(path);
|
|
140
|
+
}
|
|
141
|
+
return buckets;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=path-boundary-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-boundary-classifier.js","sourceRoot":"","sources":["../../src/utils/path-boundary-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained HTML replay report generator.
|
|
3
|
+
*
|
|
4
|
+
* Renders deterministic replay state into a single audit-grade HTML file.
|
|
5
|
+
* No JavaScript, no external assets, no remote requests — every byte of the
|
|
6
|
+
* output is derived from canonical replay artifacts.
|
|
7
|
+
*
|
|
8
|
+
* The output is intended to be opened directly in a browser, attached to
|
|
9
|
+
* audit reports, or stored alongside `.neurcode/evidence/` artifacts.
|
|
10
|
+
*/
|
|
11
|
+
import type { replayGovernanceState } from './replay-runtime';
|
|
12
|
+
type ReplayState = ReturnType<typeof replayGovernanceState>;
|
|
13
|
+
export interface HtmlReportInput {
|
|
14
|
+
state: ReplayState;
|
|
15
|
+
/**
|
|
16
|
+
* Optional latest verify payload (the structural+governance envelope
|
|
17
|
+
* emitted by `verify --json`). When provided, scope issues, runtime
|
|
18
|
+
* capabilities, and the canonical replay checksum are surfaced.
|
|
19
|
+
*/
|
|
20
|
+
verify?: Record<string, unknown> | null;
|
|
21
|
+
generatedAt?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Render a self-contained HTML report. The returned string is ready to be
|
|
25
|
+
* written to disk and opened in any browser. No external assets fetched.
|
|
26
|
+
*/
|
|
27
|
+
export declare function renderReplayHtmlReport(input: HtmlReportInput): string;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=replay-html-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-html-report.d.ts","sourceRoot":"","sources":["../../src/utils/replay-html-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoQD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAsCrE"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Self-contained HTML replay report generator.
|
|
4
|
+
*
|
|
5
|
+
* Renders deterministic replay state into a single audit-grade HTML file.
|
|
6
|
+
* No JavaScript, no external assets, no remote requests — every byte of the
|
|
7
|
+
* output is derived from canonical replay artifacts.
|
|
8
|
+
*
|
|
9
|
+
* The output is intended to be opened directly in a browser, attached to
|
|
10
|
+
* audit reports, or stored alongside `.neurcode/evidence/` artifacts.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.renderReplayHtmlReport = renderReplayHtmlReport;
|
|
14
|
+
const STYLES = `
|
|
15
|
+
:root {
|
|
16
|
+
--bg: #0f172a;
|
|
17
|
+
--bg-soft: #111827;
|
|
18
|
+
--panel: #1e293b;
|
|
19
|
+
--border: #334155;
|
|
20
|
+
--text: #e2e8f0;
|
|
21
|
+
--muted: #94a3b8;
|
|
22
|
+
--accent: #38bdf8;
|
|
23
|
+
--good: #4ade80;
|
|
24
|
+
--warn: #facc15;
|
|
25
|
+
--bad: #f87171;
|
|
26
|
+
}
|
|
27
|
+
* { box-sizing: border-box; }
|
|
28
|
+
body {
|
|
29
|
+
margin: 0; padding: 32px;
|
|
30
|
+
background: var(--bg); color: var(--text);
|
|
31
|
+
font: 14px/1.55 -apple-system, BlinkMacSystemFont, "Segoe UI", "SF Mono", monospace;
|
|
32
|
+
}
|
|
33
|
+
main { max-width: 1100px; margin: 0 auto; }
|
|
34
|
+
h1 { font-size: 22px; margin: 0 0 4px; letter-spacing: 0.2px; }
|
|
35
|
+
h2 { font-size: 16px; margin: 24px 0 8px; color: var(--accent); text-transform: uppercase; letter-spacing: 0.9px; }
|
|
36
|
+
.subtitle { color: var(--muted); margin: 0 0 24px; font-size: 13px; }
|
|
37
|
+
.panel { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 16px 20px; margin-bottom: 16px; }
|
|
38
|
+
.kv { display: grid; grid-template-columns: 220px 1fr; row-gap: 6px; column-gap: 16px; }
|
|
39
|
+
.kv dt { color: var(--muted); }
|
|
40
|
+
.kv dd { margin: 0; word-break: break-all; }
|
|
41
|
+
.badge { display: inline-block; padding: 1px 8px; border-radius: 4px; font-size: 11px; margin-right: 4px; font-weight: 600; letter-spacing: 0.4px; }
|
|
42
|
+
.badge.good { background: rgba(74, 222, 128, 0.18); color: var(--good); }
|
|
43
|
+
.badge.warn { background: rgba(250, 204, 21, 0.18); color: var(--warn); }
|
|
44
|
+
.badge.bad { background: rgba(248, 113, 113, 0.18); color: var(--bad); }
|
|
45
|
+
.badge.muted { background: rgba(148, 163, 184, 0.18); color: var(--muted); }
|
|
46
|
+
.checksum { font-family: "SF Mono", "Menlo", monospace; font-size: 12px; word-break: break-all; }
|
|
47
|
+
table { width: 100%; border-collapse: collapse; }
|
|
48
|
+
th, td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--border); vertical-align: top; font-size: 13px; }
|
|
49
|
+
th { color: var(--muted); font-weight: 500; text-transform: uppercase; letter-spacing: 0.6px; font-size: 11px; }
|
|
50
|
+
tr:last-child td { border-bottom: 0; }
|
|
51
|
+
.muted { color: var(--muted); }
|
|
52
|
+
.code { font-family: "SF Mono", "Menlo", monospace; }
|
|
53
|
+
.row { display: flex; gap: 12px; flex-wrap: wrap; }
|
|
54
|
+
.row .panel { flex: 1; min-width: 280px; }
|
|
55
|
+
footer { color: var(--muted); font-size: 12px; margin-top: 32px; border-top: 1px solid var(--border); padding-top: 12px; }
|
|
56
|
+
`;
|
|
57
|
+
function escapeHtml(text) {
|
|
58
|
+
if (text === null || text === undefined)
|
|
59
|
+
return '—';
|
|
60
|
+
const s = typeof text === 'string' ? text : String(text);
|
|
61
|
+
return s
|
|
62
|
+
.replace(/&/g, '&')
|
|
63
|
+
.replace(/</g, '<')
|
|
64
|
+
.replace(/>/g, '>')
|
|
65
|
+
.replace(/"/g, '"')
|
|
66
|
+
.replace(/'/g, ''');
|
|
67
|
+
}
|
|
68
|
+
function badge(value, kind) {
|
|
69
|
+
return `<span class="badge ${kind}">${escapeHtml(value)}</span>`;
|
|
70
|
+
}
|
|
71
|
+
function statusBadge(value, positive, warning = []) {
|
|
72
|
+
if (!value)
|
|
73
|
+
return badge('unknown', 'muted');
|
|
74
|
+
if (positive.includes(value))
|
|
75
|
+
return badge(value, 'good');
|
|
76
|
+
if (warning.includes(value))
|
|
77
|
+
return badge(value, 'warn');
|
|
78
|
+
return badge(value, 'bad');
|
|
79
|
+
}
|
|
80
|
+
function row(label, value) {
|
|
81
|
+
return `<dt>${escapeHtml(label)}</dt><dd>${value}</dd>`;
|
|
82
|
+
}
|
|
83
|
+
function renderRuntimeCapabilities(verify) {
|
|
84
|
+
const rc = (verify?.runtimeCapabilities ?? null);
|
|
85
|
+
if (!rc) {
|
|
86
|
+
return `<section class="panel">
|
|
87
|
+
<h2>Runtime Capabilities</h2>
|
|
88
|
+
<p class="muted">No <code>runtimeCapabilities</code> envelope was attached to the input. This typically means the run pre-dates the 0.11.0 intent-runtime activation, or no <code>verify</code> output was supplied with <code>--verify</code>.</p>
|
|
89
|
+
</section>`;
|
|
90
|
+
}
|
|
91
|
+
const tag = (v) => statusBadge(typeof v === 'string' ? v : null, ['active', 'enforced', 'pattern-deterministic', 'active-authored', 'active-synthesized', 'offline', 'full-bundle', 'intent-pack-only'], ['inactive', 'unenforced']);
|
|
92
|
+
return `<section class="panel">
|
|
93
|
+
<h2>Runtime Capabilities</h2>
|
|
94
|
+
<p class="muted">What actually executed in this run. Schema: <code>${escapeHtml(rc.schemaVersion ?? 'neurcode.runtime-capabilities.v1')}</code></p>
|
|
95
|
+
<dl class="kv">
|
|
96
|
+
${row('intent-runtime', tag(rc.intentRuntime))}
|
|
97
|
+
${row('intent-contract-source', tag(rc.intentContractSource))}
|
|
98
|
+
${row('intent-runtime-required', rc.intentRuntimeRequired === true ? badge('required', 'good') : badge('not required', 'muted'))}
|
|
99
|
+
${row('requirement-satisfied', rc.intentRuntimeRequirementSatisfied === false ? badge('NOT SATISFIED', 'bad') : badge('satisfied', 'good'))}
|
|
100
|
+
${row('scope-guard', tag(rc.scopeGuard))}
|
|
101
|
+
${row('forbidden-boundary-enforcement', tag(rc.forbiddenBoundaryEnforcement))}
|
|
102
|
+
${row('import-edge-governance', tag(rc.importEdgeGovernance))}
|
|
103
|
+
${row('generated-code-governance', tag(rc.generatedCodeGovernance))}
|
|
104
|
+
${row('drift-intelligence', tag(rc.driftIntelligence))}
|
|
105
|
+
${row('structural-rules', tag(rc.structuralRules))}
|
|
106
|
+
${row('replay-determinism', tag(rc.replayDeterminism))}
|
|
107
|
+
${row('api-contract-status', tag(rc.apiContractStatus))}
|
|
108
|
+
${row('execution-path', escapeHtml(rc.executionPath ?? '—'))}
|
|
109
|
+
</dl>
|
|
110
|
+
${rc.importEdgesAnalyzed !== undefined ? `
|
|
111
|
+
<h3 style="font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:0.6px;margin-top:14px;">Import-edge observability</h3>
|
|
112
|
+
<dl class="kv">
|
|
113
|
+
${row('edges-analyzed', escapeHtml(rc.importEdgesAnalyzed))}
|
|
114
|
+
${row('blocking-findings', escapeHtml(rc.importEdgeBlockingFindings ?? 0))}
|
|
115
|
+
${row('advisory-findings', escapeHtml(rc.importEdgeAdvisoryFindings ?? 0))}
|
|
116
|
+
${row('observed-boundary-types', escapeHtml(Array.isArray(rc.observedImportEdgeBoundaryTypes) ? rc.observedImportEdgeBoundaryTypes.join(', ') : '—'))}
|
|
117
|
+
</dl>` : ''}
|
|
118
|
+
</section>`;
|
|
119
|
+
}
|
|
120
|
+
function renderPosture(verify) {
|
|
121
|
+
const ig = (verify?.intentGovernance ?? null);
|
|
122
|
+
if (!ig || (!ig.governanceGate && !ig.rolloutTrust)) {
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
return `<section class="panel">
|
|
126
|
+
<h2>Governance Posture</h2>
|
|
127
|
+
<p class="muted">Categorical rollup synthesised by the drift-intelligence engine from the canonical finding set.</p>
|
|
128
|
+
<dl class="kv">
|
|
129
|
+
${row('governance-gate', escapeHtml(ig.governanceGate ?? '—'))}
|
|
130
|
+
${row('rollout-trust', escapeHtml(ig.rolloutTrust ?? '—'))}
|
|
131
|
+
${row('rollout-risk', escapeHtml(ig.rolloutRisk ?? '—'))}
|
|
132
|
+
${row('canonical-finding-count', escapeHtml(ig.canonicalFindingCount ?? 0))}
|
|
133
|
+
${row('blocking-finding-count', escapeHtml(ig.blockingFindingCount ?? 0))}
|
|
134
|
+
${row('advisory-finding-count', escapeHtml(ig.advisoryFindingCount ?? 0))}
|
|
135
|
+
${ig.unexpectedFiles && Array.isArray(ig.unexpectedFiles) && ig.unexpectedFiles.length > 0
|
|
136
|
+
? row('unexpected-files', `<code>${ig.unexpectedFiles.map(escapeHtml).join('</code><br><code>')}</code>`)
|
|
137
|
+
: ''}
|
|
138
|
+
</dl>
|
|
139
|
+
</section>`;
|
|
140
|
+
}
|
|
141
|
+
function renderScopeIssues(verify) {
|
|
142
|
+
const issues = (verify?.scopeIssues ?? []);
|
|
143
|
+
if (!Array.isArray(issues) || issues.length === 0) {
|
|
144
|
+
return `<section class="panel">
|
|
145
|
+
<h2>Scope Issues</h2>
|
|
146
|
+
<p class="muted">No scope issues recorded for this replay state.</p>
|
|
147
|
+
</section>`;
|
|
148
|
+
}
|
|
149
|
+
const pathTouch = issues.filter((i) => !i.importEdge);
|
|
150
|
+
const importEdges = issues.filter((i) => !!i.importEdge);
|
|
151
|
+
const rows = (subset, type) => subset.map((issue) => {
|
|
152
|
+
const edge = (issue.importEdge ?? null);
|
|
153
|
+
const policyBadge = issue.policy === 'forbidden' ? badge('forbidden', 'bad')
|
|
154
|
+
: issue.policy === 'review-required' ? badge('review-required', 'warn')
|
|
155
|
+
: issue.policy === 'generated-code' ? badge('generated-code', 'warn')
|
|
156
|
+
: badge(issue.policy ?? 'out-of-scope', 'muted');
|
|
157
|
+
const boundaryBadge = issue.boundaryType ? badge(issue.boundaryType, 'muted') : '';
|
|
158
|
+
if (type === 'edge' && edge) {
|
|
159
|
+
return `<tr>
|
|
160
|
+
<td class="code">${escapeHtml(edge.sourceFile)}:${escapeHtml(edge.sourceLine)}</td>
|
|
161
|
+
<td>${policyBadge}${boundaryBadge}<span class="badge muted">${escapeHtml(edge.edgeKind)}</span></td>
|
|
162
|
+
<td><span class="code">${escapeHtml(edge.importTarget)}</span><br><span class="muted">→ ${escapeHtml(edge.resolvedTargetPath)}</span><br><span class="muted">boundary: ${escapeHtml(edge.resolvedBoundary)}</span></td>
|
|
163
|
+
</tr>`;
|
|
164
|
+
}
|
|
165
|
+
return `<tr>
|
|
166
|
+
<td class="code">${escapeHtml(issue.file)}</td>
|
|
167
|
+
<td>${policyBadge}${boundaryBadge}</td>
|
|
168
|
+
<td>${escapeHtml(issue.message)}</td>
|
|
169
|
+
</tr>`;
|
|
170
|
+
}).join('');
|
|
171
|
+
const sections = [];
|
|
172
|
+
if (importEdges.length > 0) {
|
|
173
|
+
sections.push(`<section class="panel">
|
|
174
|
+
<h2>Import-Edge Drift (${importEdges.length})</h2>
|
|
175
|
+
<p class="muted">Cross-boundary <code>import</code> statements inside otherwise in-scope files. Deterministic, replay-stable.</p>
|
|
176
|
+
<table>
|
|
177
|
+
<thead><tr><th>Source · line</th><th>Classification</th><th>Edge</th></tr></thead>
|
|
178
|
+
<tbody>${rows(importEdges, 'edge')}</tbody>
|
|
179
|
+
</table>
|
|
180
|
+
</section>`);
|
|
181
|
+
}
|
|
182
|
+
if (pathTouch.length > 0) {
|
|
183
|
+
sections.push(`<section class="panel">
|
|
184
|
+
<h2>Path-touch Scope Drift (${pathTouch.length})</h2>
|
|
185
|
+
<p class="muted">Files modified outside the declared scope or inside an explicit forbidden boundary.</p>
|
|
186
|
+
<table>
|
|
187
|
+
<thead><tr><th>File</th><th>Classification</th><th>Message</th></tr></thead>
|
|
188
|
+
<tbody>${rows(pathTouch, 'path')}</tbody>
|
|
189
|
+
</table>
|
|
190
|
+
</section>`);
|
|
191
|
+
}
|
|
192
|
+
return sections.join('\n');
|
|
193
|
+
}
|
|
194
|
+
function renderReplayState(state, verify) {
|
|
195
|
+
const reconstruction = state.reconstruction;
|
|
196
|
+
const statusBadgeForRecon = reconstruction.reconstructionStatus === 'exact'
|
|
197
|
+
? badge('exact', 'good')
|
|
198
|
+
: badge(reconstruction.reconstructionStatus, 'warn');
|
|
199
|
+
const verifyChecksum = (verify?.replayChecksum ?? null);
|
|
200
|
+
const verdict = (verify?.verdict ?? null);
|
|
201
|
+
return `<section class="panel">
|
|
202
|
+
<h2>Replay State</h2>
|
|
203
|
+
<dl class="kv">
|
|
204
|
+
${row('as-of', escapeHtml(state.asOf))}
|
|
205
|
+
${row('artifact-hash', `<span class="checksum">${escapeHtml(state.determinism.artifactHash)}</span>`)}
|
|
206
|
+
${verifyChecksum ? row('canonical-replay-checksum', `<span class="checksum">${escapeHtml(verifyChecksum)}</span>`) : ''}
|
|
207
|
+
${verdict ? row('latest-verdict', verdict === 'PASS' ? badge('PASS', 'good') : badge(verdict, 'bad')) : ''}
|
|
208
|
+
${row('reconstruction-status', statusBadgeForRecon)}
|
|
209
|
+
${row('reconstruction-confidence', `${reconstruction.confidence.overall}/100`)}
|
|
210
|
+
${row('snapshot · control-plane', state.controlPlane.snapshotId ? escapeHtml(state.controlPlane.snapshotId) : badge('none', 'muted'))}
|
|
211
|
+
${row('snapshot · workspace', state.workspace.snapshotId ? escapeHtml(state.workspace.snapshotId) : badge('none', 'muted'))}
|
|
212
|
+
</dl>
|
|
213
|
+
<div class="row" style="margin-top:14px;">
|
|
214
|
+
<div class="panel" style="margin-bottom:0;">
|
|
215
|
+
<h3 style="font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:0.6px;margin:0 0 8px;">Posture</h3>
|
|
216
|
+
<dl class="kv">
|
|
217
|
+
${row('runs', escapeHtml(state.posture.runCount))}
|
|
218
|
+
${row('pass-rate', `${escapeHtml(state.posture.passRate)}%`)}
|
|
219
|
+
${row('block-rate', `${escapeHtml(state.posture.blockRate)}%`)}
|
|
220
|
+
${row('regression-rate', `${escapeHtml(state.posture.regressionRate)}%`)}
|
|
221
|
+
</dl>
|
|
222
|
+
</div>
|
|
223
|
+
<div class="panel" style="margin-bottom:0;">
|
|
224
|
+
<h3 style="font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:0.6px;margin:0 0 8px;">Reconstruction confidence (deterministic subscores)</h3>
|
|
225
|
+
<dl class="kv">
|
|
226
|
+
${row('provenance', `${reconstruction.confidence.provenance.score}/100`)}
|
|
227
|
+
${row('graph', `${reconstruction.confidence.graph.score}/100`)}
|
|
228
|
+
${row('semantic', `${reconstruction.confidence.semantic.score}/100`)}
|
|
229
|
+
${row('federation', `${reconstruction.confidence.federation.score}/100`)}
|
|
230
|
+
${row('artifacts', `${reconstruction.confidence.artifacts.score}/100`)}
|
|
231
|
+
</dl>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</section>`;
|
|
235
|
+
}
|
|
236
|
+
function renderBlockedExecutions(state) {
|
|
237
|
+
if (state.blockedExecutions.length === 0)
|
|
238
|
+
return '';
|
|
239
|
+
const rows = state.blockedExecutions.slice(0, 30).map((exec) => `<tr>
|
|
240
|
+
<td class="code">${escapeHtml(exec.executionId.slice(0, 12))}</td>
|
|
241
|
+
<td>${escapeHtml(exec.type)}</td>
|
|
242
|
+
<td>${escapeHtml(exec.source)}</td>
|
|
243
|
+
<td>${escapeHtml(exec.createdAt)}</td>
|
|
244
|
+
<td>${escapeHtml(exec.blocking)}</td>
|
|
245
|
+
<td>${escapeHtml(exec.advisory)}</td>
|
|
246
|
+
</tr>`).join('');
|
|
247
|
+
return `<section class="panel">
|
|
248
|
+
<h2>Blocked Executions (${state.blockedExecutions.length})</h2>
|
|
249
|
+
<table>
|
|
250
|
+
<thead><tr><th>Execution</th><th>Type</th><th>Source</th><th>Created</th><th>Blocking</th><th>Advisory</th></tr></thead>
|
|
251
|
+
<tbody>${rows}</tbody>
|
|
252
|
+
</table>
|
|
253
|
+
</section>`;
|
|
254
|
+
}
|
|
255
|
+
function renderRecoveryGuidance(state) {
|
|
256
|
+
const guidance = state.reconstruction.recoveryGuidance ?? [];
|
|
257
|
+
if (guidance.length === 0)
|
|
258
|
+
return '';
|
|
259
|
+
const items = guidance.slice(0, 20).map((g) => `<li>${escapeHtml(g)}</li>`).join('');
|
|
260
|
+
return `<section class="panel">
|
|
261
|
+
<h2>Operational Recovery Guidance</h2>
|
|
262
|
+
<p class="muted">Bounded, deterministic remediation hints derived from observed snapshot completeness.</p>
|
|
263
|
+
<ul>${items}</ul>
|
|
264
|
+
</section>`;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Render a self-contained HTML report. The returned string is ready to be
|
|
268
|
+
* written to disk and opened in any browser. No external assets fetched.
|
|
269
|
+
*/
|
|
270
|
+
function renderReplayHtmlReport(input) {
|
|
271
|
+
const generatedAt = input.generatedAt ?? new Date().toISOString();
|
|
272
|
+
const projectRoot = input.state.determinism.projectRoot ?? 'unknown';
|
|
273
|
+
const verify = input.verify ?? null;
|
|
274
|
+
return `<!doctype html>
|
|
275
|
+
<html lang="en">
|
|
276
|
+
<head>
|
|
277
|
+
<meta charset="utf-8" />
|
|
278
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
279
|
+
<meta name="generator" content="neurcode replay --html" />
|
|
280
|
+
<title>Neurcode · Replay Report</title>
|
|
281
|
+
<style>${STYLES}</style>
|
|
282
|
+
</head>
|
|
283
|
+
<body>
|
|
284
|
+
<main>
|
|
285
|
+
<h1>Neurcode · Replay Report</h1>
|
|
286
|
+
<p class="subtitle">Deterministic operational governance · audit-grade · same inputs → same report bytes.</p>
|
|
287
|
+
<section class="panel">
|
|
288
|
+
<dl class="kv">
|
|
289
|
+
${row('generated-at', escapeHtml(generatedAt))}
|
|
290
|
+
${row('project-root', `<code>${escapeHtml(projectRoot)}</code>`)}
|
|
291
|
+
${row('replay schema', escapeHtml(input.state.schemaVersion))}
|
|
292
|
+
</dl>
|
|
293
|
+
</section>
|
|
294
|
+
${renderReplayState(input.state, verify)}
|
|
295
|
+
${renderRuntimeCapabilities(verify)}
|
|
296
|
+
${renderPosture(verify)}
|
|
297
|
+
${renderScopeIssues(verify)}
|
|
298
|
+
${renderBlockedExecutions(input.state)}
|
|
299
|
+
${renderRecoveryGuidance(input.state)}
|
|
300
|
+
<footer>
|
|
301
|
+
<p>Replay output is deterministic. Same diff + same intent contract + same rule set → byte-identical <code>replayChecksum</code>.</p>
|
|
302
|
+
<p>Schema: <code>${escapeHtml(input.state.schemaVersion)}</code> · Generator: <code>neurcode replay --html</code> · No JavaScript, no external assets.</p>
|
|
303
|
+
</footer>
|
|
304
|
+
</main>
|
|
305
|
+
</body>
|
|
306
|
+
</html>
|
|
307
|
+
`;
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=replay-html-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-html-report.js","sourceRoot":"","sources":["../../src/utils/replay-html-report.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAuRH,wDAsCC;AA5SD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Cd,CAAC;AAEF,SAAS,UAAU,CAAC,IAAa;IAC/B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IACpD,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,KAAK,CAAC,KAAc,EAAE,IAAuC;IACpE,OAAO,sBAAsB,IAAI,KAAK,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,KAAgC,EAAE,QAAkB,EAAE,UAAoB,EAAE;IAC/F,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa;IACvC,OAAO,OAAO,UAAU,CAAC,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC;AAC1D,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAkD;IACnF,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,IAAI,IAAI,CAAmC,CAAC;IACnF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO;;;WAGA,CAAC;IACV,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9O,OAAO;;uEAE8D,UAAU,CAAC,EAAE,CAAC,aAAa,IAAI,kCAAkC,CAAC;;MAEnI,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;MAC5C,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;MAC3D,GAAG,CAAC,yBAAyB,EAAE,EAAE,CAAC,qBAAqB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;MAC9H,GAAG,CAAC,uBAAuB,EAAE,EAAE,CAAC,iCAAiC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;MACzI,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;MACtC,GAAG,CAAC,gCAAgC,EAAE,GAAG,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC;MAC3E,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;MAC3D,GAAG,CAAC,2BAA2B,EAAE,GAAG,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC;MACjE,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;MACpD,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;MAChD,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;MACpD,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;MACrD,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;;IAE5D,EAAE,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC;;;MAGrC,GAAG,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;MACzD,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,EAAE,CAAC,0BAA0B,IAAI,CAAC,CAAC,CAAC;MACxE,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,EAAE,CAAC,0BAA0B,IAAI,CAAC,CAAC,CAAC;MACxE,GAAG,CAAC,yBAAyB,EAAE,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,+BAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/J,CAAC,CAAC,CAAC,EAAE;WACF,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,MAAkD;IACvE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,IAAI,IAAI,CAAmC,CAAC;IAChF,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;;;;MAIH,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;MAC5D,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;MACxD,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;MACtD,GAAG,CAAC,yBAAyB,EAAE,UAAU,CAAC,EAAE,CAAC,qBAAqB,IAAI,CAAC,CAAC,CAAC;MACzE,GAAG,CAAC,wBAAwB,EAAE,UAAU,CAAC,EAAE,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC;MACvE,GAAG,CAAC,wBAAwB,EAAE,UAAU,CAAC,EAAE,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC;MACvE,EAAE,CAAC,eAAe,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,CAAC,IAAK,EAAE,CAAC,eAA6B,CAAC,MAAM,GAAG,CAAC;QACvG,CAAC,CAAC,GAAG,CAAC,kBAAkB,EAAE,SAAU,EAAE,CAAC,eAA4B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;QACvH,CAAC,CAAC,EAAE;;WAEC,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkD;IAC3E,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,CAAmC,CAAC;IAC7E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO;;;WAGA,CAAC;IACV,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,CAAC,MAAqB,EAAE,IAAqB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAClF,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAmC,CAAC;QAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;YAC1E,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC;gBACvE,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,CAAC;oBACrE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;YAC5B,OAAO;qBACQ,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;QACvE,WAAW,GAAG,aAAa,6BAA6B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;2BAC9D,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,oCAAoC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,4CAA4C,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;MACtM,CAAC;QACH,CAAC;QACD,OAAO;qBACU,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACnC,WAAW,GAAG,aAAa;QAC3B,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;MAC3B,CAAC;IACL,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;2BACS,WAAW,CAAC,MAAM;;;;aAIhC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;;WAE3B,CAAC,CAAC;IACX,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;gCACc,SAAS,CAAC,MAAM;;;;aAInC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;;WAEzB,CAAC,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAkB,EAAE,MAAkD;IAC/F,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAC5C,MAAM,mBAAmB,GAAG,cAAc,CAAC,oBAAoB,KAAK,OAAO;QACzE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;QACxB,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,cAAc,IAAI,IAAI,CAAkB,CAAC;IACzE,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,IAAI,CAAkB,CAAC;IAC3D,OAAO;;;MAGH,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;MACpC,GAAG,CAAC,eAAe,EAAE,0BAA0B,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC;MACnG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,EAAE,0BAA0B,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;MACrH,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;MACxG,GAAG,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;MACjD,GAAG,CAAC,2BAA2B,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC;MAC5E,GAAG,CAAC,0BAA0B,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;MACnI,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;;;UAMrH,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;UAC/C,GAAG,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;UAC1D,GAAG,CAAC,YAAY,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC;UAC5D,GAAG,CAAC,iBAAiB,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC;;;;;;UAMtE,GAAG,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC;UACtE,GAAG,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC;UAC5D,GAAG,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;UAClE,GAAG,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC;UACtE,GAAG,CAAC,WAAW,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;;;;WAInE,CAAC;AACZ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAkB;IACjD,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;qBAC7C,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QACvB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;MAC3B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO;4BACmB,KAAK,CAAC,iBAAiB,CAAC,MAAM;;;aAG7C,IAAI;;WAEN,CAAC;AACZ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAkB;IAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAC7D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrF,OAAO;;;QAGD,KAAK;WACF,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,KAAsB;IAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClE,MAAM,WAAW,GAAI,KAAK,CAAC,KAAK,CAAC,WAAwC,CAAC,WAAW,IAAI,SAAS,CAAC;IACnG,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;IACpC,OAAO;;;;;;;WAOE,MAAM;;;;;;;;QAQT,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5C,GAAG,CAAC,cAAc,EAAE,SAAS,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;QAC9D,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;;;IAG/D,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;IACtC,yBAAyB,CAAC,MAAM,CAAC;IACjC,aAAa,CAAC,MAAM,CAAC;IACrB,iBAAiB,CAAC,MAAM,CAAC;IACzB,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC;IACpC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;;;uBAGhB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;;;;;CAK3D,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime state guardrails.
|
|
3
|
+
*
|
|
4
|
+
* Detects the operational state of a project root and produces structured
|
|
5
|
+
* "what's next" guidance when a command would otherwise fail with a raw
|
|
6
|
+
* runtime / git / filesystem error.
|
|
7
|
+
*
|
|
8
|
+
* Pure, deterministic, no network. Read-only. No mutations to .neurcode/
|
|
9
|
+
* or any other on-disk state.
|
|
10
|
+
*
|
|
11
|
+
* Aesthetic discipline: subtle sophistication, no terminal theatrics.
|
|
12
|
+
* Aligned with the operational-experience refabrication phase
|
|
13
|
+
* (docs/ux/final-operational-experience-report.md).
|
|
14
|
+
*/
|
|
15
|
+
export type RuntimeStateIssue = 'not-a-git-repo' | 'no-head-commit' | 'no-neurcode-dir' | 'no-intent-pack';
|
|
16
|
+
export interface RuntimeStateSnapshot {
|
|
17
|
+
projectRoot: string;
|
|
18
|
+
isGitRepo: boolean;
|
|
19
|
+
hasHeadCommit: boolean;
|
|
20
|
+
hasNeurcodeDir: boolean;
|
|
21
|
+
hasIntentPack: boolean;
|
|
22
|
+
hasLastVerifyOutput: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function detectRuntimeState(projectRoot: string): RuntimeStateSnapshot;
|
|
25
|
+
/**
|
|
26
|
+
* Render an operational-guidance panel when a command cannot run because
|
|
27
|
+
* a prerequisite is not met. Same aesthetic as the welcome banner + the
|
|
28
|
+
* `neurcode home` panels: subtle, structured, no theatrics.
|
|
29
|
+
*
|
|
30
|
+
* The panel writes to stderr (so JSON-mode callers piping stdout get clean
|
|
31
|
+
* JSON or no output) and returns the exit code the caller should propagate.
|
|
32
|
+
*/
|
|
33
|
+
export declare function renderRuntimeStateGuidance(issue: RuntimeStateIssue, state: RuntimeStateSnapshot, options?: {
|
|
34
|
+
commandLabel?: string;
|
|
35
|
+
}): number;
|
|
36
|
+
/**
|
|
37
|
+
* Convenience: detect state + render guidance + return the exit code for
|
|
38
|
+
* the FIRST unsatisfied prerequisite (in lifecycle order). Returns null if
|
|
39
|
+
* all required prerequisites are satisfied.
|
|
40
|
+
*/
|
|
41
|
+
export declare function guardRequired(projectRoot: string, required: ReadonlyArray<RuntimeStateIssue>, options?: {
|
|
42
|
+
commandLabel?: string;
|
|
43
|
+
}): number | null;
|
|
44
|
+
//# sourceMappingURL=runtime-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../../src/utils/runtime-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAUD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAiB5E;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACtC,MAAM,CA2ER;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC1C,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GACtC,MAAM,GAAG,IAAI,CAcf"}
|