specweave 2.0.3 → 2.2.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/.claude-plugin/marketplace.json +3 -3
- package/README.md +21 -11
- package/bin/specweave.js +28 -0
- package/dist/dashboard/assets/index-BeKUULf0.css +1 -0
- package/dist/dashboard/assets/index-Bf5TF0_l.js +13 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/src/cli/commands/jev-helpers.d.ts +148 -0
- package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -0
- package/dist/src/cli/commands/jev-helpers.js +582 -0
- package/dist/src/cli/commands/jev-helpers.js.map +1 -0
- package/dist/src/cli/commands/jev.d.ts +21 -0
- package/dist/src/cli/commands/jev.d.ts.map +1 -0
- package/dist/src/cli/commands/jev.js +350 -0
- package/dist/src/cli/commands/jev.js.map +1 -0
- package/dist/src/cli/commands/sync.d.ts.map +1 -1
- package/dist/src/cli/commands/sync.js +23 -5
- package/dist/src/cli/commands/sync.js.map +1 -1
- package/dist/src/cli/helpers/init/instruction-file-writer.d.ts +4 -0
- package/dist/src/cli/helpers/init/instruction-file-writer.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/instruction-file-writer.js +11 -6
- package/dist/src/cli/helpers/init/instruction-file-writer.js.map +1 -1
- package/dist/src/core/auto/completion-evaluator.d.ts +22 -1
- package/dist/src/core/auto/completion-evaluator.d.ts.map +1 -1
- package/dist/src/core/auto/completion-evaluator.js +99 -9
- package/dist/src/core/auto/completion-evaluator.js.map +1 -1
- package/dist/src/core/config/types.d.ts +39 -1
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js +1 -0
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/doctor/checkers/hooks-checker.d.ts +1 -1
- package/dist/src/core/doctor/checkers/hooks-checker.js +1 -1
- package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +28 -5
- package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/pre-tool-use.js +162 -7
- package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
- package/dist/src/core/hooks/handlers/session-start.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/session-start.js +20 -0
- package/dist/src/core/hooks/handlers/session-start.js.map +1 -1
- package/dist/src/core/intent/portable-context.d.ts +4 -0
- package/dist/src/core/intent/portable-context.d.ts.map +1 -0
- package/dist/src/core/intent/portable-context.js +68 -0
- package/dist/src/core/intent/portable-context.js.map +1 -0
- package/dist/src/core/intent/types.d.ts +28 -0
- package/dist/src/core/intent/types.d.ts.map +1 -0
- package/dist/src/core/intent/types.js +3 -0
- package/dist/src/core/intent/types.js.map +1 -0
- package/dist/src/core/intent/validation.d.ts +5 -0
- package/dist/src/core/intent/validation.d.ts.map +1 -0
- package/dist/src/core/intent/validation.js +39 -0
- package/dist/src/core/intent/validation.js.map +1 -0
- package/dist/src/core/jev/browse.d.ts +56 -0
- package/dist/src/core/jev/browse.d.ts.map +1 -0
- package/dist/src/core/jev/browse.js +721 -0
- package/dist/src/core/jev/browse.js.map +1 -0
- package/dist/src/core/jev/client.d.ts +134 -0
- package/dist/src/core/jev/client.d.ts.map +1 -0
- package/dist/src/core/jev/client.js +329 -0
- package/dist/src/core/jev/client.js.map +1 -0
- package/dist/src/core/jev/config.d.ts +69 -0
- package/dist/src/core/jev/config.d.ts.map +1 -0
- package/dist/src/core/jev/config.js +181 -0
- package/dist/src/core/jev/config.js.map +1 -0
- package/dist/src/core/jev/decide.d.ts +160 -0
- package/dist/src/core/jev/decide.d.ts.map +1 -0
- package/dist/src/core/jev/decide.js +325 -0
- package/dist/src/core/jev/decide.js.map +1 -0
- package/dist/src/core/jev/index.d.ts +20 -0
- package/dist/src/core/jev/index.d.ts.map +1 -0
- package/dist/src/core/jev/index.js +20 -0
- package/dist/src/core/jev/index.js.map +1 -0
- package/dist/src/core/jev/questions.d.ts +56 -0
- package/dist/src/core/jev/questions.d.ts.map +1 -0
- package/dist/src/core/jev/questions.js +159 -0
- package/dist/src/core/jev/questions.js.map +1 -0
- package/dist/src/core/jev/redact.d.ts +44 -0
- package/dist/src/core/jev/redact.d.ts.map +1 -0
- package/dist/src/core/jev/redact.js +102 -0
- package/dist/src/core/jev/redact.js.map +1 -0
- package/dist/src/core/jev/usage.d.ts +38 -0
- package/dist/src/core/jev/usage.d.ts.map +1 -0
- package/dist/src/core/jev/usage.js +70 -0
- package/dist/src/core/jev/usage.js.map +1 -0
- package/dist/src/core/session/handoff-pointer.d.ts +4 -0
- package/dist/src/core/session/handoff-pointer.d.ts.map +1 -0
- package/dist/src/core/session/handoff-pointer.js +60 -0
- package/dist/src/core/session/handoff-pointer.js.map +1 -0
- package/dist/src/core/session/work-handoff.d.ts.map +1 -1
- package/dist/src/core/session/work-handoff.js +10 -3
- package/dist/src/core/session/work-handoff.js.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.d.ts +1 -0
- package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.js +10 -90
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/dashboard/server/data/cost-aggregator.d.ts +10 -5
- package/dist/src/dashboard/server/data/cost-aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/cost-aggregator.js +31 -33
- package/dist/src/dashboard/server/data/cost-aggregator.js.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +0 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +14 -66
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-task-board.d.ts +4 -0
- package/dist/src/dashboard/server/data/dashboard-task-board.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/dashboard-task-board.js +56 -0
- package/dist/src/dashboard/server/data/dashboard-task-board.js.map +1 -0
- package/dist/src/dashboard/server/data/intent-store.d.ts +19 -0
- package/dist/src/dashboard/server/data/intent-store.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/intent-store.js +268 -0
- package/dist/src/dashboard/server/data/intent-store.js.map +1 -0
- package/dist/src/dashboard/server/data/local-sessions.d.ts +15 -0
- package/dist/src/dashboard/server/data/local-sessions.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/local-sessions.js +197 -0
- package/dist/src/dashboard/server/data/local-sessions.js.map +1 -0
- package/dist/src/dashboard/server/data/work-projection.d.ts +8 -0
- package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/work-projection.js +175 -0
- package/dist/src/dashboard/server/data/work-projection.js.map +1 -0
- package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -1
- package/dist/src/dashboard/server/file-watcher.js +2 -1
- package/dist/src/dashboard/server/file-watcher.js.map +1 -1
- package/dist/src/dashboard/server/local-request.d.ts +4 -0
- package/dist/src/dashboard/server/local-request.d.ts.map +1 -0
- package/dist/src/dashboard/server/local-request.js +29 -0
- package/dist/src/dashboard/server/local-request.js.map +1 -0
- package/dist/src/dashboard/server/routes/work-routes.d.ts +5 -0
- package/dist/src/dashboard/server/routes/work-routes.d.ts.map +1 -0
- package/dist/src/dashboard/server/routes/work-routes.js +37 -0
- package/dist/src/dashboard/server/routes/work-routes.js.map +1 -0
- package/dist/src/dashboard/types.d.ts +3 -3
- package/dist/src/dashboard/types.d.ts.map +1 -1
- package/dist/src/dashboard/work-types.d.ts +39 -0
- package/dist/src/dashboard/work-types.d.ts.map +1 -0
- package/dist/src/dashboard/work-types.js +3 -0
- package/dist/src/dashboard/work-types.js.map +1 -0
- package/dist/src/sync/external-change-puller.d.ts +19 -0
- package/dist/src/sync/external-change-puller.d.ts.map +1 -1
- package/dist/src/sync/external-change-puller.js +87 -77
- package/dist/src/sync/external-change-puller.js.map +1 -1
- package/dist/src/utils/model-selection.d.ts +49 -0
- package/dist/src/utils/model-selection.d.ts.map +1 -1
- package/dist/src/utils/model-selection.js +70 -0
- package/dist/src/utils/model-selection.js.map +1 -1
- package/package.json +3 -3
- package/plugins/PLUGINS-INDEX.md +14 -4
- package/plugins/specweave/.claude-plugin/plugin.json +5 -3
- package/plugins/specweave/PLUGIN.md +16 -4
- package/plugins/specweave/hooks/hooks.json +1 -24
- package/plugins/specweave/hooks/run-worker.mjs +37 -2
- package/plugins/specweave/hooks/run.mjs +54 -1
- package/plugins/specweave/marketplace.json +6 -0
- package/plugins/specweave/skills/increment/SKILL.md +7 -5
- package/plugins/specweave/skills/jev/SKILL.md +201 -0
- package/src/templates/AGENTS.md.template +27 -5
- package/src/templates/CLAUDE.md.template +27 -5
- package/dist/dashboard/assets/index-BiJhGDZV.js +0 -13
- package/dist/dashboard/assets/index-heYRtWFf.css +0 -1
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `specweave jev` — the local-environment half of the command.
|
|
3
|
+
*
|
|
4
|
+
* Argument parsing, the shipped-skill roster, `.specweave/config.json` writes, the
|
|
5
|
+
* shared exit codes and printers, and the two environment subcommands (`doctor`,
|
|
6
|
+
* `setup`). `jev.ts` keeps the dispatcher and the decision subcommands.
|
|
7
|
+
*
|
|
8
|
+
* Nothing here ever reads, prints or stores an API key VALUE — only env var NAMES.
|
|
9
|
+
*
|
|
10
|
+
* @module cli/commands/jev-helpers
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
import { JEV_FALLBACK_KEY_ENV, JEV_PROVIDER_KEY_ENV, JEV_PROVIDER_MODEL, JevClient, jevEndpoint, loadJevConfig, readUsageSummary, resolveApiKey, } from '../../core/jev/index.js';
|
|
16
|
+
/** Exit codes shared by every `specweave jev` subcommand (documented in the skill). */
|
|
17
|
+
export const EXIT = {
|
|
18
|
+
ok: 0,
|
|
19
|
+
error: 1,
|
|
20
|
+
warn: 2,
|
|
21
|
+
deny: 3,
|
|
22
|
+
/** Jev is disabled or has no key — agents treat this as "continue without Jev". */
|
|
23
|
+
unavailable: 4,
|
|
24
|
+
};
|
|
25
|
+
/** Where the opt-in PreToolUse Bash guard marker lives. */
|
|
26
|
+
export function guardMarkerPath(projectRoot) {
|
|
27
|
+
return path.join(projectRoot, '.specweave', 'state', 'jev-guard.enabled');
|
|
28
|
+
}
|
|
29
|
+
/** Create or remove the Bash guard marker. Returns true when the marker exists after the call. */
|
|
30
|
+
export function setGuardMarker(projectRoot, on) {
|
|
31
|
+
const marker = guardMarkerPath(projectRoot);
|
|
32
|
+
try {
|
|
33
|
+
if (on) {
|
|
34
|
+
fs.mkdirSync(path.dirname(marker), { recursive: true });
|
|
35
|
+
fs.writeFileSync(marker, 'Jev Bash guard enabled by `specweave jev setup`.\n', 'utf-8');
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (fs.existsSync(marker))
|
|
39
|
+
fs.rmSync(marker);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return fs.existsSync(marker);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Merge a patch into the `jev` section of `.specweave/config.json`, keeping every
|
|
48
|
+
* other key (and every other jev key) untouched. Returns the config path written.
|
|
49
|
+
*/
|
|
50
|
+
export function mergeJevConfig(projectRoot, patch) {
|
|
51
|
+
const configPath = path.join(projectRoot, '.specweave', 'config.json');
|
|
52
|
+
let config = {};
|
|
53
|
+
try {
|
|
54
|
+
if (fs.existsSync(configPath)) {
|
|
55
|
+
const parsed = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
56
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
57
|
+
config = parsed;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// A malformed config is replaced rather than crashing setup; the jev section is
|
|
63
|
+
// the only thing we own, and the user gets a fresh, valid file.
|
|
64
|
+
config = {};
|
|
65
|
+
}
|
|
66
|
+
const current = config.jev && typeof config.jev === 'object' && !Array.isArray(config.jev)
|
|
67
|
+
? { ...config.jev }
|
|
68
|
+
: {};
|
|
69
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
70
|
+
const existing = current[key];
|
|
71
|
+
if (value && typeof value === 'object' && !Array.isArray(value) &&
|
|
72
|
+
existing && typeof existing === 'object' && !Array.isArray(existing)) {
|
|
73
|
+
current[key] = { ...existing, ...value };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
current[key] = value;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
config.jev = current;
|
|
80
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
81
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
82
|
+
return configPath;
|
|
83
|
+
}
|
|
84
|
+
/** The installed specweave package root (walks up from this module). */
|
|
85
|
+
export function packageRoot() {
|
|
86
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
87
|
+
for (let i = 0; i < 8; i++) {
|
|
88
|
+
try {
|
|
89
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
|
|
90
|
+
if (pkg.name === 'specweave')
|
|
91
|
+
return dir;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// keep walking
|
|
95
|
+
}
|
|
96
|
+
const parent = path.dirname(dir);
|
|
97
|
+
if (parent === dir)
|
|
98
|
+
break;
|
|
99
|
+
dir = parent;
|
|
100
|
+
}
|
|
101
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
|
|
102
|
+
}
|
|
103
|
+
// ── project-level PreToolUse hook (.claude/settings.json) ────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Why this lives in the PROJECT's settings.json and not in the plugin manifest:
|
|
106
|
+
* SpecWeave 2.1 deliberately ships only SessionStart and Stop as default hooks
|
|
107
|
+
* ("retire intrusive hooks"). A PreToolUse entry in `plugins/specweave/hooks/
|
|
108
|
+
* hooks.json` would put a guard in front of every Bash command for everyone who
|
|
109
|
+
* installs the plugin, which is exactly the decision 2.1 reversed. The Jev Bash
|
|
110
|
+
* guard is opt-in per project, so `specweave jev setup --guard-bash` registers it
|
|
111
|
+
* where opting in belongs: `<projectRoot>/.claude/settings.json`.
|
|
112
|
+
*/
|
|
113
|
+
const HOOK_REL = path.join('plugins', 'specweave', 'hooks', 'run.mjs');
|
|
114
|
+
const HOOK_EVENT = 'pre-tool-use';
|
|
115
|
+
const HOOK_MATCHER = 'Bash';
|
|
116
|
+
/** Seconds, matching the launcher's own PreToolUse budget. */
|
|
117
|
+
const HOOK_TIMEOUT = 10;
|
|
118
|
+
/** `<projectRoot>/.claude/settings.json`. */
|
|
119
|
+
export function projectSettingsPath(projectRoot) {
|
|
120
|
+
return path.join(projectRoot, '.claude', 'settings.json');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The exact command the hook entry runs.
|
|
124
|
+
*
|
|
125
|
+
* Absolute, because `CLAUDE_PLUGIN_ROOT` is NOT set for hooks declared in
|
|
126
|
+
* settings.json — `${CLAUDE_PLUGIN_ROOT}` would expand to nothing. `run.mjs`
|
|
127
|
+
* resolves its own plugin root from `import.meta.url`, so an absolute path is
|
|
128
|
+
* all it needs.
|
|
129
|
+
*/
|
|
130
|
+
export function jevHookCommand(root = packageRoot()) {
|
|
131
|
+
return `node "${path.join(root, HOOK_REL)}" ${HOOK_EVENT}`;
|
|
132
|
+
}
|
|
133
|
+
/** One hook entry, exactly as written into settings.json. */
|
|
134
|
+
function jevHookEntry(root) {
|
|
135
|
+
return { type: 'command', command: jevHookCommand(root), timeout: HOOK_TIMEOUT };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Ours? Matched on the launcher path + event rather than on the whole string, so
|
|
139
|
+
* an entry written by an older install (different package path, Windows
|
|
140
|
+
* separators) is still recognised — and therefore updated instead of duplicated.
|
|
141
|
+
*/
|
|
142
|
+
function isJevHookCommand(command) {
|
|
143
|
+
if (typeof command !== 'string')
|
|
144
|
+
return false;
|
|
145
|
+
return /hooks\/run\.mjs"?\s+pre-tool-use(\s|$)/.test(command.replace(/\\/g, '/'));
|
|
146
|
+
}
|
|
147
|
+
function isRecord(value) {
|
|
148
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
149
|
+
}
|
|
150
|
+
function preToolUseGroups(settings) {
|
|
151
|
+
const hooks = isRecord(settings.hooks) ? settings.hooks : {};
|
|
152
|
+
return Array.isArray(hooks.PreToolUse) ? hooks.PreToolUse : [];
|
|
153
|
+
}
|
|
154
|
+
/** Parse settings.json, or explain why it must be left alone. */
|
|
155
|
+
function readSettings(file) {
|
|
156
|
+
try {
|
|
157
|
+
if (!fs.existsSync(file))
|
|
158
|
+
return { settings: {}, existed: false };
|
|
159
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
160
|
+
if (!isRecord(parsed))
|
|
161
|
+
return { error: `${file} is not a JSON object` };
|
|
162
|
+
return { settings: parsed, existed: true };
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
return { error: `${file} could not be read: ${messageOf(error)}` };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Is the Jev PreToolUse hook registered for this project right now? */
|
|
169
|
+
export function readProjectHook(projectRoot) {
|
|
170
|
+
const file = projectSettingsPath(projectRoot);
|
|
171
|
+
const read = readSettings(file);
|
|
172
|
+
if ('error' in read)
|
|
173
|
+
return { path: file, present: false, error: read.error };
|
|
174
|
+
const present = preToolUseGroups(read.settings).some((group) => (group?.hooks ?? []).some((hook) => isJevHookCommand(hook?.command)));
|
|
175
|
+
return { path: file, present };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Register or remove the Jev Bash guard in `<projectRoot>/.claude/settings.json`.
|
|
179
|
+
*
|
|
180
|
+
* Idempotent: an entry already pointing at a `hooks/run.mjs pre-tool-use` is
|
|
181
|
+
* rewritten in place (so a moved or reinstalled package updates rather than
|
|
182
|
+
* duplicates) and never reordered. Removal takes out exactly our entries — other
|
|
183
|
+
* PreToolUse groups survive — and then deletes the empty array and keys it left
|
|
184
|
+
* behind. Every other key in the file is preserved byte-for-byte through the
|
|
185
|
+
* JSON round trip.
|
|
186
|
+
*
|
|
187
|
+
* A settings.json that is missing or malformed is never overwritten blind: a
|
|
188
|
+
* malformed file comes back as `{ error }` and is left exactly as it was.
|
|
189
|
+
*/
|
|
190
|
+
export function setProjectHook(projectRoot, on, packageDir = packageRoot()) {
|
|
191
|
+
const file = projectSettingsPath(projectRoot);
|
|
192
|
+
const read = readSettings(file);
|
|
193
|
+
if ('error' in read)
|
|
194
|
+
return { path: file, present: false, error: read.error };
|
|
195
|
+
const { settings, existed } = read;
|
|
196
|
+
if (!on && !existed)
|
|
197
|
+
return { path: file, present: false };
|
|
198
|
+
const hooks = isRecord(settings.hooks) ? { ...settings.hooks } : {};
|
|
199
|
+
const groups = preToolUseGroups(settings).map((group) => isRecord(group) ? { ...group } : group);
|
|
200
|
+
let changed = false;
|
|
201
|
+
let placed = false;
|
|
202
|
+
const next = [];
|
|
203
|
+
for (const group of groups) {
|
|
204
|
+
const entries = Array.isArray(group?.hooks) ? group.hooks : [];
|
|
205
|
+
const mine = entries.some((hook) => isJevHookCommand(hook?.command));
|
|
206
|
+
if (!mine) {
|
|
207
|
+
next.push(group);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
changed = true;
|
|
211
|
+
if (on && !placed) {
|
|
212
|
+
// Refresh in place — the package may have moved since it was written.
|
|
213
|
+
placed = true;
|
|
214
|
+
next.push({
|
|
215
|
+
...group,
|
|
216
|
+
matcher: HOOK_MATCHER,
|
|
217
|
+
hooks: entries.map((hook) => (isJevHookCommand(hook?.command) ? jevHookEntry(packageDir) : hook)),
|
|
218
|
+
});
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const kept = entries.filter((hook) => !isJevHookCommand(hook?.command));
|
|
222
|
+
if (kept.length > 0)
|
|
223
|
+
next.push({ ...group, hooks: kept });
|
|
224
|
+
}
|
|
225
|
+
if (on && !placed) {
|
|
226
|
+
next.push({ matcher: HOOK_MATCHER, hooks: [jevHookEntry(packageDir)] });
|
|
227
|
+
changed = true;
|
|
228
|
+
}
|
|
229
|
+
if (next.length > 0)
|
|
230
|
+
hooks.PreToolUse = next;
|
|
231
|
+
else
|
|
232
|
+
delete hooks.PreToolUse;
|
|
233
|
+
if (Object.keys(hooks).length > 0)
|
|
234
|
+
settings.hooks = hooks;
|
|
235
|
+
else
|
|
236
|
+
delete settings.hooks;
|
|
237
|
+
if (!changed && existed)
|
|
238
|
+
return { path: file, present: on };
|
|
239
|
+
try {
|
|
240
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
241
|
+
fs.writeFileSync(file, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
return { path: file, present: false, error: `${file} could not be written: ${messageOf(error)}` };
|
|
245
|
+
}
|
|
246
|
+
return { path: file, present: on };
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Roster used when the shipped `plugins/specweave/skills/` tree cannot be read
|
|
250
|
+
* (global install layouts differ). Keeps `jev route` useful everywhere.
|
|
251
|
+
*/
|
|
252
|
+
export const FALLBACK_SKILLS = [
|
|
253
|
+
{ name: 'increment', description: 'Plan a unit of work as a SpecWeave increment: spec.md with Problem, Scope, numbered ACs and an Approach, plus tasks.md.' },
|
|
254
|
+
{ name: 'do', description: 'Work an increment task by task through the ledger: task next, claim, implement, commit, task done with evidence.' },
|
|
255
|
+
{ name: 'done', description: 'Close an increment after a green verify, or with an explicit reason.' },
|
|
256
|
+
{ name: 'review', description: 'Review an increment in fresh context before closing; findings cite path:line and are re-verified.' },
|
|
257
|
+
{ name: 'qa', description: 'Risk-scored quality assessment of an increment.' },
|
|
258
|
+
{ name: 'brainstorm', description: 'Expand the solution space before committing: framed options compared on stated criteria, ending in a pick.' },
|
|
259
|
+
{ name: 'handoff', description: 'Write a portable, secret-scrubbed work-handoff doc so another tool or agent can resume.' },
|
|
260
|
+
{ name: 'sync', description: 'Sync increments with external trackers (GitHub, JIRA, Azure DevOps).' },
|
|
261
|
+
{ name: 'team', description: 'Run a multi-agent team over one increment: fan out tasks, then close centrally.' },
|
|
262
|
+
{ name: 'auto', description: 'Run the increment loop autonomously until the tasks are done.' },
|
|
263
|
+
{ name: 'jev', description: 'Delegate a closed-set decision to Jev (TypeSafe System One): routing, guard verdicts, AC judgements, browser steps.' },
|
|
264
|
+
];
|
|
265
|
+
/** First line of the frontmatter `description:` in a SKILL.md, or ''. */
|
|
266
|
+
function frontmatterDescription(file) {
|
|
267
|
+
let raw;
|
|
268
|
+
try {
|
|
269
|
+
raw = fs.readFileSync(file, 'utf-8');
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return '';
|
|
273
|
+
}
|
|
274
|
+
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
275
|
+
if (!match)
|
|
276
|
+
return '';
|
|
277
|
+
const line = match[1].split(/\r?\n/).find((l) => /^description\s*:/i.test(l));
|
|
278
|
+
if (!line)
|
|
279
|
+
return '';
|
|
280
|
+
return line
|
|
281
|
+
.replace(/^description\s*:\s*/i, '')
|
|
282
|
+
.replace(/^["']|["']$/g, '')
|
|
283
|
+
.trim()
|
|
284
|
+
.slice(0, 400);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Shipped skill names + their frontmatter descriptions, for the SKILL_ROUTE question.
|
|
288
|
+
* Falls back to {@link FALLBACK_SKILLS} when the plugin tree is unreadable.
|
|
289
|
+
*/
|
|
290
|
+
export function skillRoster(root = packageRoot()) {
|
|
291
|
+
const dir = path.join(root, 'plugins', 'specweave', 'skills');
|
|
292
|
+
let entries;
|
|
293
|
+
try {
|
|
294
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
return [...FALLBACK_SKILLS];
|
|
298
|
+
}
|
|
299
|
+
const skills = [];
|
|
300
|
+
for (const entry of entries) {
|
|
301
|
+
if (!entry.isDirectory())
|
|
302
|
+
continue;
|
|
303
|
+
const skillFile = path.join(dir, entry.name, 'SKILL.md');
|
|
304
|
+
if (!fs.existsSync(skillFile))
|
|
305
|
+
continue;
|
|
306
|
+
const description = frontmatterDescription(skillFile);
|
|
307
|
+
skills.push({ name: entry.name, description: description || `The ${entry.name} SpecWeave workflow step.` });
|
|
308
|
+
}
|
|
309
|
+
skills.sort((a, b) => a.name.localeCompare(b.name));
|
|
310
|
+
return skills.length >= 2 ? skills : [...FALLBACK_SKILLS];
|
|
311
|
+
}
|
|
312
|
+
/** Read stdin synchronously. Returns '' when there is nothing to read. */
|
|
313
|
+
export function readStdin(src) {
|
|
314
|
+
if (src.stdin !== undefined)
|
|
315
|
+
return src.stdin;
|
|
316
|
+
try {
|
|
317
|
+
return fs.readFileSync(0, 'utf-8');
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return '';
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Resolve a `--state` / `--questions` style argument:
|
|
325
|
+
* `-` → stdin, `@path` → file contents, anything else → the literal value.
|
|
326
|
+
*/
|
|
327
|
+
export function readArgValue(value, src) {
|
|
328
|
+
if (value === undefined)
|
|
329
|
+
return undefined;
|
|
330
|
+
if (value === '-')
|
|
331
|
+
return readStdin(src);
|
|
332
|
+
if (value.startsWith('@')) {
|
|
333
|
+
return fs.readFileSync(path.resolve(src.cwd, value.slice(1)), 'utf-8');
|
|
334
|
+
}
|
|
335
|
+
return value;
|
|
336
|
+
}
|
|
337
|
+
/** Resolve a `[file|-]` positional: missing or `-` → stdin, otherwise the file. */
|
|
338
|
+
export function readFileOrStdin(value, src) {
|
|
339
|
+
if (!value || value === '-')
|
|
340
|
+
return readStdin(src);
|
|
341
|
+
const file = value.startsWith('@') ? value.slice(1) : value;
|
|
342
|
+
return fs.readFileSync(path.resolve(src.cwd, file), 'utf-8');
|
|
343
|
+
}
|
|
344
|
+
/** JSON when the text parses as JSON, the plain string otherwise. */
|
|
345
|
+
export function parseJsonOrText(text) {
|
|
346
|
+
const trimmed = text.trim();
|
|
347
|
+
if (!trimmed)
|
|
348
|
+
return '';
|
|
349
|
+
try {
|
|
350
|
+
return JSON.parse(trimmed);
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return text;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/** Parse a `--questions` payload into the client's question map. */
|
|
357
|
+
export function parseQuestions(text) {
|
|
358
|
+
let parsed;
|
|
359
|
+
try {
|
|
360
|
+
parsed = JSON.parse(text);
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
throw new Error(`--questions is not valid JSON: ${error.message}`);
|
|
364
|
+
}
|
|
365
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
366
|
+
throw new Error('--questions must be a JSON object keyed by question id');
|
|
367
|
+
}
|
|
368
|
+
return parsed;
|
|
369
|
+
}
|
|
370
|
+
/** Split repeatable `key=value` flags (`--option`, `--input`) into a record. */
|
|
371
|
+
export function parseKeyValues(list, flag) {
|
|
372
|
+
const out = {};
|
|
373
|
+
for (const raw of list ?? []) {
|
|
374
|
+
const eq = raw.indexOf('=');
|
|
375
|
+
if (eq <= 0)
|
|
376
|
+
throw new Error(`${flag} expects "key=value", got "${raw}"`);
|
|
377
|
+
out[raw.slice(0, eq).trim()] = raw.slice(eq + 1);
|
|
378
|
+
}
|
|
379
|
+
return out;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Build questions from the `--choice` / `--option` / `--noul` shorthands.
|
|
383
|
+
* Returns an empty map when no shorthand was used.
|
|
384
|
+
*/
|
|
385
|
+
export function shorthandQuestions(opts) {
|
|
386
|
+
const questions = {};
|
|
387
|
+
if (opts.choice) {
|
|
388
|
+
const criteria = parseKeyValues(opts.option, '--option');
|
|
389
|
+
if (Object.keys(criteria).length < 2) {
|
|
390
|
+
throw new Error('--choice needs at least two --option key=description flags');
|
|
391
|
+
}
|
|
392
|
+
questions.CHOICE = { type: 'choice', instructions: opts.choice, criteria };
|
|
393
|
+
}
|
|
394
|
+
if (opts.noul) {
|
|
395
|
+
questions.NOUL = { type: 'noul', instructions: opts.noul };
|
|
396
|
+
}
|
|
397
|
+
return questions;
|
|
398
|
+
}
|
|
399
|
+
/** Body of a `## <heading>` section of a markdown doc, up to the next `## `. */
|
|
400
|
+
export function extractSection(markdown, heading) {
|
|
401
|
+
const lines = markdown.split(/\r?\n/);
|
|
402
|
+
const start = lines.findIndex((l) => new RegExp(`^##\\s+${heading}\\b`, 'i').test(l));
|
|
403
|
+
if (start === -1)
|
|
404
|
+
return '';
|
|
405
|
+
const rest = lines.slice(start + 1);
|
|
406
|
+
const end = rest.findIndex((l) => /^##\s+/.test(l));
|
|
407
|
+
return (end === -1 ? rest : rest.slice(0, end)).join('\n').trim();
|
|
408
|
+
}
|
|
409
|
+
/** `0.0000155` → `$0.0000155`; small enough that toFixed(2) would read as $0.00. */
|
|
410
|
+
export function formatCost(cost) {
|
|
411
|
+
if (!Number.isFinite(cost) || cost === 0)
|
|
412
|
+
return '$0';
|
|
413
|
+
return cost < 0.01 ? `$${cost.toPrecision(3)}` : `$${cost.toFixed(4)}`;
|
|
414
|
+
}
|
|
415
|
+
/** `{a: 0.91, b: 0.09}` → `a 0.91 · b 0.09`, highest first, top 5. */
|
|
416
|
+
export function formatProbabilities(probabilities) {
|
|
417
|
+
const pairs = Object.entries(probabilities ?? {})
|
|
418
|
+
.sort((a, b) => b[1] - a[1])
|
|
419
|
+
.slice(0, 5)
|
|
420
|
+
.map(([k, v]) => `${k} ${v.toFixed(2)}`);
|
|
421
|
+
return pairs.join(' · ');
|
|
422
|
+
}
|
|
423
|
+
export const out = (s) => { process.stdout.write(s + '\n'); };
|
|
424
|
+
export const err = (s) => { process.stderr.write(s + '\n'); };
|
|
425
|
+
export const json = (value) => { out(JSON.stringify(value, null, 2)); };
|
|
426
|
+
export function messageOf(error) {
|
|
427
|
+
return error?.message ?? String(error);
|
|
428
|
+
}
|
|
429
|
+
// ── doctor ───────────────────────────────────────────────────────────────────
|
|
430
|
+
export async function jevDoctor(root, env, opts) {
|
|
431
|
+
const cfg = loadJevConfig(root, env);
|
|
432
|
+
const key = resolveApiKey(cfg, env);
|
|
433
|
+
const marker = guardMarkerPath(root);
|
|
434
|
+
const markerPresent = fs.existsSync(marker);
|
|
435
|
+
const projectHook = readProjectHook(root);
|
|
436
|
+
const summary = readUsageSummary(root);
|
|
437
|
+
let ping;
|
|
438
|
+
if (cfg.enabled && key) {
|
|
439
|
+
const client = opts.client ?? new JevClient(cfg, {
|
|
440
|
+
apiKey: key.key,
|
|
441
|
+
projectRoot: root,
|
|
442
|
+
fetch: opts.fetch,
|
|
443
|
+
usageLog: false,
|
|
444
|
+
kind: 'doctor',
|
|
445
|
+
});
|
|
446
|
+
ping = await client.ping();
|
|
447
|
+
}
|
|
448
|
+
const unavailable = !cfg.enabled || !key;
|
|
449
|
+
const code = unavailable ? EXIT.unavailable : ping && !ping.ok ? EXIT.error : EXIT.ok;
|
|
450
|
+
if (opts.json) {
|
|
451
|
+
json({
|
|
452
|
+
projectRoot: root,
|
|
453
|
+
enabled: cfg.enabled,
|
|
454
|
+
provider: cfg.provider,
|
|
455
|
+
endpoint: jevEndpoint(cfg),
|
|
456
|
+
model: cfg.model,
|
|
457
|
+
keySource: key?.source ?? null,
|
|
458
|
+
keyPresent: !!key,
|
|
459
|
+
guardBash: cfg.guards.bash,
|
|
460
|
+
guardMarker: { path: marker, present: markerPresent },
|
|
461
|
+
projectHook: { path: projectHook.path, present: projectHook.present },
|
|
462
|
+
modelRouting: cfg.modelRouting,
|
|
463
|
+
thresholds: cfg.thresholds,
|
|
464
|
+
timeoutMs: cfg.timeoutMs,
|
|
465
|
+
ping: ping ?? null,
|
|
466
|
+
usage: summary,
|
|
467
|
+
exitCode: code,
|
|
468
|
+
});
|
|
469
|
+
return code;
|
|
470
|
+
}
|
|
471
|
+
out('Jev (TypeSafe System One)');
|
|
472
|
+
out(` enabled ${cfg.enabled ? 'yes' : 'no'}`);
|
|
473
|
+
out(` provider ${cfg.provider}`);
|
|
474
|
+
out(` endpoint ${jevEndpoint(cfg)}`);
|
|
475
|
+
out(` model ${cfg.model}`);
|
|
476
|
+
out(key
|
|
477
|
+
? ` key found in ${key.source}`
|
|
478
|
+
: ` key NOT FOUND (tried ${[cfg.apiKeyEnv, JEV_PROVIDER_KEY_ENV[cfg.provider], JEV_FALLBACK_KEY_ENV].filter(Boolean).join(', ')})`);
|
|
479
|
+
out(` bash guard ${cfg.guards.bash ? 'on' : 'off'} (marker ${markerPresent ? 'present' : 'absent'}: ${marker})`);
|
|
480
|
+
out(` project hook ${projectHook.present ? 'registered' : 'not registered'}: ${projectHook.path}`);
|
|
481
|
+
out(` timeout ${cfg.timeoutMs} ms · thresholds route ${cfg.thresholds.route} / warn ${cfg.thresholds.guardWarn} / deny ${cfg.thresholds.guardDeny}`);
|
|
482
|
+
if (ping) {
|
|
483
|
+
out(ping.ok
|
|
484
|
+
? ` ping ok ${ping.latencyMs} ms (${ping.model ?? cfg.model})`
|
|
485
|
+
: ` ping FAILED after ${ping.latencyMs} ms — ${ping.error ?? 'unknown error'}`);
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
out(' ping skipped (Jev unavailable)');
|
|
489
|
+
}
|
|
490
|
+
out(` usage ${summary.calls} call(s) · ${summary.input_tokens} input tokens · ${formatCost(summary.cost)}`);
|
|
491
|
+
if (unavailable)
|
|
492
|
+
err('Jev unavailable: run `specweave jev setup` (exit 4 = continue without Jev)');
|
|
493
|
+
return code;
|
|
494
|
+
}
|
|
495
|
+
// ── setup ────────────────────────────────────────────────────────────────────
|
|
496
|
+
export async function jevSetup(root, env, opts) {
|
|
497
|
+
const cfg = loadJevConfig(root, env);
|
|
498
|
+
if (opts.disable) {
|
|
499
|
+
const configPath = mergeJevConfig(root, { enabled: false, guards: { bash: false } });
|
|
500
|
+
setGuardMarker(root, false);
|
|
501
|
+
const projectHook = setProjectHook(root, false);
|
|
502
|
+
if (opts.json) {
|
|
503
|
+
json({
|
|
504
|
+
enabled: false,
|
|
505
|
+
configPath,
|
|
506
|
+
guardBash: false,
|
|
507
|
+
projectHook: { path: projectHook.path, present: projectHook.present },
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
out(`Jev disabled in ${configPath} (guard marker and project hook removed).`);
|
|
512
|
+
if (projectHook.error)
|
|
513
|
+
err(` note: ${projectHook.error}`);
|
|
514
|
+
}
|
|
515
|
+
return EXIT.ok;
|
|
516
|
+
}
|
|
517
|
+
const requested = opts.provider?.trim().toLowerCase();
|
|
518
|
+
if (requested && requested !== 'openrouter' && requested !== 'typesafe') {
|
|
519
|
+
err(`Unknown provider "${opts.provider}". Use: openrouter | typesafe`);
|
|
520
|
+
return EXIT.error;
|
|
521
|
+
}
|
|
522
|
+
const provider = requested ?? cfg.provider;
|
|
523
|
+
const model = opts.model?.trim()
|
|
524
|
+
?? (provider === cfg.provider ? cfg.model : JEV_PROVIDER_MODEL[provider]);
|
|
525
|
+
const guardBash = opts.guardBash ?? cfg.guards.bash;
|
|
526
|
+
const candidate = {
|
|
527
|
+
...cfg,
|
|
528
|
+
enabled: true,
|
|
529
|
+
provider,
|
|
530
|
+
model,
|
|
531
|
+
guards: { bash: guardBash },
|
|
532
|
+
};
|
|
533
|
+
const key = resolveApiKey(candidate, env);
|
|
534
|
+
if (!key) {
|
|
535
|
+
err(`Jev unavailable: no API key — export ${JEV_PROVIDER_KEY_ENV[provider]} (or ${JEV_FALLBACK_KEY_ENV}) and re-run`);
|
|
536
|
+
return EXIT.unavailable;
|
|
537
|
+
}
|
|
538
|
+
const client = opts.client ?? new JevClient(candidate, {
|
|
539
|
+
apiKey: key.key,
|
|
540
|
+
projectRoot: root,
|
|
541
|
+
fetch: opts.fetch,
|
|
542
|
+
usageLog: false,
|
|
543
|
+
kind: 'setup',
|
|
544
|
+
});
|
|
545
|
+
const ping = await client.ping();
|
|
546
|
+
if (!ping.ok) {
|
|
547
|
+
err(`Jev ping failed (${provider}, ${model}): ${ping.error ?? 'unknown error'} — nothing was written`);
|
|
548
|
+
return EXIT.error;
|
|
549
|
+
}
|
|
550
|
+
const configPath = mergeJevConfig(root, {
|
|
551
|
+
enabled: true,
|
|
552
|
+
provider,
|
|
553
|
+
model,
|
|
554
|
+
guards: { bash: guardBash },
|
|
555
|
+
});
|
|
556
|
+
const markerPresent = setGuardMarker(root, guardBash);
|
|
557
|
+
const projectHook = setProjectHook(root, guardBash);
|
|
558
|
+
if (opts.json) {
|
|
559
|
+
json({
|
|
560
|
+
enabled: true,
|
|
561
|
+
provider,
|
|
562
|
+
model,
|
|
563
|
+
keySource: key.source,
|
|
564
|
+
guardBash,
|
|
565
|
+
guardMarker: { path: guardMarkerPath(root), present: markerPresent },
|
|
566
|
+
projectHook: { path: projectHook.path, present: projectHook.present },
|
|
567
|
+
configPath,
|
|
568
|
+
ping,
|
|
569
|
+
next: 'specweave update-instructions',
|
|
570
|
+
});
|
|
571
|
+
return EXIT.ok;
|
|
572
|
+
}
|
|
573
|
+
out(`Jev enabled: ${provider} · ${ping.model ?? model} · key from ${key.source} · ping ${ping.latencyMs} ms`);
|
|
574
|
+
out(` config ${configPath}`);
|
|
575
|
+
out(` bash guard ${guardBash ? `on (marker ${guardMarkerPath(root)})` : 'off'}`);
|
|
576
|
+
out(` project hook ${projectHook.present ? 'registered in' : 'removed from'} ${projectHook.path}`);
|
|
577
|
+
if (projectHook.error)
|
|
578
|
+
err(` note: ${projectHook.error}`);
|
|
579
|
+
out('Next: specweave update-instructions # renders the jev section into CLAUDE.md / AGENTS.md');
|
|
580
|
+
return EXIT.ok;
|
|
581
|
+
}
|
|
582
|
+
//# sourceMappingURL=jev-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev-helpers.js","sourceRoot":"","sources":["../../../../src/cli/commands/jev-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: `specweave jev <action>` — TypeSafe System One from the shell.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: doctor | setup | ask | route | task | guard | screen | failure | browse | usage
|
|
5
|
+
*
|
|
6
|
+
* Exit codes (every agent integration depends on these):
|
|
7
|
+
* 0 ok · 1 error · 2 guard warn · 3 guard deny · 4 Jev unavailable (disabled or no key)
|
|
8
|
+
*
|
|
9
|
+
* Exit 4 prints a single reason line on stderr and nothing else, so a hook or script can
|
|
10
|
+
* treat it as "continue without Jev". `doctor` is the one exception: reporting the
|
|
11
|
+
* unavailable state IS its job, so it prints its report and still exits 4.
|
|
12
|
+
*
|
|
13
|
+
* The API key value is never printed, logged or written — only env var NAMES.
|
|
14
|
+
*
|
|
15
|
+
* @module cli/commands/jev
|
|
16
|
+
*/
|
|
17
|
+
import { type JevCommandOptions } from './jev-helpers.js';
|
|
18
|
+
export type { JevCommandOptions } from './jev-helpers.js';
|
|
19
|
+
/** `specweave jev <action> [args...]` — returns the process exit code. */
|
|
20
|
+
export declare function jevCommand(action: string, args?: string[], opts?: JevCommandOptions): Promise<number>;
|
|
21
|
+
//# sourceMappingURL=jev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/jev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuBH,OAAO,EAkBL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAkC1D,0EAA0E;AAC1E,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAM,EAAO,EACnB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
|