@codyswann/lisa 4.28.3 → 4.28.5

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 (126) hide show
  1. package/README.md +3 -1
  2. package/all/copy-overwrite/scripts/lisa-postinstall.mjs +6 -2
  3. package/dist/cli/apply.d.ts +20 -0
  4. package/dist/cli/apply.d.ts.map +1 -1
  5. package/dist/cli/apply.js +70 -3
  6. package/dist/cli/apply.js.map +1 -1
  7. package/dist/cli/doctor-apply-freshness.d.ts.map +1 -1
  8. package/dist/cli/doctor-apply-freshness.js +10 -4
  9. package/dist/cli/doctor-apply-freshness.js.map +1 -1
  10. package/dist/cli/doctor-merge-drivers.d.ts.map +1 -1
  11. package/dist/cli/doctor-merge-drivers.js +4 -2
  12. package/dist/cli/doctor-merge-drivers.js.map +1 -1
  13. package/dist/cli/shared-options.d.ts +11 -4
  14. package/dist/cli/shared-options.d.ts.map +1 -1
  15. package/dist/cli/shared-options.js +8 -8
  16. package/dist/cli/shared-options.js.map +1 -1
  17. package/dist/core/apply-mode.d.ts +80 -29
  18. package/dist/core/apply-mode.d.ts.map +1 -1
  19. package/dist/core/apply-mode.js +23 -2
  20. package/dist/core/apply-mode.js.map +1 -1
  21. package/dist/core/apply-receipt.d.ts +5 -1
  22. package/dist/core/apply-receipt.d.ts.map +1 -1
  23. package/dist/core/apply-receipt.js.map +1 -1
  24. package/dist/core/config.d.ts +24 -12
  25. package/dist/core/config.d.ts.map +1 -1
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/learnings.d.ts +1 -1
  28. package/dist/core/learnings.d.ts.map +1 -1
  29. package/dist/core/learnings.js +1 -1
  30. package/dist/core/learnings.js.map +1 -1
  31. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  32. package/dist/core/lisa-owned-hash-ledger.js +4 -0
  33. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  34. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  35. package/dist/core/project-config-learnings.d.ts +49 -0
  36. package/dist/core/project-config-learnings.d.ts.map +1 -0
  37. package/dist/core/project-config-learnings.js +87 -0
  38. package/dist/core/project-config-learnings.js.map +1 -0
  39. package/dist/core/project-config.d.ts +2 -18
  40. package/dist/core/project-config.d.ts.map +1 -1
  41. package/dist/core/project-config.js +4 -57
  42. package/dist/core/project-config.js.map +1 -1
  43. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  44. package/dist/core/upstream-evidence-manifest.js +11 -6
  45. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  46. package/dist/migrations/ensure-learnings-gitattributes.d.ts.map +1 -1
  47. package/dist/migrations/ensure-learnings-gitattributes.js +6 -5
  48. package/dist/migrations/ensure-learnings-gitattributes.js.map +1 -1
  49. package/dist/migrations/ensure-learnings-merge-driver.d.ts.map +1 -1
  50. package/dist/migrations/ensure-learnings-merge-driver.js +6 -3
  51. package/dist/migrations/ensure-learnings-merge-driver.js.map +1 -1
  52. package/dist/migrations/ensure-lisa-postinstall.d.ts +1 -1
  53. package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
  54. package/dist/migrations/ensure-lisa-postinstall.js +28 -5
  55. package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
  56. package/dist/utils/postinstall-trampoline-source.js +10 -1
  57. package/dist/utils/postinstall-trampoline-source.js.map +1 -1
  58. package/package.json +3 -3
  59. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +7 -3
  62. package/plugins/lisa/.codex-plugin/skills/lisa-persist-learning/SKILL.md +1 -1
  63. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +7 -3
  64. package/plugins/lisa/skills/lisa-persist-learning/SKILL.md +1 -1
  65. package/plugins/lisa-agy/plugin.json +1 -1
  66. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +7 -3
  67. package/plugins/lisa-agy/skills/lisa-persist-learning/SKILL.md +1 -1
  68. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  70. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  71. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +7 -3
  75. package/plugins/lisa-copilot/skills/lisa-persist-learning/SKILL.md +1 -1
  76. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +7 -3
  78. package/plugins/lisa-cursor/skills/lisa-persist-learning/SKILL.md +1 -1
  79. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-expo-agy/plugin.json +1 -1
  82. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  87. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  92. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  97. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  102. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  106. package/plugins/lisa-rails-agy/plugin.json +1 -1
  107. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  111. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  112. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  114. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  116. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  117. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  118. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  119. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +7 -3
  120. package/plugins/src/base/skills/lisa-persist-learning/SKILL.md +1 -1
  121. package/scripts/install-claude-plugins.sh +7 -2
  122. package/scripts/verify-packed-learnings-contract.mjs +101 -2
  123. package/dist/core/learnings-merge-driver-config.d.ts +0 -7
  124. package/dist/core/learnings-merge-driver-config.d.ts.map +0 -1
  125. package/dist/core/learnings-merge-driver-config.js +0 -58
  126. package/dist/core/learnings-merge-driver-config.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-learnings-gitattributes.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-gitattributes.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,qCAAsC,YAAW,SAAS;IACrE,QAAQ,CAAC,IAAI,oCAAoC;IACjD,QAAQ,CAAC,WAAW,qGACgF;IAEpG;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB5D;;;;OAIG;YACW,cAAc;CAsB7B"}
1
+ {"version":3,"file":"ensure-learnings-gitattributes.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-gitattributes.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,qCAAsC,YAAW,SAAS;IACrE,QAAQ,CAAC,IAAI,oCAAoC;IACjD,QAAQ,CAAC,WAAW,qGACgF;IAEpG;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB5D;;;;OAIG;YACW,cAAc;CAqB7B"}
@@ -1,9 +1,9 @@
1
1
  import * as fse from "fs-extra";
2
2
  import { readFile, writeFile } from "node:fs/promises";
3
3
  import * as path from "node:path";
4
- import { isLearningsMergeDriverEnabled } from "../core/learnings-merge-driver-config.js";
5
4
  import { renderLearningsGitattributesBlock } from "../core/learnings-merge-driver.js";
6
- import { readProjectConfig, resolveProjectLearningsFile, } from "../core/project-config.js";
5
+ import { readProjectConfig } from "../core/project-config.js";
6
+ import { resolveLearningsSettings } from "../core/project-config-learnings.js";
7
7
  import { mergeCopyContents } from "../strategies/copy-contents.js";
8
8
  const GITATTRIBUTES = ".gitattributes";
9
9
  /**
@@ -72,6 +72,8 @@ export class EnsureLearningsGitattributesMigration {
72
72
  * @returns Existing content and the content this migration would write
73
73
  */
74
74
  async resolveContent(ctx) {
75
+ const config = await readProjectConfig(ctx.projectDir);
76
+ const settings = resolveLearningsSettings(config);
75
77
  const target = path.join(ctx.projectDir, GITATTRIBUTES);
76
78
  const current = (await fse.pathExists(target))
77
79
  ? await readFile(target, "utf8")
@@ -79,11 +81,10 @@ export class EnsureLearningsGitattributesMigration {
79
81
  // Honour the same opt-out as the driver registration: shipping an
80
82
  // attribute that binds the ledger to a driver the host declined would be
81
83
  // inert at best and confusing at worst.
82
- if (!(await isLearningsMergeDriverEnabled(ctx.projectDir))) {
84
+ if (!settings.mergeDriverEnabled) {
83
85
  return { current, next: current };
84
86
  }
85
- const config = await readProjectConfig(ctx.projectDir);
86
- const block = renderLearningsGitattributesBlock(resolveProjectLearningsFile(config));
87
+ const block = renderLearningsGitattributesBlock(settings.learningsFile);
87
88
  return {
88
89
  current,
89
90
  next: current === "" ? block : mergeCopyContents(block, current),
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-learnings-gitattributes.js","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-gitattributes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-learnings-gitattributes.js","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-gitattributes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-learnings-merge-driver.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-merge-driver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,mCAAoC,YAAW,SAAS;IACnE,QAAQ,CAAC,IAAI,mCAAmC;IAChD,QAAQ,CAAC,WAAW,2HAA2I;IAE/J;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAoB7D"}
1
+ {"version":3,"file":"ensure-learnings-merge-driver.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-merge-driver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,mCAAoC,YAAW,SAAS;IACnE,QAAQ,CAAC,IAAI,mCAAmC;IAChD,QAAQ,CAAC,WAAW,2HAA2I;IAE/J;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAqB7D"}
@@ -1,6 +1,7 @@
1
1
  import { canInstallLearningsMergeDriver, installLearningsMergeDriver, } from "../core/learnings-merge-driver-install.js";
2
2
  import { LEARNINGS_MERGE_DRIVER_NAME } from "../core/learnings-merge-driver.js";
3
- import { isLearningsMergeDriverEnabled } from "../core/learnings-merge-driver-config.js";
3
+ import { readProjectConfig } from "../core/project-config.js";
4
+ import { resolveLearningsSettings } from "../core/project-config-learnings.js";
4
5
  /**
5
6
  * Migration: register the project-learnings union merge driver locally.
6
7
  *
@@ -38,7 +39,8 @@ export class EnsureLearningsMergeDriverMigration {
38
39
  * @returns True when there is work to do
39
40
  */
40
41
  async applies(ctx) {
41
- if (!(await isLearningsMergeDriverEnabled(ctx.projectDir))) {
42
+ const config = await readProjectConfig(ctx.projectDir);
43
+ if (!resolveLearningsSettings(config).mergeDriverEnabled) {
42
44
  return false;
43
45
  }
44
46
  return canInstallLearningsMergeDriver(ctx.projectDir);
@@ -49,7 +51,8 @@ export class EnsureLearningsMergeDriverMigration {
49
51
  * @returns Result describing the action taken
50
52
  */
51
53
  async apply(ctx) {
52
- if (!(await isLearningsMergeDriverEnabled(ctx.projectDir))) {
54
+ const config = await readProjectConfig(ctx.projectDir);
55
+ if (!resolveLearningsSettings(config).mergeDriverEnabled) {
53
56
  return { name: this.name, action: "noop" };
54
57
  }
55
58
  if (!(await canInstallLearningsMergeDriver(ctx.projectDir))) {
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-learnings-merge-driver.js","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-merge-driver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AAOzF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,mCAAmC;IACrC,IAAI,GAAG,+BAA+B,CAAC;IACvC,WAAW,GAAG,gBAAgB,2BAA2B,4FAA4F,CAAC;IAE/J;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,IAAI,CAAC,CAAC,MAAM,6BAA6B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAqB;QAC/B,IAAI,CAAC,CAAC,MAAM,6BAA6B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CACZ,sBAAsB,2BAA2B,mBAAmB,CACrE,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;CACF"}
1
+ {"version":3,"file":"ensure-learnings-merge-driver.js","sourceRoot":"","sources":["../../src/migrations/ensure-learnings-merge-driver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAO/E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,mCAAmC;IACrC,IAAI,GAAG,+BAA+B,CAAC;IACvC,WAAW,GAAG,gBAAgB,2BAA2B,4FAA4F,CAAC;IAE/J;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAqB;QAC/B,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACzD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CACZ,sBAAsB,2BAA2B,mBAAmB,CACrE,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxE,CAAC;CACF"}
@@ -31,7 +31,7 @@ export declare const APPLY_FAILURE_NOTICE: string;
31
31
  * Exported so tests can execute the real script under `sh` rather than assert
32
32
  * on a string.
33
33
  */
34
- export declare const LISA_INVOCATION = "[ -n \"$CI\" ] || LISA_BOOTSTRAP=1 node node_modules/@codyswann/lisa/dist/index.js --yes --skip-git-check . || echo \"lisa: TEMPLATE APPLY FAILED - this project is NOT receiving Lisa template or guardrail updates. The error is above. Reproduce it with: node node_modules/@codyswann/lisa/dist/index.js --yes --skip-git-check . - then run: node node_modules/@codyswann/lisa/dist/index.js doctor\" >&2";
34
+ export declare const LISA_INVOCATION = "[ -n \"$CI\" ] || LISA_BOOTSTRAP=1 LISA_POSTINSTALL=1 node node_modules/@codyswann/lisa/dist/index.js --yes --skip-git-check . || echo \"lisa: TEMPLATE APPLY FAILED - this project is NOT receiving Lisa template or guardrail updates. The error is above. Reproduce it with: LISA_POSTINSTALL=1 node node_modules/@codyswann/lisa/dist/index.js --yes --skip-git-check . - then run: node node_modules/@codyswann/lisa/dist/index.js doctor\" >&2";
35
35
  /**
36
36
  * Migration: ensure Node-based projects chain Lisa into their postinstall script.
37
37
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-lisa-postinstall.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-lisa-postinstall.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAQlC;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,QAGS,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,mZAAqG,CAAC;AA6ElI;;;;;;;;;GASG;AACH,qBAAa,8BAA+B,YAAW,SAAS;IAC9D,QAAQ,CAAC,IAAI,6BAA6B;IAC1C,QAAQ,CAAC,WAAW,qEACgD;IAEpE;;;;;;;;;;;;;OAaG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAqC7D"}
1
+ {"version":3,"file":"ensure-lisa-postinstall.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-lisa-postinstall.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAqBlC;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,QAG8C,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,ybAA0H,CAAC;AAuFvJ;;;;;;;;;GASG;AACH,qBAAa,8BAA+B,YAAW,SAAS;IAC9D,QAAQ,CAAC,IAAI,6BAA6B;IAC1C,QAAQ,CAAC,WAAW,qEACgD;IAEpE;;;;;;;;;;;;;OAaG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAqC7D"}
@@ -4,8 +4,21 @@ import { readJsonOrNull, writeJson } from "../utils/json-utils.js";
4
4
  const PACKAGE_JSON = "package.json";
5
5
  const CI_GUARD_PREFIX = '[ -n "$CI" ] || ';
6
6
  const BOOTSTRAP_PREFIX = "LISA_BOOTSTRAP=1 ";
7
+ /**
8
+ * The hook's declaration that it is a package-manager install lifecycle.
9
+ *
10
+ * This — not `--skip-git-check` — is what selects the reduced
11
+ * `postinstall-safe` apply (CodySwannGT/lisa#3066). It is spelled as an
12
+ * environment prefix rather than a flag on purpose: the command tail stays
13
+ * byte-identical, so {@link LISA_INVOCATION_RE} keeps matching every hook
14
+ * already installed in a consumer's `package.json` with one added alternative
15
+ * in a group it already had.
16
+ */
17
+ const POSTINSTALL_PREFIX = "LISA_POSTINSTALL=1 ";
7
18
  const LISA_MARKER = "node_modules/@codyswann/lisa/dist/index.js";
8
19
  const LISA_APPLY_COMMAND = `node ${LISA_MARKER} --yes --skip-git-check .`;
20
+ /** The apply command with the declaration, as an operator would reproduce it. */
21
+ const LISA_APPLY_COMMAND_AS_POSTINSTALL = `${POSTINSTALL_PREFIX}${LISA_APPLY_COMMAND}`;
9
22
  /**
10
23
  * What the operator sees on stderr when the bootstrap apply fails.
11
24
  *
@@ -16,8 +29,8 @@ const LISA_APPLY_COMMAND = `node ${LISA_MARKER} --yes --skip-git-check .`;
16
29
  * it survives being embedded in a JSON string inside a `sh -c` command.
17
30
  */
18
31
  export const APPLY_FAILURE_NOTICE = "lisa: TEMPLATE APPLY FAILED - this project is NOT receiving Lisa template " +
19
- `or guardrail updates. The error is above. Reproduce it with: ${LISA_APPLY_COMMAND} ` +
20
- `- then run: node ${LISA_MARKER} doctor`;
32
+ "or guardrail updates. The error is above. Reproduce it with: " +
33
+ `${LISA_APPLY_COMMAND_AS_POSTINSTALL} - then run: node ${LISA_MARKER} doctor`;
21
34
  /**
22
35
  * The bootstrap invocation chained into a host project's `postinstall`.
23
36
  *
@@ -40,7 +53,7 @@ export const APPLY_FAILURE_NOTICE = "lisa: TEMPLATE APPLY FAILED - this project
40
53
  * Exported so tests can execute the real script under `sh` rather than assert
41
54
  * on a string.
42
55
  */
43
- export const LISA_INVOCATION = `${CI_GUARD_PREFIX}${BOOTSTRAP_PREFIX}${LISA_APPLY_COMMAND} || echo "${APPLY_FAILURE_NOTICE}" >&2`;
56
+ export const LISA_INVOCATION = `${CI_GUARD_PREFIX}${BOOTSTRAP_PREFIX}${POSTINSTALL_PREFIX}${LISA_APPLY_COMMAND} || echo "${APPLY_FAILURE_NOTICE}" >&2`;
44
57
  /**
45
58
  * Project types that do not use Node.js postinstall hooks (e.g. Rails).
46
59
  * Projects detected as only these types are skipped by this migration.
@@ -62,9 +75,19 @@ async function readPackageJson(projectDir) {
62
75
  * (`2>/dev/null || true`), the current loud-but-non-fatal form
63
76
  * (`|| echo "..." >&2`), and a bare invocation with no tail at all. Guard
64
77
  * prefixes are optional and repeatable because older Lisa versions introduced
65
- * them one at a time.
78
+ * them one at a time — `LISA_POSTINSTALL=1` being the newest
79
+ * (CodySwannGT/lisa#3066).
80
+ *
81
+ * **Every alternative here is permanent.** There is no cutover date: this text
82
+ * lives in the consumer's own repository, and nothing updates it until an
83
+ * apply runs — an apply that only rewrites it if this pattern matched it
84
+ * first. A miss does not fail, it CHAINS a second invocation in front of the
85
+ * old one, so the project quietly runs two applies per install and every
86
+ * instrument reads normal (the CodySwannGT/lisa#3050 shape). A project that
87
+ * never re-applies keeps its old spelling forever, which is why an old
88
+ * alternative may never be removed.
66
89
  */
67
- const LISA_INVOCATION_RE = new RegExp('(?:(?:\\[ -n "\\$CI" \\] \\|\\| )|(?:LISA_BOOTSTRAP=1 ))*' +
90
+ const LISA_INVOCATION_RE = new RegExp('(?:(?:\\[ -n "\\$CI" \\] \\|\\| )|(?:LISA_BOOTSTRAP=1 )|(?:LISA_POSTINSTALL=1 ))*' +
68
91
  "node node_modules/@codyswann/lisa/dist/index\\.js --yes --skip-git-check \\." +
69
92
  '(?: 2>/dev/null \\|\\| true| \\|\\| echo "[^"]*" >&2)?');
70
93
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-lisa-postinstall.js","sourceRoot":"","sources":["../../src/migrations/ensure-lisa-postinstall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-lisa-postinstall.js","sourceRoot":"","sources":["../../src/migrations/ensure-lisa-postinstall.ts"],"names":[],"mappings":"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"}
@@ -201,7 +201,16 @@ function buildTrampolineHelpers(literals) {
201
201
  }
202
202
 
203
203
  function runLisa() {
204
- return spawnChild(${literals.nodeBin}, [${literals.lisaEntry}, "--yes", "--skip-git-check", ${literals.projectDir}]);
204
+ // BOTH flags, and they mean different things since
205
+ // CodySwannGT/lisa#3066: --skip-git-check waives the clean-tree check,
206
+ // which this child needs because the install it follows has already
207
+ // rewritten package.json and the lockfile; --postinstall-safe declares
208
+ // the install-lifecycle context that selects the reduced apply, so a
209
+ // trampoline never regenerates committed agent trees. It is a FLAG
210
+ // rather than LISA_POSTINSTALL=1 because sanitizeEnv strips this child's
211
+ // environment, and a declaration that can be stripped can be lost
212
+ // silently.
213
+ return spawnChild(${literals.nodeBin}, [${literals.lisaEntry}, "--yes", "--skip-git-check", "--postinstall-safe", ${literals.projectDir}]);
205
214
  }
206
215
 
207
216
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"postinstall-trampoline-source.js","sourceRoot":"","sources":["../../src/utils/postinstall-trampoline-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postinstall-trampoline-source.js","sourceRoot":"","sources":["../../src/utils/postinstall-trampoline-source.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -162,7 +162,7 @@
162
162
  "zod-validation-error": "^4.0.0"
163
163
  },
164
164
  "name": "@codyswann/lisa",
165
- "version": "4.28.3",
165
+ "version": "4.28.5",
166
166
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
167
167
  "main": "dist/index.js",
168
168
  "exports": {
@@ -307,6 +307,6 @@
307
307
  "test": "tests"
308
308
  },
309
309
  "types": "./dist/index.d.ts",
310
- "lisaReleaseCommit": "050e7ef3bffff5eff7e48b93984db171aa46c564",
311
- "gitHead": "050e7ef3bffff5eff7e48b93984db171aa46c564"
310
+ "lisaReleaseCommit": "2af88022a9f354acb80903d57bca5c26155302b7",
311
+ "gitHead": "2af88022a9f354acb80903d57bca5c26155302b7"
312
312
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -296,7 +296,8 @@ commit, and push. Only escalate to a human if the conflict needs design input
296
296
  surface the file list and merge state.
297
297
 
298
298
  **The project learnings ledger is a special case.** It is bound to the
299
- `lisa-learnings` union merge driver in `.gitattributes`, which merges concurrent
299
+ `lisa-learnings` union merge driver in `.gitattributes`, which is enabled by default
300
+ and merges concurrent
300
301
  learning branches by entry id. When that driver runs and still fails, it exits
301
302
  non-zero WITHOUT writing conflict markers — so the ledger on disk looks clean
302
303
  but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
@@ -304,8 +305,11 @@ but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
304
305
  learnings. On any conflict touching the ledger: re-union both sides by keeping
305
306
  every distinct entry id, honouring supersessions from either side, and re-run
306
307
  `lisa check-learnings-budget` before committing. If the driver was never
307
- registered you will instead see real conflict markers — run
308
- `lisa install-merge-driver .` and redo the merge rather than hand-editing them.
308
+ registered you will instead see real conflict markers. Only an exact
309
+ `learnings.mergeDriver: false` declines installation, and changing that setting
310
+ does not uninstall an existing registration or remove the committed mapping. Run
311
+ `lisa install-merge-driver .` and redo the merge rather than hand-editing markers
312
+ unless the project explicitly opted out.
309
313
 
310
314
  ### c. Failing CI / deploy checks (`statusCheckRollup` has FAILURE)
311
315
  Inspect the failing check's logs (`gh pr checks <pr>`, `gh run view <run> --log-failed`).
@@ -240,4 +240,4 @@ No learning content is ever committed without a PR — there is no other write p
240
240
  - **No learning loops about learning**: never feed this skill a candidate whose triggering artifact is itself learning machinery (a `[lisa-learning-*]`-marked comment, learning PR, or handoff); the judge's Step 0 guard backstops this.
241
241
  - **Idempotent**: re-running with the same candidate posts no duplicate comment, opens no duplicate PR, and writes no duplicate entry — the fingerprint and markers guarantee it.
242
242
  - **One write path**: the learnings surface changes only through `persistLearningEntry` / `persistConsolidatedLearning` inside a PR. Never hand-edit the file, never commit it to the default branch directly.
243
- - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. `git add`-ing it, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge.
243
+ - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. Driver installation is enabled by default; only an exact `learnings.mergeDriver: false` declines it. That opt-out is non-destructive: changing the setting does not uninstall an existing registration or remove the committed mapping. `git add`-ing the failed result, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge unless the project explicitly opted out.
@@ -296,7 +296,8 @@ commit, and push. Only escalate to a human if the conflict needs design input
296
296
  surface the file list and merge state.
297
297
 
298
298
  **The project learnings ledger is a special case.** It is bound to the
299
- `lisa-learnings` union merge driver in `.gitattributes`, which merges concurrent
299
+ `lisa-learnings` union merge driver in `.gitattributes`, which is enabled by default
300
+ and merges concurrent
300
301
  learning branches by entry id. When that driver runs and still fails, it exits
301
302
  non-zero WITHOUT writing conflict markers — so the ledger on disk looks clean
302
303
  but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
@@ -304,8 +305,11 @@ but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
304
305
  learnings. On any conflict touching the ledger: re-union both sides by keeping
305
306
  every distinct entry id, honouring supersessions from either side, and re-run
306
307
  `lisa check-learnings-budget` before committing. If the driver was never
307
- registered you will instead see real conflict markers — run
308
- `lisa install-merge-driver .` and redo the merge rather than hand-editing them.
308
+ registered you will instead see real conflict markers. Only an exact
309
+ `learnings.mergeDriver: false` declines installation, and changing that setting
310
+ does not uninstall an existing registration or remove the committed mapping. Run
311
+ `lisa install-merge-driver .` and redo the merge rather than hand-editing markers
312
+ unless the project explicitly opted out.
309
313
 
310
314
  ### c. Failing CI / deploy checks (`statusCheckRollup` has FAILURE)
311
315
  Inspect the failing check's logs (`gh pr checks <pr>`, `gh run view <run> --log-failed`).
@@ -240,4 +240,4 @@ No learning content is ever committed without a PR — there is no other write p
240
240
  - **No learning loops about learning**: never feed this skill a candidate whose triggering artifact is itself learning machinery (a `[lisa-learning-*]`-marked comment, learning PR, or handoff); the judge's Step 0 guard backstops this.
241
241
  - **Idempotent**: re-running with the same candidate posts no duplicate comment, opens no duplicate PR, and writes no duplicate entry — the fingerprint and markers guarantee it.
242
242
  - **One write path**: the learnings surface changes only through `persistLearningEntry` / `persistConsolidatedLearning` inside a PR. Never hand-edit the file, never commit it to the default branch directly.
243
- - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. `git add`-ing it, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge.
243
+ - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. Driver installation is enabled by default; only an exact `learnings.mergeDriver: false` declines it. That opt-out is non-destructive: changing the setting does not uninstall an existing registration or remove the committed mapping. `git add`-ing the failed result, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge unless the project explicitly opted out.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.28.3",
3
+ "version": "4.28.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -296,7 +296,8 @@ commit, and push. Only escalate to a human if the conflict needs design input
296
296
  surface the file list and merge state.
297
297
 
298
298
  **The project learnings ledger is a special case.** It is bound to the
299
- `lisa-learnings` union merge driver in `.gitattributes`, which merges concurrent
299
+ `lisa-learnings` union merge driver in `.gitattributes`, which is enabled by default
300
+ and merges concurrent
300
301
  learning branches by entry id. When that driver runs and still fails, it exits
301
302
  non-zero WITHOUT writing conflict markers — so the ledger on disk looks clean
302
303
  but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
@@ -304,8 +305,11 @@ but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
304
305
  learnings. On any conflict touching the ledger: re-union both sides by keeping
305
306
  every distinct entry id, honouring supersessions from either side, and re-run
306
307
  `lisa check-learnings-budget` before committing. If the driver was never
307
- registered you will instead see real conflict markers — run
308
- `lisa install-merge-driver .` and redo the merge rather than hand-editing them.
308
+ registered you will instead see real conflict markers. Only an exact
309
+ `learnings.mergeDriver: false` declines installation, and changing that setting
310
+ does not uninstall an existing registration or remove the committed mapping. Run
311
+ `lisa install-merge-driver .` and redo the merge rather than hand-editing markers
312
+ unless the project explicitly opted out.
309
313
 
310
314
  ### c. Failing CI / deploy checks (`statusCheckRollup` has FAILURE)
311
315
  Inspect the failing check's logs (`gh pr checks <pr>`, `gh run view <run> --log-failed`).
@@ -240,4 +240,4 @@ No learning content is ever committed without a PR — there is no other write p
240
240
  - **No learning loops about learning**: never feed this skill a candidate whose triggering artifact is itself learning machinery (a `[lisa-learning-*]`-marked comment, learning PR, or handoff); the judge's Step 0 guard backstops this.
241
241
  - **Idempotent**: re-running with the same candidate posts no duplicate comment, opens no duplicate PR, and writes no duplicate entry — the fingerprint and markers guarantee it.
242
242
  - **One write path**: the learnings surface changes only through `persistLearningEntry` / `persistConsolidatedLearning` inside a PR. Never hand-edit the file, never commit it to the default branch directly.
243
- - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. `git add`-ing it, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge.
243
+ - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. Driver installation is enabled by default; only an exact `learnings.mergeDriver: false` declines it. That opt-out is non-destructive: changing the setting does not uninstall an existing registration or remove the committed mapping. `git add`-ing the failed result, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge unless the project explicitly opted out.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -296,7 +296,8 @@ commit, and push. Only escalate to a human if the conflict needs design input
296
296
  surface the file list and merge state.
297
297
 
298
298
  **The project learnings ledger is a special case.** It is bound to the
299
- `lisa-learnings` union merge driver in `.gitattributes`, which merges concurrent
299
+ `lisa-learnings` union merge driver in `.gitattributes`, which is enabled by default
300
+ and merges concurrent
300
301
  learning branches by entry id. When that driver runs and still fails, it exits
301
302
  non-zero WITHOUT writing conflict markers — so the ledger on disk looks clean
302
303
  but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
@@ -304,8 +305,11 @@ but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
304
305
  learnings. On any conflict touching the ledger: re-union both sides by keeping
305
306
  every distinct entry id, honouring supersessions from either side, and re-run
306
307
  `lisa check-learnings-budget` before committing. If the driver was never
307
- registered you will instead see real conflict markers — run
308
- `lisa install-merge-driver .` and redo the merge rather than hand-editing them.
308
+ registered you will instead see real conflict markers. Only an exact
309
+ `learnings.mergeDriver: false` declines installation, and changing that setting
310
+ does not uninstall an existing registration or remove the committed mapping. Run
311
+ `lisa install-merge-driver .` and redo the merge rather than hand-editing markers
312
+ unless the project explicitly opted out.
309
313
 
310
314
  ### c. Failing CI / deploy checks (`statusCheckRollup` has FAILURE)
311
315
  Inspect the failing check's logs (`gh pr checks <pr>`, `gh run view <run> --log-failed`).
@@ -240,4 +240,4 @@ No learning content is ever committed without a PR — there is no other write p
240
240
  - **No learning loops about learning**: never feed this skill a candidate whose triggering artifact is itself learning machinery (a `[lisa-learning-*]`-marked comment, learning PR, or handoff); the judge's Step 0 guard backstops this.
241
241
  - **Idempotent**: re-running with the same candidate posts no duplicate comment, opens no duplicate PR, and writes no duplicate entry — the fingerprint and markers guarantee it.
242
242
  - **One write path**: the learnings surface changes only through `persistLearningEntry` / `persistConsolidatedLearning` inside a PR. Never hand-edit the file, never commit it to the default branch directly.
243
- - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. `git add`-ing it, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge.
243
+ - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. Driver installation is enabled by default; only an exact `learnings.mergeDriver: false` declines it. That opt-out is non-destructive: changing the setting does not uninstall an existing registration or remove the committed mapping. `git add`-ing the failed result, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge unless the project explicitly opted out.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.28.3",
3
+ "version": "4.28.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -296,7 +296,8 @@ commit, and push. Only escalate to a human if the conflict needs design input
296
296
  surface the file list and merge state.
297
297
 
298
298
  **The project learnings ledger is a special case.** It is bound to the
299
- `lisa-learnings` union merge driver in `.gitattributes`, which merges concurrent
299
+ `lisa-learnings` union merge driver in `.gitattributes`, which is enabled by default
300
+ and merges concurrent
300
301
  learning branches by entry id. When that driver runs and still fails, it exits
301
302
  non-zero WITHOUT writing conflict markers — so the ledger on disk looks clean
302
303
  but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
@@ -304,8 +305,11 @@ but contains **OUR SIDE ONLY**. Staging it as-is (`git add`, `git checkout
304
305
  learnings. On any conflict touching the ledger: re-union both sides by keeping
305
306
  every distinct entry id, honouring supersessions from either side, and re-run
306
307
  `lisa check-learnings-budget` before committing. If the driver was never
307
- registered you will instead see real conflict markers — run
308
- `lisa install-merge-driver .` and redo the merge rather than hand-editing them.
308
+ registered you will instead see real conflict markers. Only an exact
309
+ `learnings.mergeDriver: false` declines installation, and changing that setting
310
+ does not uninstall an existing registration or remove the committed mapping. Run
311
+ `lisa install-merge-driver .` and redo the merge rather than hand-editing markers
312
+ unless the project explicitly opted out.
309
313
 
310
314
  ### c. Failing CI / deploy checks (`statusCheckRollup` has FAILURE)
311
315
  Inspect the failing check's logs (`gh pr checks <pr>`, `gh run view <run> --log-failed`).
@@ -240,4 +240,4 @@ No learning content is ever committed without a PR — there is no other write p
240
240
  - **No learning loops about learning**: never feed this skill a candidate whose triggering artifact is itself learning machinery (a `[lisa-learning-*]`-marked comment, learning PR, or handoff); the judge's Step 0 guard backstops this.
241
241
  - **Idempotent**: re-running with the same candidate posts no duplicate comment, opens no duplicate PR, and writes no duplicate entry — the fingerprint and markers guarantee it.
242
242
  - **One write path**: the learnings surface changes only through `persistLearningEntry` / `persistConsolidatedLearning` inside a PR. Never hand-edit the file, never commit it to the default branch directly.
243
- - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. `git add`-ing it, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge.
243
+ - **Never resolve a ledger conflict by taking one side.** Concurrent passes each work on their own `learning/<fingerprint>` branch, so two PRs routinely touch the same JSONL block. The `lisa-learnings` union merge driver reconciles them by entry id, but when it cannot it exits non-zero **without writing conflict markers** — leaving a clean-looking file that holds **OUR SIDE ONLY**. Driver installation is enabled by default; only an exact `learnings.mergeDriver: false` declines it. That opt-out is non-destructive: changing the setting does not uninstall an existing registration or remove the committed mapping. `git add`-ing the failed result, or running `git checkout --ours`, silently deletes the other branch's learnings. Re-union both sides instead: keep every distinct entry id, honour supersessions from either side, then re-run `lisa check-learnings-budget`. Literal conflict markers in the ledger mean the driver was not registered — run `lisa install-merge-driver .` and redo the merge unless the project explicitly opted out.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
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.28.3",
3
+ "version": "4.28.5",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"