@codyswann/lisa 3.40.5 → 3.41.1
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/all/copy-overwrite/scripts/lisa-gates.mjs +234 -1
- package/dist/cli/doctor-skip-jobs-migration.d.ts +48 -0
- package/dist/cli/doctor-skip-jobs-migration.d.ts.map +1 -0
- package/dist/cli/doctor-skip-jobs-migration.js +271 -0
- package/dist/cli/doctor-skip-jobs-migration.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +7 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +1 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +7 -0
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +12 -4
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/core/workflow-reference-guard.d.ts +17 -0
- package/dist/core/workflow-reference-guard.d.ts.map +1 -0
- package/dist/core/workflow-reference-guard.js +145 -0
- package/dist/core/workflow-reference-guard.js.map +1 -0
- package/dist/strategies/package-lisa.d.ts +2 -1
- package/dist/strategies/package-lisa.d.ts.map +1 -1
- package/dist/strategies/package-lisa.js +168 -42
- package/dist/strategies/package-lisa.js.map +1 -1
- package/expo/package-lisa/package.lisa.json +3 -3
- package/package.json +3 -3
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +20 -0
- 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-copilot/skills/lisa-doctor/SKILL.md +20 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +20 -0
- 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/plugins/src/base/skills/lisa-doctor/SKILL.md +20 -0
- package/typescript/package-lisa/package.lisa.json +2 -2
|
@@ -452,6 +452,213 @@ export const REGISTRY = Object.freeze({
|
|
|
452
452
|
},
|
|
453
453
|
});
|
|
454
454
|
|
|
455
|
+
/**
|
|
456
|
+
* Every `quality.yml` job that resolves through the gate façade, and its gate.
|
|
457
|
+
*
|
|
458
|
+
* This table and the two below exist so that the answer to "which gate replaces
|
|
459
|
+
* this `skip_jobs` token" can be read in a CONSUMER. It could not be, before:
|
|
460
|
+
* the pairs lived in one of Lisa's own test fixtures, which no consumer
|
|
461
|
+
* installs, so `lisa doctor` running in a caller repository and an agent working
|
|
462
|
+
* in a caller checkout both had nothing authoritative to consult.
|
|
463
|
+
*
|
|
464
|
+
* Eleven of the pairs cannot be recovered by transforming the name — `lint` is
|
|
465
|
+
* `code-style`, `sg_scan` is `structural-rules`, `work_item_traceability` is
|
|
466
|
+
* `traceability`. An underscore-to-hyphen guess gets a minority of them right,
|
|
467
|
+
* and being wrong here does not break a build: it declares the WRONG gate
|
|
468
|
+
* `off`, so a check silently stops running while the configuration reads
|
|
469
|
+
* deliberate. That is why this ships as data rather than as advice.
|
|
470
|
+
*
|
|
471
|
+
* It is STATIC on purpose. A consumer holds no copy of `quality.yml` — it calls
|
|
472
|
+
* the reusable workflow by ref — so the table cannot be derived where it is
|
|
473
|
+
* read. `tests/integration/quality-gate-skip-jobs-mapping.test.ts` derives it
|
|
474
|
+
* from the workflow in the one repository that has the workflow and fails when
|
|
475
|
+
* the two disagree, which is what keeps a static copy true.
|
|
476
|
+
*/
|
|
477
|
+
export const QUALITY_JOB_GATES = Object.freeze({
|
|
478
|
+
lint: "code-style",
|
|
479
|
+
lint_slow: "code-style-slow",
|
|
480
|
+
typecheck: "type-correctness",
|
|
481
|
+
verification_coverage: "coverage-adequacy",
|
|
482
|
+
test_unit: "test-correctness",
|
|
483
|
+
test_mutation: "test-meaningfulness",
|
|
484
|
+
test_integration: "test-integration",
|
|
485
|
+
playwright_e2e_aggregate: "e2e-browser",
|
|
486
|
+
format: "format-conformance",
|
|
487
|
+
build: "build-integrity",
|
|
488
|
+
work_item_traceability: "traceability",
|
|
489
|
+
performance_budget: "performance-budget",
|
|
490
|
+
test_node_suites: "test-node-suites",
|
|
491
|
+
environment_reset: "environment-reset",
|
|
492
|
+
environment_reseed: "environment-reseed",
|
|
493
|
+
dead_code: "dead-code",
|
|
494
|
+
sg_scan: "structural-rules",
|
|
495
|
+
npm_security_scan: "dependency-vulnerability",
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Every `skip_jobs` token `quality.yml` honours or advertises, and the jobs it
|
|
500
|
+
* suppresses.
|
|
501
|
+
*
|
|
502
|
+
* Keyed by TOKEN, not by job id, because the two differ and the difference is
|
|
503
|
+
* invisible from either side: the token is `test:unit` and the job is
|
|
504
|
+
* `test_unit`, so a table keyed on job ids answers "no such token" for three of
|
|
505
|
+
* the tokens that do have gates.
|
|
506
|
+
*
|
|
507
|
+
* An empty array is a real entry, not a placeholder. `github_issue` is
|
|
508
|
+
* advertised by the input's own description and honoured by no job at all — it
|
|
509
|
+
* suppresses nothing today, which a consumer deleting it deserves to be told
|
|
510
|
+
* rather than left to infer from a check that never changed.
|
|
511
|
+
*/
|
|
512
|
+
export const SKIP_JOB_TOKENS = Object.freeze({
|
|
513
|
+
lint: Object.freeze(["lint"]),
|
|
514
|
+
lint_slow: Object.freeze(["lint_slow"]),
|
|
515
|
+
typecheck: Object.freeze(["typecheck"]),
|
|
516
|
+
e2e_coverage: Object.freeze(["e2e_coverage"]),
|
|
517
|
+
state_classification: Object.freeze(["state_classification"]),
|
|
518
|
+
bdd_coverage: Object.freeze(["bdd_coverage"]),
|
|
519
|
+
learnings_budget: Object.freeze(["learnings_budget"]),
|
|
520
|
+
"test:unit": Object.freeze(["test_unit"]),
|
|
521
|
+
"test:mutation": Object.freeze(["test_mutation"]),
|
|
522
|
+
"test:integration": Object.freeze(["test_integration"]),
|
|
523
|
+
"test:e2e": Object.freeze(["test_e2e"]),
|
|
524
|
+
maestro_e2e: Object.freeze(["maestro_e2e"]),
|
|
525
|
+
// Three jobs, one token, and only the last of them has a façade. Reporting
|
|
526
|
+
// this as a clean swap would be the most expensive wrong answer in the table:
|
|
527
|
+
// the shards keep running, so an operator who deleted the token would see the
|
|
528
|
+
// work continue and conclude the declaration had not taken effect.
|
|
529
|
+
playwright_e2e: Object.freeze([
|
|
530
|
+
"playwright_e2e_setup",
|
|
531
|
+
"playwright_e2e",
|
|
532
|
+
"playwright_e2e_aggregate",
|
|
533
|
+
]),
|
|
534
|
+
format: Object.freeze(["format"]),
|
|
535
|
+
build: Object.freeze(["build"]),
|
|
536
|
+
skipped_required_checks: Object.freeze(["skipped_required_checks"]),
|
|
537
|
+
threshold_ratchet: Object.freeze(["threshold_ratchet"]),
|
|
538
|
+
work_item_traceability: Object.freeze(["work_item_traceability"]),
|
|
539
|
+
test_node_suites: Object.freeze(["test_node_suites"]),
|
|
540
|
+
environment_reset: Object.freeze(["environment_reset"]),
|
|
541
|
+
environment_reseed: Object.freeze(["environment_reseed"]),
|
|
542
|
+
dead_code: Object.freeze(["dead_code"]),
|
|
543
|
+
sg_scan: Object.freeze(["sg_scan"]),
|
|
544
|
+
floor_collisions: Object.freeze(["floor_collisions"]),
|
|
545
|
+
npm_security_scan: Object.freeze(["npm_security_scan"]),
|
|
546
|
+
sonarcloud: Object.freeze(["sonarcloud"]),
|
|
547
|
+
snyk: Object.freeze(["snyk"]),
|
|
548
|
+
secret_scanning: Object.freeze(["secret_scanning"]),
|
|
549
|
+
license_compliance: Object.freeze(["license_compliance"]),
|
|
550
|
+
zap_baseline: Object.freeze(["zap_baseline"]),
|
|
551
|
+
github_issue: Object.freeze([]),
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* What a `skip_jobs` token can be resolved to.
|
|
556
|
+
*
|
|
557
|
+
* Four of the five are refusals, which is the point. The failure this table
|
|
558
|
+
* exists to prevent is a confident wrong answer, so anything short of "one gate
|
|
559
|
+
* covers every job this token suppresses" has to be a distinct, nameable
|
|
560
|
+
* outcome rather than a best effort.
|
|
561
|
+
*/
|
|
562
|
+
export const SKIP_JOB_STATUS = [
|
|
563
|
+
"replaceable",
|
|
564
|
+
"partial",
|
|
565
|
+
"unmappable",
|
|
566
|
+
"inert",
|
|
567
|
+
"unknown",
|
|
568
|
+
"moment-illegal",
|
|
569
|
+
];
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Resolve one `skip_jobs` token to the gate declaration that replaces it.
|
|
573
|
+
* @param {string} token A `skip_jobs` token, exactly as the caller spells it.
|
|
574
|
+
* @returns {{token: string, status: string, jobs: string[], gates: string[], gate: string|null, ungated: string[]}} What is known about the token.
|
|
575
|
+
*/
|
|
576
|
+
export function gateForSkipJob(token) {
|
|
577
|
+
const jobs = Object.hasOwn(SKIP_JOB_TOKENS, token)
|
|
578
|
+
? [...SKIP_JOB_TOKENS[token]]
|
|
579
|
+
: null;
|
|
580
|
+
if (jobs === null) {
|
|
581
|
+
// Not a guess declined — a token this workflow has never had. A caller can
|
|
582
|
+
// reach here by typo, by whitespace (`'lint, lint_slow'` yields the token
|
|
583
|
+
// `" lint_slow"`), or by carrying a token from a workflow that predates
|
|
584
|
+
// this one. All three suppress nothing today, and none of them may be
|
|
585
|
+
// answered with the nearest-looking gate.
|
|
586
|
+
return {
|
|
587
|
+
token,
|
|
588
|
+
status: "unknown",
|
|
589
|
+
jobs: [],
|
|
590
|
+
gates: [],
|
|
591
|
+
gate: null,
|
|
592
|
+
ungated: [],
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
const ungated = jobs.filter(job => !Object.hasOwn(QUALITY_JOB_GATES, job));
|
|
597
|
+
const gates = [
|
|
598
|
+
...new Set(
|
|
599
|
+
jobs.flatMap(job =>
|
|
600
|
+
Object.hasOwn(QUALITY_JOB_GATES, job) ? [QUALITY_JOB_GATES[job]] : []
|
|
601
|
+
)
|
|
602
|
+
),
|
|
603
|
+
];
|
|
604
|
+
|
|
605
|
+
const status =
|
|
606
|
+
jobs.length === 0
|
|
607
|
+
? "inert"
|
|
608
|
+
: gates.length === 0
|
|
609
|
+
? "unmappable"
|
|
610
|
+
: gates.length === 1 && ungated.length === 0
|
|
611
|
+
? "replaceable"
|
|
612
|
+
: "partial";
|
|
613
|
+
|
|
614
|
+
return {
|
|
615
|
+
token,
|
|
616
|
+
status,
|
|
617
|
+
jobs,
|
|
618
|
+
gates,
|
|
619
|
+
// One gate or none. Two gates behind one token means no single declaration
|
|
620
|
+
// replaces it, and picking either would turn off half of what the token
|
|
621
|
+
// turns off while reading as a complete migration.
|
|
622
|
+
gate: gates.length === 1 ? gates[0] : null,
|
|
623
|
+
ungated,
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* Resolve a token to the declaration that replaces it AT ONE MOMENT.
|
|
629
|
+
*
|
|
630
|
+
* The moment is not decoration. `quality.yml` takes it as an input, every job
|
|
631
|
+
* resolves its gate at it, and a gate's registry entry names the closed set of
|
|
632
|
+
* moments it may legally be declared at — `traceability` at `push` and
|
|
633
|
+
* `pull-request` and nowhere else. So a caller running the pre-deploy set has
|
|
634
|
+
* no legal declaration for that token, and printing one anyway would be
|
|
635
|
+
* refused by `validate` AFTER the operator had already deleted the token,
|
|
636
|
+
* leaving the check running unguarded with the configuration reading migrated.
|
|
637
|
+
*
|
|
638
|
+
* Emitted by both `lisa doctor` and this file's `skip-jobs` command, from here,
|
|
639
|
+
* so the string an operator is shown cannot differ between the two.
|
|
640
|
+
* @param {string} token A `skip_jobs` token, exactly as the caller spells it.
|
|
641
|
+
* @param {string} [moment] The moment the caller passes to `quality.yml`.
|
|
642
|
+
* @returns {{token: string, status: string, moment: string, jobs: string[], gates: string[], gate: string|null, ungated: string[], declaration: string|null}} The migration for that token.
|
|
643
|
+
*/
|
|
644
|
+
export function skipJobMigration(token, moment = "pull-request") {
|
|
645
|
+
const resolved = gateForSkipJob(token);
|
|
646
|
+
if (resolved.gate === null) {
|
|
647
|
+
return { ...resolved, moment, declaration: null };
|
|
648
|
+
}
|
|
649
|
+
const permitted =
|
|
650
|
+
isMoment(moment) &&
|
|
651
|
+
(REGISTRY[resolved.gate]?.moments ?? []).includes(momentFamily(moment));
|
|
652
|
+
if (!permitted) {
|
|
653
|
+
return { ...resolved, moment, status: "moment-illegal", declaration: null };
|
|
654
|
+
}
|
|
655
|
+
return {
|
|
656
|
+
...resolved,
|
|
657
|
+
moment,
|
|
658
|
+
declaration: `"${resolved.gate}": { "${moment}": "off" }`,
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
|
|
455
662
|
/**
|
|
456
663
|
* Guarantees the platform enforces, which no task can implement.
|
|
457
664
|
*
|
|
@@ -1414,6 +1621,32 @@ function main() {
|
|
|
1414
1621
|
return;
|
|
1415
1622
|
}
|
|
1416
1623
|
|
|
1624
|
+
if (command === "skip-jobs") {
|
|
1625
|
+
// Deliberately not gated on reading .lisa.config.json: this answers "what
|
|
1626
|
+
// would replace this token", which a repository that has not migrated yet
|
|
1627
|
+
// must be able to ask. It is the surface an agent in a consumer checkout
|
|
1628
|
+
// uses, so it must work before anything has been declared.
|
|
1629
|
+
const requested = (flag("tokens") ?? "")
|
|
1630
|
+
.split(",")
|
|
1631
|
+
.filter(entry => entry !== "");
|
|
1632
|
+
const moment = flag("moment") ?? "pull-request";
|
|
1633
|
+
const resolved = (
|
|
1634
|
+
requested.length ? requested : Object.keys(SKIP_JOB_TOKENS)
|
|
1635
|
+
).map(token => skipJobMigration(token, moment));
|
|
1636
|
+
if (rest.includes("--json")) {
|
|
1637
|
+
console.log(JSON.stringify(resolved, null, 2));
|
|
1638
|
+
return;
|
|
1639
|
+
}
|
|
1640
|
+
for (const entry of resolved) {
|
|
1641
|
+
console.log(
|
|
1642
|
+
`${entry.token.padEnd(24)} ${entry.status.padEnd(15)} ${
|
|
1643
|
+
entry.declaration ?? "(no declaration — see status)"
|
|
1644
|
+
}`
|
|
1645
|
+
);
|
|
1646
|
+
}
|
|
1647
|
+
return;
|
|
1648
|
+
}
|
|
1649
|
+
|
|
1417
1650
|
if (command === "audit-config") {
|
|
1418
1651
|
const findings = auditConfigKeys(config);
|
|
1419
1652
|
for (const finding of findings) console.error(` ${finding.message}`);
|
|
@@ -1422,7 +1655,7 @@ function main() {
|
|
|
1422
1655
|
}
|
|
1423
1656
|
|
|
1424
1657
|
throw new Error(
|
|
1425
|
-
"usage: lisa-gates.mjs validate|list|needs|contexts|audit-config"
|
|
1658
|
+
"usage: lisa-gates.mjs validate|list|needs|contexts|skip-jobs|audit-config"
|
|
1426
1659
|
);
|
|
1427
1660
|
}
|
|
1428
1661
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { DoctorCheck } from "./doctor.js";
|
|
2
|
+
/** One token's migration, exactly as the shipped registry resolves it. */
|
|
3
|
+
export interface SkipJobToken {
|
|
4
|
+
/** The token as the caller spells it, including any damaging whitespace. */
|
|
5
|
+
readonly token: string;
|
|
6
|
+
/** One of the registry's `SKIP_JOB_STATUS` values. */
|
|
7
|
+
readonly status: string;
|
|
8
|
+
/** The gate that replaces it, or null when there is none. */
|
|
9
|
+
readonly gate: string | null;
|
|
10
|
+
/** The `quality.yml` jobs the token suppresses. */
|
|
11
|
+
readonly jobs: readonly string[];
|
|
12
|
+
/** Suppressed jobs with no gate — these keep running after the migration. */
|
|
13
|
+
readonly ungated: readonly string[];
|
|
14
|
+
/** The `.lisa.config.json` fragment to write, or null when none exists. */
|
|
15
|
+
readonly declaration: string | null;
|
|
16
|
+
}
|
|
17
|
+
/** One caller workflow that still passes `skip_jobs`. */
|
|
18
|
+
export interface SkipJobCaller {
|
|
19
|
+
/** Workflow file, relative to the project root. */
|
|
20
|
+
readonly file: string;
|
|
21
|
+
/** The moment that caller resolves gates at. */
|
|
22
|
+
readonly moment: string;
|
|
23
|
+
/** Every token it passes, in the order it passes them. */
|
|
24
|
+
readonly tokens: readonly SkipJobToken[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Every caller in a project that still passes `skip_jobs`, with its migration.
|
|
28
|
+
* @param targetPath - Project root
|
|
29
|
+
* @returns One entry per `skip_jobs` input carrying at least one token
|
|
30
|
+
*/
|
|
31
|
+
export declare function skipJobCallers(targetPath: string): Promise<SkipJobCaller[]>;
|
|
32
|
+
/**
|
|
33
|
+
* The operator-readable line for one token.
|
|
34
|
+
* @param entry - The token's resolved migration
|
|
35
|
+
* @returns One line naming the edit, or naming why there is none
|
|
36
|
+
*/
|
|
37
|
+
export declare function describeToken(entry: SkipJobToken): string;
|
|
38
|
+
/**
|
|
39
|
+
* Report the gate declarations that replace a caller's `skip_jobs` tokens.
|
|
40
|
+
*
|
|
41
|
+
* Reports only. `ci.yml` ships create-only, so `lisa apply` never refreshes it
|
|
42
|
+
* and the migration is a consumer-side edit either way — but the reason this
|
|
43
|
+
* does not write is the one in the module docstring, not that one.
|
|
44
|
+
* @param targetPath - Project path to inspect
|
|
45
|
+
* @returns Doctor check result
|
|
46
|
+
*/
|
|
47
|
+
export declare function checkSkipJobsMigration(targetPath: string): Promise<DoctorCheck>;
|
|
48
|
+
//# sourceMappingURL=doctor-skip-jobs-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-skip-jobs-migration.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-skip-jobs-migration.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/C,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AA6KD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,EAAE,CAAC,CAQ1B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CA4BzD;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAoCtB"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor check: report the gate declaration that replaces each `skip_jobs`
|
|
3
|
+
* token a caller still passes.
|
|
4
|
+
*
|
|
5
|
+
* `skip_jobs` is being retired in favour of `moment` plus gate levels —
|
|
6
|
+
* `quality.yml`'s own `moment` input says so — and it is unsafe by
|
|
7
|
+
* construction, because GitHub counts a SKIPPED required status check as
|
|
8
|
+
* SATISFIED. A job named in `skip_jobs` reports green against a context its
|
|
9
|
+
* ruleset still requires, having run nothing.
|
|
10
|
+
*
|
|
11
|
+
* No consumer could migrate off it, because the table saying which gate
|
|
12
|
+
* replaces which token lived only in one of Lisa's test fixtures — not shipped,
|
|
13
|
+
* so nothing running in a caller repository could read it. Eleven of the pairs
|
|
14
|
+
* are not recoverable from the name (`sg_scan` is `structural-rules`), and
|
|
15
|
+
* being wrong declares the WRONG gate `off`: a check silently stops running
|
|
16
|
+
* while the configuration reads deliberate. The table now ships in
|
|
17
|
+
* `scripts/lisa-gates.mjs`, and this check reads it.
|
|
18
|
+
*
|
|
19
|
+
* ## Why this reports rather than repairs
|
|
20
|
+
*
|
|
21
|
+
* Established the hard way in this repository on 2026-08-18. A doctor check was
|
|
22
|
+
* built that auto-migrated `*.test.mjs` suites to `.test.ts`. It passed six
|
|
23
|
+
* fixture tests. Against a real consumer's twelve suites it would have migrated
|
|
24
|
+
* ten, and nine of those import a local `.mjs` module that project's jest
|
|
25
|
+
* cannot load — turning passing suites into hard failures. The fixtures agreed
|
|
26
|
+
* with the code because one author wrote both.
|
|
27
|
+
*
|
|
28
|
+
* `lisa apply` runs on postinstall. A repair that edits a caller's workflow
|
|
29
|
+
* there and gets it wrong is silent. So this check establishes what is true and
|
|
30
|
+
* names the exact edit; the edit is made by something that can read the
|
|
31
|
+
* surrounding code and verify afterwards that the same checks still run.
|
|
32
|
+
*
|
|
33
|
+
* ## Why it warns and never fails
|
|
34
|
+
*
|
|
35
|
+
* The input still works, and it must keep working until every consumer has
|
|
36
|
+
* migrated. A `fail` here would turn `lisa doctor` red in every repository that
|
|
37
|
+
* has not yet done a migration Lisa only just made possible.
|
|
38
|
+
* @module cli/doctor-skip-jobs-migration
|
|
39
|
+
*/
|
|
40
|
+
import { existsSync } from "node:fs";
|
|
41
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
42
|
+
import * as path from "node:path";
|
|
43
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
44
|
+
/** Name rendered in the doctor report. */
|
|
45
|
+
const CHECK_NAME = "skip_jobs migrated to gates?";
|
|
46
|
+
/** The moment `quality.yml` resolves gates at when a caller declares none. */
|
|
47
|
+
const DEFAULT_MOMENT = "pull-request";
|
|
48
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
49
|
+
/** A caller's `skip_jobs` input, whatever quoting style it uses. */
|
|
50
|
+
const SKIP_JOBS_INPUT = /^([ \t]{0,64})skip_jobs:[ \t]{0,64}(.{0,4096})$/;
|
|
51
|
+
/** A caller's `moment` input, whatever quoting style it uses. */
|
|
52
|
+
const MOMENT_INPUT = /^([ \t]{0,64})moment:[ \t]{0,64}(.{0,4096})$/;
|
|
53
|
+
/**
|
|
54
|
+
* Walk parents until a package-root-relative file exists.
|
|
55
|
+
* @param startDir - Directory to start searching from
|
|
56
|
+
* @param relativePath - Path under the package root
|
|
57
|
+
* @returns Absolute path, or null when no ancestor holds it
|
|
58
|
+
*/
|
|
59
|
+
function findPackageFileWalk(startDir, relativePath) {
|
|
60
|
+
const candidate = path.join(startDir, relativePath);
|
|
61
|
+
if (existsSync(candidate))
|
|
62
|
+
return candidate;
|
|
63
|
+
const parent = path.dirname(startDir);
|
|
64
|
+
return parent === startDir ? null : findPackageFileWalk(parent, relativePath);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Locate the shipped gate registry inside the running Lisa package.
|
|
68
|
+
*
|
|
69
|
+
* Deliberately Lisa's own copy rather than the project's `scripts/lisa-gates.mjs`.
|
|
70
|
+
* Both are the same file in a healthy repository — it installs by
|
|
71
|
+
* copy-overwrite — but a stale project copy would answer with a table that
|
|
72
|
+
* describes a workflow that is no longer there, which is the failure this whole
|
|
73
|
+
* check exists to stop. The authority is the version of Lisa doing the
|
|
74
|
+
* reporting.
|
|
75
|
+
* @returns Absolute path to the registry, or null when it cannot be found
|
|
76
|
+
*/
|
|
77
|
+
function resolveGateRegistry() {
|
|
78
|
+
const relative = path.join("all", "copy-overwrite", "scripts", "lisa-gates.mjs");
|
|
79
|
+
const fromPackageRoot = path.join(__dirname, "..", "..", relative);
|
|
80
|
+
if (existsSync(fromPackageRoot))
|
|
81
|
+
return fromPackageRoot;
|
|
82
|
+
return findPackageFileWalk(__dirname, relative);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Import the shipped registry.
|
|
86
|
+
* @returns The registry module, or null when it is not installed
|
|
87
|
+
*/
|
|
88
|
+
async function loadRegistry() {
|
|
89
|
+
const script = resolveGateRegistry();
|
|
90
|
+
if (script === null)
|
|
91
|
+
return null;
|
|
92
|
+
return (await import(pathToFileURL(script).href));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Strip YAML quoting and a trailing comment from an inline scalar.
|
|
96
|
+
* @param raw - The text after `key:`
|
|
97
|
+
* @returns The scalar's value
|
|
98
|
+
*/
|
|
99
|
+
function scalar(raw) {
|
|
100
|
+
const withoutComment = /^(['"])(.*?)\1/.exec(raw.trim());
|
|
101
|
+
if (withoutComment)
|
|
102
|
+
return withoutComment[2] ?? "";
|
|
103
|
+
return raw.split("#")[0]?.trim() ?? "";
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The `moment` declared in the same `with:` block as a `skip_jobs` line.
|
|
107
|
+
*
|
|
108
|
+
* Scoped by indentation rather than taken from anywhere in the file: a
|
|
109
|
+
* workflow may call `quality.yml` twice with different moments, and attributing
|
|
110
|
+
* one job's moment to the other's tokens would produce a declaration that is
|
|
111
|
+
* legal for neither.
|
|
112
|
+
* @param lines - The workflow file's lines
|
|
113
|
+
* @param at - Index of the `skip_jobs` line
|
|
114
|
+
* @param indent - That line's leading whitespace
|
|
115
|
+
* @returns The declared moment, or the workflow's default
|
|
116
|
+
*/
|
|
117
|
+
function momentFor(lines, at, indent) {
|
|
118
|
+
const sameBlock = (index) => {
|
|
119
|
+
const line = lines[index];
|
|
120
|
+
if (line === undefined)
|
|
121
|
+
return false;
|
|
122
|
+
if (line.trim() === "")
|
|
123
|
+
return true;
|
|
124
|
+
return line.startsWith(indent) && !/^[ \t]/.test(line.slice(indent.length));
|
|
125
|
+
};
|
|
126
|
+
const declaredAt = (index) => {
|
|
127
|
+
const match = MOMENT_INPUT.exec(lines[index] ?? "");
|
|
128
|
+
return match && match[1] === indent ? scalar(match[2] ?? "") : null;
|
|
129
|
+
};
|
|
130
|
+
const scan = (index, step) => sameBlock(index) ? (declaredAt(index) ?? scan(index + step, step)) : null;
|
|
131
|
+
return scan(at - 1, -1) ?? scan(at + 1, 1) ?? DEFAULT_MOMENT;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Every workflow file in a project's `.github/workflows` directory.
|
|
135
|
+
* @param targetPath - Project root
|
|
136
|
+
* @returns Absolute paths, empty when the directory is absent
|
|
137
|
+
*/
|
|
138
|
+
async function workflowFiles(targetPath) {
|
|
139
|
+
const dir = path.join(targetPath, ".github", "workflows");
|
|
140
|
+
const entries = await readdir(dir).catch(() => undefined);
|
|
141
|
+
if (entries === undefined)
|
|
142
|
+
return [];
|
|
143
|
+
return entries
|
|
144
|
+
.filter(name => /\.ya?ml$/.test(name))
|
|
145
|
+
.sort((left, right) => left.localeCompare(right))
|
|
146
|
+
.map(name => path.join(dir, name));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Read one workflow's `skip_jobs` callers.
|
|
150
|
+
*
|
|
151
|
+
* Matched as text rather than through a YAML parse, for the same reason
|
|
152
|
+
* `doctor-reusable-workflow-refs` does: a caller whose YAML is malformed still
|
|
153
|
+
* passes the input, and a parse failure would silently drop the file from the
|
|
154
|
+
* audit — reporting a migrated project because one file could not be read.
|
|
155
|
+
* @param registry - The shipped gate registry
|
|
156
|
+
* @param targetPath - Project root
|
|
157
|
+
* @param file - Absolute path to the workflow
|
|
158
|
+
* @returns One entry per `skip_jobs` input carrying at least one token
|
|
159
|
+
*/
|
|
160
|
+
async function callersIn(registry, targetPath, file) {
|
|
161
|
+
const lines = (await readFile(file, "utf8").catch(() => "")).split("\n");
|
|
162
|
+
return lines.flatMap((line, index) => {
|
|
163
|
+
const match = SKIP_JOBS_INPUT.exec(line);
|
|
164
|
+
if (match === null)
|
|
165
|
+
return [];
|
|
166
|
+
const indent = match[1] ?? "";
|
|
167
|
+
// Split on commas WITHOUT trimming. `'lint, lint_slow'` yields the token
|
|
168
|
+
// `" lint_slow"`, which GitHub matches against nothing, so that job RUNS.
|
|
169
|
+
// Trimming here would report a skip that was never in effect and migrate
|
|
170
|
+
// the operator to a declaration that turns a passing check off.
|
|
171
|
+
const tokens = scalar(match[2] ?? "")
|
|
172
|
+
.split(",")
|
|
173
|
+
.filter(token => token !== "");
|
|
174
|
+
if (tokens.length === 0)
|
|
175
|
+
return [];
|
|
176
|
+
const moment = momentFor(lines, index, indent);
|
|
177
|
+
return [
|
|
178
|
+
{
|
|
179
|
+
file: path.relative(targetPath, file),
|
|
180
|
+
moment,
|
|
181
|
+
tokens: tokens.map(token => {
|
|
182
|
+
const resolved = registry.skipJobMigration(token, moment);
|
|
183
|
+
return {
|
|
184
|
+
token: resolved.token,
|
|
185
|
+
status: resolved.status,
|
|
186
|
+
gate: resolved.gate,
|
|
187
|
+
jobs: resolved.jobs,
|
|
188
|
+
ungated: resolved.ungated,
|
|
189
|
+
declaration: resolved.declaration,
|
|
190
|
+
};
|
|
191
|
+
}),
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Every caller in a project that still passes `skip_jobs`, with its migration.
|
|
198
|
+
* @param targetPath - Project root
|
|
199
|
+
* @returns One entry per `skip_jobs` input carrying at least one token
|
|
200
|
+
*/
|
|
201
|
+
export async function skipJobCallers(targetPath) {
|
|
202
|
+
const registry = await loadRegistry();
|
|
203
|
+
if (registry === null)
|
|
204
|
+
return [];
|
|
205
|
+
const files = await workflowFiles(targetPath);
|
|
206
|
+
const perFile = await Promise.all(files.map(file => callersIn(registry, targetPath, file)));
|
|
207
|
+
return perFile.flat();
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* The operator-readable line for one token.
|
|
211
|
+
* @param entry - The token's resolved migration
|
|
212
|
+
* @returns One line naming the edit, or naming why there is none
|
|
213
|
+
*/
|
|
214
|
+
export function describeToken(entry) {
|
|
215
|
+
switch (entry.status) {
|
|
216
|
+
case "replaceable":
|
|
217
|
+
return `${entry.token} → declare ${entry.declaration} and delete the token`;
|
|
218
|
+
case "partial":
|
|
219
|
+
return (`${entry.token} → PARTIAL: ${entry.declaration} covers ${entry.gate ?? ""}, ` +
|
|
220
|
+
`but ${entry.ungated.join(", ")} have no gate yet and keep running — ` +
|
|
221
|
+
"keep the token until they are converted");
|
|
222
|
+
case "moment-illegal":
|
|
223
|
+
return (`${entry.token} → the ${entry.gate ?? ""} gate cannot be declared at this ` +
|
|
224
|
+
"caller's moment, so there is no legal declaration — keep the token");
|
|
225
|
+
case "unmappable":
|
|
226
|
+
return (`${entry.token} → no gate equivalent yet (${entry.jobs.join(", ")} ` +
|
|
227
|
+
"was never converted to a gate façade) — keep the token");
|
|
228
|
+
case "inert":
|
|
229
|
+
return `${entry.token} → no job honours this token; it suppresses nothing`;
|
|
230
|
+
default:
|
|
231
|
+
return (`${entry.token} → unknown token; no job matches it, so it suppresses ` +
|
|
232
|
+
"nothing (check for a space after a comma)");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Report the gate declarations that replace a caller's `skip_jobs` tokens.
|
|
237
|
+
*
|
|
238
|
+
* Reports only. `ci.yml` ships create-only, so `lisa apply` never refreshes it
|
|
239
|
+
* and the migration is a consumer-side edit either way — but the reason this
|
|
240
|
+
* does not write is the one in the module docstring, not that one.
|
|
241
|
+
* @param targetPath - Project path to inspect
|
|
242
|
+
* @returns Doctor check result
|
|
243
|
+
*/
|
|
244
|
+
export async function checkSkipJobsMigration(targetPath) {
|
|
245
|
+
const callers = await skipJobCallers(targetPath);
|
|
246
|
+
if (callers.length === 0) {
|
|
247
|
+
return {
|
|
248
|
+
name: CHECK_NAME,
|
|
249
|
+
status: "ok",
|
|
250
|
+
detail: "No caller workflow passes skip_jobs",
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const detail = callers
|
|
254
|
+
.map(caller => `${caller.file} (moment: ${caller.moment}) — ${caller.tokens
|
|
255
|
+
.map(describeToken)
|
|
256
|
+
.join("; ")}`)
|
|
257
|
+
.join(" | ");
|
|
258
|
+
const count = callers.reduce((total, caller) => total + caller.tokens.length, 0);
|
|
259
|
+
return {
|
|
260
|
+
name: CHECK_NAME,
|
|
261
|
+
status: "warn",
|
|
262
|
+
detail: `${count} skip_jobs token(s) still passed. A skipped required check ` +
|
|
263
|
+
`counts as SATISFIED on GitHub, so each of these reports green having ` +
|
|
264
|
+
`run nothing; declaring the gate instead removes it from the required ` +
|
|
265
|
+
`contexts. Add the declarations to the "gates" block of ` +
|
|
266
|
+
`.lisa.config.json, then delete the token — doctor does not edit the ` +
|
|
267
|
+
`workflow, so confirm the same checks still run afterwards. Same answer ` +
|
|
268
|
+
`on demand: \`node scripts/lisa-gates.mjs skip-jobs --json\`. ${detail}`,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=doctor-skip-jobs-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-skip-jobs-migration.js","sourceRoot":"","sources":["../../src/cli/doctor-skip-jobs-migration.ts"],"names":[],"mappings":"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"}
|
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":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAsBnE,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;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;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;IACjC,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;IAC9C,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;CACjD;AAaD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,EAChD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,CAAC,CAyBtB;AA4MD;;;;;;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,CAkFvB"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -19,6 +19,7 @@ import { checkRepositoryReadiness } from "./doctor-readiness.js";
|
|
|
19
19
|
import { checkReusableWorkflowRefs } from "./doctor-reusable-workflow-refs.js";
|
|
20
20
|
import { checkWorkerEpoch } from "./doctor-worker-epoch.js";
|
|
21
21
|
import { checkSerializeLegsContract } from "./doctor-serialize-legs-contract.js";
|
|
22
|
+
import { checkSkipJobsMigration } from "./doctor-skip-jobs-migration.js";
|
|
22
23
|
import { checkTraceabilityGate } from "./doctor-traceability-gate.js";
|
|
23
24
|
import { checkWorktreeHygiene } from "./doctor-worktree-hygiene.js";
|
|
24
25
|
import { checkWorktreeWorkAtRisk } from "./doctor-worktree-work-at-risk.js";
|
|
@@ -274,6 +275,12 @@ export async function runDoctor(targetPath, options, dependencies = {}) {
|
|
|
274
275
|
await checkLegacyMonitorThresholds(resolvedTarget),
|
|
275
276
|
await checkLisaOwnedArtifacts(resolvedTarget),
|
|
276
277
|
await checkReusableWorkflowRefs(resolvedTarget),
|
|
278
|
+
// Immediately after the ref check, because both read the same caller
|
|
279
|
+
// workflows and an operator editing one wants both findings together. This
|
|
280
|
+
// one only REPORTS: `lisa apply` runs on postinstall, and a repair that
|
|
281
|
+
// edits a caller workflow there and gets it wrong is silent
|
|
282
|
+
// (CodySwannGT/lisa#2719).
|
|
283
|
+
await checkSkipJobsMigration(resolvedTarget),
|
|
277
284
|
await checkProjectType(resolvedTarget),
|
|
278
285
|
await checkInstructionFiles(resolvedTarget),
|
|
279
286
|
// Runs AFTER the instruction-files check because that check performs the
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
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,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,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,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;AAoCpE,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;IACtC,kBAAkB;IAClB,mBAAmB;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgD,EAChD,OAAgB;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,uCAAuC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,aAAa,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,MAAM,EAAE;SAClE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACnB,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,MAAM,EAAE;YAC3D,CAAC,CAAC,6BAA6B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;KAC9E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,MAAM,WAAW,GAAG,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACjE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;SAChD,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAEhD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,uDAAuD;SAChE,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,yBAAyB;gBAC/B,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAClC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE;aACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IAChD,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAClD,MAAM,aAAa,GAAG,gBAAgB,CAAC,mBAAmB,CACxD,MAAM,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,CAC7C,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,+BAA+B;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAC/B,IAAwB,EACxB,OAAgB;IAEhB,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,+CAA+C;SACxD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,OAAO,EAAC,EAAE;QAC1C,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CACnC,gCAAgC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAChE,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,GAAG,aAAa,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;YAClE,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAC9B,OAAO,GAAG,aAAa,eAAe,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,aAAa,cAAc,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAE3E,OAAO;QACL,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC7C,MAAM,EACJ,QAAQ,CAAC,MAAM,KAAK,CAAC;YACnB,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,UAAkB;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,2BAA2B;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,uBAAuB;QACvB,6BAA6B;QAC7B,UAAU;KACX,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QACzC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC5C,MAAM,EACJ,OAAO,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,OAAO;QACL,mBAAmB;QACnB,yBAAyB;QACzB,kBAAkB;QAClB,kBAAkB;KACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IACrD,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,mCAAmC;SAC5C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,MAAM,CAAC,OAAO;gBACpB,CAAC,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC1C,CAAC,CAAC,qEAAqE;SAC1E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,0CACN,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE;SACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,UAA8B,EAC9B,OAAsB,EACtB,eAA4C,EAAE;IAE9C,MAAM,IAAI,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG;QACb,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QAClD,4EAA4E;QAC5E,2EAA2E;QAC3E,wDAAwD;QACxD,MAAM,mBAAmB,CAAC,cAAc,CAAC;QACzC,gBAAgB,EAAE;QAClB,MAAM,kBAAkB,CAAC,cAAc,CAAC;QACxC,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,2EAA2E;QAC3E,qCAAqC;QACrC,MAAM,qBAAqB,CAAC,cAAc,CAAC;QAC3C,MAAM,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC;QAC7C,MAAM,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC;QAC9C,MAAM,4BAA4B,CAAC,cAAc,CAAC;QAClD,MAAM,uBAAuB,CAAC,cAAc,CAAC;QAC7C,MAAM,yBAAyB,CAAC,cAAc,CAAC;QAC/C,qEAAqE;QACrE,2EAA2E;QAC3E,wEAAwE;QACxE,4DAA4D;QAC5D,2BAA2B;QAC3B,MAAM,sBAAsB,CAAC,cAAc,CAAC;QAC5C,MAAM,gBAAgB,CAAC,cAAc,CAAC;QACtC,MAAM,qBAAqB,CAAC,cAAc,CAAC;QAC3C,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,eAAe;QACf,MAAM,oBAAoB,CAAC,cAAc,CAAC;QAC1C,wEAAwE;QACxE,4EAA4E;QAC5E,2EAA2E;QAC3E,qEAAqE;QACrE,8DAA8D;QAC9D,MAAM,yBAAyB,CAAC,cAAc,CAAC;QAC/C,MAAM,gBAAgB,CAAC,cAAc,CAAC;QACtC,uBAAuB,CAAC,cAAc,CAAC;QACvC,oEAAoE;QACpE,uEAAuE;QACvE,yEAAyE;QACzE,gCAAgC;QAChC,qEAAqE;QACrE,4EAA4E;QAC5E,MAAM,0BAA0B,CAAC,cAAc,CAAC;QAChD,MAAM,oBAAoB,CAAC,cAAc,CAAC;QAC1C,wEAAwE;QACxE,2EAA2E;QAC3E,yEAAyE;QACzE,uEAAuE;QACvE,MAAM,uBAAuB,CAAC,cAAc,CAAC;QAC7C,MAAM,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC;QACxD,SAAS,CAAC,cAAc,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI;YAC5B,CAAC,CAAC,CAAC,MAAM,wBAAwB,CAAC,cAAc,CAAC,CAAC;YAClD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC;IAE1B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,CACR,MAAM;aACH,GAAG,CACF,KAAK,CAAC,EAAE,CACN,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CACjE;aACA,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|