@codyswann/lisa 4.21.4 → 4.21.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 (58) hide show
  1. package/dist/core/upstream-evidence-manifest.js +1 -1
  2. package/package.json +2 -2
  3. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  5. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +17 -2
  6. package/plugins/lisa/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +17 -2
  7. package/plugins/lisa-agy/plugin.json +1 -1
  8. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +17 -2
  9. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  12. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +17 -2
  16. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +17 -2
  18. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-expo-agy/plugin.json +1 -1
  21. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  31. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  36. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  41. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-rails-agy/plugin.json +1 -1
  46. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  51. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  56. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/src/base/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +17 -2
@@ -655,7 +655,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
655
655
  "plugins/src/base/skills/lisa-secrets-access/scripts/preflight-secrets.mjs": "98a0a541041d543fe91e6260da4a25e383123a0eb40bad32a4d59551b7da8db8",
656
656
  "plugins/src/base/skills/lisa-secrets-access/scripts/prompt-secret.mjs": "22b28bcdf49b9b0fcd1b15639e031655efacc028b74d48d57e2275f3e1557508",
657
657
  "plugins/src/base/skills/lisa-secrets-access/scripts/providers.mjs": "bc0c75528f82f92478b10d75c9c60349c50160594255f5bafd7bfc03e8a54fee",
658
- "plugins/src/base/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs": "992b26b13a96d358e388d070fb4cfeaf628f527e9a23f19aba662d190560879f",
658
+ "plugins/src/base/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs": "69a614f2bdb7a169dc19561457fc09fb45402d4617e9802004243aeb74abd1db",
659
659
  "plugins/src/base/skills/lisa-secrets-access/scripts/read-secret-note.mjs": "735434e25bf1db9f2f7eb3d5ede8361cba01b922d65931393bd36e6f96531654",
660
660
  "plugins/src/base/skills/lisa-secrets-access/scripts/resolve-secret.mjs": "4170220c95f410072f3871f58938b7575684254480d0645e3dbb1535cf09d7a7",
661
661
  "plugins/src/base/skills/lisa-secrets-access/scripts/rotate-secret.mjs": "adada60f766760395858c69ef784654e9e096943485ed237c395c8fc2ca8e20f",
package/package.json CHANGED
@@ -159,7 +159,7 @@
159
159
  "zod-validation-error": "^4.0.0"
160
160
  },
161
161
  "name": "@codyswann/lisa",
162
- "version": "4.21.4",
162
+ "version": "4.21.5",
163
163
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
164
164
  "main": "dist/index.js",
165
165
  "exports": {
@@ -298,5 +298,5 @@
298
298
  "vite": "^8.0.16"
299
299
  },
300
300
  "type": "module",
301
- "lisaReleaseCommit": "5f434c7c7b16ad75f5c91e8403f3f338820cb7d0"
301
+ "lisaReleaseCommit": "3058845dd698f4d6fd2bb7356825d96f65e008ce"
302
302
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -126,6 +126,10 @@ export function candidateAwsEnvironment(bundle) {
126
126
  env.AWS_SECRET_ACCESS_KEY = String(
127
127
  bundle.secretAccessKey ?? bundle.aws_secret_access_key
128
128
  );
129
+ // STS verification must reach AWS, not an endpoint inherited from the host.
130
+ // A redirected endpoint could otherwise answer the probe and turn a green
131
+ // result into evidence about a local emulator or an attacker-controlled URL.
132
+ env.AWS_IGNORE_CONFIGURED_ENDPOINT_URLS = "true";
129
133
  env.AWS_PAGER = "";
130
134
  return env;
131
135
  }
@@ -228,12 +232,17 @@ export function preflightAwsBootstrap(cfg, operations = {}) {
228
232
  * Restore the previous provider value and prove the restoration.
229
233
  * @param {object} cfg Resolved configuration.
230
234
  * @param {{id: string, value: string}} previous Previous entry.
235
+ * @param {string} candidateRaw Exact value written by this publication.
231
236
  * @param {Function} fetch Provider reader.
232
237
  * @param {Function} write Provider writer.
233
238
  * @returns {string} Human-readable rollback outcome with no secret material.
234
239
  */
235
- function rollback(cfg, previous, fetch, write) {
240
+ function rollback(cfg, previous, candidateRaw, fetch, write) {
236
241
  try {
242
+ const current = currentEntry(cfg, fetch);
243
+ if (current.value !== candidateRaw) {
244
+ return "rollback skipped because the provider changed after this publication";
245
+ }
237
246
  write(cfg, previous.id, previous.value);
238
247
  const restored = currentEntry(cfg, fetch);
239
248
  if (restored.value !== previous.value) {
@@ -288,7 +297,13 @@ export function publishAwsBootstrap(raw, cfg, operations = {}) {
288
297
  } catch (error) {
289
298
  const reason =
290
299
  error instanceof Error ? error.message.split("\n")[0] : String(error);
291
- const rollbackOutcome = rollback(cfg, previous, fetch, write);
300
+ const rollbackOutcome = rollback(
301
+ cfg,
302
+ previous,
303
+ candidate.raw,
304
+ fetch,
305
+ write
306
+ );
292
307
  throw new Error(
293
308
  `${BOOTSTRAP_KEY} publication failed: ${reason}; ${rollbackOutcome}`
294
309
  );
@@ -126,6 +126,10 @@ export function candidateAwsEnvironment(bundle) {
126
126
  env.AWS_SECRET_ACCESS_KEY = String(
127
127
  bundle.secretAccessKey ?? bundle.aws_secret_access_key
128
128
  );
129
+ // STS verification must reach AWS, not an endpoint inherited from the host.
130
+ // A redirected endpoint could otherwise answer the probe and turn a green
131
+ // result into evidence about a local emulator or an attacker-controlled URL.
132
+ env.AWS_IGNORE_CONFIGURED_ENDPOINT_URLS = "true";
129
133
  env.AWS_PAGER = "";
130
134
  return env;
131
135
  }
@@ -228,12 +232,17 @@ export function preflightAwsBootstrap(cfg, operations = {}) {
228
232
  * Restore the previous provider value and prove the restoration.
229
233
  * @param {object} cfg Resolved configuration.
230
234
  * @param {{id: string, value: string}} previous Previous entry.
235
+ * @param {string} candidateRaw Exact value written by this publication.
231
236
  * @param {Function} fetch Provider reader.
232
237
  * @param {Function} write Provider writer.
233
238
  * @returns {string} Human-readable rollback outcome with no secret material.
234
239
  */
235
- function rollback(cfg, previous, fetch, write) {
240
+ function rollback(cfg, previous, candidateRaw, fetch, write) {
236
241
  try {
242
+ const current = currentEntry(cfg, fetch);
243
+ if (current.value !== candidateRaw) {
244
+ return "rollback skipped because the provider changed after this publication";
245
+ }
237
246
  write(cfg, previous.id, previous.value);
238
247
  const restored = currentEntry(cfg, fetch);
239
248
  if (restored.value !== previous.value) {
@@ -288,7 +297,13 @@ export function publishAwsBootstrap(raw, cfg, operations = {}) {
288
297
  } catch (error) {
289
298
  const reason =
290
299
  error instanceof Error ? error.message.split("\n")[0] : String(error);
291
- const rollbackOutcome = rollback(cfg, previous, fetch, write);
300
+ const rollbackOutcome = rollback(
301
+ cfg,
302
+ previous,
303
+ candidate.raw,
304
+ fetch,
305
+ write
306
+ );
292
307
  throw new Error(
293
308
  `${BOOTSTRAP_KEY} publication failed: ${reason}; ${rollbackOutcome}`
294
309
  );
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -126,6 +126,10 @@ export function candidateAwsEnvironment(bundle) {
126
126
  env.AWS_SECRET_ACCESS_KEY = String(
127
127
  bundle.secretAccessKey ?? bundle.aws_secret_access_key
128
128
  );
129
+ // STS verification must reach AWS, not an endpoint inherited from the host.
130
+ // A redirected endpoint could otherwise answer the probe and turn a green
131
+ // result into evidence about a local emulator or an attacker-controlled URL.
132
+ env.AWS_IGNORE_CONFIGURED_ENDPOINT_URLS = "true";
129
133
  env.AWS_PAGER = "";
130
134
  return env;
131
135
  }
@@ -228,12 +232,17 @@ export function preflightAwsBootstrap(cfg, operations = {}) {
228
232
  * Restore the previous provider value and prove the restoration.
229
233
  * @param {object} cfg Resolved configuration.
230
234
  * @param {{id: string, value: string}} previous Previous entry.
235
+ * @param {string} candidateRaw Exact value written by this publication.
231
236
  * @param {Function} fetch Provider reader.
232
237
  * @param {Function} write Provider writer.
233
238
  * @returns {string} Human-readable rollback outcome with no secret material.
234
239
  */
235
- function rollback(cfg, previous, fetch, write) {
240
+ function rollback(cfg, previous, candidateRaw, fetch, write) {
236
241
  try {
242
+ const current = currentEntry(cfg, fetch);
243
+ if (current.value !== candidateRaw) {
244
+ return "rollback skipped because the provider changed after this publication";
245
+ }
237
246
  write(cfg, previous.id, previous.value);
238
247
  const restored = currentEntry(cfg, fetch);
239
248
  if (restored.value !== previous.value) {
@@ -288,7 +297,13 @@ export function publishAwsBootstrap(raw, cfg, operations = {}) {
288
297
  } catch (error) {
289
298
  const reason =
290
299
  error instanceof Error ? error.message.split("\n")[0] : String(error);
291
- const rollbackOutcome = rollback(cfg, previous, fetch, write);
300
+ const rollbackOutcome = rollback(
301
+ cfg,
302
+ previous,
303
+ candidate.raw,
304
+ fetch,
305
+ write
306
+ );
292
307
  throw new Error(
293
308
  `${BOOTSTRAP_KEY} publication failed: ${reason}; ${rollbackOutcome}`
294
309
  );
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -126,6 +126,10 @@ export function candidateAwsEnvironment(bundle) {
126
126
  env.AWS_SECRET_ACCESS_KEY = String(
127
127
  bundle.secretAccessKey ?? bundle.aws_secret_access_key
128
128
  );
129
+ // STS verification must reach AWS, not an endpoint inherited from the host.
130
+ // A redirected endpoint could otherwise answer the probe and turn a green
131
+ // result into evidence about a local emulator or an attacker-controlled URL.
132
+ env.AWS_IGNORE_CONFIGURED_ENDPOINT_URLS = "true";
129
133
  env.AWS_PAGER = "";
130
134
  return env;
131
135
  }
@@ -228,12 +232,17 @@ export function preflightAwsBootstrap(cfg, operations = {}) {
228
232
  * Restore the previous provider value and prove the restoration.
229
233
  * @param {object} cfg Resolved configuration.
230
234
  * @param {{id: string, value: string}} previous Previous entry.
235
+ * @param {string} candidateRaw Exact value written by this publication.
231
236
  * @param {Function} fetch Provider reader.
232
237
  * @param {Function} write Provider writer.
233
238
  * @returns {string} Human-readable rollback outcome with no secret material.
234
239
  */
235
- function rollback(cfg, previous, fetch, write) {
240
+ function rollback(cfg, previous, candidateRaw, fetch, write) {
236
241
  try {
242
+ const current = currentEntry(cfg, fetch);
243
+ if (current.value !== candidateRaw) {
244
+ return "rollback skipped because the provider changed after this publication";
245
+ }
237
246
  write(cfg, previous.id, previous.value);
238
247
  const restored = currentEntry(cfg, fetch);
239
248
  if (restored.value !== previous.value) {
@@ -288,7 +297,13 @@ export function publishAwsBootstrap(raw, cfg, operations = {}) {
288
297
  } catch (error) {
289
298
  const reason =
290
299
  error instanceof Error ? error.message.split("\n")[0] : String(error);
291
- const rollbackOutcome = rollback(cfg, previous, fetch, write);
300
+ const rollbackOutcome = rollback(
301
+ cfg,
302
+ previous,
303
+ candidate.raw,
304
+ fetch,
305
+ write
306
+ );
292
307
  throw new Error(
293
308
  `${BOOTSTRAP_KEY} publication failed: ${reason}; ${rollbackOutcome}`
294
309
  );
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -126,6 +126,10 @@ export function candidateAwsEnvironment(bundle) {
126
126
  env.AWS_SECRET_ACCESS_KEY = String(
127
127
  bundle.secretAccessKey ?? bundle.aws_secret_access_key
128
128
  );
129
+ // STS verification must reach AWS, not an endpoint inherited from the host.
130
+ // A redirected endpoint could otherwise answer the probe and turn a green
131
+ // result into evidence about a local emulator or an attacker-controlled URL.
132
+ env.AWS_IGNORE_CONFIGURED_ENDPOINT_URLS = "true";
129
133
  env.AWS_PAGER = "";
130
134
  return env;
131
135
  }
@@ -228,12 +232,17 @@ export function preflightAwsBootstrap(cfg, operations = {}) {
228
232
  * Restore the previous provider value and prove the restoration.
229
233
  * @param {object} cfg Resolved configuration.
230
234
  * @param {{id: string, value: string}} previous Previous entry.
235
+ * @param {string} candidateRaw Exact value written by this publication.
231
236
  * @param {Function} fetch Provider reader.
232
237
  * @param {Function} write Provider writer.
233
238
  * @returns {string} Human-readable rollback outcome with no secret material.
234
239
  */
235
- function rollback(cfg, previous, fetch, write) {
240
+ function rollback(cfg, previous, candidateRaw, fetch, write) {
236
241
  try {
242
+ const current = currentEntry(cfg, fetch);
243
+ if (current.value !== candidateRaw) {
244
+ return "rollback skipped because the provider changed after this publication";
245
+ }
237
246
  write(cfg, previous.id, previous.value);
238
247
  const restored = currentEntry(cfg, fetch);
239
248
  if (restored.value !== previous.value) {
@@ -288,7 +297,13 @@ export function publishAwsBootstrap(raw, cfg, operations = {}) {
288
297
  } catch (error) {
289
298
  const reason =
290
299
  error instanceof Error ? error.message.split("\n")[0] : String(error);
291
- const rollbackOutcome = rollback(cfg, previous, fetch, write);
300
+ const rollbackOutcome = rollback(
301
+ cfg,
302
+ previous,
303
+ candidate.raw,
304
+ fetch,
305
+ write
306
+ );
292
307
  throw new Error(
293
308
  `${BOOTSTRAP_KEY} publication failed: ${reason}; ${rollbackOutcome}`
294
309
  );
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.5",
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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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.21.4",
3
+ "version": "4.21.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-nestjs",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.21.4",
3
+ "version": "4.21.5",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -126,6 +126,10 @@ export function candidateAwsEnvironment(bundle) {
126
126
  env.AWS_SECRET_ACCESS_KEY = String(
127
127
  bundle.secretAccessKey ?? bundle.aws_secret_access_key
128
128
  );
129
+ // STS verification must reach AWS, not an endpoint inherited from the host.
130
+ // A redirected endpoint could otherwise answer the probe and turn a green
131
+ // result into evidence about a local emulator or an attacker-controlled URL.
132
+ env.AWS_IGNORE_CONFIGURED_ENDPOINT_URLS = "true";
129
133
  env.AWS_PAGER = "";
130
134
  return env;
131
135
  }
@@ -228,12 +232,17 @@ export function preflightAwsBootstrap(cfg, operations = {}) {
228
232
  * Restore the previous provider value and prove the restoration.
229
233
  * @param {object} cfg Resolved configuration.
230
234
  * @param {{id: string, value: string}} previous Previous entry.
235
+ * @param {string} candidateRaw Exact value written by this publication.
231
236
  * @param {Function} fetch Provider reader.
232
237
  * @param {Function} write Provider writer.
233
238
  * @returns {string} Human-readable rollback outcome with no secret material.
234
239
  */
235
- function rollback(cfg, previous, fetch, write) {
240
+ function rollback(cfg, previous, candidateRaw, fetch, write) {
236
241
  try {
242
+ const current = currentEntry(cfg, fetch);
243
+ if (current.value !== candidateRaw) {
244
+ return "rollback skipped because the provider changed after this publication";
245
+ }
237
246
  write(cfg, previous.id, previous.value);
238
247
  const restored = currentEntry(cfg, fetch);
239
248
  if (restored.value !== previous.value) {
@@ -288,7 +297,13 @@ export function publishAwsBootstrap(raw, cfg, operations = {}) {
288
297
  } catch (error) {
289
298
  const reason =
290
299
  error instanceof Error ? error.message.split("\n")[0] : String(error);
291
- const rollbackOutcome = rollback(cfg, previous, fetch, write);
300
+ const rollbackOutcome = rollback(
301
+ cfg,
302
+ previous,
303
+ candidate.raw,
304
+ fetch,
305
+ write
306
+ );
292
307
  throw new Error(
293
308
  `${BOOTSTRAP_KEY} publication failed: ${reason}; ${rollbackOutcome}`
294
309
  );