@codyswann/lisa 2.311.11 → 2.311.12
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/dist/cli/doctor-readiness-promoted-artifact.d.ts +23 -1
- package/dist/cli/doctor-readiness-promoted-artifact.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-promoted-artifact.js +109 -6
- package/dist/cli/doctor-readiness-promoted-artifact.js.map +1 -1
- package/dist/cli/doctor-readiness-release-path.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-release-path.js +11 -38
- package/dist/cli/doctor-readiness-release-path.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
|
@@ -6,6 +6,12 @@ import type { ParsedWorkflowJob, ParsedWorkflowStep } from "./doctor-readiness-w
|
|
|
6
6
|
import type { ReleasePathOutcome } from "./doctor-readiness-release-path.js";
|
|
7
7
|
/** The GitHub Actions promotion step Lisa recognizes for CI-built artifacts. */
|
|
8
8
|
export declare const PROMOTION_ACTION = "actions/download-artifact";
|
|
9
|
+
/**
|
|
10
|
+
* Whether an action step publishes something externally.
|
|
11
|
+
* @param step - The step to classify
|
|
12
|
+
* @returns True when the action is a known publishing action
|
|
13
|
+
*/
|
|
14
|
+
export declare function isPublishAction(step: ParsedWorkflowStep): boolean;
|
|
9
15
|
/**
|
|
10
16
|
* Whether an action reference is the trusted artifact-promotion action.
|
|
11
17
|
* @param uses - Raw action reference
|
|
@@ -16,9 +22,25 @@ export declare function isPromotionAction(uses: string): boolean;
|
|
|
16
22
|
* Whether the job promotes an artifact produced by another job.
|
|
17
23
|
* @param job - The publishing job
|
|
18
24
|
* @param publishStep - The step that ships
|
|
25
|
+
* @param ancestorJobs - Jobs in the publishing job's `needs:` closure
|
|
19
26
|
* @returns True when a download-artifact step is present before publication
|
|
20
27
|
*/
|
|
21
|
-
export declare function promotesValidatedArtifact(job: ParsedWorkflowJob, publishStep: ParsedWorkflowStep): boolean;
|
|
28
|
+
export declare function promotesValidatedArtifact(job: ParsedWorkflowJob, publishStep: ParsedWorkflowStep, ancestorJobs?: readonly ParsedWorkflowJob[]): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Whether a named artifact download disagrees with named ancestor uploads.
|
|
31
|
+
* @param job - The publishing job
|
|
32
|
+
* @param publishStep - The step that ships
|
|
33
|
+
* @param ancestorJobs - Jobs in the publishing job's `needs:` closure
|
|
34
|
+
* @returns True when the downloaded artifact name is not uploaded by any ancestor
|
|
35
|
+
*/
|
|
36
|
+
export declare function hasArtifactNameMismatch(job: ParsedWorkflowJob, publishStep: ParsedWorkflowStep, ancestorJobs: readonly ParsedWorkflowJob[]): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* The release job downloaded a named artifact different from anything a
|
|
39
|
+
* validating ancestor uploaded, so the shipped bytes are not the tested bytes.
|
|
40
|
+
* @param where - Evidence location label
|
|
41
|
+
* @returns The violation outcome
|
|
42
|
+
*/
|
|
43
|
+
export declare function artifactNameMismatch(where: string): ReleasePathOutcome;
|
|
22
44
|
/**
|
|
23
45
|
* A downloaded artifact without linked validation is unestablished, not clean.
|
|
24
46
|
* @param where - Evidence location label
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-promoted-artifact.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-promoted-artifact.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-promoted-artifact.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-promoted-artifact.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AA4B5D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAMjE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AA6CD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,GAAE,SAAS,iBAAiB,EAAO,GAC9C,OAAO,CAWT;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,SAAS,iBAAiB,EAAE,GACzC,OAAO,CAST;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAOtE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAQ5E"}
|
|
@@ -1,24 +1,127 @@
|
|
|
1
1
|
/** The GitHub Actions promotion step Lisa recognizes for CI-built artifacts. */
|
|
2
2
|
export const PROMOTION_ACTION = "actions/download-artifact";
|
|
3
|
+
const DOCKER_BUILD_PUSH_ACTION = "docker/build-push-action";
|
|
4
|
+
const GITHUB_RELEASE_ACTION = "softprops/action-gh-release";
|
|
5
|
+
const PYPI_PUBLISH_ACTION = "pypa/gh-action-pypi-publish";
|
|
6
|
+
const UPLOAD_ARTIFACT_ACTION = "actions/upload-artifact";
|
|
7
|
+
/**
|
|
8
|
+
* Normalize an action reference to its owner/repo component.
|
|
9
|
+
* @param uses - Raw `uses:` value
|
|
10
|
+
* @returns Lowercase action id without an `@ref`
|
|
11
|
+
*/
|
|
12
|
+
function actionId(uses) {
|
|
13
|
+
return (uses.split("@")[0] ?? "").trim().toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Whether a serialized `with:` block sets a boolean option to true.
|
|
17
|
+
* @param inputs - Flattened step inputs
|
|
18
|
+
* @param name - Input name to read
|
|
19
|
+
* @returns True when the option is explicitly true
|
|
20
|
+
*/
|
|
21
|
+
function hasTrueInput(inputs, name) {
|
|
22
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
23
|
+
return new RegExp(`(^|\\n)${escaped}:\\s*['"]?true['"]?(\\s|$)`, "i").test(inputs);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether an action step publishes something externally.
|
|
27
|
+
* @param step - The step to classify
|
|
28
|
+
* @returns True when the action is a known publishing action
|
|
29
|
+
*/
|
|
30
|
+
export function isPublishAction(step) {
|
|
31
|
+
const id = actionId(step.uses);
|
|
32
|
+
if (id === DOCKER_BUILD_PUSH_ACTION) {
|
|
33
|
+
return hasTrueInput(step.inputs, "push");
|
|
34
|
+
}
|
|
35
|
+
return id === PYPI_PUBLISH_ACTION || id === GITHUB_RELEASE_ACTION;
|
|
36
|
+
}
|
|
3
37
|
/**
|
|
4
38
|
* Whether an action reference is the trusted artifact-promotion action.
|
|
5
39
|
* @param uses - Raw action reference
|
|
6
40
|
* @returns True when the action id is exactly actions/download-artifact
|
|
7
41
|
*/
|
|
8
42
|
export function isPromotionAction(uses) {
|
|
9
|
-
|
|
10
|
-
|
|
43
|
+
return actionId(uses) === PROMOTION_ACTION;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether an action reference uploads an artifact produced by CI.
|
|
47
|
+
* @param uses - Raw action reference
|
|
48
|
+
* @returns True when the action id is exactly actions/upload-artifact
|
|
49
|
+
*/
|
|
50
|
+
function isUploadAction(uses) {
|
|
51
|
+
return actionId(uses) === UPLOAD_ARTIFACT_ACTION;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Read a scalar step input from the parser's flattened `with:` text.
|
|
55
|
+
* @param inputs - Flattened step inputs
|
|
56
|
+
* @param name - Input name to read
|
|
57
|
+
* @returns The input value, or null when absent
|
|
58
|
+
*/
|
|
59
|
+
function stepInput(inputs, name) {
|
|
60
|
+
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
61
|
+
const match = new RegExp(`(^|\\n)${escaped}:\\s*(.+)(\\n|$)`).exec(inputs);
|
|
62
|
+
const value = match?.[2]?.trim();
|
|
63
|
+
if (value === undefined || value === "") {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return value.replace(/^['"]|['"]$/g, "");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* List artifact names uploaded by jobs whose outputs have already been validated.
|
|
70
|
+
* @param validatingAncestorJobs - Validating jobs in the publishing job's `needs:` closure
|
|
71
|
+
* @returns Uploaded artifact names
|
|
72
|
+
*/
|
|
73
|
+
function uploadedArtifactNames(validatingAncestorJobs) {
|
|
74
|
+
return new Set(validatingAncestorJobs.flatMap(job => job.steps
|
|
75
|
+
.filter(step => isUploadAction(step.uses))
|
|
76
|
+
.map(step => stepInput(step.inputs, "name"))
|
|
77
|
+
.filter((name) => name !== null)));
|
|
11
78
|
}
|
|
12
79
|
/**
|
|
13
80
|
* Whether the job promotes an artifact produced by another job.
|
|
14
81
|
* @param job - The publishing job
|
|
15
82
|
* @param publishStep - The step that ships
|
|
83
|
+
* @param ancestorJobs - Jobs in the publishing job's `needs:` closure
|
|
16
84
|
* @returns True when a download-artifact step is present before publication
|
|
17
85
|
*/
|
|
18
|
-
export function promotesValidatedArtifact(job, publishStep) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
86
|
+
export function promotesValidatedArtifact(job, publishStep, ancestorJobs = []) {
|
|
87
|
+
const uploads = uploadedArtifactNames(ancestorJobs);
|
|
88
|
+
return job.steps.slice(0, job.steps.indexOf(publishStep)).some(step => {
|
|
89
|
+
if (!isPromotionAction(step.uses)) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
const downloadName = stepInput(step.inputs, "name");
|
|
93
|
+
return (downloadName === null || uploads.size === 0 || uploads.has(downloadName));
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Whether a named artifact download disagrees with named ancestor uploads.
|
|
98
|
+
* @param job - The publishing job
|
|
99
|
+
* @param publishStep - The step that ships
|
|
100
|
+
* @param ancestorJobs - Jobs in the publishing job's `needs:` closure
|
|
101
|
+
* @returns True when the downloaded artifact name is not uploaded by any ancestor
|
|
102
|
+
*/
|
|
103
|
+
export function hasArtifactNameMismatch(job, publishStep, ancestorJobs) {
|
|
104
|
+
const uploads = uploadedArtifactNames(ancestorJobs);
|
|
105
|
+
return job.steps.slice(0, job.steps.indexOf(publishStep)).some(step => {
|
|
106
|
+
if (!isPromotionAction(step.uses)) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
const downloadName = stepInput(step.inputs, "name");
|
|
110
|
+
return downloadName !== null && !uploads.has(downloadName);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The release job downloaded a named artifact different from anything a
|
|
115
|
+
* validating ancestor uploaded, so the shipped bytes are not the tested bytes.
|
|
116
|
+
* @param where - Evidence location label
|
|
117
|
+
* @returns The violation outcome
|
|
118
|
+
*/
|
|
119
|
+
export function artifactNameMismatch(where) {
|
|
120
|
+
return {
|
|
121
|
+
kind: "violation",
|
|
122
|
+
evidence: `${where} downloads a named artifact that no validating ancestor uploads, ` +
|
|
123
|
+
"so the release path cannot prove the shipped artifact is the one CI tested",
|
|
124
|
+
};
|
|
22
125
|
}
|
|
23
126
|
/**
|
|
24
127
|
* A downloaded artifact without linked validation is unestablished, not clean.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-promoted-artifact.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-promoted-artifact.ts"],"names":[],"mappings":"AAUA,gFAAgF;AAChF,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-promoted-artifact.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-promoted-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-release-path.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-release-path.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor-readiness-release-path.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-release-path.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAezC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAgF3E,sDAAsD;AACtD,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/B;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAW7D;AA4BD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,iBAAiB,GACrB,SAAS,kBAAkB,EAAE,CAE/B;AAmJD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,iBAAiB,EACtB,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,YAAY,CAAC,EAAE,SAAS,cAAc,EAAE,GACvC,SAAS,kBAAkB,EAAE,CAuC/B"}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
|
-
import { ancestorJobs, reusableCallerValidation, } from "./doctor-readiness-reusable-callers.js";
|
|
2
|
-
import { isPromotionAction, promotesValidatedArtifact, PROMOTION_ACTION, unresolvedPromotedArtifact, } from "./doctor-readiness-promoted-artifact.js";
|
|
1
|
+
import { ancestorJobs as ancestors, reusableCallerValidation, } from "./doctor-readiness-reusable-callers.js";
|
|
2
|
+
import { artifactNameMismatch, hasArtifactNameMismatch, isPublishAction, isPromotionAction, promotesValidatedArtifact, PROMOTION_ACTION, unresolvedPromotedArtifact, } from "./doctor-readiness-promoted-artifact.js";
|
|
3
3
|
export { PROMOTION_ACTION } from "./doctor-readiness-promoted-artifact.js";
|
|
4
|
-
const
|
|
5
|
-
"npm publish",
|
|
6
|
-
"docker push",
|
|
7
|
-
"gh release upload",
|
|
8
|
-
"aws s3 sync",
|
|
9
|
-
"cdk deploy",
|
|
10
|
-
"eas submit",
|
|
11
|
-
];
|
|
4
|
+
const PUBLISH_VERB = /(npm publish|docker push|gh release upload|aws s3 sync|cdk deploy|eas submit)/;
|
|
12
5
|
const DOCKER_BUILD_PUSH_ACTION = "docker/build-push-action";
|
|
13
|
-
const PYPI_PUBLISH_ACTION = "pypa/gh-action-pypi-publish";
|
|
14
|
-
const GITHUB_RELEASE_ACTION = "softprops/action-gh-release";
|
|
15
6
|
/** Commands that actually run a test suite. */
|
|
16
7
|
const VALIDATING_COMMANDS = [
|
|
17
8
|
/\b(npm|yarn|pnpm|bun|npx|bunx)\s+(run\s+)?test\b/,
|
|
@@ -101,28 +92,6 @@ const DRY_RUN_FLAG = /--dry[-_]?run\b/;
|
|
|
101
92
|
function actionId(uses) {
|
|
102
93
|
return (uses.split("@")[0] ?? "").trim().toLowerCase();
|
|
103
94
|
}
|
|
104
|
-
/**
|
|
105
|
-
* Whether a serialized `with:` block sets a boolean option to true.
|
|
106
|
-
* @param inputs - Flattened step inputs
|
|
107
|
-
* @param name - Input name to read
|
|
108
|
-
* @returns True when the option is explicitly true
|
|
109
|
-
*/
|
|
110
|
-
function hasTrueInput(inputs, name) {
|
|
111
|
-
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
112
|
-
return new RegExp(`(^|\\n)${escaped}:\\s*['"]?true['"]?(\\s|$)`, "i").test(inputs);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Whether an action step publishes something externally.
|
|
116
|
-
* @param step - The step to classify
|
|
117
|
-
* @returns True when the action is a known publishing action
|
|
118
|
-
*/
|
|
119
|
-
function isPublishAction(step) {
|
|
120
|
-
const id = actionId(step.uses);
|
|
121
|
-
if (id === DOCKER_BUILD_PUSH_ACTION) {
|
|
122
|
-
return hasTrueInput(step.inputs, "push");
|
|
123
|
-
}
|
|
124
|
-
return id === PYPI_PUBLISH_ACTION || id === GITHUB_RELEASE_ACTION;
|
|
125
|
-
}
|
|
126
95
|
/**
|
|
127
96
|
* Whether a step actually puts an artifact in front of users. A `--dry-run`
|
|
128
97
|
* invocation names a publish verb but ships nothing, so faulting its release
|
|
@@ -131,8 +100,7 @@ function isPublishAction(step) {
|
|
|
131
100
|
* @returns True when the step really publishes
|
|
132
101
|
*/
|
|
133
102
|
function isPublishStep(step) {
|
|
134
|
-
return ((
|
|
135
|
-
!DRY_RUN_FLAG.test(step.run)) ||
|
|
103
|
+
return ((PUBLISH_VERB.test(step.run) && !DRY_RUN_FLAG.test(step.run)) ||
|
|
136
104
|
isPublishAction(step));
|
|
137
105
|
}
|
|
138
106
|
/**
|
|
@@ -169,7 +137,7 @@ function validationPrecedesPublish(workflow, job, publishStep, allWorkflows) {
|
|
|
169
137
|
"validated") {
|
|
170
138
|
return true;
|
|
171
139
|
}
|
|
172
|
-
if (
|
|
140
|
+
if (ancestors(workflow, job).some(isValidatingJob)) {
|
|
173
141
|
return true;
|
|
174
142
|
}
|
|
175
143
|
return job.steps
|
|
@@ -260,16 +228,21 @@ function offlineUnresolvableTrigger(workflow, defaultBranches, allWorkflows) {
|
|
|
260
228
|
export function assessReleasePaths(workflow, job, defaultBranches, allWorkflows) {
|
|
261
229
|
return findPublishSteps(job).map(publishStep => {
|
|
262
230
|
const where = `${workflow.file} job \`${job.id}\` step \`${describeStep(publishStep)}\``;
|
|
231
|
+
const validatingAncestors = ancestors(workflow, job).filter(isValidatingJob);
|
|
263
232
|
const validated = validationPrecedesPublish(workflow, job, publishStep, allWorkflows);
|
|
264
233
|
if (shipsSelfBuiltArtifact(job, publishStep)) {
|
|
265
234
|
return validated
|
|
266
235
|
? rebuildPastValidation(where)
|
|
267
236
|
: unvalidatedSelfBuild(where, workflow, defaultBranches, allWorkflows);
|
|
268
237
|
}
|
|
238
|
+
if (validated &&
|
|
239
|
+
hasArtifactNameMismatch(job, publishStep, validatingAncestors)) {
|
|
240
|
+
return artifactNameMismatch(where);
|
|
241
|
+
}
|
|
269
242
|
if (validated) {
|
|
270
243
|
return { kind: "clean" };
|
|
271
244
|
}
|
|
272
|
-
if (promotesValidatedArtifact(job, publishStep))
|
|
245
|
+
if (promotesValidatedArtifact(job, publishStep, validatingAncestors))
|
|
273
246
|
return unresolvedPromotedArtifact(where);
|
|
274
247
|
// Neither built here nor promoted from CI, and nothing validating precedes it:
|
|
275
248
|
// the link between what ships and what was validated is simply not observable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-release-path.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-release-path.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"doctor-readiness-release-path.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-release-path.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"brace-expansion": ">=5.0.8"
|
|
116
116
|
},
|
|
117
117
|
"name": "@codyswann/lisa",
|
|
118
|
-
"version": "2.311.
|
|
118
|
+
"version": "2.311.12",
|
|
119
119
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
120
120
|
"main": "dist/index.js",
|
|
121
121
|
"exports": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.311.
|
|
3
|
+
"version": "2.311.12",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.311.
|
|
3
|
+
"version": "2.311.12",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.311.
|
|
3
|
+
"version": "2.311.12",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.311.
|
|
3
|
+
"version": "2.311.12",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.311.
|
|
3
|
+
"version": "2.311.12",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|