@codyswann/lisa 2.101.0 → 2.101.1
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/scripts/queue-status-build-readers.mjs +39 -4
- package/plugins/lisa/scripts/queue-status-prd-readers.mjs +39 -4
- 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/src/base/scripts/queue-status-build-readers.mjs +39 -4
- package/plugins/src/base/scripts/queue-status-prd-readers.mjs +39 -4
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.
|
|
85
|
+
"version": "2.101.1",
|
|
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": {
|
|
@@ -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 ??
|
|
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
|
|
121
|
+
resolutionError,
|
|
114
122
|
});
|
|
115
123
|
|
|
116
124
|
return {
|
|
117
|
-
tracker
|
|
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
|
|
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 ??
|
|
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
|
|
124
|
+
resolutionError,
|
|
117
125
|
});
|
|
118
126
|
|
|
119
127
|
return {
|
|
120
|
-
source
|
|
128
|
+
source,
|
|
121
129
|
queueResolved,
|
|
122
130
|
namespaceAdopted,
|
|
123
131
|
roles,
|
|
124
132
|
counts,
|
|
125
133
|
highlights,
|
|
126
134
|
health,
|
|
127
|
-
resolutionError
|
|
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>[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.101.
|
|
3
|
+
"version": "2.101.1",
|
|
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.
|
|
3
|
+
"version": "2.101.1",
|
|
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"
|
|
@@ -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 ??
|
|
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
|
|
121
|
+
resolutionError,
|
|
114
122
|
});
|
|
115
123
|
|
|
116
124
|
return {
|
|
117
|
-
tracker
|
|
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
|
|
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 ??
|
|
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
|
|
124
|
+
resolutionError,
|
|
117
125
|
});
|
|
118
126
|
|
|
119
127
|
return {
|
|
120
|
-
source
|
|
128
|
+
source,
|
|
121
129
|
queueResolved,
|
|
122
130
|
namespaceAdopted,
|
|
123
131
|
roles,
|
|
124
132
|
counts,
|
|
125
133
|
highlights,
|
|
126
134
|
health,
|
|
127
|
-
resolutionError
|
|
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>[]}
|