@codyswann/lisa 2.281.0 → 2.283.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.
Files changed (134) hide show
  1. package/all/copy-contents/gitignore +2 -0
  2. package/all/create-only/.lisa/DEPENDENCY_DECISIONS.md +175 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -1
  5. package/dist/cli/index.js +20 -15
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/standards-proof-cmd.d.ts +7 -0
  8. package/dist/cli/standards-proof-cmd.d.ts.map +1 -0
  9. package/dist/cli/standards-proof-cmd.js +14 -0
  10. package/dist/cli/standards-proof-cmd.js.map +1 -0
  11. package/dist/cli/ui-setup-readiness-local.d.ts +2 -1
  12. package/dist/cli/ui-setup-readiness-local.d.ts.map +1 -1
  13. package/dist/cli/ui-setup-readiness-local.js +4 -2
  14. package/dist/cli/ui-setup-readiness-local.js.map +1 -1
  15. package/dist/cli/ui-setup-readiness.d.ts.map +1 -1
  16. package/dist/cli/ui-setup-readiness.js +3 -2
  17. package/dist/cli/ui-setup-readiness.js.map +1 -1
  18. package/dist/cli/update-check-hook.d.ts +19 -0
  19. package/dist/cli/update-check-hook.d.ts.map +1 -0
  20. package/dist/cli/update-check-hook.js +36 -0
  21. package/dist/cli/update-check-hook.js.map +1 -0
  22. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  23. package/dist/core/upstream-evidence-manifest.js +49 -6
  24. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  25. package/dist/standards/capture.d.ts +41 -0
  26. package/dist/standards/capture.d.ts.map +1 -0
  27. package/dist/standards/capture.js +196 -0
  28. package/dist/standards/capture.js.map +1 -0
  29. package/dist/standards/contract.d.ts +45 -0
  30. package/dist/standards/contract.d.ts.map +1 -0
  31. package/dist/standards/contract.js +175 -0
  32. package/dist/standards/contract.js.map +1 -0
  33. package/dist/standards/git-state.d.ts +30 -0
  34. package/dist/standards/git-state.d.ts.map +1 -0
  35. package/dist/standards/git-state.js +179 -0
  36. package/dist/standards/git-state.js.map +1 -0
  37. package/dist/standards/index.d.ts +8 -0
  38. package/dist/standards/index.d.ts.map +1 -0
  39. package/dist/standards/index.js +8 -0
  40. package/dist/standards/index.js.map +1 -0
  41. package/dist/standards/readiness.d.ts +11 -0
  42. package/dist/standards/readiness.d.ts.map +1 -0
  43. package/dist/standards/readiness.js +170 -0
  44. package/dist/standards/readiness.js.map +1 -0
  45. package/dist/standards/registry.d.ts +42 -0
  46. package/dist/standards/registry.d.ts.map +1 -0
  47. package/dist/standards/registry.js +330 -0
  48. package/dist/standards/registry.js.map +1 -0
  49. package/dist/standards/storage-reasons.d.ts +15 -0
  50. package/dist/standards/storage-reasons.d.ts.map +1 -0
  51. package/dist/standards/storage-reasons.js +48 -0
  52. package/dist/standards/storage-reasons.js.map +1 -0
  53. package/dist/standards/storage.d.ts +36 -0
  54. package/dist/standards/storage.d.ts.map +1 -0
  55. package/dist/standards/storage.js +330 -0
  56. package/dist/standards/storage.js.map +1 -0
  57. package/dist/standards/test-evidence.d.ts +19 -0
  58. package/dist/standards/test-evidence.d.ts.map +1 -0
  59. package/dist/standards/test-evidence.js +195 -0
  60. package/dist/standards/test-evidence.js.map +1 -0
  61. package/package.json +1 -1
  62. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +21 -3
  65. package/plugins/lisa/rules/eager/dependency-decision-records.md +32 -0
  66. package/plugins/lisa/rules/reference/dependency-decision-records.md +140 -0
  67. package/plugins/lisa/scripts/doctor-report.mjs +266 -22
  68. package/plugins/lisa/skills/lisa-doctor/SKILL.md +21 -3
  69. package/plugins/lisa-agy/plugin.json +1 -1
  70. package/plugins/lisa-agy/scripts/doctor-report.mjs +266 -22
  71. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +21 -3
  72. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  75. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-copilot/rules/eager/dependency-decision-records.md +32 -0
  79. package/plugins/lisa-copilot/rules/reference/dependency-decision-records.md +140 -0
  80. package/plugins/lisa-copilot/scripts/doctor-report.mjs +266 -22
  81. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +21 -3
  82. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-cursor/rules/dependency-decision-records-reference.mdc +145 -0
  84. package/plugins/lisa-cursor/rules/dependency-decision-records.mdc +37 -0
  85. package/plugins/lisa-cursor/scripts/doctor-report.mjs +266 -22
  86. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +21 -3
  87. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  89. package/plugins/lisa-expo-agy/plugin.json +1 -1
  90. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  94. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  95. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  99. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  100. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  104. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  105. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  109. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  110. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  112. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  114. package/plugins/lisa-rails-agy/plugin.json +1 -1
  115. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  116. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  117. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  118. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  119. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  120. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  121. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  122. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  123. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  124. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  125. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  126. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  127. package/plugins/src/base/rules/eager/dependency-decision-records.md +32 -0
  128. package/plugins/src/base/rules/reference/dependency-decision-records.md +140 -0
  129. package/plugins/src/base/scripts/doctor-report.mjs +266 -22
  130. package/plugins/src/base/skills/lisa-doctor/SKILL.md +21 -3
  131. package/rails/copy-overwrite/lefthook.yml +9 -11
  132. package/rails/copy-overwrite/scripts/lisa-clean-git-env.sh +13 -0
  133. package/typescript/copy-contents/.husky/pre-push +9 -0
  134. package/ui/index.html +3 -2
@@ -0,0 +1,179 @@
1
+ /** Bounded, no-shell Git observation for standards proof freshness. */
2
+ import { execFile } from "node:child_process";
3
+ import { realpath } from "node:fs/promises";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ const GIT_TIMEOUT_MS = 5_000;
7
+ const MAX_GIT_OUTPUT_BYTES = 64 * 1024;
8
+ /**
9
+ * Read canonical identity, commit/tree objects, and complete nonignored dirt.
10
+ * Git optional locks and fsmonitor are disabled because UI observation must be
11
+ * read-only and safe to repeat.
12
+ * @param projectRoot - Path within the repository
13
+ * @returns Bounded repository state
14
+ */
15
+ export async function readStandardsGitState(projectRoot) {
16
+ const requested = await realpath(projectRoot);
17
+ const root = await realpath(await git(requested, ["rev-parse", "--show-toplevel"]));
18
+ const remoteNames = (await git(root, ["remote"], true))
19
+ .split("\n")
20
+ .map(value => value.trim())
21
+ .filter(Boolean);
22
+ const remoteUrls = remoteNames.includes("origin")
23
+ ? (await git(root, ["remote", "get-url", "--all", "origin"]))
24
+ .split("\n")
25
+ .map(value => value.trim())
26
+ .filter(Boolean)
27
+ : [];
28
+ if (remoteUrls.length !== 1) {
29
+ throw new Error(remoteUrls.length === 0
30
+ ? "Repository origin is missing."
31
+ : "Repository origin is ambiguous.");
32
+ }
33
+ const [head, tree, status] = await Promise.all([
34
+ git(root, ["rev-parse", "HEAD"]),
35
+ git(root, ["rev-parse", "HEAD^{tree}"]),
36
+ git(root, [
37
+ "status",
38
+ "--porcelain=v1",
39
+ "--untracked-files=all",
40
+ "--ignore-submodules=none",
41
+ "--",
42
+ ".",
43
+ ":(exclude).lisa/standards/latest.json",
44
+ ], true),
45
+ ]);
46
+ return Object.freeze({
47
+ root,
48
+ identity: normalizeGitRemoteIdentity(remoteUrls[0]),
49
+ head,
50
+ tree,
51
+ clean: status.length === 0,
52
+ });
53
+ }
54
+ /**
55
+ * Require a parent commit for the non-vacuous threshold-ratchet comparison.
56
+ * @param projectRoot - Canonical repository root
57
+ * @returns Parent commit object identifier
58
+ */
59
+ export async function requireStandardsBaseCommit(projectRoot) {
60
+ try {
61
+ return await git(projectRoot, ["rev-parse", "HEAD^"]);
62
+ }
63
+ catch {
64
+ const isShallow = (await git(projectRoot, ["rev-parse", "--is-shallow-repository"])) ===
65
+ "true";
66
+ if (isShallow) {
67
+ throw new Error("Standards proof requires more Git history for threshold comparison in a shallow clone. Run `git fetch --deepen=1` and retry.");
68
+ }
69
+ throw new Error("Standards proof requires a parent commit for threshold comparison.");
70
+ }
71
+ }
72
+ /**
73
+ * Normalize HTTPS, SSH URL, and SCP-like remotes to host[:port]/owner/repo.
74
+ * Credentials are never retained and default transport ports are removed.
75
+ * @param remote - One configured origin URL
76
+ * @returns Stable lowercase repository identity
77
+ */
78
+ export function normalizeGitRemoteIdentity(remote) {
79
+ const trimmed = remote.trim();
80
+ const scp = /^(?:[^@/:]+@)?([^/:]+):(.+)$/u.exec(trimmed);
81
+ if (scp && !trimmed.includes("://")) {
82
+ return finishIdentity(scp[1], scp[2]);
83
+ }
84
+ const parsed = parseRemoteUrl(trimmed);
85
+ if (!["https:", "http:", "ssh:", "git:"].includes(parsed.protocol)) {
86
+ throw new Error("Repository origin uses an unsupported protocol.");
87
+ }
88
+ const defaultPort = (parsed.protocol === "https:" && parsed.port === "443") ||
89
+ (parsed.protocol === "http:" && parsed.port === "80") ||
90
+ ((parsed.protocol === "ssh:" || parsed.protocol === "git:") &&
91
+ parsed.port === "22");
92
+ const authority = `${parsed.hostname}${parsed.port && !defaultPort ? `:${parsed.port}` : ""}`;
93
+ return finishIdentity(authority, parsed.pathname);
94
+ }
95
+ /**
96
+ * Complete and validate a normalized repository identity.
97
+ * @param authority - Lower-level remote host and optional non-default port
98
+ * @param pathname - Remote repository path
99
+ * @returns Normalized stable repository identity
100
+ */
101
+ function finishIdentity(authority, pathname) {
102
+ const normalizedPath = pathname
103
+ .split("/")
104
+ .filter(Boolean)
105
+ .join("/")
106
+ .replace(/\.git$/iu, "")
107
+ .toLowerCase();
108
+ const normalizedAuthority = authority.toLowerCase();
109
+ if (normalizedAuthority.length === 0 ||
110
+ normalizedPath.length === 0 ||
111
+ normalizedPath.includes("..") ||
112
+ !normalizedPath.includes("/")) {
113
+ throw new Error("Repository origin does not identify an owner/repository.");
114
+ }
115
+ return `${normalizedAuthority}/${normalizedPath}`;
116
+ }
117
+ /**
118
+ * Parse one URL without retaining credentials in any result.
119
+ * @param remote - Remote URL candidate
120
+ * @returns Parsed URL object
121
+ */
122
+ function parseRemoteUrl(remote) {
123
+ try {
124
+ return new URL(remote);
125
+ }
126
+ catch {
127
+ throw new Error("Repository origin is not a supported Git remote URL.");
128
+ }
129
+ }
130
+ /**
131
+ * Run one bounded read-only Git command without shell interpolation.
132
+ * @param cwd - Repository working directory
133
+ * @param args - Fixed Git arguments
134
+ * @param allowEmpty - Whether an empty stdout value is valid
135
+ * @returns Trimmed bounded stdout
136
+ */
137
+ async function git(cwd, args, allowEmpty = false) {
138
+ try {
139
+ const { stdout } = await execFileAsync("git", [
140
+ "-c",
141
+ "core.fsmonitor=false",
142
+ "-c",
143
+ "core.untrackedCache=false",
144
+ ...args,
145
+ ], {
146
+ cwd,
147
+ timeout: GIT_TIMEOUT_MS,
148
+ maxBuffer: MAX_GIT_OUTPUT_BYTES,
149
+ encoding: "utf8",
150
+ env: {
151
+ ...getProcessEnvironment(),
152
+ GIT_OPTIONAL_LOCKS: "0",
153
+ GIT_DIR: undefined,
154
+ GIT_WORK_TREE: undefined,
155
+ GIT_INDEX_FILE: undefined,
156
+ },
157
+ });
158
+ const output = stdout.trim();
159
+ if (!allowEmpty && output.length === 0) {
160
+ throw new Error("Git returned no repository state.");
161
+ }
162
+ return output;
163
+ }
164
+ catch (error) {
165
+ if (error instanceof Error && error.message.startsWith("Repository ")) {
166
+ throw error;
167
+ }
168
+ throw new Error("Git repository state could not be observed.");
169
+ }
170
+ }
171
+ /**
172
+ * Read the CLI environment at one reviewable process boundary.
173
+ * @returns Current process environment
174
+ */
175
+ function getProcessEnvironment() {
176
+ // eslint-disable-next-line no-restricted-syntax -- Git must inherit the operator toolchain while clearing repository redirects
177
+ return process.env;
178
+ }
179
+ //# sourceMappingURL=git-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-state.js","sourceRoot":"","sources":["../../src/standards/git-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./capture.js";
2
+ export * from "./contract.js";
3
+ export * from "./git-state.js";
4
+ export * from "./readiness.js";
5
+ export * from "./registry.js";
6
+ export * from "./storage.js";
7
+ export * from "./test-evidence.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/standards/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./capture.js";
2
+ export * from "./contract.js";
3
+ export * from "./git-state.js";
4
+ export * from "./readiness.js";
5
+ export * from "./registry.js";
6
+ export * from "./storage.js";
7
+ export * from "./test-evidence.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/standards/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SetupReadinessFinding } from "../cli/ui-setup-readiness-contract.js";
2
+ /**
3
+ * Validate the stored proof against current Git, stack, config, registry, and
4
+ * Lisa version without executing project commands or writing any state.
5
+ * Strict recomputation rejects casual tampering; defending against a malicious
6
+ * actor who can rewrite both repository inputs and local proof is out of scope.
7
+ * @param projectRoot - Canonical project root
8
+ * @returns setup.standards proof contribution
9
+ */
10
+ export declare function standardsProofFinding(projectRoot: string): Promise<SetupReadinessFinding>;
11
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/standards/readiness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAoBnF;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,CAAC,CA8BhC"}
@@ -0,0 +1,170 @@
1
+ /** Read-only setup.standards proof validation and freshness recomputation. */
2
+ import { getPackageVersion } from "../cli/version.js";
3
+ import { readConfinedDetectedStacks } from "../cli/ui-detected-stacks.js";
4
+ import { readConfinedMergedConfig } from "../cli/ui-confined-project-read.js";
5
+ import { setupFinding } from "../cli/ui-setup-readiness-contract.js";
6
+ import { readStandardsGitState } from "./git-state.js";
7
+ import { resolveStandardsCheckPlan, } from "./registry.js";
8
+ import { readStandardsProof } from "./storage.js";
9
+ const STANDARDS_FINDING_ID = "setup.standards";
10
+ const PROOF_COMMAND_HINT = "Run lisa standards-proof.";
11
+ const OBSERVATION_REASONS = Object.freeze({
12
+ git: "Git repository identity and state could not be observed",
13
+ stacks: "project stack detection could not be completed",
14
+ config: "local Lisa configuration is malformed or unreadable",
15
+ plan: "required standards check plan is incomplete or unavailable",
16
+ generic: "current standards proof inputs could not be observed",
17
+ });
18
+ /**
19
+ * Validate the stored proof against current Git, stack, config, registry, and
20
+ * Lisa version without executing project commands or writing any state.
21
+ * Strict recomputation rejects casual tampering; defending against a malicious
22
+ * actor who can rewrite both repository inputs and local proof is out of scope.
23
+ * @param projectRoot - Canonical project root
24
+ * @returns setup.standards proof contribution
25
+ */
26
+ export async function standardsProofFinding(projectRoot) {
27
+ const stored = await readStandardsProof(projectRoot);
28
+ if (stored.status === "missing") {
29
+ return setupFinding(STANDARDS_FINDING_ID, "warn", `Standards proof is missing. ${PROOF_COMMAND_HINT}`);
30
+ }
31
+ if (stored.status === "unreadable") {
32
+ return setupFinding(STANDARDS_FINDING_ID, "fail", `Standards proof is unreadable: ${stored.reason}. ${PROOF_COMMAND_HINT}`);
33
+ }
34
+ const proof = stored.proof;
35
+ if (proof.lisaVersion !== getPackageVersion()) {
36
+ return stale("Lisa version changed");
37
+ }
38
+ const gitObservation = await observeCurrentInput(async () => await readStandardsGitState(projectRoot), OBSERVATION_REASONS.git);
39
+ if (gitObservation.status === "unavailable")
40
+ return gitObservation.finding;
41
+ const repositoryCause = repositoryStaleCause(proof, gitObservation.value);
42
+ if (repositoryCause !== undefined)
43
+ return stale(repositoryCause);
44
+ const observation = await observeCurrentPlanInputs(gitObservation.value);
45
+ if (observation.status === "unavailable")
46
+ return observation.finding;
47
+ return evaluateProofFreshness(proof, observation.value);
48
+ }
49
+ /**
50
+ * Observe current project and plan inputs without running quality commands.
51
+ * @param git - Previously validated repository state
52
+ * @returns Available plan inputs or the first fail-closed finding
53
+ */
54
+ async function observeCurrentPlanInputs(git) {
55
+ const stackObservation = await observeCurrentInput(async () => await readConfinedDetectedStacks(git.root), OBSERVATION_REASONS.stacks);
56
+ if (stackObservation.status === "unavailable")
57
+ return stackObservation;
58
+ const projectTypes = stackObservation.value;
59
+ const configObservation = await observeCurrentInput(async () => await readConfinedMergedConfig(git.root), OBSERVATION_REASONS.config);
60
+ if (configObservation.status === "unavailable")
61
+ return configObservation;
62
+ const config = configObservation.value;
63
+ const planObservation = await observeCurrentInput(async () => await resolveStandardsCheckPlan(git.root, projectTypes, config), OBSERVATION_REASONS.plan);
64
+ if (planObservation.status === "unavailable")
65
+ return planObservation;
66
+ return {
67
+ status: "available",
68
+ value: {
69
+ projectTypes,
70
+ plan: planObservation.value,
71
+ },
72
+ };
73
+ }
74
+ /**
75
+ * Compare a stored proof with freshly observed inputs.
76
+ * @param proof - Strict stored standards proof
77
+ * @param current - Fresh repository and plan inputs
78
+ * @returns Current pass or stale/unavailable finding
79
+ */
80
+ function evaluateProofFreshness(proof, current) {
81
+ try {
82
+ const cause = planStaleCause(proof, current);
83
+ if (cause !== undefined)
84
+ return stale(cause);
85
+ return setupFinding(STANDARDS_FINDING_ID, "pass", "Managed standards and automated lint, analysis, test, guardrail, and threshold conformance are current for this Git artifact.");
86
+ }
87
+ catch {
88
+ return observationFailed(OBSERVATION_REASONS.generic);
89
+ }
90
+ }
91
+ /**
92
+ * Find the first repository-state mismatch.
93
+ * @param proof - Stored proof
94
+ * @param git - Current repository state
95
+ * @returns Operator-readable stale cause, when present
96
+ */
97
+ function repositoryStaleCause(proof, git) {
98
+ if (!git.clean)
99
+ return "tracked or nonignored worktree state changed";
100
+ if (git.identity !== proof.repository.identity)
101
+ return "repository identity changed";
102
+ if (git.head !== proof.repository.head)
103
+ return "HEAD changed";
104
+ if (git.tree !== proof.repository.tree)
105
+ return "Git tree changed";
106
+ return undefined;
107
+ }
108
+ /**
109
+ * Find the first project-plan or result mismatch.
110
+ * @param proof - Stored proof
111
+ * @param current - Current project types and standards plan
112
+ * @returns Operator-readable stale cause, when present
113
+ */
114
+ function planStaleCause(proof, current) {
115
+ const { plan, projectTypes } = current;
116
+ if (JSON.stringify(projectTypes) !== JSON.stringify(proof.projectTypes))
117
+ return "detected project types changed";
118
+ if (plan.configDigest !== proof.configDigest)
119
+ return "Lisa configuration changed";
120
+ if (plan.registryDigest !== proof.registryDigest)
121
+ return "standards registry changed";
122
+ const expected = plan.checks.map(check => check.id);
123
+ if (JSON.stringify(expected) !== JSON.stringify(proof.applicableChecks))
124
+ return "required check membership changed";
125
+ if (hasIncompleteResults(proof, plan))
126
+ return "required check results are incomplete";
127
+ return undefined;
128
+ }
129
+ /**
130
+ * Determine whether any stored result differs from its required check.
131
+ * @param proof - Stored proof
132
+ * @param plan - Current standards check plan
133
+ * @returns Whether required result evidence is incomplete
134
+ */
135
+ function hasIncompleteResults(proof, plan) {
136
+ return proof.results.some((result, index) => result.check !== plan.checks[index]?.id ||
137
+ result.category !== plan.checks[index]?.category ||
138
+ result.status !== "pass");
139
+ }
140
+ /**
141
+ * Create a stale-proof warning with the remediation command.
142
+ * @param cause - Operator-readable stale cause
143
+ * @returns Stale standards finding
144
+ */
145
+ function stale(cause) {
146
+ return setupFinding(STANDARDS_FINDING_ID, "warn", `Standards proof is stale: ${cause}. ${PROOF_COMMAND_HINT}`);
147
+ }
148
+ /**
149
+ * Create a fail-closed observation warning with the remediation command.
150
+ * @param reason - Sanitized observation failure reason
151
+ * @returns Fail-closed standards finding
152
+ */
153
+ function observationFailed(reason) {
154
+ return setupFinding(STANDARDS_FINDING_ID, "warn", `Standards proof freshness could not be established: ${reason}. ${PROOF_COMMAND_HINT}`);
155
+ }
156
+ /**
157
+ * Convert one throwing observation into a fail-closed result.
158
+ * @param operation - Read-only operation to execute
159
+ * @param reason - Sanitized reason to expose if observation fails
160
+ * @returns Available value or sanitized unavailable finding
161
+ */
162
+ async function observeCurrentInput(operation, reason) {
163
+ try {
164
+ return { status: "available", value: await operation() };
165
+ }
166
+ catch {
167
+ return { status: "unavailable", finding: observationFailed(reason) };
168
+ }
169
+ }
170
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/standards/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ProjectType } from "../core/config.js";
2
+ import { type JsonObject } from "../sync/json-path.js";
3
+ import type { StandardsCheckCategory } from "./contract.js";
4
+ import { type TestEvidenceFormat } from "./test-evidence.js";
5
+ /** One fixed, no-shell command in the current standards registry. */
6
+ export interface StandardsCheckSpec {
7
+ readonly id: string;
8
+ readonly category: StandardsCheckCategory;
9
+ readonly argv: readonly [string, ...string[]];
10
+ readonly timeoutMs: number;
11
+ readonly testEvidence?: TestEvidenceFormat;
12
+ readonly environment?: Readonly<Record<string, string>>;
13
+ }
14
+ /** Fully resolved current check plan and its tamper-evident registry digest. */
15
+ export interface StandardsCheckPlan {
16
+ readonly checks: readonly StandardsCheckSpec[];
17
+ readonly registryDigest: string;
18
+ readonly configDigest: string;
19
+ }
20
+ /**
21
+ * Resolve the exact ordered union of checks for current detected stacks.
22
+ * Missing managed scripts and threshold tooling fail before any command runs.
23
+ * @param projectRoot - Canonical project root
24
+ * @param projectTypes - Expanded, canonical detected types
25
+ * @param config - Current bounded merged Lisa config
26
+ * @returns Closed current check plan
27
+ */
28
+ export declare function resolveStandardsCheckPlan(// eslint-disable-line max-lines-per-function -- the closed multi-stack registry is one auditable ordered plan
29
+ projectRoot: string, projectTypes: readonly ProjectType[], config: JsonObject): Promise<StandardsCheckPlan>;
30
+ /**
31
+ * Digest only configuration that changes standards applicability or policy.
32
+ * @param config - Current merged Lisa config
33
+ * @returns Canonical standards configuration digest
34
+ */
35
+ export declare function digestStandardsConfig(config: JsonObject): string;
36
+ /**
37
+ * Return a canonical SHA-256 digest without retaining config values.
38
+ * @param value - JSON-like value to digest
39
+ * @returns Canonical SHA-256 digest
40
+ */
41
+ export declare function digestStandardsValue(value: unknown): string;
42
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/standards/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAyKD;;;;;;;GAOG;AAEH,wBAAsB,yBAAyB,CAAE,8GAA8G;AAC7J,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,SAAS,WAAW,EAAE,EACpC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,kBAAkB,CAAC,CA8G7B;AAqBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAKhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE3D"}