@codyswann/lisa 2.321.2 → 2.321.3

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 (72) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +4 -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/scripts/doctor-secrets.mjs +2 -2
  8. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/providers.mjs +39 -0
  9. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/rotate-secret.mjs +10 -2
  10. package/plugins/lisa/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +2 -2
  11. package/plugins/lisa/skills/lisa-secrets-access/scripts/providers.mjs +39 -0
  12. package/plugins/lisa/skills/lisa-secrets-access/scripts/rotate-secret.mjs +10 -2
  13. package/plugins/lisa-agy/plugin.json +1 -1
  14. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +2 -2
  15. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/providers.mjs +39 -0
  16. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/rotate-secret.mjs +10 -2
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +2 -2
  24. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/providers.mjs +39 -0
  25. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/rotate-secret.mjs +10 -2
  26. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +2 -2
  28. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/providers.mjs +39 -0
  29. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/rotate-secret.mjs +10 -2
  30. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-agy/plugin.json +1 -1
  33. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  48. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  53. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-agy/plugin.json +1 -1
  58. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  63. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  68. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/src/base/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +2 -2
  71. package/plugins/src/base/skills/lisa-secrets-access/scripts/providers.mjs +39 -0
  72. package/plugins/src/base/skills/lisa-secrets-access/scripts/rotate-secret.mjs +10 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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": "2.321.2",
3
+ "version": "2.321.3",
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"
@@ -19,7 +19,7 @@
19
19
 
20
20
  import { createHash } from "node:crypto";
21
21
 
22
- import { fetchAll } from "./providers.mjs";
22
+ import { fetchAll, fetchRotatable } from "./providers.mjs";
23
23
  import { readMaterialized } from "./resolve-secret.mjs";
24
24
  import { readConfig } from "./surfaces.mjs";
25
25
 
@@ -220,7 +220,7 @@ function main() {
220
220
  checkRequired(cfg, provider, file, report);
221
221
  checkNaming(provider, report);
222
222
  checkNotes(provider, report);
223
- checkRotating(cfg, provider, report);
223
+ checkRotating(cfg, fetchRotatable(cfg), report);
224
224
  checkTwoStores(provider, file, report);
225
225
 
226
226
  const order = { error: 0, warn: 1, ok: 2 };
@@ -243,6 +243,45 @@ export function fetchAll(cfg) {
243
243
  return normalizeRows(fetchRaw(cfg), cfg.narrow);
244
244
  }
245
245
 
246
+ /**
247
+ * The provider view the rotation path reads.
248
+ *
249
+ * `excludeKeys` keeps a credential off a **surface's disk**. Applying it here
250
+ * too hid the provider record, making `rotating` and `excludeKeys` mutually
251
+ * exclusive — and a credential you cannot see is one you cannot write back to.
252
+ * That is backwards for a consumable credential: the kind you least want
253
+ * materialized is the kind that most needs a proven write path.
254
+ *
255
+ * Nothing here materializes anything. `fetchAll` remains the only view feeding
256
+ * a surface, so an excluded rotating credential still never reaches disk.
257
+ * @param {object} cfg Resolved configuration.
258
+ * @returns {Map<string, {value: string, note: string, id: string|null}>} Selected secrets by name.
259
+ */
260
+ export function fetchRotatable(cfg) {
261
+ return normalizeRows(fetchRaw(cfg), rotationNarrow(cfg));
262
+ }
263
+
264
+ /**
265
+ * Narrowing for the rotation view: project grants intact, `excludeKeys` waived
266
+ * for declared rotating names only.
267
+ *
268
+ * The waiver reaches only names in `secrets.rotating` — config, and therefore
269
+ * reviewed, the same declared-never-inferred rule the write path enforces.
270
+ * Project narrowing is the provider's own boundary and is never widened. Split
271
+ * from {@link fetchRotatable} so the decision is testable without a provider.
272
+ * @param {object} cfg Resolved configuration.
273
+ * @returns {{projectIds: string[], excludeKeys: string[]}} Narrowing controls.
274
+ */
275
+ export function rotationNarrow(cfg) {
276
+ const rotating = new Set(cfg.rotating ?? []);
277
+ return {
278
+ projectIds: cfg.narrow?.projectIds ?? [],
279
+ excludeKeys: (cfg.narrow?.excludeKeys ?? []).filter(
280
+ key => !rotating.has(key)
281
+ ),
282
+ };
283
+ }
284
+
246
285
  /**
247
286
  * Find one raw row by exact key, bypassing the exposure boundary.
248
287
  *
@@ -30,7 +30,12 @@
30
30
  import { readFileSync } from "node:fs";
31
31
  import { hostname } from "node:os";
32
32
 
33
- import { LEASE_KEY, fetchAll, rawByKey, writeSecret } from "./providers.mjs";
33
+ import {
34
+ LEASE_KEY,
35
+ fetchRotatable,
36
+ rawByKey,
37
+ writeSecret,
38
+ } from "./providers.mjs";
34
39
  import { readConfig } from "./surfaces.mjs";
35
40
 
36
41
  /** How long a lease is honoured before it is treated as abandoned. */
@@ -63,7 +68,10 @@ function assertRotating(name, cfg) {
63
68
  * @returns {{value: string, id: string}} The current entry.
64
69
  */
65
70
  function entryFor(name, cfg) {
66
- const hit = fetchAll(cfg).get(name);
71
+ // Rotation view, not the materialization view: a name may be excluded from
72
+ // every surface and still need its replacement persisted. assertRotating has
73
+ // already proved this name is declared in config.
74
+ const hit = fetchRotatable(cfg).get(name);
67
75
  if (!hit) throw new Error(`${name} is not available to this account`);
68
76
  if (!hit.id) {
69
77
  throw new Error(