@codyswann/lisa 4.60.9 → 4.60.11

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 (69) hide show
  1. package/all/copy-overwrite/scripts/lisa-gates.mjs +9 -8
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +4 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  6. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  7. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  8. package/dist/core/upstream-evidence-manifest.js +4 -2
  9. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  10. package/dist/migrations/index.d.ts +1 -0
  11. package/dist/migrations/index.d.ts.map +1 -1
  12. package/dist/migrations/index.js +3 -0
  13. package/dist/migrations/index.js.map +1 -1
  14. package/dist/migrations/preserve-verification-opt-ins.d.ts +41 -0
  15. package/dist/migrations/preserve-verification-opt-ins.d.ts.map +1 -0
  16. package/dist/migrations/preserve-verification-opt-ins.js +244 -0
  17. package/dist/migrations/preserve-verification-opt-ins.js.map +1 -0
  18. package/expo/copy-overwrite/scripts/check-e2e-coverage.mjs +15 -14
  19. package/package.json +4 -4
  20. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-agy/plugin.json +1 -1
  23. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  26. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-agy/plugin.json +1 -1
  33. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  48. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  53. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-agy/plugin.json +1 -1
  58. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  63. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  68. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
@@ -20,6 +20,7 @@ export { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-loc
20
20
  export { EnsureWikiSourceDeclaredMigration } from "./ensure-wiki-source-declared.js";
21
21
  export { EnsureTsconfigLocalIncludesMigration } from "./ensure-tsconfig-local-includes.js";
22
22
  export { PruneRetiredClaudeDenyRulesMigration } from "./prune-retired-claude-deny-rules.js";
23
+ export { PreserveVerificationOptInsMigration } from "./preserve-verification-opt-ins.js";
23
24
  export { ReconcileClaudeStackPluginsMigration } from "./reconcile-claude-stack-plugins.js";
24
25
  export { UntrackCodexMarketplaceMigration } from "./untrack-codex-marketplace.js";
25
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,uCAAuC,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,wCAAwC,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD;;;OAGG;gBACS,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;IA6B7C;;;OAGG;IACH,MAAM,IAAI,SAAS,SAAS,EAAE;IAI9B;;;;OAIG;IACG,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAazE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,uCAAuC,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,wCAAwC,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD;;;OAGG;gBACS,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;IA8B7C;;;OAGG;IACH,MAAM,IAAI,SAAS,SAAS,EAAE;IAI9B;;;;OAIG;IACG,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAazE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
@@ -18,6 +18,7 @@ import { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-loc
18
18
  import { EnsureWikiSourceDeclaredMigration } from "./ensure-wiki-source-declared.js";
19
19
  import { EnsureTsconfigLocalIncludesMigration } from "./ensure-tsconfig-local-includes.js";
20
20
  import { PruneRetiredClaudeDenyRulesMigration } from "./prune-retired-claude-deny-rules.js";
21
+ import { PreserveVerificationOptInsMigration } from "./preserve-verification-opt-ins.js";
21
22
  import { ReconcileClaudeStackPluginsMigration } from "./reconcile-claude-stack-plugins.js";
22
23
  import { UntrackCodexMarketplaceMigration } from "./untrack-codex-marketplace.js";
23
24
  export { EnsureAuditIgnoreLocalExclusionsMigration } from "./ensure-audit-ignore-local-exclusions.js";
@@ -40,6 +41,7 @@ export { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-loc
40
41
  export { EnsureWikiSourceDeclaredMigration } from "./ensure-wiki-source-declared.js";
41
42
  export { EnsureTsconfigLocalIncludesMigration } from "./ensure-tsconfig-local-includes.js";
42
43
  export { PruneRetiredClaudeDenyRulesMigration } from "./prune-retired-claude-deny-rules.js";
44
+ export { PreserveVerificationOptInsMigration } from "./preserve-verification-opt-ins.js";
43
45
  export { ReconcileClaudeStackPluginsMigration } from "./reconcile-claude-stack-plugins.js";
44
46
  export { UntrackCodexMarketplaceMigration } from "./untrack-codex-marketplace.js";
45
47
  /**
@@ -68,6 +70,7 @@ export class MigrationRegistry {
68
70
  new EnsurePushDefaultSafeMigration(),
69
71
  new EnsureQualityCallerScopesMigration(),
70
72
  new EnsureSeededGatesMigration(),
73
+ new PreserveVerificationOptInsMigration(),
71
74
  new EnsureSonarExcludesLisaHarnessMigration(),
72
75
  new EnsureThirdPartyActionPinsMigration(),
73
76
  new EnsureWikiSourceDeclaredMigration(),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,uCAAuC,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,wCAAwC,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAalF,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,uCAAuC,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,wCAAwC,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACX,UAAU,CAAuB;IAElD;;;OAGG;IACH,YAAY,UAAiC;QAC3C,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI;YAC9B,IAAI,oCAAoC,EAAE;YAC1C,IAAI,yCAAyC,EAAE;YAC/C,IAAI,yCAAyC,EAAE;YAC/C,IAAI,iCAAiC,EAAE;YACvC,IAAI,6CAA6C,EAAE;YACnD,IAAI,qCAAqC,EAAE;YAC3C,IAAI,mCAAmC,EAAE;YACzC,IAAI,uCAAuC,EAAE;YAC7C,IAAI,qCAAqC,EAAE;YAC3C,IAAI,8BAA8B,EAAE;YACpC,IAAI,gCAAgC,EAAE;YACtC,IAAI,wCAAwC,EAAE;YAC9C,IAAI,8BAA8B,EAAE;YACpC,IAAI,kCAAkC,EAAE;YACxC,IAAI,0BAA0B,EAAE;YAChC,IAAI,mCAAmC,EAAE;YACzC,IAAI,uCAAuC,EAAE;YAC7C,IAAI,mCAAmC,EAAE;YACzC,IAAI,iCAAiC,EAAE;YACvC,IAAI,oCAAoC,EAAE;YAC1C,IAAI,oCAAoC,EAAE;YAC1C,IAAI,gCAAgC,EAAE;YACtC,0EAA0E;YAC1E,6DAA6D;YAC7D,IAAI,yCAAyC,EAAE;SAChD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CAAC,GAAqB;QAC7C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;gBAC/B,MAAM,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,GAAqB;QAChC,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC1D,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,iBAAiB,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Migration, MigrationContext, MigrationResult } from "./migration.interface.js";
2
+ /**
3
+ * Carry an existing workflow opt-in into the declaration that replaced it.
4
+ * No declaration is seeded for an inactive caller, and explicit choices win.
5
+ *
6
+ * Ordinary package installs leave project files unchanged. Explicit applies
7
+ * using the legacy postinstall-safe mode still advance workflow pins while
8
+ * retaining old template content, so this migration also runs in that mode.
9
+ * It preserves an existing choice before the retired input becomes invalid.
10
+ */
11
+ export declare class PreserveVerificationOptInsMigration implements Migration {
12
+ readonly name = "preserve-verification-opt-ins";
13
+ readonly description = "Preserve existing verification-check opt-ins when updating Lisa workflows";
14
+ private capturedProject;
15
+ private capturedOptIn;
16
+ /**
17
+ * Capture and validate before a managed workflow can lose the old input.
18
+ * @param ctx - Update context.
19
+ */
20
+ beforeStrategies(ctx: MigrationContext): Promise<void>;
21
+ /**
22
+ * Resolve a declaration without overwriting an explicit current choice.
23
+ * @param ctx - Update context.
24
+ * @param edits - Current caller edits.
25
+ * @returns An actionable plan, or null when nothing needs changing.
26
+ */
27
+ private plan;
28
+ /**
29
+ * Determine whether a former opt-in or a remaining old input needs migration.
30
+ * @param ctx - Update context.
31
+ * @returns Whether applying changes at least one file.
32
+ */
33
+ applies(ctx: MigrationContext): Promise<boolean>;
34
+ /**
35
+ * Write the equivalent declaration before removing any remaining old input.
36
+ * @param ctx - Update context.
37
+ * @returns The files changed, with dry-run behavior preserved.
38
+ */
39
+ apply(ctx: MigrationContext): Promise<MigrationResult>;
40
+ }
41
+ //# sourceMappingURL=preserve-verification-opt-ins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserve-verification-opt-ins.d.ts","sourceRoot":"","sources":["../../src/migrations/preserve-verification-opt-ins.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAqLlC;;;;;;;;GAQG;AACH,qBAAa,mCAAoC,YAAW,SAAS;IACnE,QAAQ,CAAC,IAAI,mCAAmC;IAChD,QAAQ,CAAC,WAAW,+EAC0D;IAC9E,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,aAAa,CAAS;IAE9B;;;OAGG;IACG,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5D;;;;;OAKG;YACW,IAAI;IAqClB;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAoB7D"}
@@ -0,0 +1,244 @@
1
+ import { readFile, readdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { isDeepStrictEqual } from "node:util";
4
+ import { isJsonObject } from "../sync/json-path.js";
5
+ import { loadYaml } from "../utils/yaml.js";
6
+ import { writeJson } from "../utils/json-utils.js";
7
+ import { locateJob, locateKey } from "./deploy-outcome-guard-yaml.js";
8
+ const CONFIG = ".lisa.config.json";
9
+ const WORKFLOWS = ".github/workflows";
10
+ const GATE = "coverage-adequacy";
11
+ const MOMENT = "pull-request";
12
+ const LEGACY = "verify_enforced";
13
+ const QUALITY = /^CodySwannGT\/lisa\/\.github\/workflows\/quality\.yml@/u;
14
+ /**
15
+ * Read a file without confusing an unreadable file with a missing one.
16
+ * @param file - File to read.
17
+ * @returns Its contents, or null only when absent.
18
+ */
19
+ async function readOptional(file) {
20
+ try {
21
+ return await readFile(file, "utf8");
22
+ }
23
+ catch (error) {
24
+ if (error.code === "ENOENT")
25
+ return null;
26
+ throw error;
27
+ }
28
+ }
29
+ /**
30
+ * Require an object before preserving its existing entries.
31
+ * @param value - Configuration value.
32
+ * @param name - Safe configuration path for the error message.
33
+ * @returns The existing object.
34
+ */
35
+ function object(value, name) {
36
+ if (!isJsonObject(value))
37
+ throw new Error(`Cannot preserve verification opt-in: ${name} must be an object.`);
38
+ return value;
39
+ }
40
+ /**
41
+ * Remove one literal input while preserving the rest of the YAML byte-for-byte.
42
+ * @param source - Original workflow.
43
+ * @param id - Parsed job identifier.
44
+ * @param emptyWith - Whether removing this input empties the with map.
45
+ * @returns Edited workflow, or throws before writing an ambiguous shape.
46
+ */
47
+ function removeInput(source, id, emptyWith) {
48
+ const lines = source.split("\n");
49
+ const block = /^[A-Za-z_][A-Za-z0-9_-]*$/u.test(id)
50
+ ? locateJob(lines, id)
51
+ : null;
52
+ const span = block ? locateKey(lines, block, "with") : null;
53
+ const matches = span
54
+ ? lines.flatMap((line, index) => index > span.start &&
55
+ index < span.end &&
56
+ /^\s+verify_enforced:\s*true\s*(?:#.*)?\r?$/iu.test(line)
57
+ ? [index]
58
+ : [])
59
+ : [];
60
+ if (!span || matches.length !== 1)
61
+ throw new Error("Cannot safely migrate the verification input in this YAML layout; the caller was left unchanged.");
62
+ return lines
63
+ .filter((_, index) => index !== matches[0] && !(emptyWith && index === span.start))
64
+ .join("\n");
65
+ }
66
+ /**
67
+ * Recognize only actual opt-ins to Lisa's standard PR workflow.
68
+ * @param source - Workflow text.
69
+ * @returns The edited text, or null when no supported input is present.
70
+ */
71
+ function migrateCaller(source) {
72
+ if (!source.includes(LEGACY))
73
+ return null;
74
+ const document = object(loadYaml(source), "workflow");
75
+ if (!isJsonObject(document.jobs))
76
+ return null;
77
+ const edited = Object.entries(document.jobs).reduce((state, [id, value]) => migrateJob(state, id, value), { source, jobs: document.jobs });
78
+ if (edited.source === source)
79
+ return null;
80
+ if (!isDeepStrictEqual(loadYaml(edited.source), {
81
+ ...document,
82
+ jobs: edited.jobs,
83
+ }))
84
+ throw new Error("Verification input migration would change unrelated workflow data; the caller was left unchanged.");
85
+ return edited.source;
86
+ }
87
+ /**
88
+ * Preserve one opted-in job while retaining the other workflow data.
89
+ * @param state - Current workflow text and job mapping.
90
+ * @param state.source - Current workflow text.
91
+ * @param state.jobs - Current job mapping.
92
+ * @param id - Job identifier.
93
+ * @param value - Parsed job.
94
+ * @returns Updated workflow state.
95
+ */
96
+ function migrateJob(state, id, value) {
97
+ if (!isJsonObject(value) ||
98
+ typeof value.uses !== "string" ||
99
+ !QUALITY.test(value.uses) ||
100
+ !isJsonObject(value.with) ||
101
+ value.with[LEGACY] !== true)
102
+ return state;
103
+ const input = value.with;
104
+ // The measured legacy callers use the project root and PR moment. Do not
105
+ // guess which settings file a dynamic or differently scoped caller reads.
106
+ if ((input.working_directory !== undefined &&
107
+ input.working_directory !== "." &&
108
+ input.working_directory !== "") ||
109
+ (input.moment !== undefined && input.moment !== MOMENT)) {
110
+ throw new Error("Cannot migrate this verification opt-in automatically: preserve or add the equivalent coverage-adequacy declaration in the caller's working directory and moment, then remove verify_enforced before updating Lisa.");
111
+ }
112
+ const { verify_enforced: _legacy, ...remaining } = input;
113
+ const { with: _inputs, ...job } = value;
114
+ const emptyWith = Object.keys(remaining).length === 0;
115
+ return {
116
+ jobs: {
117
+ ...state.jobs,
118
+ [id]: emptyWith ? job : { ...job, with: remaining },
119
+ },
120
+ source: removeInput(state.source, id, emptyWith),
121
+ };
122
+ }
123
+ /**
124
+ * Read only workflow files, collecting literal opt-ins and validating each edit.
125
+ * @param projectDir - Project being updated.
126
+ * @returns Safe caller edits.
127
+ */
128
+ async function callerEdits(projectDir) {
129
+ const files = await readdir(path.join(projectDir, WORKFLOWS), {
130
+ withFileTypes: true,
131
+ }).catch((error) => {
132
+ if (error.code === "ENOENT")
133
+ return [];
134
+ throw error;
135
+ });
136
+ const edits = await Promise.all(files
137
+ .filter(file => file.isFile() && /\.ya?ml$/u.test(file.name))
138
+ .map(async (file) => {
139
+ const relative = path.join(WORKFLOWS, file.name);
140
+ const source = await readFile(path.join(projectDir, relative), "utf8");
141
+ const migrated = migrateCaller(source);
142
+ return migrated === null ? null : { relative, source: migrated };
143
+ }));
144
+ return edits.filter((edit) => edit !== null);
145
+ }
146
+ /**
147
+ * Carry an existing workflow opt-in into the declaration that replaced it.
148
+ * No declaration is seeded for an inactive caller, and explicit choices win.
149
+ *
150
+ * Ordinary package installs leave project files unchanged. Explicit applies
151
+ * using the legacy postinstall-safe mode still advance workflow pins while
152
+ * retaining old template content, so this migration also runs in that mode.
153
+ * It preserves an existing choice before the retired input becomes invalid.
154
+ */
155
+ export class PreserveVerificationOptInsMigration {
156
+ name = "preserve-verification-opt-ins";
157
+ description = "Preserve existing verification-check opt-ins when updating Lisa workflows";
158
+ capturedProject = null;
159
+ capturedOptIn = false;
160
+ /**
161
+ * Capture and validate before a managed workflow can lose the old input.
162
+ * @param ctx - Update context.
163
+ */
164
+ async beforeStrategies(ctx) {
165
+ const edits = await callerEdits(ctx.projectDir);
166
+ this.capturedProject = ctx.projectDir;
167
+ this.capturedOptIn = edits.length > 0;
168
+ if (this.capturedOptIn)
169
+ await this.plan(ctx, edits);
170
+ }
171
+ /**
172
+ * Resolve a declaration without overwriting an explicit current choice.
173
+ * @param ctx - Update context.
174
+ * @param edits - Current caller edits.
175
+ * @returns An actionable plan, or null when nothing needs changing.
176
+ */
177
+ async plan(ctx, edits) {
178
+ if (edits.length === 0 &&
179
+ !(this.capturedProject === ctx.projectDir && this.capturedOptIn))
180
+ return null;
181
+ const text = await readOptional(path.join(ctx.projectDir, CONFIG));
182
+ const config = text === null ? {} : object(JSON.parse(text), CONFIG);
183
+ const gates = Object.hasOwn(config, "gates")
184
+ ? object(config.gates, "gates")
185
+ : {};
186
+ const coverage = Object.hasOwn(gates, GATE)
187
+ ? object(gates[GATE], `gates.${GATE}`)
188
+ : {};
189
+ const seed = !Object.hasOwn(coverage, MOMENT);
190
+ if (!seed && edits.length === 0)
191
+ return null;
192
+ return {
193
+ edits,
194
+ seed,
195
+ config: seed
196
+ ? {
197
+ ...config,
198
+ gates: {
199
+ ...gates,
200
+ [GATE]: {
201
+ ...coverage,
202
+ [MOMENT]: { level: "required", run: "check:verification" },
203
+ },
204
+ },
205
+ }
206
+ : config,
207
+ };
208
+ }
209
+ /**
210
+ * Determine whether a former opt-in or a remaining old input needs migration.
211
+ * @param ctx - Update context.
212
+ * @returns Whether applying changes at least one file.
213
+ */
214
+ async applies(ctx) {
215
+ return (await this.plan(ctx, await callerEdits(ctx.projectDir))) !== null;
216
+ }
217
+ /**
218
+ * Write the equivalent declaration before removing any remaining old input.
219
+ * @param ctx - Update context.
220
+ * @returns The files changed, with dry-run behavior preserved.
221
+ */
222
+ async apply(ctx) {
223
+ const plan = await this.plan(ctx, await callerEdits(ctx.projectDir));
224
+ if (plan === null)
225
+ return { name: this.name, action: "noop" };
226
+ const changedFiles = [
227
+ ...(plan.seed ? [CONFIG] : []),
228
+ ...plan.edits.map(edit => edit.relative),
229
+ ];
230
+ const message = "Preserved the project's verification-check choice and removed its retired workflow input.";
231
+ if (ctx.dryRun)
232
+ ctx.logger.dry(message);
233
+ else {
234
+ if (plan.seed)
235
+ await writeJson(path.join(ctx.projectDir, CONFIG), plan.config);
236
+ for (const edit of plan.edits)
237
+ await writeFile(path.join(ctx.projectDir, edit.relative), edit.source);
238
+ this.capturedOptIn = false;
239
+ ctx.logger.success(message);
240
+ }
241
+ return { name: this.name, action: "applied", changedFiles, message };
242
+ }
243
+ }
244
+ //# sourceMappingURL=preserve-verification-opt-ins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserve-verification-opt-ins.js","sourceRoot":"","sources":["../../src/migrations/preserve-verification-opt-ins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAOtE,MAAM,MAAM,GAAG,mBAAmB,CAAC;AACnC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AACtC,MAAM,IAAI,GAAG,mBAAmB,CAAC;AACjC,MAAM,MAAM,GAAG,cAAc,CAAC;AAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC;AACjC,MAAM,OAAO,GAAG,yDAAyD,CAAC;AAe1E;;;;GAIG;AACH,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,KAAc,EAAE,IAAY;IAC1C,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,qBAAqB,CAClE,CAAC;IACJ,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,MAAc,EAAE,EAAU,EAAE,SAAkB;IACjE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC5B,KAAK,GAAG,IAAI,CAAC,KAAK;YAClB,KAAK,GAAG,IAAI,CAAC,GAAG;YAChB,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC;YACvD,CAAC,CAAC,CAAC,KAAK,CAAC;YACT,CAAC,CAAC,EAAE,CACP;QACH,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;IACJ,OAAO,KAAK;SACT,MAAM,CACL,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAC3E;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CACjD,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EACpD,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAChC,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1C,IACE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QAC1C,GAAG,QAAQ;QACX,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC;QAEF,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAC;IACJ,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,UAAU,CACjB,KAA2C,EAC3C,EAAU,EACV,KAAc;IAEd,IACE,CAAC,YAAY,CAAC,KAAK,CAAC;QACpB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI;QAE3B,OAAO,KAAK,CAAC;IACf,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;IACzB,yEAAyE;IACzE,0EAA0E;IAC1E,IACE,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS;QACpC,KAAK,CAAC,iBAAiB,KAAK,GAAG;QAC/B,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC;QACjC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EACvD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,qNAAqN,CACtN,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC;IACzD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACtD,OAAO;QACL,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;SACpD;QACD,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC;KACjD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,UAAkB;IAC3C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE;QAC5D,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QACxC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAClE,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,KAAK;SACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5D,GAAG,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnE,CAAC,CAAC,CACL,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAsB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,mCAAmC;IACrC,IAAI,GAAG,+BAA+B,CAAC;IACvC,WAAW,GAClB,2EAA2E,CAAC;IACtE,eAAe,GAAkB,IAAI,CAAC;IACtC,aAAa,GAAG,KAAK,CAAC;IAE9B;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,GAAqB;QAC1C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,IAAI,CAChB,GAAqB,EACrB,KAA4B;QAE5B,IACE,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,eAAe,KAAK,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC;YAEhE,OAAO,IAAI,CAAC;QACd,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;YAC1C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;YAC/B,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;YACzC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;YACtC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,OAAO;YACL,KAAK;YACL,IAAI;YACJ,MAAM,EAAE,IAAI;gBACV,CAAC,CAAC;oBACE,GAAG,MAAM;oBACT,KAAK,EAAE;wBACL,GAAG,KAAK;wBACR,CAAC,IAAI,CAAC,EAAE;4BACN,GAAG,QAAQ;4BACX,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,oBAAoB,EAAE;yBAC3D;qBACF;iBACF;gBACH,CAAC,CAAC,MAAM;SACX,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC5E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAqB;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG;YACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC,CAAC;QACF,MAAM,OAAO,GACX,2FAA2F,CAAC;QAC9F,IAAI,GAAG,CAAC,MAAM;YAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aACnC,CAAC;YACJ,IAAI,IAAI,CAAC,IAAI;gBACX,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;gBAC3B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACzE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvE,CAAC;CACF"}
@@ -3,26 +3,24 @@
3
3
  // Do not edit directly — durable changes belong upstream in Lisa.
4
4
 
5
5
  /**
6
- * check-e2e-coverage — aggregate e2e route/screen coverage gate (Expo).
6
+ * check-e2e-coverage — static test-source route references (Expo).
7
7
  *
8
- * The e2e counterpart of the unit-test coverage thresholds: where Vitest/Jest
9
- * gate on line coverage, this gates on SURFACE coverage — the percentage of
10
- * expo-router routes exercised by at least one e2e spec, computed per runner:
8
+ * This gates the percentage of expo-router routes referenced in test source,
9
+ * computed per runner. It does not execute tests or prove they passed:
11
10
  *
12
- * - Playwright: routes visited via `page.goto("<path>")` in e2e specs
11
+ * - Playwright: literal `page.goto("<path>")` references in e2e specs
13
12
  * (top-level `e2e/` or nested `tests/e2e/` trees).
14
- * - Maestro: screens opened via `openLink: <deep link>` in `.maestro/` flows.
13
+ * - Maestro: literal `openLink: <deep link>` references in `.maestro/` flows.
15
14
  *
16
15
  * Maestro is black-box (no code-coverage hook exists for a compiled native
17
16
  * app), so route coverage is the shared metric both runners can honor. A spec
18
17
  * or flow that reaches a screen by tapping rather than deep-linking can declare
19
18
  * it with an `e2e-route: /path` comment annotation (JS/TS or YAML comment).
20
19
  *
21
- * Coverage is inferred from source text, so a navigation the source does not
22
- * spell out is not coverage this gate can see. It is credited to nothing and
23
- * PRINTED as an unmatched navigation — never guessed at. An unresolved template
24
- * hole is the sharpest case: `${...}` matches a route's dynamic segment, which
25
- * accepts any value anyway, and nothing else. See `routeMatchesVisit`.
20
+ * Indirect or registry-driven navigation may produce no detectable reference.
21
+ * Extracted literals that match no route are printed as unmatched references.
22
+ * An unresolved template hole matches a route's dynamic segment, which accepts
23
+ * any value anyway, and nothing else. See `routeMatchesVisit`.
26
24
  *
27
25
  * Thresholds default to 80% per runner and are project-tunable via
28
26
  * `e2e.thresholds.json` (create-only, same convention as vitest.thresholds.json):
@@ -717,6 +715,9 @@ function collectVisitedPaths({
717
715
  */
718
716
  function main() {
719
717
  const root = process.env.E2E_COVERAGE_ROOT || process.cwd();
718
+ console.log(
719
+ "[e2e-coverage] Static route references from test source and explicit annotations; no tests were executed. Registry-driven or indirect navigation may be absent from this scan. Use the runner's results to establish whether tests passed."
720
+ );
720
721
  const appDir = ["app", "src/app"]
721
722
  .map(candidate => path.join(root, candidate))
722
723
  .find(candidate => fs.existsSync(candidate));
@@ -843,7 +844,7 @@ function main() {
843
844
  }
844
845
 
845
846
  for (const [runner, verdict] of Object.entries(result.runners)) {
846
- const summary = `${verdict.covered}/${verdict.total} routes (${verdict.percentage.toFixed(1)}% vs ${verdict.threshold}% required)`;
847
+ const summary = `${verdict.covered}/${verdict.total} routes referenced in test source (${verdict.percentage.toFixed(1)}% vs ${verdict.threshold}% required)`;
847
848
  if (verdict.threshold === 0) {
848
849
  console.log(
849
850
  `[e2e-coverage] ${runner}: gate disabled (threshold 0) — ${summary}`
@@ -853,7 +854,7 @@ function main() {
853
854
  } else {
854
855
  console.error(`[e2e-coverage] ${runner}: FAIL — ${summary}`);
855
856
  console.error(
856
- `[e2e-coverage] ${runner}: screens with no e2e test yet:\n${verdict.missing
857
+ `[e2e-coverage] ${runner}: routes without a detected test-source reference:\n${verdict.missing
857
858
  .map(route => ` - ${route}`)
858
859
  .join("\n")}`
859
860
  );
@@ -861,7 +862,7 @@ function main() {
861
862
  }
862
863
  if (!result.ok) {
863
864
  console.error(
864
- "[e2e-coverage] FAIL: some screens have no end-to-end test. Add a Playwright spec (page.goto) or Maestro flow (openLink) that reaches each screen listed above, add an `e2e-route: /path` comment to a spec that already reaches it by navigation, or adjust e2e.thresholds.json."
865
+ "[e2e-coverage] FAIL: detected route references are below the configured threshold. Review the listed routes and existing tests. If a test reaches a route indirectly, an `e2e-route: /path` comment can declare that reference; this scan cannot verify the claim. Add missing tests where needed, or adjust e2e.thresholds.json to the project's intended scope."
865
866
  );
866
867
  process.exit(1);
867
868
  }
package/package.json CHANGED
@@ -187,7 +187,7 @@
187
187
  "zod-validation-error": "^4.0.0"
188
188
  },
189
189
  "name": "@codyswann/lisa",
190
- "version": "4.60.9",
190
+ "version": "4.60.11",
191
191
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
192
192
  "main": "dist/index.js",
193
193
  "exports": {
@@ -336,7 +336,7 @@
336
336
  "test": "tests"
337
337
  },
338
338
  "types": "./dist/index.d.ts",
339
- "lisaReleaseCommit": "a751e96b63604310f04fb158b76c8ac632d85852",
340
- "gitHead": "a751e96b63604310f04fb158b76c8ac632d85852",
341
- "lisaReleaseTag": "v4.60.9"
339
+ "lisaReleaseCommit": "7240c7f3ba59d6fe150a70cbb4b96aebb8025b2b",
340
+ "gitHead": "7240c7f3ba59d6fe150a70cbb4b96aebb8025b2b",
341
+ "lisaReleaseTag": "v4.60.11"
342
342
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.60.9",
3
+ "version": "4.60.11",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"