@codyswann/lisa 4.59.2 → 4.59.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  2. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  3. package/dist/core/upstream-evidence-manifest.js +15 -5
  4. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  5. package/expo/create-only/.github/workflows/deploy.yml +31 -9
  6. package/package.json +4 -4
  7. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  8. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  9. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +12 -0
  10. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
  11. package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +12 -0
  12. package/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
  13. package/plugins/lisa-agy/plugin.json +1 -1
  14. package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +12 -0
  15. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
  16. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  19. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +12 -0
  23. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
  24. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +12 -0
  26. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
  27. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo-agy/plugin.json +1 -1
  30. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  50. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails-agy/plugin.json +1 -1
  55. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  60. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  65. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +12 -0
  68. package/plugins/src/base/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
  69. package/scripts/check-workflow-package-paths.mjs +37 -3
  70. package/scripts/lib/workflow-contract-probe.mjs +11 -0
  71. package/scripts/two-channel-couplings.json +1 -1
@@ -111,6 +111,7 @@ import path from "node:path";
111
111
  import { boundedExecFileSync } from "./lib/bounded-spawn.mjs";
112
112
  import { invokedAsScript } from "./lib/invoked-as-script.mjs";
113
113
  import {
114
+ compareVersions,
114
115
  declarationGaps,
115
116
  probeReleases,
116
117
  readContractDeclaration,
@@ -489,10 +490,17 @@ export function releaseContains(entries, candidate) {
489
490
  * @param {Record<string, readonly string[]>} listings - Version to entry list
490
491
  * @returns {readonly string[]} One operator-readable line per failure
491
492
  */
492
- export function findBreakages(groups, listings) {
493
+ export function findBreakages(groups, listings, contracts = {}) {
493
494
  return Object.entries(listings).flatMap(([version, entries]) =>
494
495
  groups
495
- .filter(group => !group.paths.some(p => releaseContains(entries, p)))
496
+ .filter(
497
+ group =>
498
+ !group.paths.some(
499
+ p =>
500
+ releaseContains(entries, p) ||
501
+ introducedLater(version, contracts[p])
502
+ )
503
+ )
496
504
  .map(
497
505
  group =>
498
506
  `${version}: ${group.workflow} step "${group.step}" resolves ${group.paths
@@ -504,6 +512,17 @@ export function findBreakages(groups, listings) {
504
512
  );
505
513
  }
506
514
 
515
+ /** A declared optional feature may predate its package artifact only on known older releases. */
516
+ function introducedLater(version, contract) {
517
+ return (
518
+ /^\d+\.\d+\.\d+$/.test(version) &&
519
+ typeof contract?.since === "string" &&
520
+ typeof contract.degradation === "string" &&
521
+ contract.degradation.length >= 40 &&
522
+ compareVersions(version, contract.since) < 0
523
+ );
524
+ }
525
+
507
526
  /**
508
527
  * Run the check.
509
528
  * @returns {void}
@@ -567,7 +586,7 @@ function main() {
567
586
  });
568
587
 
569
588
  const breakages = [
570
- ...findBreakages(claims.groups, listings),
589
+ ...findBreakages(claims.groups, listings, declaration.contracts),
571
590
  ...gaps.undeclared,
572
591
  ...gaps.stale,
573
592
  ...contracts.violations,
@@ -579,6 +598,19 @@ function main() {
579
598
  releasesExamined: Object.keys(listings),
580
599
  contractProbesExecuted: contracts.executed,
581
600
  contractProbesDeferred: contracts.deferred,
601
+ packagePathsDeferred: Object.entries(listings).flatMap(
602
+ ([version, entries]) =>
603
+ Object.entries(declaration.contracts)
604
+ .filter(
605
+ ([where, contract]) =>
606
+ !releaseContains(entries, where) &&
607
+ introducedLater(version, contract)
608
+ )
609
+ .map(
610
+ ([where, contract]) =>
611
+ `${version}: ${where} introduced in ${contract.since}; ${contract.degradation}`
612
+ )
613
+ ),
582
614
  contractProbesRun: contracts.probed,
583
615
  unattributed: claims.unattributed,
584
616
  breakages,
@@ -592,6 +624,8 @@ function main() {
592
624
  );
593
625
  for (const line of contracts.deferred)
594
626
  process.stdout.write(` · ${line}\n`);
627
+ for (const line of report.packagePathsDeferred)
628
+ process.stdout.write(` · ${line}\n`);
595
629
  for (const line of breakages) process.stdout.write(` ✗ ${line}\n`);
596
630
  }
597
631
 
@@ -151,6 +151,17 @@ export function readContractDeclaration(declared) {
151
151
  );
152
152
  }
153
153
  for (const [where, entry] of Object.entries(contracts)) {
154
+ if (
155
+ entry?.since !== undefined &&
156
+ (typeof entry.since !== "string" ||
157
+ !/^\d+\.\d+\.\d+$/.test(entry.since) ||
158
+ typeof entry.degradation !== "string" ||
159
+ entry.degradation.length < 40)
160
+ ) {
161
+ throw new Error(
162
+ `contracts["${where}"]: since needs a release version and degradation must explain the older caller's behavior`
163
+ );
164
+ }
154
165
  if (!CONTRACT_KINDS.has(entry?.kind)) {
155
166
  throw new Error(
156
167
  `contracts["${where}"]: kind must be one of ${[...CONTRACT_KINDS].join(", ")}`
@@ -95,7 +95,7 @@
95
95
  },
96
96
  "inspected": {
97
97
  "workflows": 23,
98
- "steps": 778,
98
+ "steps": 779,
99
99
  "couplings": 33,
100
100
  "inventory": 78
101
101
  },