@codyswann/lisa 2.117.0 → 2.118.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 (25) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  5. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  6. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  7. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  8. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  10. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  12. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  16. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  18. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-wiki/scripts/ensure-gitignore.mjs +131 -0
  21. package/plugins/lisa-wiki/skills/lisa-wiki-setup/SKILL.md +13 -4
  22. package/plugins/lisa-wiki/templates/wrapper-gitignore.txt +19 -0
  23. package/plugins/src/wiki/scripts/ensure-gitignore.mjs +131 -0
  24. package/plugins/src/wiki/skills/lisa-wiki-setup/SKILL.md +13 -4
  25. package/plugins/src/wiki/templates/wrapper-gitignore.txt +19 -0
package/package.json CHANGED
@@ -83,7 +83,7 @@
83
83
  "lodash": ">=4.18.1"
84
84
  },
85
85
  "name": "@codyswann/lisa",
86
- "version": "2.117.0",
86
+ "version": "2.118.0",
87
87
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
88
88
  "main": "dist/index.js",
89
89
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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-cdk",
3
- "version": "2.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.0",
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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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.117.0",
3
+ "version": "2.118.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,131 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ensure-gitignore.mjs — merge the lisa-wiki gitignore block into the project's
4
+ * `.gitignore`, idempotently. Dependency-free.
5
+ *
6
+ * The block is delimited by `# BEGIN: AI GUARDRAILS WIKI` and
7
+ * `# END: AI GUARDRAILS WIKI` markers (see templates/wrapper-gitignore.txt).
8
+ * Behavior matches the base lisa plugin's copy-contents strategy
9
+ * (src/strategies/copy-contents.ts):
10
+ *
11
+ * - If the file is missing, create it with just the block.
12
+ * - If the block markers exist, replace the block in place.
13
+ * - If the markers don't exist, append the block to the end (preserving a
14
+ * trailing newline).
15
+ *
16
+ * Patterns outside the marker block are NEVER touched. Re-running produces no
17
+ * spurious diff once the file is in sync.
18
+ *
19
+ * Usage: node ensure-gitignore.mjs [--cwd <project-dir>] [--dry-run]
20
+ * default cwd: process.cwd()
21
+ * --dry-run prints the proposed merge result to stdout instead of writing
22
+ *
23
+ * Exit code 0 = ok (file was created, updated, or already in sync).
24
+ * Exit code 1 = error (e.g. template missing).
25
+ */
26
+ import fs from "node:fs";
27
+ import path from "node:path";
28
+ import { fileURLToPath } from "node:url";
29
+
30
+ const BEGIN_MARKER = "# BEGIN: AI GUARDRAILS WIKI";
31
+ const END_MARKER = "# END: AI GUARDRAILS WIKI";
32
+
33
+ function fail(msg) {
34
+ console.error(`✗ ${msg}`);
35
+ process.exit(1);
36
+ }
37
+
38
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
39
+ const pluginRoot = path.dirname(scriptDir);
40
+ const templatePath = path.join(
41
+ pluginRoot,
42
+ "templates",
43
+ "wrapper-gitignore.txt"
44
+ );
45
+
46
+ const argv = process.argv.slice(2);
47
+ const cwdIndex = argv.indexOf("--cwd");
48
+ const projectDir =
49
+ cwdIndex !== -1 && argv[cwdIndex + 1]
50
+ ? path.resolve(argv[cwdIndex + 1])
51
+ : process.cwd();
52
+ const dryRun = argv.includes("--dry-run");
53
+
54
+ if (!fs.existsSync(templatePath)) {
55
+ fail(`template not found: ${templatePath}`);
56
+ }
57
+
58
+ const templateRaw = fs.readFileSync(templatePath, "utf8");
59
+ const block = extractBlock(templateRaw);
60
+ if (!block) {
61
+ fail(
62
+ `template at ${templatePath} does not contain the expected marker pair (${BEGIN_MARKER} / ${END_MARKER})`
63
+ );
64
+ }
65
+
66
+ const gitignorePath = path.join(projectDir, ".gitignore");
67
+ const existing = fs.existsSync(gitignorePath)
68
+ ? fs.readFileSync(gitignorePath, "utf8")
69
+ : null;
70
+
71
+ const merged = mergeBlock(existing, block);
72
+
73
+ if (existing !== null && merged === existing) {
74
+ console.log(`✓ .gitignore already in sync (${gitignorePath})`);
75
+ process.exit(0);
76
+ }
77
+
78
+ if (dryRun) {
79
+ process.stdout.write(merged);
80
+ process.exit(0);
81
+ }
82
+
83
+ fs.writeFileSync(gitignorePath, merged);
84
+ const verb = existing === null ? "created" : "updated";
85
+ console.log(`✓ ${verb} ${gitignorePath}`);
86
+ process.exit(0);
87
+
88
+ /**
89
+ * Pull the block (markers included) out of arbitrary text. Returns null when
90
+ * the marker pair is missing or out of order.
91
+ */
92
+ function extractBlock(text) {
93
+ const startIdx = text.indexOf(BEGIN_MARKER);
94
+ if (startIdx === -1) return null;
95
+ const endStart = text.indexOf(END_MARKER, startIdx + BEGIN_MARKER.length);
96
+ if (endStart === -1) return null;
97
+ const endIdx = endStart + END_MARKER.length;
98
+ return text.slice(startIdx, endIdx);
99
+ }
100
+
101
+ /**
102
+ * Merge a freshly-rendered block into the destination file content.
103
+ * - existing === null → return the block alone (file will be created)
104
+ * - existing has the markers → replace the block in place
105
+ * - existing lacks the markers → append the block at the end
106
+ * Always normalizes to exactly one trailing newline.
107
+ */
108
+ function mergeBlock(existing, freshBlock) {
109
+ if (existing === null) {
110
+ return `${freshBlock.trimEnd()}\n`;
111
+ }
112
+
113
+ const startIdx = existing.indexOf(BEGIN_MARKER);
114
+ if (startIdx !== -1) {
115
+ const endStart = existing.indexOf(
116
+ END_MARKER,
117
+ startIdx + BEGIN_MARKER.length
118
+ );
119
+ if (endStart !== -1) {
120
+ const endIdx = endStart + END_MARKER.length;
121
+ const before = existing.slice(0, startIdx);
122
+ const after = existing.slice(endIdx);
123
+ const trimmedAfter = after.startsWith("\n") ? after : `\n${after}`;
124
+ return `${before}${freshBlock.trimEnd()}${trimmedAfter}`;
125
+ }
126
+ }
127
+
128
+ // No marker pair in the destination — append.
129
+ const base = existing.endsWith("\n") ? existing : `${existing}\n`;
130
+ return `${base}\n${freshBlock.trimEnd()}\n`;
131
+ }
@@ -30,13 +30,22 @@ never overwrites human-authored content.
30
30
  3. **Contract.** Render `wiki/schema/llm-wiki-contract.md` from the plugin templates + config via
31
31
  `scripts/render-contract.mjs`, stamping the `kernelVersion`. This snapshot keeps the wiki
32
32
  self-describing without the plugin installed.
33
- 4. **Pointers.** Ensure `AGENTS.md` / `CLAUDE.md` point at the contract + plugin (thin pointers only).
34
- 5. **Staff.** For each `config.staff[]` entry (the standard roster by default), generate the role's
33
+ 4. **Gitignore.** Merge the lisa-wiki gitignore block into the project's `.gitignore` via
34
+ `scripts/ensure-gitignore.mjs`. The block (delimited by `# BEGIN: AI GUARDRAILS WIKI` /
35
+ `# END: AI GUARDRAILS WIKI`) covers transient per-session worktrees and Lisa backup snapshots
36
+ (`.claude/worktrees/`, `.codex/worktrees/`, `.lisabak/`). Idempotent: re-running produces no
37
+ diff once the block is present. The block coexists with the base lisa plugin's
38
+ `# BEGIN: AI GUARDRAILS` block — both can be installed without overwriting each other because
39
+ the copy-contents strategy keys on the marker suffix. Wiki-wrapper repos (mode `wrapper` /
40
+ `standalone`) typically don't enable the base lisa plugin, so this step is the only path by
41
+ which they get the worktree-ignore patterns.
42
+ 5. **Pointers.** Ensure `AGENTS.md` / `CLAUDE.md` point at the contract + plugin (thin pointers only).
43
+ 6. **Staff.** For each `config.staff[]` entry (the standard roster by default), generate the role's
35
44
  `wiki/staff/<role>.md` page and its dual-runtime subagents by delegating to `lisa-wiki-add-role`
36
45
  (running the subagents is out of scope).
37
- 6. **README.** Apply the chosen README mode (ingest the old README first; `rich` keeps install/usage +
46
+ 7. **README.** Apply the chosen README mode (ingest the old README first; `rich` keeps install/usage +
38
47
  adds the onboarding line; `stub` is the minimal pointer; `preserve` leaves it).
39
- 7. **Verify.** Run `lisa-wiki-doctor` and report the verdict + any blocking items.
48
+ 8. **Verify.** Run `lisa-wiki-doctor` and report the verdict + any blocking items.
40
49
 
41
50
  ## Standard roster
42
51
  The default operating team seeded into `config.staff[]` for every new wiki (Chief of Staff plus six
@@ -0,0 +1,19 @@
1
+ # BEGIN: AI GUARDRAILS WIKI
2
+ # Managed by the lisa-wiki kernel. Do not edit between these markers — re-run
3
+ # /lisa-wiki:setup (or the equivalent script) to update. Patterns outside the
4
+ # block are preserved untouched. The "WIKI" suffix lets this block coexist
5
+ # with the base lisa plugin's "# BEGIN: AI GUARDRAILS" block when both are
6
+ # installed (the copy-contents strategy keys on the marker suffix).
7
+
8
+ # Claude Code per-session git worktrees. Each Claude session that needs an
9
+ # isolated working copy spawns one under .claude/worktrees/ (via
10
+ # `git worktree add`). They are transient, large (often hundreds of MB each),
11
+ # and per-developer; they must never be committed.
12
+ /.claude/worktrees/
13
+
14
+ # Codex CLI per-session worktrees (Codex equivalent of the above).
15
+ /.codex/worktrees/
16
+
17
+ # Lisa backup snapshots (created by `lisa` runs).
18
+ /.lisabak/
19
+ # END: AI GUARDRAILS WIKI
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ensure-gitignore.mjs — merge the lisa-wiki gitignore block into the project's
4
+ * `.gitignore`, idempotently. Dependency-free.
5
+ *
6
+ * The block is delimited by `# BEGIN: AI GUARDRAILS WIKI` and
7
+ * `# END: AI GUARDRAILS WIKI` markers (see templates/wrapper-gitignore.txt).
8
+ * Behavior matches the base lisa plugin's copy-contents strategy
9
+ * (src/strategies/copy-contents.ts):
10
+ *
11
+ * - If the file is missing, create it with just the block.
12
+ * - If the block markers exist, replace the block in place.
13
+ * - If the markers don't exist, append the block to the end (preserving a
14
+ * trailing newline).
15
+ *
16
+ * Patterns outside the marker block are NEVER touched. Re-running produces no
17
+ * spurious diff once the file is in sync.
18
+ *
19
+ * Usage: node ensure-gitignore.mjs [--cwd <project-dir>] [--dry-run]
20
+ * default cwd: process.cwd()
21
+ * --dry-run prints the proposed merge result to stdout instead of writing
22
+ *
23
+ * Exit code 0 = ok (file was created, updated, or already in sync).
24
+ * Exit code 1 = error (e.g. template missing).
25
+ */
26
+ import fs from "node:fs";
27
+ import path from "node:path";
28
+ import { fileURLToPath } from "node:url";
29
+
30
+ const BEGIN_MARKER = "# BEGIN: AI GUARDRAILS WIKI";
31
+ const END_MARKER = "# END: AI GUARDRAILS WIKI";
32
+
33
+ function fail(msg) {
34
+ console.error(`✗ ${msg}`);
35
+ process.exit(1);
36
+ }
37
+
38
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
39
+ const pluginRoot = path.dirname(scriptDir);
40
+ const templatePath = path.join(
41
+ pluginRoot,
42
+ "templates",
43
+ "wrapper-gitignore.txt"
44
+ );
45
+
46
+ const argv = process.argv.slice(2);
47
+ const cwdIndex = argv.indexOf("--cwd");
48
+ const projectDir =
49
+ cwdIndex !== -1 && argv[cwdIndex + 1]
50
+ ? path.resolve(argv[cwdIndex + 1])
51
+ : process.cwd();
52
+ const dryRun = argv.includes("--dry-run");
53
+
54
+ if (!fs.existsSync(templatePath)) {
55
+ fail(`template not found: ${templatePath}`);
56
+ }
57
+
58
+ const templateRaw = fs.readFileSync(templatePath, "utf8");
59
+ const block = extractBlock(templateRaw);
60
+ if (!block) {
61
+ fail(
62
+ `template at ${templatePath} does not contain the expected marker pair (${BEGIN_MARKER} / ${END_MARKER})`
63
+ );
64
+ }
65
+
66
+ const gitignorePath = path.join(projectDir, ".gitignore");
67
+ const existing = fs.existsSync(gitignorePath)
68
+ ? fs.readFileSync(gitignorePath, "utf8")
69
+ : null;
70
+
71
+ const merged = mergeBlock(existing, block);
72
+
73
+ if (existing !== null && merged === existing) {
74
+ console.log(`✓ .gitignore already in sync (${gitignorePath})`);
75
+ process.exit(0);
76
+ }
77
+
78
+ if (dryRun) {
79
+ process.stdout.write(merged);
80
+ process.exit(0);
81
+ }
82
+
83
+ fs.writeFileSync(gitignorePath, merged);
84
+ const verb = existing === null ? "created" : "updated";
85
+ console.log(`✓ ${verb} ${gitignorePath}`);
86
+ process.exit(0);
87
+
88
+ /**
89
+ * Pull the block (markers included) out of arbitrary text. Returns null when
90
+ * the marker pair is missing or out of order.
91
+ */
92
+ function extractBlock(text) {
93
+ const startIdx = text.indexOf(BEGIN_MARKER);
94
+ if (startIdx === -1) return null;
95
+ const endStart = text.indexOf(END_MARKER, startIdx + BEGIN_MARKER.length);
96
+ if (endStart === -1) return null;
97
+ const endIdx = endStart + END_MARKER.length;
98
+ return text.slice(startIdx, endIdx);
99
+ }
100
+
101
+ /**
102
+ * Merge a freshly-rendered block into the destination file content.
103
+ * - existing === null → return the block alone (file will be created)
104
+ * - existing has the markers → replace the block in place
105
+ * - existing lacks the markers → append the block at the end
106
+ * Always normalizes to exactly one trailing newline.
107
+ */
108
+ function mergeBlock(existing, freshBlock) {
109
+ if (existing === null) {
110
+ return `${freshBlock.trimEnd()}\n`;
111
+ }
112
+
113
+ const startIdx = existing.indexOf(BEGIN_MARKER);
114
+ if (startIdx !== -1) {
115
+ const endStart = existing.indexOf(
116
+ END_MARKER,
117
+ startIdx + BEGIN_MARKER.length
118
+ );
119
+ if (endStart !== -1) {
120
+ const endIdx = endStart + END_MARKER.length;
121
+ const before = existing.slice(0, startIdx);
122
+ const after = existing.slice(endIdx);
123
+ const trimmedAfter = after.startsWith("\n") ? after : `\n${after}`;
124
+ return `${before}${freshBlock.trimEnd()}${trimmedAfter}`;
125
+ }
126
+ }
127
+
128
+ // No marker pair in the destination — append.
129
+ const base = existing.endsWith("\n") ? existing : `${existing}\n`;
130
+ return `${base}\n${freshBlock.trimEnd()}\n`;
131
+ }
@@ -30,13 +30,22 @@ never overwrites human-authored content.
30
30
  3. **Contract.** Render `wiki/schema/llm-wiki-contract.md` from the plugin templates + config via
31
31
  `scripts/render-contract.mjs`, stamping the `kernelVersion`. This snapshot keeps the wiki
32
32
  self-describing without the plugin installed.
33
- 4. **Pointers.** Ensure `AGENTS.md` / `CLAUDE.md` point at the contract + plugin (thin pointers only).
34
- 5. **Staff.** For each `config.staff[]` entry (the standard roster by default), generate the role's
33
+ 4. **Gitignore.** Merge the lisa-wiki gitignore block into the project's `.gitignore` via
34
+ `scripts/ensure-gitignore.mjs`. The block (delimited by `# BEGIN: AI GUARDRAILS WIKI` /
35
+ `# END: AI GUARDRAILS WIKI`) covers transient per-session worktrees and Lisa backup snapshots
36
+ (`.claude/worktrees/`, `.codex/worktrees/`, `.lisabak/`). Idempotent: re-running produces no
37
+ diff once the block is present. The block coexists with the base lisa plugin's
38
+ `# BEGIN: AI GUARDRAILS` block — both can be installed without overwriting each other because
39
+ the copy-contents strategy keys on the marker suffix. Wiki-wrapper repos (mode `wrapper` /
40
+ `standalone`) typically don't enable the base lisa plugin, so this step is the only path by
41
+ which they get the worktree-ignore patterns.
42
+ 5. **Pointers.** Ensure `AGENTS.md` / `CLAUDE.md` point at the contract + plugin (thin pointers only).
43
+ 6. **Staff.** For each `config.staff[]` entry (the standard roster by default), generate the role's
35
44
  `wiki/staff/<role>.md` page and its dual-runtime subagents by delegating to `lisa-wiki-add-role`
36
45
  (running the subagents is out of scope).
37
- 6. **README.** Apply the chosen README mode (ingest the old README first; `rich` keeps install/usage +
46
+ 7. **README.** Apply the chosen README mode (ingest the old README first; `rich` keeps install/usage +
38
47
  adds the onboarding line; `stub` is the minimal pointer; `preserve` leaves it).
39
- 7. **Verify.** Run `lisa-wiki-doctor` and report the verdict + any blocking items.
48
+ 8. **Verify.** Run `lisa-wiki-doctor` and report the verdict + any blocking items.
40
49
 
41
50
  ## Standard roster
42
51
  The default operating team seeded into `config.staff[]` for every new wiki (Chief of Staff plus six
@@ -0,0 +1,19 @@
1
+ # BEGIN: AI GUARDRAILS WIKI
2
+ # Managed by the lisa-wiki kernel. Do not edit between these markers — re-run
3
+ # /lisa-wiki:setup (or the equivalent script) to update. Patterns outside the
4
+ # block are preserved untouched. The "WIKI" suffix lets this block coexist
5
+ # with the base lisa plugin's "# BEGIN: AI GUARDRAILS" block when both are
6
+ # installed (the copy-contents strategy keys on the marker suffix).
7
+
8
+ # Claude Code per-session git worktrees. Each Claude session that needs an
9
+ # isolated working copy spawns one under .claude/worktrees/ (via
10
+ # `git worktree add`). They are transient, large (often hundreds of MB each),
11
+ # and per-developer; they must never be committed.
12
+ /.claude/worktrees/
13
+
14
+ # Codex CLI per-session worktrees (Codex equivalent of the above).
15
+ /.codex/worktrees/
16
+
17
+ # Lisa backup snapshots (created by `lisa` runs).
18
+ /.lisabak/
19
+ # END: AI GUARDRAILS WIKI