@codyswann/lisa 3.14.8 → 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.
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +19 -3
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +49 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
- package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +50 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +50 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +50 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +50 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/validate-config.mjs +76 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +50 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/inspect-vault.mjs +120 -0
- package/plugins/src/base/skills/lisa-secrets-access/scripts/surfaces.mjs +2 -0
- package/plugins/src/base/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +481 -0
- 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 ` +
|