@codyswann/lisa 2.113.1 → 2.115.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/cdk/copy-overwrite/knip.json +14 -1
- 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/scripts/queue-status-prd-readers.mjs +43 -0
- 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/skills/lisa-wiki-setup/SKILL.md +24 -3
- package/plugins/src/base/scripts/queue-status-prd-readers.mjs +43 -0
- package/plugins/src/wiki/skills/lisa-wiki-setup/SKILL.md +24 -3
- package/typescript/copy-overwrite/knip.json +14 -1
|
@@ -42,7 +42,20 @@
|
|
|
42
42
|
"constructs",
|
|
43
43
|
"aws-cdk-github-oidc"
|
|
44
44
|
],
|
|
45
|
-
"ignoreBinaries": [
|
|
45
|
+
"ignoreBinaries": [
|
|
46
|
+
"expo",
|
|
47
|
+
"playwright",
|
|
48
|
+
"audit",
|
|
49
|
+
"docker",
|
|
50
|
+
"eval",
|
|
51
|
+
"ast-grep",
|
|
52
|
+
"eslint",
|
|
53
|
+
"husky",
|
|
54
|
+
"knip",
|
|
55
|
+
"prettier",
|
|
56
|
+
"tsc",
|
|
57
|
+
"vitest"
|
|
58
|
+
],
|
|
46
59
|
"ignoreExportsUsedInFile": true,
|
|
47
60
|
"rules": {
|
|
48
61
|
"devDependencies": "off"
|
package/package.json
CHANGED
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"lodash": ">=4.18.1"
|
|
83
83
|
},
|
|
84
84
|
"name": "@codyswann/lisa",
|
|
85
|
-
"version": "2.
|
|
85
|
+
"version": "2.115.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": {
|
|
@@ -55,6 +55,41 @@ const HIGHLIGHT_COPY = {
|
|
|
55
55
|
},
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Decide whether a PRD queue snapshot has open lifecycle pressure that should
|
|
60
|
+
* pause automatic PRD promotion or ideation work.
|
|
61
|
+
*
|
|
62
|
+
* @param {{
|
|
63
|
+
* readonly counts?: Record<string, number>
|
|
64
|
+
* readonly highlights?: readonly Record<string, any>[]
|
|
65
|
+
* }} snapshot
|
|
66
|
+
*/
|
|
67
|
+
export function evaluatePrdQueuePressure(snapshot = {}) {
|
|
68
|
+
const decisiveRole = ACTIONABLE_ROLE_ORDER.find(
|
|
69
|
+
role => normalizeCount(snapshot.counts?.[role]) > 0
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
if (!decisiveRole) {
|
|
73
|
+
return {
|
|
74
|
+
allowed: true,
|
|
75
|
+
decisiveRole: null,
|
|
76
|
+
blockerItem: null,
|
|
77
|
+
nextStep: null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const blockerItem =
|
|
82
|
+
snapshot.highlights?.find(highlight => highlight.role === decisiveRole) ??
|
|
83
|
+
null;
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
allowed: false,
|
|
87
|
+
decisiveRole,
|
|
88
|
+
blockerItem,
|
|
89
|
+
nextStep: blockerItem?.nextStep ?? HIGHLIGHT_COPY[decisiveRole].nextStep,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
58
93
|
/**
|
|
59
94
|
* Read a GitHub-backed PRD queue snapshot from issue payloads.
|
|
60
95
|
*
|
|
@@ -393,3 +428,11 @@ function normalizeTimestamp(value) {
|
|
|
393
428
|
const trimmed = value.trim();
|
|
394
429
|
return trimmed.length > 0 ? trimmed : null;
|
|
395
430
|
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* @param {unknown} value
|
|
434
|
+
* @returns {number}
|
|
435
|
+
*/
|
|
436
|
+
function normalizeCount(value) {
|
|
437
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
438
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.115.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.115.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"
|
|
@@ -21,7 +21,9 @@ never overwrites human-authored content.
|
|
|
21
21
|
`displayName`, **`purpose`** (one paragraph — what this wiki is for), `mode`
|
|
22
22
|
(`embedded|wrapper|standalone|subdir`), `categories`, source layout, connectors, sensitivity,
|
|
23
23
|
`sourceRetention`, and the **README mode** (`rich` default | `stub` | `preserve` — always ask;
|
|
24
|
-
never select `stub` implicitly).
|
|
24
|
+
never select `stub` implicitly). If `staff` is absent, seed the **standard roster** (below) as the
|
|
25
|
+
default — every wiki gets the standard operating team unless the user opts out or edits it. Union
|
|
26
|
+
each role's owned categories into `config.categories`. Validate with `scripts/validate-config.mjs`.
|
|
25
27
|
2. **Structure.** Scaffold the canonical tree per `schema/wiki-structure.schema.json`:
|
|
26
28
|
`wiki/{index.md, log.md, start-here.md, schema/, sources/, state/, staff/, <category dirs>}`.
|
|
27
29
|
Create only what is missing.
|
|
@@ -29,12 +31,31 @@ never overwrites human-authored content.
|
|
|
29
31
|
`scripts/render-contract.mjs`, stamping the `kernelVersion`. This snapshot keeps the wiki
|
|
30
32
|
self-describing without the plugin installed.
|
|
31
33
|
4. **Pointers.** Ensure `AGENTS.md` / `CLAUDE.md` point at the contract + plugin (thin pointers only).
|
|
32
|
-
5. **Staff.** For each `config.staff[]` entry, generate the role's
|
|
33
|
-
dual-runtime subagents by delegating to `lisa-wiki-add-role`
|
|
34
|
+
5. **Staff.** For each `config.staff[]` entry (the standard roster by default), generate the role's
|
|
35
|
+
`wiki/staff/<role>.md` page and its dual-runtime subagents by delegating to `lisa-wiki-add-role`
|
|
36
|
+
(running the subagents is out of scope).
|
|
34
37
|
6. **README.** Apply the chosen README mode (ingest the old README first; `rich` keeps install/usage +
|
|
35
38
|
adds the onboarding line; `stub` is the minimal pointer; `preserve` leaves it).
|
|
36
39
|
7. **Verify.** Run `lisa-wiki-doctor` and report the verdict + any blocking items.
|
|
37
40
|
|
|
41
|
+
## Standard roster
|
|
42
|
+
The default operating team seeded into `config.staff[]` for every new wiki (Chief of Staff plus six
|
|
43
|
+
domain agents). Each role becomes a `wiki/staff/<id>.md` page and a dual-runtime subagent; the human
|
|
44
|
+
owner talks to Chief, who routes to the others. Owned categories are unioned into `config.categories`.
|
|
45
|
+
|
|
46
|
+
| id | role | owns (categories) | sensitivity |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `chief` | Chief of Staff | `projects`, `decisions`, `playbooks`, `open-questions` | confidential |
|
|
49
|
+
| `sally` | Sales | `sales` | internal |
|
|
50
|
+
| `mark` | Marketing | `marketing` | internal |
|
|
51
|
+
| `felix` | Finance | `finance` | confidential |
|
|
52
|
+
| `casey` | Customer Success | `customers` | internal |
|
|
53
|
+
| `parker` | People | `people` | confidential |
|
|
54
|
+
| `lex` | Legal & Compliance | `legal` | confidential |
|
|
55
|
+
|
|
56
|
+
Projects may add, remove, or rename roles afterward; the standard roster is the starting point, not a
|
|
57
|
+
constraint.
|
|
58
|
+
|
|
38
59
|
## Rules
|
|
39
60
|
- Idempotent; re-running produces no spurious changes.
|
|
40
61
|
- Never overwrite human content; only create/repair structure and the rendered snapshot. The README is
|
|
@@ -55,6 +55,41 @@ const HIGHLIGHT_COPY = {
|
|
|
55
55
|
},
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Decide whether a PRD queue snapshot has open lifecycle pressure that should
|
|
60
|
+
* pause automatic PRD promotion or ideation work.
|
|
61
|
+
*
|
|
62
|
+
* @param {{
|
|
63
|
+
* readonly counts?: Record<string, number>
|
|
64
|
+
* readonly highlights?: readonly Record<string, any>[]
|
|
65
|
+
* }} snapshot
|
|
66
|
+
*/
|
|
67
|
+
export function evaluatePrdQueuePressure(snapshot = {}) {
|
|
68
|
+
const decisiveRole = ACTIONABLE_ROLE_ORDER.find(
|
|
69
|
+
role => normalizeCount(snapshot.counts?.[role]) > 0
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
if (!decisiveRole) {
|
|
73
|
+
return {
|
|
74
|
+
allowed: true,
|
|
75
|
+
decisiveRole: null,
|
|
76
|
+
blockerItem: null,
|
|
77
|
+
nextStep: null,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const blockerItem =
|
|
82
|
+
snapshot.highlights?.find(highlight => highlight.role === decisiveRole) ??
|
|
83
|
+
null;
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
allowed: false,
|
|
87
|
+
decisiveRole,
|
|
88
|
+
blockerItem,
|
|
89
|
+
nextStep: blockerItem?.nextStep ?? HIGHLIGHT_COPY[decisiveRole].nextStep,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
58
93
|
/**
|
|
59
94
|
* Read a GitHub-backed PRD queue snapshot from issue payloads.
|
|
60
95
|
*
|
|
@@ -393,3 +428,11 @@ function normalizeTimestamp(value) {
|
|
|
393
428
|
const trimmed = value.trim();
|
|
394
429
|
return trimmed.length > 0 ? trimmed : null;
|
|
395
430
|
}
|
|
431
|
+
|
|
432
|
+
/**
|
|
433
|
+
* @param {unknown} value
|
|
434
|
+
* @returns {number}
|
|
435
|
+
*/
|
|
436
|
+
function normalizeCount(value) {
|
|
437
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
438
|
+
}
|
|
@@ -21,7 +21,9 @@ never overwrites human-authored content.
|
|
|
21
21
|
`displayName`, **`purpose`** (one paragraph — what this wiki is for), `mode`
|
|
22
22
|
(`embedded|wrapper|standalone|subdir`), `categories`, source layout, connectors, sensitivity,
|
|
23
23
|
`sourceRetention`, and the **README mode** (`rich` default | `stub` | `preserve` — always ask;
|
|
24
|
-
never select `stub` implicitly).
|
|
24
|
+
never select `stub` implicitly). If `staff` is absent, seed the **standard roster** (below) as the
|
|
25
|
+
default — every wiki gets the standard operating team unless the user opts out or edits it. Union
|
|
26
|
+
each role's owned categories into `config.categories`. Validate with `scripts/validate-config.mjs`.
|
|
25
27
|
2. **Structure.** Scaffold the canonical tree per `schema/wiki-structure.schema.json`:
|
|
26
28
|
`wiki/{index.md, log.md, start-here.md, schema/, sources/, state/, staff/, <category dirs>}`.
|
|
27
29
|
Create only what is missing.
|
|
@@ -29,12 +31,31 @@ never overwrites human-authored content.
|
|
|
29
31
|
`scripts/render-contract.mjs`, stamping the `kernelVersion`. This snapshot keeps the wiki
|
|
30
32
|
self-describing without the plugin installed.
|
|
31
33
|
4. **Pointers.** Ensure `AGENTS.md` / `CLAUDE.md` point at the contract + plugin (thin pointers only).
|
|
32
|
-
5. **Staff.** For each `config.staff[]` entry, generate the role's
|
|
33
|
-
dual-runtime subagents by delegating to `lisa-wiki-add-role`
|
|
34
|
+
5. **Staff.** For each `config.staff[]` entry (the standard roster by default), generate the role's
|
|
35
|
+
`wiki/staff/<role>.md` page and its dual-runtime subagents by delegating to `lisa-wiki-add-role`
|
|
36
|
+
(running the subagents is out of scope).
|
|
34
37
|
6. **README.** Apply the chosen README mode (ingest the old README first; `rich` keeps install/usage +
|
|
35
38
|
adds the onboarding line; `stub` is the minimal pointer; `preserve` leaves it).
|
|
36
39
|
7. **Verify.** Run `lisa-wiki-doctor` and report the verdict + any blocking items.
|
|
37
40
|
|
|
41
|
+
## Standard roster
|
|
42
|
+
The default operating team seeded into `config.staff[]` for every new wiki (Chief of Staff plus six
|
|
43
|
+
domain agents). Each role becomes a `wiki/staff/<id>.md` page and a dual-runtime subagent; the human
|
|
44
|
+
owner talks to Chief, who routes to the others. Owned categories are unioned into `config.categories`.
|
|
45
|
+
|
|
46
|
+
| id | role | owns (categories) | sensitivity |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| `chief` | Chief of Staff | `projects`, `decisions`, `playbooks`, `open-questions` | confidential |
|
|
49
|
+
| `sally` | Sales | `sales` | internal |
|
|
50
|
+
| `mark` | Marketing | `marketing` | internal |
|
|
51
|
+
| `felix` | Finance | `finance` | confidential |
|
|
52
|
+
| `casey` | Customer Success | `customers` | internal |
|
|
53
|
+
| `parker` | People | `people` | confidential |
|
|
54
|
+
| `lex` | Legal & Compliance | `legal` | confidential |
|
|
55
|
+
|
|
56
|
+
Projects may add, remove, or rename roles afterward; the standard roster is the starting point, not a
|
|
57
|
+
constraint.
|
|
58
|
+
|
|
38
59
|
## Rules
|
|
39
60
|
- Idempotent; re-running produces no spurious changes.
|
|
40
61
|
- Never overwrite human content; only create/repair structure and the rendered snapshot. The README is
|
|
@@ -37,7 +37,20 @@
|
|
|
37
37
|
"graphql-ws",
|
|
38
38
|
"lodash"
|
|
39
39
|
],
|
|
40
|
-
"ignoreBinaries": [
|
|
40
|
+
"ignoreBinaries": [
|
|
41
|
+
"expo",
|
|
42
|
+
"playwright",
|
|
43
|
+
"audit",
|
|
44
|
+
"docker",
|
|
45
|
+
"eval",
|
|
46
|
+
"ast-grep",
|
|
47
|
+
"eslint",
|
|
48
|
+
"husky",
|
|
49
|
+
"knip",
|
|
50
|
+
"prettier",
|
|
51
|
+
"tsc",
|
|
52
|
+
"vitest"
|
|
53
|
+
],
|
|
41
54
|
"ignoreExportsUsedInFile": true,
|
|
42
55
|
"rules": {
|
|
43
56
|
"devDependencies": "off"
|