@codyswann/lisa 3.14.7 → 3.15.0

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 (84) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +19 -3
  3. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  4. package/package.json +1 -1
  5. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  6. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +49 -0
  8. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
  9. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
  10. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
  11. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
  12. package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +50 -1
  13. package/plugins/lisa/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
  14. package/plugins/lisa/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
  15. package/plugins/lisa/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
  16. package/plugins/lisa/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
  17. package/plugins/lisa-agy/plugin.json +1 -1
  18. package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +50 -1
  19. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
  20. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
  21. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
  22. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
  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-copilot/skills/lisa-secrets-access/SKILL.md +50 -1
  30. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
  31. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
  32. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
  33. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
  34. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +50 -1
  36. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
  37. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
  38. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
  39. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
  40. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-expo-agy/plugin.json +1 -1
  43. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  48. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  53. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  58. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  63. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-rails-agy/plugin.json +1 -1
  68. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  72. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  73. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  77. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  78. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  80. package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +50 -1
  81. package/plugins/src/base/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
  82. package/plugins/src/base/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
  83. package/plugins/src/base/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
  84. package/plugins/src/base/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
@@ -108,6 +108,65 @@ function isDownloadKind(method) {
108
108
  return INSTALL_METHODS.has(method) && method !== "npm-global";
109
109
  }
110
110
 
111
+ /**
112
+ * Validate `secrets.propagating`, which carries two shapes on purpose.
113
+ *
114
+ * A bare string mirrors `secrets.rotating`: it pins which *credential* may be
115
+ * copied into a foreign store, and any target may receive it. An object adds
116
+ * `targets`, pinning *where it may go* as well — the stronger statement, and the
117
+ * one worth making for anything not intended fleet-wide.
118
+ *
119
+ * Checked here rather than folded into the `require`/`rotating` loop because
120
+ * that loop assumes every entry is a string, and quietly rejecting the object
121
+ * form would leave the stronger declaration unusable.
122
+ * @param {unknown} propagating The declaration, if present.
123
+ * @returns {string[]} Problems found.
124
+ */
125
+ function validatePropagating(propagating) {
126
+ if (propagating === undefined || propagating === null) return [];
127
+ if (!Array.isArray(propagating)) {
128
+ return [
129
+ `secrets.propagating must be an array of exact key names, or of ` +
130
+ `{ name, targets } objects`,
131
+ ];
132
+ }
133
+ const problems = [];
134
+ for (const entry of propagating) {
135
+ const name = typeof entry === "string" ? entry : entry?.name;
136
+ if (typeof name !== "string" || !/^[A-Z][A-Z0-9_]*$/.test(name)) {
137
+ problems.push(
138
+ `secrets.propagating entry ${JSON.stringify(entry)} has no exact ` +
139
+ `UPPER_SNAKE_CASE name. Lookup is never fuzzy.`
140
+ );
141
+ continue;
142
+ }
143
+ if (typeof entry === "string") continue;
144
+ const targets = entry.targets;
145
+ if (targets === undefined) continue;
146
+ if (!Array.isArray(targets) || targets.length === 0) {
147
+ problems.push(
148
+ `secrets.propagating["${name}"].targets must be a non-empty array of ` +
149
+ `"<org>" or "<owner>/<repo>". Omit it to allow any target.`
150
+ );
151
+ continue;
152
+ }
153
+ for (const target of targets) {
154
+ if (
155
+ typeof target !== "string" ||
156
+ !/^[A-Za-z0-9][A-Za-z0-9._-]*(\/[A-Za-z0-9][A-Za-z0-9._-]*)?$/.test(
157
+ target
158
+ )
159
+ ) {
160
+ problems.push(
161
+ `secrets.propagating["${name}"] target ${JSON.stringify(target)} is ` +
162
+ `neither an organization nor an owner/repo.`
163
+ );
164
+ }
165
+ }
166
+ }
167
+ return problems;
168
+ }
169
+
111
170
  /**
112
171
  * Validate the `secrets` block.
113
172
  * @param {object|undefined} secrets The block, if present.
@@ -164,6 +223,23 @@ export function validateSecrets(secrets) {
164
223
  }
165
224
  }
166
225
 
226
+ problems.push(...validatePropagating(secrets.propagating));
227
+
228
+ // Excluding a name from every surface and declaring it copyable to a foreign
229
+ // store are opposite instructions about the same credential. The propagator
230
+ // refuses at push time; catching it here means the contradiction surfaces in
231
+ // review rather than the first time someone needs the push to work.
232
+ const excluded = new Set(secrets.narrow?.excludeKeys ?? []);
233
+ for (const entry of secrets.propagating ?? []) {
234
+ const name = typeof entry === "string" ? entry : entry?.name;
235
+ if (typeof name === "string" && excluded.has(name)) {
236
+ problems.push(
237
+ `secrets.propagating["${name}"] is also in secrets.narrow.excludeKeys. ` +
238
+ `Those say opposite things about the same credential.`
239
+ );
240
+ }
241
+ }
242
+
167
243
  if ((secrets.rotating ?? []).length && !secrets.bootstrap?.key) {
168
244
  problems.push(
169
245
  `secrets.rotating is declared but secrets.bootstrap.key is not. A ` +