@codyswann/lisa 2.101.0 → 2.102.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 (34) hide show
  1. package/README.md +4 -0
  2. package/dist/utils/postinstall-trampoline.d.ts.map +1 -1
  3. package/dist/utils/postinstall-trampoline.js +10 -0
  4. package/dist/utils/postinstall-trampoline.js.map +1 -1
  5. package/package.json +1 -1
  6. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  8. package/plugins/lisa/commands/wiki/install.md +7 -0
  9. package/plugins/lisa/rules/config-resolution.md +1 -0
  10. package/plugins/lisa/scripts/queue-status-build-readers.mjs +39 -4
  11. package/plugins/lisa/scripts/queue-status-prd-readers.mjs +39 -4
  12. package/plugins/lisa/skills/wiki-install/SKILL.md +101 -0
  13. package/plugins/lisa/skills/wiki-install/agents/openai.yaml +4 -0
  14. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  30. package/plugins/src/base/commands/wiki/install.md +7 -0
  31. package/plugins/src/base/rules/config-resolution.md +1 -0
  32. package/plugins/src/base/scripts/queue-status-build-readers.mjs +39 -4
  33. package/plugins/src/base/scripts/queue-status-prd-readers.mjs +39 -4
  34. package/plugins/src/base/skills/wiki-install/SKILL.md +101 -0
package/README.md CHANGED
@@ -164,3 +164,7 @@ Useful ingestion requests:
164
164
  - Ingest this design plan into the Lisa wiki.
165
165
  - Ingest these meeting notes.
166
166
  - Update the architecture overview from recent source changes.
167
+
168
+ ### Adding a wiki to a downstream project
169
+
170
+ The wiki kernel ships as a separate plugin (`lisa-wiki`) that is `AVAILABLE` but not enabled by default. To bootstrap it in a project that already has Lisa installed, run `/lisa:wiki:install` (Claude) or `$lisa-wiki-install` (Codex). This shipped-with-base command flips `lisa-wiki@lisa` to enabled in `.claude/settings.json` and verifies the Codex skill overlay is current — but does not scaffold the wiki itself. After reload, follow up with `/setup:wiki` (Claude) or `$lisa-wiki-setup` (Codex) to create `wiki/` from `wiki/lisa-wiki.config.json`.
@@ -1 +1 @@
1
- {"version":3,"file":"postinstall-trampoline.d.ts","sourceRoot":"","sources":["../../src/utils/postinstall-trampoline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAmC3C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AA6DD;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,OAAO,CASvC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,OAAO,GACd,OAAO,CAIT;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,GACjB,SAAS,cAAc,EAAE,CAI3B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,iBAAiB,CAE1E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAMjB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
1
+ {"version":3,"file":"postinstall-trampoline.d.ts","sourceRoot":"","sources":["../../src/utils/postinstall-trampoline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAmC3C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AA6DD;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,OAAO,CASvC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,OAAO,GACd,OAAO,CAYT;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,GACjB,SAAS,cAAc,EAAE,CAI3B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,cAAc,GAAG,iBAAiB,CAE1E;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAMjB,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -143,6 +143,16 @@ export function shouldSchedulePostinstallReconciliation(dryRun) {
143
143
  return false;
144
144
  if (isRunningAsTrampoline())
145
145
  return false;
146
+ // Test runners (vitest, jest) frequently invoke `bun run` / `npm test` which
147
+ // sets `npm_package_json`, making `isRunningAsLifecycleScript()` true. The
148
+ // detached trampoline child then races against the test's temp-dir cleanup
149
+ // and dies with ENOENT when its cwd vanishes. Same principle as
150
+ // isRunningInCI's vitest/jest opt-out above — test runners are not real
151
+ // package-manager processes and the trampoline must not spawn from them.
152
+ if (readEnv("VITEST") !== undefined)
153
+ return false;
154
+ if (readEnv("JEST_WORKER_ID") !== undefined)
155
+ return false;
146
156
  return isRunningAsLifecycleScript();
147
157
  }
148
158
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"postinstall-trampoline.js","sourceRoot":"","sources":["../../src/utils/postinstall-trampoline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postinstall-trampoline.js","sourceRoot":"","sources":["../../src/utils/postinstall-trampoline.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -82,7 +82,7 @@
82
82
  "lodash": ">=4.18.1"
83
83
  },
84
84
  "name": "@codyswann/lisa",
85
- "version": "2.101.0",
85
+ "version": "2.102.0",
86
86
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
87
87
  "main": "dist/index.js",
88
88
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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": "2.101.0",
3
+ "version": "2.102.0",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: "Enable the LLM Wiki kernel (lisa-wiki plugin) in this project so its setup skill becomes discoverable. Edits .claude/settings.json to enable lisa-wiki@lisa and confirm the CodySwannGT/lisa marketplace, then verifies the Codex overlay (.codex/skills/lisa) already carries the wiki kernel. Does NOT scaffold the wiki itself — after install, reload the runtime and run /setup:wiki (Claude) or $lisa-wiki-setup (Codex)."
3
+ allowed-tools: ["Skill"]
4
+ argument-hint: ""
5
+ ---
6
+
7
+ Use the /lisa:wiki-install skill to enable the lisa-wiki plugin in this project. $ARGUMENTS
@@ -164,6 +164,7 @@ fi
164
164
  |-------|----------|---------|-------|
165
165
  | `tracker` | **yes** | — | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing → fail with instruction to run the matching `/lisa:setup:*` skill. |
166
166
  | `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
167
+ | `usage` | no | — | Optional token/cost pricing metadata consumed by the `usage-accounting` rule. Missing pricing never blocks a lifecycle flow; Lisa records token counts with `estimated_cost: null` when no trustworthy price source is configured. |
167
168
 
168
169
  ### Vendor sections
169
170
 
@@ -19,6 +19,7 @@ export const BUILD_LIFECYCLE_ORDER = [
19
19
  ];
20
20
 
21
21
  const ACTIONABLE_ROLE_ORDER = ["blocked", "ready", "claimed", "review"];
22
+ const RAW_BUILD_READER_TRACKERS = new Set(["github"]);
22
23
 
23
24
  const HIGHLIGHT_COPY = {
24
25
  blocked: {
@@ -89,6 +90,8 @@ export function readGithubBuildQueueSnapshot(input = {}) {
89
90
  * }} input
90
91
  */
91
92
  export function createBuildQueueSnapshot(input = {}) {
93
+ const tracker = normalizeTracker(input.tracker);
94
+ const unsupportedReaderError = resolveUnsupportedReaderError(input, tracker);
92
95
  const roles = normalizeRoles(input.roles);
93
96
  const items = normalizeItems(input.items);
94
97
  const counts = buildLifecycleCounts(items);
@@ -99,9 +102,14 @@ export function createBuildQueueSnapshot(input = {}) {
99
102
  input.queueArgument
100
103
  );
101
104
  const queueResolved =
102
- input.queueResolved ?? typeof input.resolutionError !== "string";
105
+ input.queueResolved ??
106
+ (unsupportedReaderError
107
+ ? false
108
+ : typeof input.resolutionError !== "string");
103
109
  const namespaceAdopted =
104
110
  input.namespaceAdopted ?? inferNamespaceAdopted(items, roles);
111
+ const resolutionError =
112
+ unsupportedReaderError ?? input.resolutionError ?? null;
105
113
 
106
114
  const health = classifyQueueHealth({
107
115
  queueResolved,
@@ -110,11 +118,11 @@ export function createBuildQueueSnapshot(input = {}) {
110
118
  activeCount: counts.claimed + counts.review,
111
119
  blockedCount: counts.blocked,
112
120
  stalledCount: repairSignals.stalled.length,
113
- resolutionError: input.resolutionError ?? null,
121
+ resolutionError,
114
122
  });
115
123
 
116
124
  return {
117
- tracker: input.tracker ?? "unknown",
125
+ tracker,
118
126
  queueResolved,
119
127
  namespaceAdopted,
120
128
  roles,
@@ -122,7 +130,7 @@ export function createBuildQueueSnapshot(input = {}) {
122
130
  highlights,
123
131
  repairSignals,
124
132
  health,
125
- resolutionError: input.resolutionError ?? null,
133
+ resolutionError,
126
134
  };
127
135
  }
128
136
 
@@ -218,6 +226,33 @@ function normalizeRoles(roles) {
218
226
  };
219
227
  }
220
228
 
229
+ /**
230
+ * @param {string | undefined} tracker
231
+ * @returns {string}
232
+ */
233
+ function normalizeTracker(tracker) {
234
+ return typeof tracker === "string" && tracker.trim().length > 0
235
+ ? tracker.trim().toLowerCase()
236
+ : "unknown";
237
+ }
238
+
239
+ /**
240
+ * @param {Record<string, any>} input
241
+ * @param {string} tracker
242
+ * @returns {string | null}
243
+ */
244
+ function resolveUnsupportedReaderError(input, tracker) {
245
+ if (
246
+ tracker === "unknown" ||
247
+ RAW_BUILD_READER_TRACKERS.has(tracker) ||
248
+ Object.hasOwn(input, "items")
249
+ ) {
250
+ return null;
251
+ }
252
+
253
+ return `vendor reader not implemented for build tracker '${tracker}'`;
254
+ }
255
+
221
256
  /**
222
257
  * @param {Record<string, any> | undefined} done
223
258
  * @returns {Record<string, string>}
@@ -27,6 +27,7 @@ const ACTIONABLE_ROLE_ORDER = [
27
27
  "ready",
28
28
  "ticketed",
29
29
  ];
30
+ const RAW_PRD_READER_SOURCES = new Set(["github"]);
30
31
 
31
32
  const HIGHLIGHT_COPY = {
32
33
  blocked: {
@@ -96,15 +97,22 @@ export function readGithubPrdQueueSnapshot(input = {}) {
96
97
  * }} input
97
98
  */
98
99
  export function createPrdQueueSnapshot(input = {}) {
100
+ const source = normalizeSource(input.source);
101
+ const unsupportedReaderError = resolveUnsupportedReaderError(input, source);
99
102
  const rawRoles = input.roles ?? {};
100
103
  const roles = normalizeRoles(rawRoles);
101
104
  const items = normalizeItems(input.items);
102
105
  const counts = buildLifecycleCounts(items);
103
106
  const highlights = buildActionableHighlights(items, input.queueArgument);
104
107
  const queueResolved =
105
- input.queueResolved ?? typeof input.resolutionError !== "string";
108
+ input.queueResolved ??
109
+ (unsupportedReaderError
110
+ ? false
111
+ : typeof input.resolutionError !== "string");
106
112
  const namespaceAdopted =
107
113
  input.namespaceAdopted ?? inferNamespaceAdopted(items, rawRoles);
114
+ const resolutionError =
115
+ unsupportedReaderError ?? input.resolutionError ?? null;
108
116
 
109
117
  const health = classifyQueueHealth({
110
118
  queueResolved,
@@ -113,18 +121,18 @@ export function createPrdQueueSnapshot(input = {}) {
113
121
  activeCount: counts.in_review + counts.ticketed,
114
122
  blockedCount: counts.blocked,
115
123
  stalledCount: counts.shipped,
116
- resolutionError: input.resolutionError ?? null,
124
+ resolutionError,
117
125
  });
118
126
 
119
127
  return {
120
- source: input.source ?? "unknown",
128
+ source,
121
129
  queueResolved,
122
130
  namespaceAdopted,
123
131
  roles,
124
132
  counts,
125
133
  highlights,
126
134
  health,
127
- resolutionError: input.resolutionError ?? null,
135
+ resolutionError,
128
136
  };
129
137
  }
130
138
 
@@ -203,6 +211,33 @@ function normalizeRoles(roles) {
203
211
  return normalized;
204
212
  }
205
213
 
214
+ /**
215
+ * @param {string | undefined} source
216
+ * @returns {string}
217
+ */
218
+ function normalizeSource(source) {
219
+ return typeof source === "string" && source.trim().length > 0
220
+ ? source.trim().toLowerCase()
221
+ : "unknown";
222
+ }
223
+
224
+ /**
225
+ * @param {Record<string, any>} input
226
+ * @param {string} source
227
+ * @returns {string | null}
228
+ */
229
+ function resolveUnsupportedReaderError(input, source) {
230
+ if (
231
+ source === "unknown" ||
232
+ RAW_PRD_READER_SOURCES.has(source) ||
233
+ Object.hasOwn(input, "items")
234
+ ) {
235
+ return null;
236
+ }
237
+
238
+ return `vendor reader not implemented for PRD source '${source}'`;
239
+ }
240
+
206
241
  /**
207
242
  * @param {readonly Record<string, any>[] | undefined} items
208
243
  * @returns {readonly Record<string, any>[]}
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: wiki-install
3
+ description: "Bootstrap the LLM Wiki kernel (lisa-wiki plugin) in a host project. Solves the chicken-and-egg gap: the base lisa plugin can install the wiki plugin so its setup skill becomes discoverable. Edits .claude/settings.json to enable lisa-wiki@lisa and confirm the CodySwannGT/lisa marketplace, then for Codex verifies whether the .codex/skills/lisa overlay already carries lisa-wiki-* skills (printed by Lisa's apply) and nudges the user to refresh the overlay if missing. Idempotent. Never auto-runs `lisa apply`. After this skill, reload the runtime and run /setup:wiki (Claude) or $lisa-wiki-setup (Codex) to scaffold the wiki itself."
4
+ allowed-tools: ["Bash", "Read", "Write", "Edit"]
5
+ ---
6
+
7
+ # Install the LLM Wiki kernel
8
+
9
+ This skill makes the `lisa-wiki` plugin visible in the current project so its scaffolder (`/setup:wiki` / `$lisa-wiki-setup`) can run. It does **not** scaffold the wiki itself — that is the wiki plugin's job. This skill only flips the install bit and verifies the Codex overlay carries the kernel.
10
+
11
+ ## Why this skill exists
12
+
13
+ `lisa-wiki` is published as `AVAILABLE` (not `INSTALLED_BY_DEFAULT`) in Lisa's marketplace. A downstream project that never enabled it has no way to discover the wiki's setup command — a chicken-and-egg bootstrap gap. Because the base `lisa` plugin is auto-enabled everywhere, putting the bootstrap here is what makes the wiki reachable.
14
+
15
+ ## Asymmetry note
16
+
17
+ The two runtimes work differently:
18
+
19
+ - **Claude Code** loads plugin skills per-project through `.claude/settings.json` `enabledPlugins`. The wiki skills are invisible until `lisa-wiki@lisa` is enabled there. This skill makes that edit.
20
+ - **Codex** loads Lisa skills through an overlay path (`src/codex/skills-installer.ts` runs from `Lisa.apply()` and copies every built `plugins/<p>/skills/<n>/` into `.codex/skills/lisa/`). Wiki skills land in that overlay automatically every time the project re-applies Lisa. This skill does not mutate Codex config — it only checks whether the overlay carries `lisa-wiki-setup` and tells the user how to refresh if missing.
21
+
22
+ ## Workflow
23
+
24
+ ### Step 1 — Verify we are in a project, not Lisa itself
25
+
26
+ ```bash
27
+ cwd="$(pwd)"
28
+ if [ -f "$cwd/.lisa-source" ] || { [ -d "$cwd/plugins/src/base" ] && [ -f "$cwd/.claude-plugin/marketplace.json" ]; }; then
29
+ echo "This is the Lisa monorepo itself — the base plugin's wiki kernel already lives here."
30
+ echo "Run /setup:wiki to scaffold a wiki, or invoke this skill from inside a downstream project."
31
+ exit 0
32
+ fi
33
+ ```
34
+
35
+ ### Step 2 — Enable lisa-wiki@lisa in the Claude project settings
36
+
37
+ Read `<cwd>/.claude/settings.json` (create with `{}` if absent). Then, using the **Edit** or **Write** tool with valid JSON (not jq one-liners that risk corrupting comments / formatting):
38
+
39
+ 1. Ensure `enabledPlugins` is an object.
40
+ 2. Set `enabledPlugins["lisa-wiki@lisa"] = true`.
41
+ 3. Ensure `extraKnownMarketplaces` is an object containing the entry below if it is not already present (do **not** overwrite an existing entry):
42
+
43
+ ```json
44
+ "CodySwannGT/lisa": {
45
+ "source": {
46
+ "source": "github",
47
+ "repo": "CodySwannGT/lisa"
48
+ }
49
+ }
50
+ ```
51
+
52
+ 4. Pretty-print the file with 2-space indentation and a trailing newline.
53
+
54
+ If `enabledPlugins["lisa-wiki@lisa"]` was already `true`, log "Claude: lisa-wiki@lisa already enabled — no change." If not, log "Claude: enabled lisa-wiki@lisa in .claude/settings.json."
55
+
56
+ **Do not** edit `.claude/settings.local.json` — that file is per-user and is not the right surface for a project-level enablement.
57
+
58
+ ### Step 3 — Verify the Codex overlay carries lisa-wiki
59
+
60
+ ```bash
61
+ codex_wiki_setup=".codex/skills/lisa/lisa-wiki-setup/SKILL.md"
62
+ if [ -f "$codex_wiki_setup" ]; then
63
+ echo "Codex: lisa-wiki overlay already present (found $codex_wiki_setup). Nothing to do for Codex."
64
+ else
65
+ echo "Codex: lisa-wiki skills not found in .codex/skills/lisa/."
66
+ if [ -d ".agents" ] || [ -d ".codex" ]; then
67
+ echo " → This project appears Codex-wired but its overlay is stale or predates lisa-wiki."
68
+ echo " → Refresh it by running your project's Lisa apply command, e.g.:"
69
+ echo " npx lisa --harness=codex ."
70
+ echo " (or whatever shape your project uses to apply Lisa for Codex)."
71
+ else
72
+ echo " → This project does not have a Codex installation yet (no .agents/ or .codex/). Skip if Codex parity is not needed."
73
+ fi
74
+ fi
75
+ ```
76
+
77
+ **Do not** invoke `lisa apply` automatically. `lisa apply` rewrites more than the wiki overlay; it must remain the user's explicit choice.
78
+
79
+ ### Step 4 — Hand off
80
+
81
+ Print:
82
+
83
+ ```
84
+ Wiki kernel install complete.
85
+
86
+ Next steps:
87
+ • Reload your runtime so it picks up the newly-enabled plugin (Claude: /reload or restart the session; Codex: restart `codex`).
88
+ • Then run /setup:wiki (Claude) or $lisa-wiki-setup (Codex) to scaffold wiki/ in this project.
89
+ ```
90
+
91
+ ## Rules
92
+
93
+ - Idempotent. Re-running produces no spurious changes once both flags are set.
94
+ - Project-scoped only. Never touch `~/.codex/config.toml` or any user-global config.
95
+ - Never run `lisa apply` on the user's behalf.
96
+ - Never edit `.claude/settings.local.json` — it is user-scoped overrides.
97
+ - Preserve human-authored content. Only flip the enablement key and add the marketplace entry if missing.
98
+
99
+ ## Related
100
+
101
+ `lisa-wiki-setup` (the actual scaffolder, lives in the `lisa-wiki` plugin once enabled), `lisa-wiki-doctor`, `lisa-wiki-usage`.
@@ -0,0 +1,4 @@
1
+ display_name: "Wiki Install"
2
+ short_description: "Bootstrap the LLM Wiki kernel (lisa-wiki plugin) in a host project"
3
+ default_prompt:
4
+ - "Use $wiki-install: Bootstrap the LLM Wiki kernel (lisa-wiki plugin) in a host project."
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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": "2.101.0",
3
+ "version": "2.102.0",
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-expo",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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": "2.101.0",
3
+ "version": "2.102.0",
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-harper-fabric",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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": "2.101.0",
3
+ "version": "2.102.0",
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-nestjs",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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.101.0",
3
+ "version": "2.102.0",
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-openclaw",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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.101.0",
3
+ "version": "2.102.0",
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-rails",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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.101.0",
3
+ "version": "2.102.0",
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-typescript",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint 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.101.0",
3
+ "version": "2.102.0",
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-wiki",
3
- "version": "2.101.0",
3
+ "version": "2.102.0",
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.101.0",
3
+ "version": "2.102.0",
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"
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: "Enable the LLM Wiki kernel (lisa-wiki plugin) in this project so its setup skill becomes discoverable. Edits .claude/settings.json to enable lisa-wiki@lisa and confirm the CodySwannGT/lisa marketplace, then verifies the Codex overlay (.codex/skills/lisa) already carries the wiki kernel. Does NOT scaffold the wiki itself — after install, reload the runtime and run /setup:wiki (Claude) or $lisa-wiki-setup (Codex)."
3
+ allowed-tools: ["Skill"]
4
+ argument-hint: ""
5
+ ---
6
+
7
+ Use the /lisa:wiki-install skill to enable the lisa-wiki plugin in this project. $ARGUMENTS
@@ -164,6 +164,7 @@ fi
164
164
  |-------|----------|---------|-------|
165
165
  | `tracker` | **yes** | — | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing → fail with instruction to run the matching `/lisa:setup:*` skill. |
166
166
  | `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
167
+ | `usage` | no | — | Optional token/cost pricing metadata consumed by the `usage-accounting` rule. Missing pricing never blocks a lifecycle flow; Lisa records token counts with `estimated_cost: null` when no trustworthy price source is configured. |
167
168
 
168
169
  ### Vendor sections
169
170
 
@@ -19,6 +19,7 @@ export const BUILD_LIFECYCLE_ORDER = [
19
19
  ];
20
20
 
21
21
  const ACTIONABLE_ROLE_ORDER = ["blocked", "ready", "claimed", "review"];
22
+ const RAW_BUILD_READER_TRACKERS = new Set(["github"]);
22
23
 
23
24
  const HIGHLIGHT_COPY = {
24
25
  blocked: {
@@ -89,6 +90,8 @@ export function readGithubBuildQueueSnapshot(input = {}) {
89
90
  * }} input
90
91
  */
91
92
  export function createBuildQueueSnapshot(input = {}) {
93
+ const tracker = normalizeTracker(input.tracker);
94
+ const unsupportedReaderError = resolveUnsupportedReaderError(input, tracker);
92
95
  const roles = normalizeRoles(input.roles);
93
96
  const items = normalizeItems(input.items);
94
97
  const counts = buildLifecycleCounts(items);
@@ -99,9 +102,14 @@ export function createBuildQueueSnapshot(input = {}) {
99
102
  input.queueArgument
100
103
  );
101
104
  const queueResolved =
102
- input.queueResolved ?? typeof input.resolutionError !== "string";
105
+ input.queueResolved ??
106
+ (unsupportedReaderError
107
+ ? false
108
+ : typeof input.resolutionError !== "string");
103
109
  const namespaceAdopted =
104
110
  input.namespaceAdopted ?? inferNamespaceAdopted(items, roles);
111
+ const resolutionError =
112
+ unsupportedReaderError ?? input.resolutionError ?? null;
105
113
 
106
114
  const health = classifyQueueHealth({
107
115
  queueResolved,
@@ -110,11 +118,11 @@ export function createBuildQueueSnapshot(input = {}) {
110
118
  activeCount: counts.claimed + counts.review,
111
119
  blockedCount: counts.blocked,
112
120
  stalledCount: repairSignals.stalled.length,
113
- resolutionError: input.resolutionError ?? null,
121
+ resolutionError,
114
122
  });
115
123
 
116
124
  return {
117
- tracker: input.tracker ?? "unknown",
125
+ tracker,
118
126
  queueResolved,
119
127
  namespaceAdopted,
120
128
  roles,
@@ -122,7 +130,7 @@ export function createBuildQueueSnapshot(input = {}) {
122
130
  highlights,
123
131
  repairSignals,
124
132
  health,
125
- resolutionError: input.resolutionError ?? null,
133
+ resolutionError,
126
134
  };
127
135
  }
128
136
 
@@ -218,6 +226,33 @@ function normalizeRoles(roles) {
218
226
  };
219
227
  }
220
228
 
229
+ /**
230
+ * @param {string | undefined} tracker
231
+ * @returns {string}
232
+ */
233
+ function normalizeTracker(tracker) {
234
+ return typeof tracker === "string" && tracker.trim().length > 0
235
+ ? tracker.trim().toLowerCase()
236
+ : "unknown";
237
+ }
238
+
239
+ /**
240
+ * @param {Record<string, any>} input
241
+ * @param {string} tracker
242
+ * @returns {string | null}
243
+ */
244
+ function resolveUnsupportedReaderError(input, tracker) {
245
+ if (
246
+ tracker === "unknown" ||
247
+ RAW_BUILD_READER_TRACKERS.has(tracker) ||
248
+ Object.hasOwn(input, "items")
249
+ ) {
250
+ return null;
251
+ }
252
+
253
+ return `vendor reader not implemented for build tracker '${tracker}'`;
254
+ }
255
+
221
256
  /**
222
257
  * @param {Record<string, any> | undefined} done
223
258
  * @returns {Record<string, string>}
@@ -27,6 +27,7 @@ const ACTIONABLE_ROLE_ORDER = [
27
27
  "ready",
28
28
  "ticketed",
29
29
  ];
30
+ const RAW_PRD_READER_SOURCES = new Set(["github"]);
30
31
 
31
32
  const HIGHLIGHT_COPY = {
32
33
  blocked: {
@@ -96,15 +97,22 @@ export function readGithubPrdQueueSnapshot(input = {}) {
96
97
  * }} input
97
98
  */
98
99
  export function createPrdQueueSnapshot(input = {}) {
100
+ const source = normalizeSource(input.source);
101
+ const unsupportedReaderError = resolveUnsupportedReaderError(input, source);
99
102
  const rawRoles = input.roles ?? {};
100
103
  const roles = normalizeRoles(rawRoles);
101
104
  const items = normalizeItems(input.items);
102
105
  const counts = buildLifecycleCounts(items);
103
106
  const highlights = buildActionableHighlights(items, input.queueArgument);
104
107
  const queueResolved =
105
- input.queueResolved ?? typeof input.resolutionError !== "string";
108
+ input.queueResolved ??
109
+ (unsupportedReaderError
110
+ ? false
111
+ : typeof input.resolutionError !== "string");
106
112
  const namespaceAdopted =
107
113
  input.namespaceAdopted ?? inferNamespaceAdopted(items, rawRoles);
114
+ const resolutionError =
115
+ unsupportedReaderError ?? input.resolutionError ?? null;
108
116
 
109
117
  const health = classifyQueueHealth({
110
118
  queueResolved,
@@ -113,18 +121,18 @@ export function createPrdQueueSnapshot(input = {}) {
113
121
  activeCount: counts.in_review + counts.ticketed,
114
122
  blockedCount: counts.blocked,
115
123
  stalledCount: counts.shipped,
116
- resolutionError: input.resolutionError ?? null,
124
+ resolutionError,
117
125
  });
118
126
 
119
127
  return {
120
- source: input.source ?? "unknown",
128
+ source,
121
129
  queueResolved,
122
130
  namespaceAdopted,
123
131
  roles,
124
132
  counts,
125
133
  highlights,
126
134
  health,
127
- resolutionError: input.resolutionError ?? null,
135
+ resolutionError,
128
136
  };
129
137
  }
130
138
 
@@ -203,6 +211,33 @@ function normalizeRoles(roles) {
203
211
  return normalized;
204
212
  }
205
213
 
214
+ /**
215
+ * @param {string | undefined} source
216
+ * @returns {string}
217
+ */
218
+ function normalizeSource(source) {
219
+ return typeof source === "string" && source.trim().length > 0
220
+ ? source.trim().toLowerCase()
221
+ : "unknown";
222
+ }
223
+
224
+ /**
225
+ * @param {Record<string, any>} input
226
+ * @param {string} source
227
+ * @returns {string | null}
228
+ */
229
+ function resolveUnsupportedReaderError(input, source) {
230
+ if (
231
+ source === "unknown" ||
232
+ RAW_PRD_READER_SOURCES.has(source) ||
233
+ Object.hasOwn(input, "items")
234
+ ) {
235
+ return null;
236
+ }
237
+
238
+ return `vendor reader not implemented for PRD source '${source}'`;
239
+ }
240
+
206
241
  /**
207
242
  * @param {readonly Record<string, any>[] | undefined} items
208
243
  * @returns {readonly Record<string, any>[]}
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: wiki-install
3
+ description: "Bootstrap the LLM Wiki kernel (lisa-wiki plugin) in a host project. Solves the chicken-and-egg gap: the base lisa plugin can install the wiki plugin so its setup skill becomes discoverable. Edits .claude/settings.json to enable lisa-wiki@lisa and confirm the CodySwannGT/lisa marketplace, then for Codex verifies whether the .codex/skills/lisa overlay already carries lisa-wiki-* skills (printed by Lisa's apply) and nudges the user to refresh the overlay if missing. Idempotent. Never auto-runs `lisa apply`. After this skill, reload the runtime and run /setup:wiki (Claude) or $lisa-wiki-setup (Codex) to scaffold the wiki itself."
4
+ allowed-tools: ["Bash", "Read", "Write", "Edit"]
5
+ ---
6
+
7
+ # Install the LLM Wiki kernel
8
+
9
+ This skill makes the `lisa-wiki` plugin visible in the current project so its scaffolder (`/setup:wiki` / `$lisa-wiki-setup`) can run. It does **not** scaffold the wiki itself — that is the wiki plugin's job. This skill only flips the install bit and verifies the Codex overlay carries the kernel.
10
+
11
+ ## Why this skill exists
12
+
13
+ `lisa-wiki` is published as `AVAILABLE` (not `INSTALLED_BY_DEFAULT`) in Lisa's marketplace. A downstream project that never enabled it has no way to discover the wiki's setup command — a chicken-and-egg bootstrap gap. Because the base `lisa` plugin is auto-enabled everywhere, putting the bootstrap here is what makes the wiki reachable.
14
+
15
+ ## Asymmetry note
16
+
17
+ The two runtimes work differently:
18
+
19
+ - **Claude Code** loads plugin skills per-project through `.claude/settings.json` `enabledPlugins`. The wiki skills are invisible until `lisa-wiki@lisa` is enabled there. This skill makes that edit.
20
+ - **Codex** loads Lisa skills through an overlay path (`src/codex/skills-installer.ts` runs from `Lisa.apply()` and copies every built `plugins/<p>/skills/<n>/` into `.codex/skills/lisa/`). Wiki skills land in that overlay automatically every time the project re-applies Lisa. This skill does not mutate Codex config — it only checks whether the overlay carries `lisa-wiki-setup` and tells the user how to refresh if missing.
21
+
22
+ ## Workflow
23
+
24
+ ### Step 1 — Verify we are in a project, not Lisa itself
25
+
26
+ ```bash
27
+ cwd="$(pwd)"
28
+ if [ -f "$cwd/.lisa-source" ] || { [ -d "$cwd/plugins/src/base" ] && [ -f "$cwd/.claude-plugin/marketplace.json" ]; }; then
29
+ echo "This is the Lisa monorepo itself — the base plugin's wiki kernel already lives here."
30
+ echo "Run /setup:wiki to scaffold a wiki, or invoke this skill from inside a downstream project."
31
+ exit 0
32
+ fi
33
+ ```
34
+
35
+ ### Step 2 — Enable lisa-wiki@lisa in the Claude project settings
36
+
37
+ Read `<cwd>/.claude/settings.json` (create with `{}` if absent). Then, using the **Edit** or **Write** tool with valid JSON (not jq one-liners that risk corrupting comments / formatting):
38
+
39
+ 1. Ensure `enabledPlugins` is an object.
40
+ 2. Set `enabledPlugins["lisa-wiki@lisa"] = true`.
41
+ 3. Ensure `extraKnownMarketplaces` is an object containing the entry below if it is not already present (do **not** overwrite an existing entry):
42
+
43
+ ```json
44
+ "CodySwannGT/lisa": {
45
+ "source": {
46
+ "source": "github",
47
+ "repo": "CodySwannGT/lisa"
48
+ }
49
+ }
50
+ ```
51
+
52
+ 4. Pretty-print the file with 2-space indentation and a trailing newline.
53
+
54
+ If `enabledPlugins["lisa-wiki@lisa"]` was already `true`, log "Claude: lisa-wiki@lisa already enabled — no change." If not, log "Claude: enabled lisa-wiki@lisa in .claude/settings.json."
55
+
56
+ **Do not** edit `.claude/settings.local.json` — that file is per-user and is not the right surface for a project-level enablement.
57
+
58
+ ### Step 3 — Verify the Codex overlay carries lisa-wiki
59
+
60
+ ```bash
61
+ codex_wiki_setup=".codex/skills/lisa/lisa-wiki-setup/SKILL.md"
62
+ if [ -f "$codex_wiki_setup" ]; then
63
+ echo "Codex: lisa-wiki overlay already present (found $codex_wiki_setup). Nothing to do for Codex."
64
+ else
65
+ echo "Codex: lisa-wiki skills not found in .codex/skills/lisa/."
66
+ if [ -d ".agents" ] || [ -d ".codex" ]; then
67
+ echo " → This project appears Codex-wired but its overlay is stale or predates lisa-wiki."
68
+ echo " → Refresh it by running your project's Lisa apply command, e.g.:"
69
+ echo " npx lisa --harness=codex ."
70
+ echo " (or whatever shape your project uses to apply Lisa for Codex)."
71
+ else
72
+ echo " → This project does not have a Codex installation yet (no .agents/ or .codex/). Skip if Codex parity is not needed."
73
+ fi
74
+ fi
75
+ ```
76
+
77
+ **Do not** invoke `lisa apply` automatically. `lisa apply` rewrites more than the wiki overlay; it must remain the user's explicit choice.
78
+
79
+ ### Step 4 — Hand off
80
+
81
+ Print:
82
+
83
+ ```
84
+ Wiki kernel install complete.
85
+
86
+ Next steps:
87
+ • Reload your runtime so it picks up the newly-enabled plugin (Claude: /reload or restart the session; Codex: restart `codex`).
88
+ • Then run /setup:wiki (Claude) or $lisa-wiki-setup (Codex) to scaffold wiki/ in this project.
89
+ ```
90
+
91
+ ## Rules
92
+
93
+ - Idempotent. Re-running produces no spurious changes once both flags are set.
94
+ - Project-scoped only. Never touch `~/.codex/config.toml` or any user-global config.
95
+ - Never run `lisa apply` on the user's behalf.
96
+ - Never edit `.claude/settings.local.json` — it is user-scoped overrides.
97
+ - Preserve human-authored content. Only flip the enablement key and add the marketplace entry if missing.
98
+
99
+ ## Related
100
+
101
+ `lisa-wiki-setup` (the actual scaffolder, lives in the `lisa-wiki` plugin once enabled), `lisa-wiki-doctor`, `lisa-wiki-usage`.