@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.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-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-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-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-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-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-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki/skills/lisa-wiki-setup/SKILL.md +13 -4
- package/plugins/lisa-wiki/templates/wrapper-gitignore.txt +19 -0
- package/plugins/src/wiki/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/src/wiki/skills/lisa-wiki-setup/SKILL.md +13 -4
- 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.
|
|
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-openclaw",
|
|
3
|
-
"version": "2.
|
|
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.
|
|
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"
|
|
@@ -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. **
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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. **
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|