@codyswann/lisa 4.21.6 → 4.22.2
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/all/copy-overwrite/scripts/lisa-environment-prepare.mjs +28 -12
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +2 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +9 -7
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-playwright-dedicated-caller.d.ts +0 -2
- package/dist/migrations/ensure-playwright-dedicated-caller.d.ts.map +1 -1
- package/dist/migrations/ensure-playwright-dedicated-caller.js +12 -40
- package/dist/migrations/ensure-playwright-dedicated-caller.js.map +1 -1
- package/expo/create-only/.github/workflows/maestro-e2e.yml +6 -0
- package/expo/create-only/.github/workflows/playwright-e2e.yml +5 -5
- package/package.json +2 -2
- 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 +26 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/providers.mjs +90 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +307 -53
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +20 -3
- package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +26 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/providers.mjs +90 -2
- package/plugins/lisa/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +307 -53
- package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +20 -3
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +26 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/providers.mjs +90 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +307 -53
- package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +20 -3
- 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 +26 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/providers.mjs +90 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +307 -53
- package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +20 -3
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +26 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/providers.mjs +90 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +307 -53
- package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +20 -3
- 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 +26 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/providers.mjs +90 -2
- package/plugins/src/base/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +307 -53
- package/plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md +20 -3
|
@@ -62,14 +62,12 @@ export declare class EnsurePlaywrightDedicatedCallerMigration implements Migrati
|
|
|
62
62
|
/**
|
|
63
63
|
* Produce the rewritten caller lines.
|
|
64
64
|
* @param plan - The classification of the current file
|
|
65
|
-
* @param verbs - Facade verbs the project declares
|
|
66
65
|
* @returns The new file contents, line by line
|
|
67
66
|
*/
|
|
68
67
|
private rewrite;
|
|
69
68
|
/**
|
|
70
69
|
* Summarize the rewrite for the operator standing outside the factory.
|
|
71
70
|
* @param plan - The classification of the current file
|
|
72
|
-
* @param verbs - Facade verbs the project declares
|
|
73
71
|
* @returns A one-line summary a non-technical reader can act on
|
|
74
72
|
*/
|
|
75
73
|
private describe;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-playwright-dedicated-caller.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-playwright-dedicated-caller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ensure-playwright-dedicated-caller.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-playwright-dedicated-caller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AA2BlC;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAa9C,CAAC;AA8OH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,wCAAyC,YAAW,SAAS;IACxE,QAAQ,CAAC,IAAI,wCAAwC;IACrD,QAAQ,CAAC,WAAW,8FACyE;IAE7F;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA8B5D;;;;;OAKG;IACH,OAAO,CAAC,MAAM;IAMd;;;;OAIG;IACH,OAAO,CAAC,OAAO;IA4Bf;;;;OAIG;IACH,OAAO,CAAC,QAAQ;CAQjB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import * as fse from "fs-extra";
|
|
4
|
-
import { readJsonOrNull } from "../utils/json-utils.js";
|
|
5
4
|
/** The seeded caller this migration repairs. */
|
|
6
5
|
const CALLER_FILE = path.join(".github", "workflows", "playwright-e2e.yml");
|
|
7
6
|
/** Any job-level caller pointing at a Lisa reusable workflow. */
|
|
@@ -41,11 +40,6 @@ export const DECLARED_INPUTS = new Set([
|
|
|
41
40
|
"prepare_setup_command",
|
|
42
41
|
"prepare_timeout_minutes",
|
|
43
42
|
]);
|
|
44
|
-
/** Facade verbs the retrofit may request, and the script each one requires. */
|
|
45
|
-
const PREPARE_VERBS = [
|
|
46
|
-
["reset", "environment:reset"],
|
|
47
|
-
["reseed", "environment:reseed"],
|
|
48
|
-
];
|
|
49
43
|
const EMPTY = {
|
|
50
44
|
verdict: "not-applicable",
|
|
51
45
|
reason: "",
|
|
@@ -203,21 +197,6 @@ function environmentFor(moment) {
|
|
|
203
197
|
const environment = moment.split(":")[1]?.trim() ?? "";
|
|
204
198
|
return environment === "" ? "development" : environment;
|
|
205
199
|
}
|
|
206
|
-
/**
|
|
207
|
-
* Read the facade verbs the project actually declares.
|
|
208
|
-
*
|
|
209
|
-
* A verb named in `prepare_verbs` that the project does not declare FAILS the
|
|
210
|
-
* run rather than skipping, so the retrofit asks only for verbs it can prove
|
|
211
|
-
* exist. A project with neither gets no `prepare_*` inputs at all, which leaves
|
|
212
|
-
* its nightly behaving exactly as it did.
|
|
213
|
-
* @param projectDir - Destination project directory
|
|
214
|
-
* @returns Declared verb names, in reset-then-reseed order
|
|
215
|
-
*/
|
|
216
|
-
async function declaredVerbs(projectDir) {
|
|
217
|
-
const pkg = await readJsonOrNull(path.join(projectDir, "package.json"));
|
|
218
|
-
const scripts = pkg?.scripts ?? {};
|
|
219
|
-
return PREPARE_VERBS.filter(([, script]) => script in scripts).map(([verb]) => verb);
|
|
220
|
-
}
|
|
221
200
|
/**
|
|
222
201
|
* First line of the contiguous comment block immediately above `at`.
|
|
223
202
|
*
|
|
@@ -290,8 +269,7 @@ export class EnsurePlaywrightDedicatedCallerMigration {
|
|
|
290
269
|
return this.report(ctx, plan);
|
|
291
270
|
if (plan.verdict !== "stale")
|
|
292
271
|
return { name: this.name, action: "noop" };
|
|
293
|
-
const
|
|
294
|
-
const message = this.describe(plan, verbs);
|
|
272
|
+
const message = this.describe(plan);
|
|
295
273
|
if (ctx.dryRun) {
|
|
296
274
|
ctx.logger.dry(`Would update ${CALLER_FILE}: ${message}`);
|
|
297
275
|
return {
|
|
@@ -301,7 +279,7 @@ export class EnsurePlaywrightDedicatedCallerMigration {
|
|
|
301
279
|
message,
|
|
302
280
|
};
|
|
303
281
|
}
|
|
304
|
-
await writeFile(path.join(ctx.projectDir, CALLER_FILE), this.rewrite(plan
|
|
282
|
+
await writeFile(path.join(ctx.projectDir, CALLER_FILE), this.rewrite(plan).join("\n"));
|
|
305
283
|
ctx.logger.success(message);
|
|
306
284
|
return {
|
|
307
285
|
name: this.name,
|
|
@@ -324,24 +302,21 @@ export class EnsurePlaywrightDedicatedCallerMigration {
|
|
|
324
302
|
/**
|
|
325
303
|
* Produce the rewritten caller lines.
|
|
326
304
|
* @param plan - The classification of the current file
|
|
327
|
-
* @param verbs - Facade verbs the project declares
|
|
328
305
|
* @returns The new file contents, line by line
|
|
329
306
|
*/
|
|
330
|
-
rewrite(plan
|
|
307
|
+
rewrite(plan) {
|
|
331
308
|
const usesLine = plan.lines[plan.usesAt].replace(`${STALE_WORKFLOW}.yml@${plan.ref}`, `${DEDICATED_WORKFLOW}.yml@${plan.ref}`);
|
|
332
309
|
const repointed = plan.lines.map((line, i) => i === plan.usesAt ? usesLine : line);
|
|
333
310
|
// Inserted at the TOP of the `with:` block: a key appended at the bottom
|
|
334
311
|
// could land inside a trailing block scalar such as
|
|
335
312
|
// `playwright_setup_command: |`, where it would be swallowed as script text.
|
|
336
|
-
const withPrepare =
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
...repointed.slice(plan.withAt + 1),
|
|
344
|
-
];
|
|
313
|
+
const withPrepare = [
|
|
314
|
+
...repointed.slice(0, plan.withAt + 1),
|
|
315
|
+
...PREPARE_NOTE,
|
|
316
|
+
` prepare_environment: '${environmentFor(plan.moment)}'`,
|
|
317
|
+
" prepare_verbs: 'reset,reseed'",
|
|
318
|
+
...repointed.slice(plan.withAt + 1),
|
|
319
|
+
];
|
|
345
320
|
if (plan.retiredAt < 0)
|
|
346
321
|
return withPrepare;
|
|
347
322
|
const retiredAt = plan.retiredAt + (withPrepare.length - repointed.length);
|
|
@@ -353,16 +328,13 @@ export class EnsurePlaywrightDedicatedCallerMigration {
|
|
|
353
328
|
/**
|
|
354
329
|
* Summarize the rewrite for the operator standing outside the factory.
|
|
355
330
|
* @param plan - The classification of the current file
|
|
356
|
-
* @param verbs - Facade verbs the project declares
|
|
357
331
|
* @returns A one-line summary a non-technical reader can act on
|
|
358
332
|
*/
|
|
359
|
-
describe(plan
|
|
333
|
+
describe(plan) {
|
|
360
334
|
const parts = [
|
|
361
335
|
`pointed it at the dedicated Playwright workflow (${DEDICATED_WORKFLOW}.yml@${plan.ref})`,
|
|
362
336
|
plan.retiredAt < 0 ? null : `dropped the retired ${RETIRED_INPUT} list`,
|
|
363
|
-
|
|
364
|
-
? "left the environment unprepared, because this project declares no environment:reset or environment:reseed script"
|
|
365
|
-
: `asked for a prepared environment (${verbs.join(", ")})`,
|
|
337
|
+
"required the complete environment lifecycle (reset, reseed)",
|
|
366
338
|
].filter((part) => part !== null);
|
|
367
339
|
return `Retrofitted ${CALLER_FILE}: ${parts.join("; ")}`;
|
|
368
340
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-playwright-dedicated-caller.js","sourceRoot":"","sources":["../../src/migrations/ensure-playwright-dedicated-caller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ensure-playwright-dedicated-caller.js","sourceRoot":"","sources":["../../src/migrations/ensure-playwright-dedicated-caller.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,6 +97,12 @@ jobs:
|
|
|
97
97
|
uses: CodySwannGT/lisa/.github/workflows/maestro-native-e2e.yml@main
|
|
98
98
|
with:
|
|
99
99
|
platform: ${{ inputs.platform || 'all' }}
|
|
100
|
+
# Return the shared environment to a known state before either platform
|
|
101
|
+
# starts. Both lifecycle commands are mandatory. If this project needs no
|
|
102
|
+
# seeded fixtures, environment:reseed is an explicit verified no-op; the
|
|
103
|
+
# step is still invoked so every suite follows reset then reseed.
|
|
104
|
+
prepare_environment: 'development'
|
|
105
|
+
prepare_verbs: 'reset,reseed'
|
|
100
106
|
# android_app_id: 'com.example.app'
|
|
101
107
|
# ios_app_id: 'com.example.app'
|
|
102
108
|
# maestro_env: |
|
|
@@ -149,11 +149,11 @@ jobs:
|
|
|
149
149
|
# a runner dies, is cancelled, or is evicted, so the next night starts
|
|
150
150
|
# against whatever the last failure left behind.
|
|
151
151
|
#
|
|
152
|
-
#
|
|
153
|
-
#
|
|
154
|
-
#
|
|
155
|
-
#
|
|
156
|
-
#
|
|
152
|
+
# Both `environment:reset` and `environment:reseed` must exist. A project
|
|
153
|
+
# with no fixture data still implements reseed as an explicit verified
|
|
154
|
+
# no-op; omitting a lifecycle step is not equivalent to invoking one that
|
|
155
|
+
# intentionally does no work. Clear `prepare_environment` only when this
|
|
156
|
+
# suite genuinely has no shared environment to prepare.
|
|
157
157
|
prepare_environment: 'development'
|
|
158
158
|
prepare_verbs: 'reset,reseed'
|
|
159
159
|
# Applies only while `e2e-browser` is undeclared at THIS workflow's
|
package/package.json
CHANGED
|
@@ -161,7 +161,7 @@
|
|
|
161
161
|
"zod-validation-error": "^4.0.0"
|
|
162
162
|
},
|
|
163
163
|
"name": "@codyswann/lisa",
|
|
164
|
-
"version": "4.
|
|
164
|
+
"version": "4.22.2",
|
|
165
165
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
166
166
|
"main": "dist/index.js",
|
|
167
167
|
"exports": {
|
|
@@ -300,5 +300,5 @@
|
|
|
300
300
|
"vite": "^8.0.16"
|
|
301
301
|
},
|
|
302
302
|
"type": "module",
|
|
303
|
-
"lisaReleaseCommit": "
|
|
303
|
+
"lisaReleaseCommit": "74f1e736556f9df6b3aa3616ae9d38d59fa35662"
|
|
304
304
|
}
|
|
@@ -281,7 +281,7 @@ Values never enter that process, so its output cannot leak one even if logged.
|
|
|
281
281
|
|
|
282
282
|
| Provider | Read | Write (rotation only) |
|
|
283
283
|
| --- | --- | --- |
|
|
284
|
-
| `bitwarden` | `bws secret list --output json` → index by `key` | `bws secret edit` |
|
|
284
|
+
| `bitwarden` | `bws secret list --output json` → index by `key` | `bws secret edit`; temporary `create`/`delete` for AWS publication coordination |
|
|
285
285
|
| `doppler` | `doppler secrets download --no-file --format json` | not implemented |
|
|
286
286
|
| `env` | environment only; the provider is the environment | n/a |
|
|
287
287
|
| `1password` | `op read "op://<vault>/<name>/credential"` | not implemented |
|
|
@@ -297,6 +297,31 @@ secret you would otherwise store inside it.
|
|
|
297
297
|
|
|
298
298
|
Unimplemented providers fail with a message naming where to add them, rather than failing obscurely. Do not claim support that does not exist.
|
|
299
299
|
|
|
300
|
+
### AWS bootstrap publication coordination
|
|
301
|
+
|
|
302
|
+
`publish-aws-bootstrap.mjs publish` and `preflight` serialize mutations of
|
|
303
|
+
`LISA_AWS_BOOTSTRAP_JSON` in the provider. Each contender creates a unique,
|
|
304
|
+
non-secret coordination record in the target record's Bitwarden project. The
|
|
305
|
+
oldest active contender wins by provider-issued `creationDate`, with the
|
|
306
|
+
provider id as a deterministic tie-breaker. Later contenders remove themselves
|
|
307
|
+
and stop before the bundle is written.
|
|
308
|
+
|
|
309
|
+
The winner re-reads the target after acquisition, then holds the coordination
|
|
310
|
+
record across the no-op write check, candidate verification, replacement,
|
|
311
|
+
read-back, post-write verification, and any rollback. Cleanup deletes the
|
|
312
|
+
coordination record and proves it no longer appears in the provider. Records
|
|
313
|
+
older than 30 minutes are expired and removed on the next attempt, covering a
|
|
314
|
+
killed host without permitting a permanent lock.
|
|
315
|
+
|
|
316
|
+
Coordination keys start with `LISA_COORDINATION_` and are excluded before
|
|
317
|
+
normal secret selection, so they can never resolve or materialize as
|
|
318
|
+
credentials. Their value is a fixed public sentinel; no credential is copied
|
|
319
|
+
into them. This publication lock is separate from the advisory rotation lease
|
|
320
|
+
record used by `rotate-secret.mjs`.
|
|
321
|
+
|
|
322
|
+
Ordinary session refresh only reads and materializes existing provider values.
|
|
323
|
+
It neither creates coordination records nor writes the AWS bundle.
|
|
324
|
+
|
|
300
325
|
Cache **in-process only**. Never write a resolved value to disk except through the materialization contract above.
|
|
301
326
|
|
|
302
327
|
## Doctor checks worth wiring
|
|
@@ -33,6 +33,17 @@ export const ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
|
33
33
|
*/
|
|
34
34
|
export const LEASE_KEY = "LISA_ROTATION_LEASES";
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Prefix reserved for provider-side coordination records.
|
|
38
|
+
*
|
|
39
|
+
* These records contain no credential material. They exist only long enough
|
|
40
|
+
* to serialize a provider mutation and must never cross the exposure boundary
|
|
41
|
+
* into a shell, file, hook, or CI environment.
|
|
42
|
+
*/
|
|
43
|
+
export const COORDINATION_KEY_PREFIX = "LISA_COORDINATION_";
|
|
44
|
+
|
|
45
|
+
const COORDINATION_VALUE = "coordination-only";
|
|
46
|
+
|
|
36
47
|
/**
|
|
37
48
|
* The environment variable each provider's CLI reads its own bootstrap from.
|
|
38
49
|
*
|
|
@@ -177,7 +188,7 @@ function fromKeychain(key) {
|
|
|
177
188
|
* caller may see, so the set it returns *is* the permitted set. Restating that
|
|
178
189
|
* as a list in config would duplicate a boundary the provider already enforces.
|
|
179
190
|
* @param {object} cfg Resolved configuration.
|
|
180
|
-
* @returns {Array<{key: string, value: string, note: string, projectId: string|null}>} Rows.
|
|
191
|
+
* @returns {Array<{key: string, value: string, note: string, projectId: string|null, id?: string|null, creationDate?: string|null, revisionDate?: string|null}>} Rows.
|
|
181
192
|
*/
|
|
182
193
|
export function fetchRaw(cfg) {
|
|
183
194
|
const env = providerEnv(cfg);
|
|
@@ -201,6 +212,8 @@ export function fetchRaw(cfg) {
|
|
|
201
212
|
note: s.note ?? "",
|
|
202
213
|
projectId: s.projectId ?? null,
|
|
203
214
|
id: s.id ?? null,
|
|
215
|
+
creationDate: s.creationDate ?? null,
|
|
216
|
+
revisionDate: s.revisionDate ?? null,
|
|
204
217
|
}));
|
|
205
218
|
}
|
|
206
219
|
|
|
@@ -248,7 +261,7 @@ function run(bin, args, env) {
|
|
|
248
261
|
* which is neither stable nor visible at the call site.
|
|
249
262
|
* @param {Array<object>} rows Raw provider rows.
|
|
250
263
|
* @param {{projectIds: string[], excludeKeys: string[]}} narrow Narrowing controls.
|
|
251
|
-
* @returns {Map<string, {value: string, note: string, id: string|null}>} Selected secrets by name.
|
|
264
|
+
* @returns {Map<string, {value: string, note: string, id: string|null, projectId: string|null, creationDate: string|null, revisionDate: string|null}>} Selected secrets by name.
|
|
252
265
|
*/
|
|
253
266
|
export function normalizeRows(
|
|
254
267
|
rows,
|
|
@@ -260,6 +273,12 @@ export function normalizeRows(
|
|
|
260
273
|
|
|
261
274
|
for (const row of rows) {
|
|
262
275
|
if (projects.size && !projects.has(row.projectId)) continue;
|
|
276
|
+
if (
|
|
277
|
+
typeof row.key === "string" &&
|
|
278
|
+
row.key.startsWith(COORDINATION_KEY_PREFIX)
|
|
279
|
+
) {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
263
282
|
if (typeof row.key !== "string" || !ENV_KEY.test(row.key)) continue;
|
|
264
283
|
if (excluded.has(row.key)) continue;
|
|
265
284
|
if (out.has(row.key)) {
|
|
@@ -276,6 +295,9 @@ export function normalizeRows(
|
|
|
276
295
|
value: row.value,
|
|
277
296
|
note: row.note ?? "",
|
|
278
297
|
id: row.id ?? null,
|
|
298
|
+
projectId: row.projectId ?? null,
|
|
299
|
+
creationDate: row.creationDate ?? null,
|
|
300
|
+
revisionDate: row.revisionDate ?? null,
|
|
279
301
|
});
|
|
280
302
|
}
|
|
281
303
|
return out;
|
|
@@ -370,3 +392,69 @@ export function writeSecret(cfg, id, value) {
|
|
|
370
392
|
`Rotation requires a proven write path; add one in providers.mjs.`
|
|
371
393
|
);
|
|
372
394
|
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Create one provider-issued publication contender in the target project.
|
|
398
|
+
*
|
|
399
|
+
* The deliberately constrained interface accepts no value: coordination
|
|
400
|
+
* records always contain the same public sentinel, which prevents this helper
|
|
401
|
+
* from becoming an alternate credential-write path.
|
|
402
|
+
* @param {object} cfg Resolved configuration.
|
|
403
|
+
* @param {string} key Unique coordination key.
|
|
404
|
+
* @param {string} projectId Project containing the target provider record.
|
|
405
|
+
* @param {string} note Non-sensitive lifecycle metadata.
|
|
406
|
+
* @returns {object} The provider-issued coordination row.
|
|
407
|
+
*/
|
|
408
|
+
export function createCoordinationRecord(cfg, key, projectId, note) {
|
|
409
|
+
const env = providerEnv(cfg);
|
|
410
|
+
|
|
411
|
+
if (cfg.provider === "bitwarden") {
|
|
412
|
+
const raw = run(
|
|
413
|
+
"bws",
|
|
414
|
+
[
|
|
415
|
+
"secret",
|
|
416
|
+
"create",
|
|
417
|
+
key,
|
|
418
|
+
COORDINATION_VALUE,
|
|
419
|
+
projectId,
|
|
420
|
+
"--note",
|
|
421
|
+
note,
|
|
422
|
+
"--output",
|
|
423
|
+
"json",
|
|
424
|
+
],
|
|
425
|
+
env
|
|
426
|
+
);
|
|
427
|
+
const created = JSON.parse(raw);
|
|
428
|
+
return {
|
|
429
|
+
key: created.key,
|
|
430
|
+
value: created.value,
|
|
431
|
+
note: created.note ?? "",
|
|
432
|
+
projectId: created.projectId ?? null,
|
|
433
|
+
id: created.id ?? null,
|
|
434
|
+
creationDate: created.creationDate ?? null,
|
|
435
|
+
revisionDate: created.revisionDate ?? null,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
throw new Error(
|
|
439
|
+
`provider "${cfg.provider}" has no coordination-record creation implemented.\n` +
|
|
440
|
+
`AWS bootstrap publication requires a provider-backed single-writer lock.`
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Remove one provider-side coordination record by its provider identifier.
|
|
446
|
+
* @param {object} cfg Resolved configuration.
|
|
447
|
+
* @param {string} id Provider-side identifier for the coordination record.
|
|
448
|
+
*/
|
|
449
|
+
export function removeCoordinationRecord(cfg, id) {
|
|
450
|
+
const env = providerEnv(cfg);
|
|
451
|
+
|
|
452
|
+
if (cfg.provider === "bitwarden") {
|
|
453
|
+
run("bws", ["secret", "delete", id, "--output", "none"], env);
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
throw new Error(
|
|
457
|
+
`provider "${cfg.provider}" has no coordination-record deletion implemented.\n` +
|
|
458
|
+
`AWS bootstrap publication requires verified lock cleanup.`
|
|
459
|
+
);
|
|
460
|
+
}
|