@codyswann/lisa 2.233.1 → 2.235.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/dist/cli/doctor.d.ts +9 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +3 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/ui-ci-quality-jobs-compute.d.ts +46 -0
- package/dist/cli/ui-ci-quality-jobs-compute.d.ts.map +1 -0
- package/dist/cli/ui-ci-quality-jobs-compute.js +178 -0
- package/dist/cli/ui-ci-quality-jobs-compute.js.map +1 -0
- package/dist/cli/ui-ci-quality-jobs-parse.d.ts +15 -0
- package/dist/cli/ui-ci-quality-jobs-parse.d.ts.map +1 -0
- package/dist/cli/ui-ci-quality-jobs-parse.js +109 -0
- package/dist/cli/ui-ci-quality-jobs-parse.js.map +1 -0
- package/dist/cli/ui-ci-quality-jobs.d.ts +22 -0
- package/dist/cli/ui-ci-quality-jobs.d.ts.map +1 -0
- package/dist/cli/ui-ci-quality-jobs.js +160 -0
- package/dist/cli/ui-ci-quality-jobs.js.map +1 -0
- package/dist/cli/ui-cmd.d.ts +2 -0
- package/dist/cli/ui-cmd.d.ts.map +1 -1
- package/dist/cli/ui-cmd.js +9 -1
- package/dist/cli/ui-cmd.js.map +1 -1
- package/dist/cli/ui-lisa-version.d.ts +36 -0
- package/dist/cli/ui-lisa-version.d.ts.map +1 -0
- package/dist/cli/ui-lisa-version.js +86 -0
- package/dist/cli/ui-lisa-version.js.map +1 -0
- 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
- package/ui/index.html +274 -40
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -23,6 +23,15 @@ export interface DoctorDependencies {
|
|
|
23
23
|
setExitCode: (code: number) => void;
|
|
24
24
|
write: (message: string) => void;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Check Lisa's installed version against npm.
|
|
28
|
+
* Exported so the console live-status probe can reuse the same check as
|
|
29
|
+
* `lisa doctor` — never invent a second npm update-check path.
|
|
30
|
+
* @param deps - Runtime dependencies
|
|
31
|
+
* @param offline - Skip network check
|
|
32
|
+
* @returns Doctor check result
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkVersion(deps: DoctorDependencies, offline: boolean): Promise<DoctorCheck>;
|
|
26
35
|
/**
|
|
27
36
|
* Run Lisa doctor checks.
|
|
28
37
|
* @param targetPath - Optional project path
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,mDAAmD;AACnD,KAAK,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAO3C,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,mDAAmD;AACnD,KAAK,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAO3C,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,KAAK,CAAC;IACxB,cAAc,EAAE,OAAO,cAAc,CAAC;IACtC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAWD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,CAAC,CAyBtB;AAgQD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,aAAa,EACtB,YAAY,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC7C,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -24,11 +24,13 @@ const DEFAULT_DEPENDENCIES = {
|
|
|
24
24
|
};
|
|
25
25
|
/**
|
|
26
26
|
* Check Lisa's installed version against npm.
|
|
27
|
+
* Exported so the console live-status probe can reuse the same check as
|
|
28
|
+
* `lisa doctor` — never invent a second npm update-check path.
|
|
27
29
|
* @param deps - Runtime dependencies
|
|
28
30
|
* @param offline - Skip network check
|
|
29
31
|
* @returns Doctor check result
|
|
30
32
|
*/
|
|
31
|
-
async function checkVersion(deps, offline) {
|
|
33
|
+
export async function checkVersion(deps, offline) {
|
|
32
34
|
if (offline) {
|
|
33
35
|
return {
|
|
34
36
|
name: VERSION_CHECK_NAME,
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAC7C,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;AACjE,MAAM,4BAA4B,GAAG,8BAA8B,CAAC;AA4BpE,MAAM,oBAAoB,GAAuB;IAC/C,SAAS,EAAE,KAAK;IAChB,cAAc;IACd,WAAW,EAAE,IAAI,CAAC,EAAE;QAClB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;CACvC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure join of ci.yml inputs, Lisa gate config, and secret presence for the
|
|
3
|
+
* CI Quality jobs Active column.
|
|
4
|
+
* @module cli/ui-ci-quality-jobs-compute
|
|
5
|
+
*/
|
|
6
|
+
import { type JsonObject, type JsonValue } from "../sync/json-path.js";
|
|
7
|
+
/** Inputs the project's `ci.yml` forwards into Lisa's quality workflow. */
|
|
8
|
+
export interface CiWorkflowInputs {
|
|
9
|
+
readonly skipJobs: readonly string[];
|
|
10
|
+
readonly verifyEnforced: boolean;
|
|
11
|
+
readonly complianceFramework: string;
|
|
12
|
+
readonly requireApproval: boolean;
|
|
13
|
+
readonly zapTargetUrl: string;
|
|
14
|
+
}
|
|
15
|
+
/** Presence-only secret inventory, or an honest unknown. */
|
|
16
|
+
export type RepoSecretsPresence = {
|
|
17
|
+
readonly state: "value";
|
|
18
|
+
readonly names: ReadonlySet<string>;
|
|
19
|
+
} | {
|
|
20
|
+
readonly state: "unknown";
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
readonly message: string;
|
|
23
|
+
};
|
|
24
|
+
/** One Quality-jobs row for the Active column. */
|
|
25
|
+
export type CiQualityJobEntry = {
|
|
26
|
+
readonly [key: string]: JsonValue;
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly label: string;
|
|
29
|
+
/** `true` active, `false` off, `null` unknown (never a false off). */
|
|
30
|
+
readonly active: boolean | null;
|
|
31
|
+
readonly reason: string;
|
|
32
|
+
};
|
|
33
|
+
/** Structured probe value for the Quality jobs table. */
|
|
34
|
+
export type CiQualityJobsValue = {
|
|
35
|
+
readonly [key: string]: JsonValue;
|
|
36
|
+
readonly jobs: CiQualityJobEntry[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Join ci.yml inputs, gate config, and secret presence into Active-column rows.
|
|
40
|
+
* @param inputs - Parsed ci.yml quality inputs
|
|
41
|
+
* @param config - Merged Lisa config
|
|
42
|
+
* @param secrets - Presence-only secret inventory
|
|
43
|
+
* @returns Probe value for the Quality jobs table
|
|
44
|
+
*/
|
|
45
|
+
export declare function computeCiQualityJobs(inputs: CiWorkflowInputs, config: JsonObject, secrets: RepoSecretsPresence): CiQualityJobsValue;
|
|
46
|
+
//# sourceMappingURL=ui-ci-quality-jobs-compute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-ci-quality-jobs-compute.d.ts","sourceRoot":"","sources":["../../src/cli/ui-ci-quality-jobs-compute.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAE9B,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GAChE;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,kDAAkD;AAClD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,CAAC;CACpC,CAAC;AA2JF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAqCpB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure join of ci.yml inputs, Lisa gate config, and secret presence for the
|
|
3
|
+
* CI Quality jobs Active column.
|
|
4
|
+
* @module cli/ui-ci-quality-jobs-compute
|
|
5
|
+
*/
|
|
6
|
+
import { isJsonObject, } from "../sync/json-path.js";
|
|
7
|
+
/** Jobs shown in the console Quality jobs table, in display order. */
|
|
8
|
+
const QUALITY_JOB_SPECS = [
|
|
9
|
+
{ id: "lint", label: "🧹 Lint" },
|
|
10
|
+
{ id: "lint_slow", label: "🐢 Slow Lint Rules" },
|
|
11
|
+
{ id: "typecheck", label: "🔍 Type Check" },
|
|
12
|
+
{ id: "format", label: "📐 Check Formatting" },
|
|
13
|
+
{ id: "build", label: "🏗️ Build" },
|
|
14
|
+
{ id: "test:unit", label: "🧪 Run Unit Tests" },
|
|
15
|
+
{ id: "test:integration", label: "🧪 Run Integration Tests" },
|
|
16
|
+
{ id: "test:e2e", label: "🧪 Run E2E Tests" },
|
|
17
|
+
{ id: "playwright_e2e", label: "🎭 Playwright E2E Tests" },
|
|
18
|
+
{
|
|
19
|
+
id: "maestro_e2e",
|
|
20
|
+
label: "📱 Maestro Cloud E2E",
|
|
21
|
+
secret: "MAESTRO_API_KEY",
|
|
22
|
+
},
|
|
23
|
+
{ id: "e2e_coverage", label: "🧭 E2E Route Coverage" },
|
|
24
|
+
{ id: "test:mutation", label: "🧬 Mutation Testing Gate", gate: "mutation" },
|
|
25
|
+
{
|
|
26
|
+
id: "verification_coverage",
|
|
27
|
+
label: "✅ Verification Coverage",
|
|
28
|
+
gate: "verify_enforced",
|
|
29
|
+
},
|
|
30
|
+
{ id: "dead_code", label: "🗑️ Dead Code Detection" },
|
|
31
|
+
{ id: "sg_scan", label: "🔎 AST Grep Scan" },
|
|
32
|
+
{ id: "npm_security_scan", label: "🔒 Security Scan" },
|
|
33
|
+
{
|
|
34
|
+
id: "sonarcloud",
|
|
35
|
+
label: "🔍 SonarCloud SAST",
|
|
36
|
+
secret: "SONAR_TOKEN",
|
|
37
|
+
},
|
|
38
|
+
{ id: "snyk", label: "🛡️ Snyk", secret: "SNYK_TOKEN" },
|
|
39
|
+
{
|
|
40
|
+
id: "secret_scanning",
|
|
41
|
+
label: "🔐 GitGuardian",
|
|
42
|
+
secret: "GITGUARDIAN_API_KEY",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "license_compliance",
|
|
46
|
+
label: "📜 FOSSA",
|
|
47
|
+
secret: "FOSSA_API_KEY",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "zap_baseline",
|
|
51
|
+
label: "🕷️ OWASP ZAP Baseline",
|
|
52
|
+
gate: "zap_target_url",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "compliance_validation",
|
|
56
|
+
label: "🧾 Compliance Validation",
|
|
57
|
+
gate: "compliance_framework",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "approval_gate",
|
|
61
|
+
label: "🚦 Approval Gate",
|
|
62
|
+
gate: "require_approval",
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* Read whether the mutation gate is enabled in merged Lisa config.
|
|
67
|
+
* @param config - Merged config
|
|
68
|
+
* @returns True only when explicitly enabled
|
|
69
|
+
*/
|
|
70
|
+
function mutationGateEnabled(config) {
|
|
71
|
+
if (!isJsonObject(config.quality)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (!isJsonObject(config.quality.mutation)) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (!isJsonObject(config.quality.mutation.gate)) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return config.quality.mutation.gate.enabled === true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve a config/workflow gate into an off-reason, or undefined when open.
|
|
84
|
+
* @param gate - Gate kind on the job spec
|
|
85
|
+
* @param inputs - ci.yml inputs
|
|
86
|
+
* @param config - Merged Lisa config
|
|
87
|
+
* @returns Off reason when the gate closes the job
|
|
88
|
+
*/
|
|
89
|
+
function gateOffReason(gate, inputs, config) {
|
|
90
|
+
if (gate === "mutation" && !mutationGateEnabled(config)) {
|
|
91
|
+
return "mutation gate is disabled";
|
|
92
|
+
}
|
|
93
|
+
if (gate === "verify_enforced" && !inputs.verifyEnforced) {
|
|
94
|
+
return "verify_enforced is off";
|
|
95
|
+
}
|
|
96
|
+
if (gate === "compliance_framework" &&
|
|
97
|
+
(inputs.complianceFramework.length === 0 ||
|
|
98
|
+
inputs.complianceFramework === "none" ||
|
|
99
|
+
inputs.complianceFramework === "(none)")) {
|
|
100
|
+
return "no compliance_framework configured";
|
|
101
|
+
}
|
|
102
|
+
if (gate === "zap_target_url" && inputs.zapTargetUrl.length === 0) {
|
|
103
|
+
return "zap_target_url is not set";
|
|
104
|
+
}
|
|
105
|
+
if (gate === "require_approval" && !inputs.requireApproval) {
|
|
106
|
+
return "require_approval is off";
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Resolve secret presence into active/off/unknown for one job.
|
|
112
|
+
* @param secretName - Required Actions secret
|
|
113
|
+
* @param secrets - Presence inventory or unknown
|
|
114
|
+
* @returns Job active state and reason
|
|
115
|
+
*/
|
|
116
|
+
function secretActiveState(secretName, secrets) {
|
|
117
|
+
if (secrets.state === "unknown") {
|
|
118
|
+
return {
|
|
119
|
+
active: null,
|
|
120
|
+
reason: secrets.reason === "not-authenticated"
|
|
121
|
+
? "not authenticated"
|
|
122
|
+
: secrets.message,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (!secrets.names.has(secretName)) {
|
|
126
|
+
return {
|
|
127
|
+
active: false,
|
|
128
|
+
reason: `${secretName} secret is not set`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return { active: true, reason: "" };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Join ci.yml inputs, gate config, and secret presence into Active-column rows.
|
|
135
|
+
* @param inputs - Parsed ci.yml quality inputs
|
|
136
|
+
* @param config - Merged Lisa config
|
|
137
|
+
* @param secrets - Presence-only secret inventory
|
|
138
|
+
* @returns Probe value for the Quality jobs table
|
|
139
|
+
*/
|
|
140
|
+
export function computeCiQualityJobs(inputs, config, secrets) {
|
|
141
|
+
const skipped = new Set(inputs.skipJobs);
|
|
142
|
+
const jobs = QUALITY_JOB_SPECS.map((spec) => {
|
|
143
|
+
if (skipped.has(spec.id)) {
|
|
144
|
+
return {
|
|
145
|
+
id: spec.id,
|
|
146
|
+
label: spec.label,
|
|
147
|
+
active: false,
|
|
148
|
+
reason: `ci.yml skip_jobs includes ${spec.id}`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const closed = gateOffReason(spec.gate, inputs, config);
|
|
152
|
+
if (closed !== undefined) {
|
|
153
|
+
return {
|
|
154
|
+
id: spec.id,
|
|
155
|
+
label: spec.label,
|
|
156
|
+
active: false,
|
|
157
|
+
reason: closed,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (spec.secret !== undefined) {
|
|
161
|
+
const secretState = secretActiveState(spec.secret, secrets);
|
|
162
|
+
return {
|
|
163
|
+
id: spec.id,
|
|
164
|
+
label: spec.label,
|
|
165
|
+
active: secretState.active,
|
|
166
|
+
reason: secretState.reason,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
id: spec.id,
|
|
171
|
+
label: spec.label,
|
|
172
|
+
active: true,
|
|
173
|
+
reason: "",
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
return { jobs };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=ui-ci-quality-jobs-compute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-ci-quality-jobs-compute.js","sourceRoot":"","sources":["../../src/cli/ui-ci-quality-jobs-compute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CiWorkflowInputs } from "./ui-ci-quality-jobs-compute.js";
|
|
2
|
+
/**
|
|
3
|
+
* Read `ci.yml` from the project workflows directory.
|
|
4
|
+
* @param cwd - Project root
|
|
5
|
+
* @returns File contents
|
|
6
|
+
*/
|
|
7
|
+
export declare function readCiYmlFile(cwd: string): Promise<string>;
|
|
8
|
+
/**
|
|
9
|
+
* Parse the project's calling `ci.yml` into quality workflow inputs.
|
|
10
|
+
* @param cwd - Project root
|
|
11
|
+
* @param readCiYml - Injectable file reader
|
|
12
|
+
* @returns Normalized inputs
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseCiWorkflowInputs(cwd: string, readCiYml?: (projectRoot: string) => Promise<string>): Promise<CiWorkflowInputs>;
|
|
15
|
+
//# sourceMappingURL=ui-ci-quality-jobs-parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-ci-quality-jobs-parse.d.ts","sourceRoot":"","sources":["../../src/cli/ui-ci-quality-jobs-parse.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhE;AAiFD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAiB,GAClE,OAAO,CAAC,gBAAgB,CAAC,CAmB3B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse the project's calling `ci.yml` quality workflow inputs.
|
|
3
|
+
* @module cli/ui-ci-quality-jobs-parse
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import yaml from "js-yaml";
|
|
8
|
+
import { isJsonObject } from "../sync/json-path.js";
|
|
9
|
+
/**
|
|
10
|
+
* Read `ci.yml` from the project workflows directory.
|
|
11
|
+
* @param cwd - Project root
|
|
12
|
+
* @returns File contents
|
|
13
|
+
*/
|
|
14
|
+
export async function readCiYmlFile(cwd) {
|
|
15
|
+
return await readFile(path.join(cwd, ".github", "workflows", "ci.yml"), "utf8");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Split a comma-separated skip_jobs string into trimmed non-empty ids.
|
|
19
|
+
* @param raw - Raw skip_jobs value from YAML
|
|
20
|
+
* @returns Normalized job ids
|
|
21
|
+
*/
|
|
22
|
+
function parseSkipJobs(raw) {
|
|
23
|
+
if (typeof raw !== "string") {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
return raw
|
|
27
|
+
.split(",")
|
|
28
|
+
.map(part => part.trim())
|
|
29
|
+
.filter(part => part.length > 0);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Coerce a YAML scalar to boolean with an explicit default.
|
|
33
|
+
* @param value - Candidate YAML value
|
|
34
|
+
* @param fallback - Default when absent or unreadable
|
|
35
|
+
* @returns Boolean
|
|
36
|
+
*/
|
|
37
|
+
function asBoolean(value, fallback) {
|
|
38
|
+
if (typeof value === "boolean") {
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
if (value === "true") {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
if (value === "false") {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
return fallback;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Coerce a YAML scalar to a trimmed string with a default.
|
|
51
|
+
* @param value - Candidate YAML value
|
|
52
|
+
* @param fallback - Default when absent
|
|
53
|
+
* @returns String
|
|
54
|
+
*/
|
|
55
|
+
function asString(value, fallback) {
|
|
56
|
+
if (typeof value === "string") {
|
|
57
|
+
return value.trim();
|
|
58
|
+
}
|
|
59
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
60
|
+
return String(value);
|
|
61
|
+
}
|
|
62
|
+
return fallback;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Find the `with:` map on the job that calls Lisa's quality workflow.
|
|
66
|
+
* @param document - Parsed ci.yml root
|
|
67
|
+
* @returns The with-block object, or undefined
|
|
68
|
+
*/
|
|
69
|
+
function qualityWithBlock(document) {
|
|
70
|
+
if (!isJsonObject(document) || !isJsonObject(document.jobs)) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
for (const job of Object.values(document.jobs)) {
|
|
74
|
+
if (!isJsonObject(job) || typeof job.uses !== "string") {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!job.uses.includes("quality.yml") &&
|
|
78
|
+
!job.uses.includes("quality-rails.yml")) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (isJsonObject(job.with)) {
|
|
82
|
+
return job.with;
|
|
83
|
+
}
|
|
84
|
+
return {};
|
|
85
|
+
}
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse the project's calling `ci.yml` into quality workflow inputs.
|
|
90
|
+
* @param cwd - Project root
|
|
91
|
+
* @param readCiYml - Injectable file reader
|
|
92
|
+
* @returns Normalized inputs
|
|
93
|
+
*/
|
|
94
|
+
export async function parseCiWorkflowInputs(cwd, readCiYml = readCiYmlFile) {
|
|
95
|
+
const source = await readCiYml(cwd);
|
|
96
|
+
const document = yaml.load(source);
|
|
97
|
+
const withBlock = qualityWithBlock(document);
|
|
98
|
+
if (withBlock === undefined) {
|
|
99
|
+
throw new Error("ci.yml does not call quality.yml or quality-rails.yml with a with-block");
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
skipJobs: parseSkipJobs(withBlock.skip_jobs),
|
|
103
|
+
verifyEnforced: asBoolean(withBlock.verify_enforced, false),
|
|
104
|
+
complianceFramework: asString(withBlock.compliance_framework, "none").toLowerCase(),
|
|
105
|
+
requireApproval: asBoolean(withBlock.require_approval, false),
|
|
106
|
+
zapTargetUrl: asString(withBlock.zap_target_url, ""),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=ui-ci-quality-jobs-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-ci-quality-jobs-parse.js","sourceRoot":"","sources":["../../src/cli/ui-ci-quality-jobs-parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type JsonObject } from "../sync/json-path.js";
|
|
2
|
+
import { type CiQualityJobsValue, type RepoSecretsPresence } from "./ui-ci-quality-jobs-compute.js";
|
|
3
|
+
import type { StatusProbe } from "./ui-status.js";
|
|
4
|
+
export { computeCiQualityJobs, type CiQualityJobEntry, type CiQualityJobsValue, type CiWorkflowInputs, type RepoSecretsPresence, } from "./ui-ci-quality-jobs-compute.js";
|
|
5
|
+
export { parseCiWorkflowInputs } from "./ui-ci-quality-jobs-parse.js";
|
|
6
|
+
/** Stable probe id consumed by the console Active-column hydrator. */
|
|
7
|
+
export declare const CI_QUALITY_JOBS_PROBE_ID = "ci-quality-jobs";
|
|
8
|
+
/** Injectable collaborators for focused unit tests. */
|
|
9
|
+
export interface CiQualityJobsDependencies {
|
|
10
|
+
readonly listSecrets?: (cwd: string, timeoutMs: number, signal: AbortSignal, repo: string | undefined) => Promise<RepoSecretsPresence>;
|
|
11
|
+
readonly readCiYml?: (cwd: string) => Promise<string>;
|
|
12
|
+
readonly resolveRepo?: (cwd: string, config: JsonObject) => string | undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create the CI quality-jobs Active-column probe.
|
|
16
|
+
* @param cwd - Project root
|
|
17
|
+
* @param config - Merged Lisa config (mutation gate, github slug)
|
|
18
|
+
* @param dependencies - Injectable readers for tests
|
|
19
|
+
* @returns Live-status probe
|
|
20
|
+
*/
|
|
21
|
+
export declare function createCiQualityJobsProbe(cwd: string, config: JsonObject, dependencies?: CiQualityJobsDependencies): StatusProbe<CiQualityJobsValue>;
|
|
22
|
+
//# sourceMappingURL=ui-ci-quality-jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-ci-quality-jobs.d.ts","sourceRoot":"","sources":["../../src/cli/ui-ci-quality-jobs.ts"],"names":[],"mappings":"AASA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAKzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EACL,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,GACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,oBAAoB,CAAC;AAE1D,uDAAuD;AACvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GAAG,SAAS,KACrB,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,KACf,MAAM,GAAG,SAAS,CAAC;CACzB;AAiID;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,EAClB,YAAY,GAAE,yBAA8B,GAC3C,WAAW,CAAC,kBAAkB,CAAC,CAuCjC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live-status probe for the CI Quality jobs Active column.
|
|
3
|
+
*
|
|
4
|
+
* Three-input join: `ci.yml` skip/gate inputs, Lisa gate config, and
|
|
5
|
+
* presence-only `gh secret list`. READ-ONLY — never fabricates "off" for
|
|
6
|
+
* secrets when authentication is unavailable.
|
|
7
|
+
* @module cli/ui-ci-quality-jobs
|
|
8
|
+
*/
|
|
9
|
+
import { execFile } from "node:child_process";
|
|
10
|
+
import { isJsonObject } from "../sync/json-path.js";
|
|
11
|
+
import { computeCiQualityJobs, } from "./ui-ci-quality-jobs-compute.js";
|
|
12
|
+
import { parseCiWorkflowInputs, readCiYmlFile, } from "./ui-ci-quality-jobs-parse.js";
|
|
13
|
+
export { computeCiQualityJobs, } from "./ui-ci-quality-jobs-compute.js";
|
|
14
|
+
export { parseCiWorkflowInputs } from "./ui-ci-quality-jobs-parse.js";
|
|
15
|
+
/** Stable probe id consumed by the console Active-column hydrator. */
|
|
16
|
+
export const CI_QUALITY_JOBS_PROBE_ID = "ci-quality-jobs";
|
|
17
|
+
/**
|
|
18
|
+
* Resolve `owner/repo` from Lisa config when both fields are non-empty strings.
|
|
19
|
+
* @param config - Merged Lisa config
|
|
20
|
+
* @returns Repo slug, or undefined when absent
|
|
21
|
+
*/
|
|
22
|
+
function repoFromConfig(config) {
|
|
23
|
+
if (!isJsonObject(config.github)) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
const org = config.github.org;
|
|
27
|
+
const repo = config.github.repo;
|
|
28
|
+
if (typeof org === "string" &&
|
|
29
|
+
org.trim().length > 0 &&
|
|
30
|
+
typeof repo === "string" &&
|
|
31
|
+
repo.trim().length > 0) {
|
|
32
|
+
return `${org.trim()}/${repo.trim()}`;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Classify a failed `gh secret list` into not-authenticated vs other unknown.
|
|
38
|
+
* @param error - Child-process or parse error
|
|
39
|
+
* @returns Unknown secrets presence
|
|
40
|
+
*/
|
|
41
|
+
function classifySecretListError(error) {
|
|
42
|
+
const message = error instanceof Error && error.message.trim().length > 0
|
|
43
|
+
? error.message
|
|
44
|
+
: "Unable to list repository secrets";
|
|
45
|
+
const lower = message.toLowerCase();
|
|
46
|
+
const notAuthenticated = lower.includes("401") ||
|
|
47
|
+
lower.includes("bad credentials") ||
|
|
48
|
+
lower.includes("not logged in") ||
|
|
49
|
+
lower.includes("authentication required") ||
|
|
50
|
+
lower.includes("to re-authenticate") ||
|
|
51
|
+
lower.includes("gh auth login");
|
|
52
|
+
return {
|
|
53
|
+
state: "unknown",
|
|
54
|
+
reason: notAuthenticated ? "not-authenticated" : "secret-list-failed",
|
|
55
|
+
message: notAuthenticated ? "GitHub CLI is not authenticated" : message,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse `gh secret list --json name` stdout into a presence set.
|
|
60
|
+
* @param stdout - Command stdout
|
|
61
|
+
* @returns Presence-only secret names
|
|
62
|
+
*/
|
|
63
|
+
function secretNamesFromJson(stdout) {
|
|
64
|
+
const parsed = JSON.parse(stdout);
|
|
65
|
+
if (!Array.isArray(parsed)) {
|
|
66
|
+
throw new TypeError("gh secret list did not return an array");
|
|
67
|
+
}
|
|
68
|
+
return new Set(parsed.flatMap(entry => {
|
|
69
|
+
if (typeof entry !== "object" || entry === null) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
const name = Reflect.get(entry, "name");
|
|
73
|
+
return typeof name === "string" && name.trim().length > 0 ? [name] : [];
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* List Actions secret *names* only via `gh secret list --json name`.
|
|
78
|
+
* @param cwd - Project root
|
|
79
|
+
* @param timeoutMs - Child-process timeout
|
|
80
|
+
* @param signal - Probe cancellation
|
|
81
|
+
* @param repo - Optional `owner/repo` for `-R`
|
|
82
|
+
* @returns Presence set or unknown
|
|
83
|
+
*/
|
|
84
|
+
const listRepoSecretNames = async (cwd, timeoutMs, signal, repo) => await new Promise((resolve, reject) => {
|
|
85
|
+
const args = repo !== undefined && repo.length > 0
|
|
86
|
+
? ["secret", "list", "--json", "name", "-R", repo]
|
|
87
|
+
: ["secret", "list", "--json", "name"];
|
|
88
|
+
const ghExecutable = "gh";
|
|
89
|
+
execFile(
|
|
90
|
+
// eslint-disable-next-line sonarjs/no-os-command-from-path -- fixed user-installed gh executable
|
|
91
|
+
ghExecutable, [...args], { cwd, signal, timeout: timeoutMs, encoding: "utf8" }, (error, stdout) => {
|
|
92
|
+
if (error !== null) {
|
|
93
|
+
reject(error);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
resolve({ state: "value", names: secretNamesFromJson(stdout) });
|
|
98
|
+
}
|
|
99
|
+
catch (parseError) {
|
|
100
|
+
reject(parseError);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* Load secret presence, mapping command failures to honest unknown states.
|
|
106
|
+
* @param listSecrets - Injectable secret lister
|
|
107
|
+
* @param cwd - Project root
|
|
108
|
+
* @param timeoutMs - Child-process timeout
|
|
109
|
+
* @param signal - Probe cancellation
|
|
110
|
+
* @param repo - Optional repo slug
|
|
111
|
+
* @returns Presence inventory or unknown
|
|
112
|
+
*/
|
|
113
|
+
async function loadSecretsPresence(listSecrets, cwd, timeoutMs, signal, repo) {
|
|
114
|
+
try {
|
|
115
|
+
return await listSecrets(cwd, timeoutMs + 250, signal, repo);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return classifySecretListError(error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create the CI quality-jobs Active-column probe.
|
|
123
|
+
* @param cwd - Project root
|
|
124
|
+
* @param config - Merged Lisa config (mutation gate, github slug)
|
|
125
|
+
* @param dependencies - Injectable readers for tests
|
|
126
|
+
* @returns Live-status probe
|
|
127
|
+
*/
|
|
128
|
+
export function createCiQualityJobsProbe(cwd, config, dependencies = {}) {
|
|
129
|
+
const timeoutMs = 5_000;
|
|
130
|
+
const listSecrets = dependencies.listSecrets ?? listRepoSecretNames;
|
|
131
|
+
const readCiYml = dependencies.readCiYml ?? readCiYmlFile;
|
|
132
|
+
const resolveRepo = dependencies.resolveRepo ?? ((_projectRoot, cfg) => repoFromConfig(cfg));
|
|
133
|
+
return {
|
|
134
|
+
id: CI_QUALITY_JOBS_PROBE_ID,
|
|
135
|
+
timeoutMs,
|
|
136
|
+
run: async (signal) => {
|
|
137
|
+
try {
|
|
138
|
+
const inputs = await parseCiWorkflowInputs(cwd, readCiYml);
|
|
139
|
+
const secrets = await loadSecretsPresence(listSecrets, cwd, timeoutMs, signal, resolveRepo(cwd, config));
|
|
140
|
+
return {
|
|
141
|
+
state: "value",
|
|
142
|
+
value: computeCiQualityJobs(inputs, config, secrets),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const message = error instanceof Error && error.message.trim().length > 0
|
|
147
|
+
? error.message
|
|
148
|
+
: "Unable to read ci.yml quality inputs";
|
|
149
|
+
const missing = message.includes("ENOENT") ||
|
|
150
|
+
message.toLowerCase().includes("no such file");
|
|
151
|
+
return {
|
|
152
|
+
state: "unknown",
|
|
153
|
+
reason: missing ? "ci-yml-missing" : "ci-yml-unreadable",
|
|
154
|
+
message,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=ui-ci-quality-jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-ci-quality-jobs.js","sourceRoot":"","sources":["../../src/cli/ui-ci-quality-jobs.ts"],"names":[],"mappings":"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"}
|