pluidr 0.7.3 → 0.7.5

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/README.md CHANGED
@@ -321,7 +321,7 @@ Checks installation health and reports ✓/✗ for each component:
321
321
  - `opencode.jsonc` exists
322
322
  - All 18 prompt files present
323
323
  - Both plugin files present
324
- - `pluidr-contrast` theme file present
324
+ - `pluidr-contrast` theme configured
325
325
  - `package.json` with `@opencode-ai/plugin` dependency
326
326
  - squeeze binary available
327
327
  - Config is valid JSON
@@ -330,7 +330,7 @@ Exits with code `0` if all pass, `1` if any fail.
330
330
 
331
331
  ### `pluidr update`
332
332
 
333
- Checks the npm registry for a newer version of pluidr and prompts to install it.
333
+ Checks the npm registry for a newer version of pluidr and prompts to automatically install the upgrade globally. If an update is successfully completed, the running CLI process exits to let you start fresh on the new version.
334
334
 
335
335
  ### `pluidr uninstall`
336
336
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pluidr",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "description": "Opinionated Engineering Workflow for OpenCode — Plan, Build, Review.",
5
5
  "keywords": [
6
6
  "opencode",
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync, readdirSync } from "node:fs"
2
2
  import { join } from "node:path"
3
- import { getConfigDir, getConfigPath, getPromptsDir, getThemesDir } from "../../core/paths.js"
3
+ import { getConfigDir, getConfigPath, getPromptsDir, getThemesDir, getTuiConfigPath } from "../../core/paths.js"
4
4
  import { findSqueezePath } from "../../core/squeezeInstaller.js"
5
5
 
6
6
  const EXPECTED_PROMPT_COUNT = 18
@@ -47,9 +47,30 @@ export function collectChecks() {
47
47
  }
48
48
  checks.push({ component: "plugin files", pass: pluginsFound === PLUGIN_FILES.length, detail: `${pluginsFound}/${PLUGIN_FILES.length}` })
49
49
 
50
- // 3b. Custom theme exists
50
+ // 3b. Theme configuration verification
51
51
  const themeExists = existsSync(join(themesDir, "pluidr-contrast.json"))
52
- checks.push({ component: "pluidr-contrast theme file", pass: themeExists })
52
+ const tuiConfigPath = getTuiConfigPath()
53
+ let tuiConfigValid = false
54
+ let tuiDetail = "missing mapping"
55
+ if (existsSync(tuiConfigPath)) {
56
+ try {
57
+ const content = readFileSync(tuiConfigPath, "utf-8")
58
+ const parsed = JSON.parse(content)
59
+ if (parsed.theme === "pluidr-contrast") {
60
+ tuiConfigValid = true
61
+ tuiDetail = ""
62
+ } else {
63
+ tuiDetail = `theme: ${parsed.theme || "none"}`
64
+ }
65
+ } catch {
66
+ tuiDetail = "corrupted tui.json"
67
+ }
68
+ }
69
+ checks.push({
70
+ component: themeExists && tuiConfigValid ? "pluidr-contrast theme configured" : "pluidr-contrast theme not configured",
71
+ pass: themeExists && tuiConfigValid,
72
+ detail: !themeExists ? "missing theme file" : tuiDetail
73
+ })
53
74
 
54
75
  // 4. package.json with @opencode-ai/plugin dependency
55
76
  let pkgValid = false
@@ -7,7 +7,11 @@ import { runInit } from "./init.js"
7
7
 
8
8
  export async function runLaunch() {
9
9
  // 1. Update check
10
- await checkAndPromptUpdate(version)
10
+ const updated = await checkAndPromptUpdate(version)
11
+ if (updated) {
12
+ console.log("Update successful. Please run pluidr again to start the new version.")
13
+ process.exit(0)
14
+ }
11
15
 
12
16
  // 2. Doctor check
13
17
  process.stdout.write("Running doctor... ")
@@ -2,5 +2,8 @@ import { checkAndPromptUpdate } from "../../core/versionCheck.js"
2
2
  import { version } from "../../core/version.js"
3
3
 
4
4
  export async function runUpdate() {
5
- await checkAndPromptUpdate(version)
5
+ const updated = await checkAndPromptUpdate(version)
6
+ if (updated) {
7
+ console.log("Update successful. Please run pluidr again to start the new version.")
8
+ }
6
9
  }
@@ -297,18 +297,8 @@ After presenting the Compose-Reporter's completion report to the user, you MUST:
297
297
  state returns to the starting point. The next user message triggers a
298
298
  fresh EXPLORE cycle.
299
299
 
300
- 2. **Present handoff guidance** using the `question` tool:
301
- - "Pipeline complete. What would you like to do next?"
302
- - Options:
303
- - "New feature / idea" — restart from EXPLORE (default path)
304
- - "Bug / defect found" — suggest switching to Debugger tab
305
- - "Iterate on this result" — re-enter EXPLORE with the current
306
- result as context (treat as a new request)
307
-
308
- 3. **If the user selects "Bug / defect found"**, respond with:
309
- "For bugs and defects, switch to the Debugger tab — it uses
310
- Brooks-Lint methodology for root-cause analysis. Debugger is
311
- standalone and does not depend on Composer."
300
+ 2. **Ask naturally in text** (do NOT use the `question` tool):
301
+ Ask the user if they are finished or if they need to continue the session to iterate on this result. Keep it brief, conversational, and natural.
312
302
 
313
303
  Do NOT automatically start a new pipeline without user confirmation.
314
304
  Do NOT stay in BUILD phase after presenting the report — the pipeline
@@ -396,6 +386,7 @@ elsewhere. Do not accept a report that is not in `docs/reports/`.
396
386
  already confirmed as PASS.
397
387
  - **Clarification** — If anything is ambiguous at any phase, avoid excessive questioning. For minor details, make a reasonable, safe engineering assumption based on existing codebase conventions and document it. Only prompt the user using multiple-choice options (2-3 short choices per question, and list your recommended option first prefixed with '(Recommended)') if there is a critical blocking issue that directly impacts the design direction or has high regression risk.
398
388
  - **Front-End / UI Mockups** — If the user asks for a design, mockup, or anything related to the Front-End (FE), you must provide a detailed ASCII mockup of the UI structure in your output.
389
+ - **Path Normalization** — Prefer using forward slashes (`/`) for paths when executing cross-platform runtimes (like `node`, `npm`, `python`, `pytest`, `git`, `rg`, `grep`, `cat`, etc.) to prevent the permission engine from misinterpreting backslashes as escape sequences. For native Windows shell commands (like `cmd.exe` built-ins), use standard backslashes (`\`) to prevent the shell from misinterpreting slashes as switch options (e.g. `/p` in `/plugins`).
399
390
 
400
391
  ---
401
392
 
@@ -59,17 +59,8 @@ After presenting the outcome to the user, you MUST:
59
59
  returns to the starting point. The next user message triggers a fresh
60
60
  debugging cycle.
61
61
 
62
- 2. **Present handoff guidance** using the `question` tool:
63
- - "Investigation complete. What would you like to do next?"
64
- - Options:
65
- - "New bug / defect" — start a fresh debugging cycle
66
- - "Feature work" — suggest switching to Composer tab
67
- - "Re-investigate" — re-enter with new information or context
68
-
69
- 3. **If the user selects "Feature work"**, respond with:
70
- "For feature work, switch to the Composer tab — it handles the full
71
- Explore → Plan → Build pipeline. Composer is standalone and does not
72
- depend on Debugger."
62
+ 2. **Ask naturally in text** (do NOT use the `question` tool):
63
+ Ask the user if they are finished or if they need to continue the session to investigate further or try another fix. Keep it brief, conversational, and natural.
73
64
 
74
65
  Do NOT automatically start a new investigation without user confirmation.
75
66
  Do NOT remain in a completed state without offering next steps.
@@ -133,6 +124,7 @@ just a technical restriction.
133
124
  implementation, and reporting in the same delegate call. Each subagent
134
125
  has one job; the Debugger orchestrates the sequence.
135
126
  - **Avoid Excessive Questioning** — Avoid excessive querying of the user for minor ambiguities. For small implementation details, make a reasonable, safe engineering assumption based on existing codebase conventions and proceed. Only prompt the user using multiple-choice options (2-3 short choices per question, and list your recommended option first prefixed with '(Recommended)') when a critical blocking issue directly prevents a safe diagnosis or fix.
127
+ - **Path Normalization** — Prefer using forward slashes (`/`) for paths when executing cross-platform runtimes (like `node`, `npm`, `python`, `pytest`, `git`, `rg`, `grep`, `cat`, etc.) to prevent the permission engine from misinterpreting backslashes as escape sequences. For native Windows shell commands (like `cmd.exe` built-ins), use standard backslashes (`\`) to prevent the shell from misinterpreting slashes as switch options (e.g. `/p` in `/plugins`).
136
128
 
137
129
  ## What you do NOT do
138
130
 
@@ -60,16 +60,8 @@ After presenting the audit report to the user, you MUST:
60
60
  1. **Reset your internal state.** The audit is complete — your state returns to TRACE.
61
61
  The next user message triggers a fresh security audit cycle.
62
62
 
63
- 2. **Present handoff guidance** using the `question` tool:
64
- - "Security audit complete. What would you like to do next?"
65
- - Options:
66
- - "New security audit" — start a fresh TRACE cycle
67
- - "Feature work" — suggest switching to Composer tab
68
- - "Bug investigation" — suggest switching to Debugger tab
69
-
70
- 3. **If the user selects "Feature work"**, respond with:
71
- "For feature work, switch to the Composer tab — it handles the full
72
- Explore → Plan → Build pipeline."
63
+ 2. **Ask naturally in text** (do NOT use the `question` tool):
64
+ Ask the user if they are finished or if they need to continue the session to run a new audit or review other areas. Keep it brief, conversational, and natural.
73
65
 
74
66
  Do NOT automatically start a new audit without user confirmation.
75
67
  Do NOT remain in a completed state without offering next steps.
@@ -88,6 +80,7 @@ Do NOT remain in a completed state without offering next steps.
88
80
  ## Principles you apply
89
81
 
90
82
  - **Avoid Excessive Questioning** — Avoid excessive querying of the user for minor ambiguities. For small implementation details, make a reasonable, safe engineering assumption based on existing codebase conventions and proceed. Only prompt the user using the `question` tool with multiple-choice options (2-3 short choices per question, and list your recommended option first prefixed with '(Recommended)') for critical blocking decisions (such as the Guardrail Gate or a complete audit block).
83
+ - **Path Normalization** — Prefer using forward slashes (`/`) for paths when executing cross-platform runtimes (like `node`, `npm`, `python`, `pytest`, `git`, `rg`, `grep`, `cat`, etc.) to prevent the permission engine from misinterpreting backslashes as escape sequences. For native Windows shell commands (like `cmd.exe` built-ins), use standard backslashes (`\`) to prevent the shell from misinterpreting slashes as switch options (e.g. `/p` in `/plugins`).
91
84
 
92
85
  ## Conflict Resolution
93
86
  Refer to `hierarchy.txt` (loaded globally) — you do not resolve principle
@@ -96,6 +96,19 @@
96
96
  "npm *": "allow",
97
97
  "npx *": "allow",
98
98
  "node *": "allow",
99
+ "bun *": "allow",
100
+ "pnpm *": "allow",
101
+ "yarn *": "allow",
102
+ "python *": "allow",
103
+ "python3 *": "allow",
104
+ "pip *": "allow",
105
+ "pip3 *": "allow",
106
+ "uv *": "allow",
107
+ "poetry *": "allow",
108
+ "go *": "allow",
109
+ "cargo *": "allow",
110
+ "make *": "allow",
111
+ "cmake *": "allow",
99
112
  "git *": "allow",
100
113
  "mkdir *": "allow",
101
114
  "cp *": "allow",
@@ -103,10 +116,14 @@
103
116
  "mv *": "allow",
104
117
  "cat *": "allow",
105
118
  "ls *": "allow",
119
+ "dir *": "allow",
106
120
  "rg *": "allow",
107
121
  "grep *": "allow",
108
122
  "find *": "allow",
109
- "node --test": "allow"
123
+ "echo *": "allow",
124
+ "node --test": "allow",
125
+ "npm test": "allow",
126
+ "pytest *": "allow"
110
127
  },
111
128
  "task": "deny"
112
129
  }
@@ -125,16 +142,27 @@
125
142
  "todowrite": "deny",
126
143
  "bash": {
127
144
  "*": "deny",
145
+ "node *": "allow",
146
+ "bun *": "allow",
147
+ "npm *": "allow",
148
+ "npx *": "allow",
149
+ "python *": "allow",
150
+ "python3 *": "allow",
151
+ "go *": "allow",
152
+ "cargo *": "allow",
128
153
  "node --test": "allow",
129
154
  "npm test": "allow",
130
- "npx *": "allow",
155
+ "pytest *": "allow",
131
156
  "rg *": "allow",
132
157
  "grep *": "allow",
133
158
  "find *": "allow",
134
159
  "cat *": "allow",
135
160
  "ls *": "allow",
161
+ "dir *": "allow",
136
162
  "git diff*": "allow",
137
- "git log*": "allow"
163
+ "git log*": "allow",
164
+ "git show*": "allow",
165
+ "echo *": "allow"
138
166
  },
139
167
  "task": "deny"
140
168
  }
@@ -156,8 +184,12 @@
156
184
  "git diff*": "allow",
157
185
  "git log*": "allow",
158
186
  "git show*": "allow",
187
+ "git status*": "allow",
159
188
  "rg *": "allow",
160
- "grep *": "allow"
189
+ "grep *": "allow",
190
+ "cat *": "allow",
191
+ "ls *": "allow",
192
+ "dir *": "allow"
161
193
  },
162
194
  "task": "deny"
163
195
  }
@@ -206,8 +238,13 @@
206
238
  "find *": "allow",
207
239
  "cat *": "allow",
208
240
  "ls *": "allow",
241
+ "dir *": "allow",
209
242
  "node --version": "allow",
210
- "npm --version": "allow"
243
+ "npm --version": "allow",
244
+ "python --version": "allow",
245
+ "python3 --version": "allow",
246
+ "go version": "allow",
247
+ "cargo --version": "allow"
211
248
  },
212
249
  "webfetch": "allow",
213
250
  "websearch": "allow",
@@ -275,10 +312,13 @@
275
312
  "git log*": "allow",
276
313
  "git show*": "allow",
277
314
  "git blame*": "allow",
315
+ "git status*": "allow",
278
316
  "rg *": "allow",
279
317
  "grep *": "allow",
280
318
  "cat *": "allow",
281
- "find *": "allow"
319
+ "find *": "allow",
320
+ "ls *": "allow",
321
+ "dir *": "allow"
282
322
  },
283
323
  "webfetch": "allow",
284
324
  "websearch": "allow",
@@ -299,23 +339,37 @@
299
339
  "todowrite": "allow",
300
340
  "bash": {
301
341
  "*": "deny",
302
- "node --test": "allow",
303
- "npm test": "allow",
304
342
  "npm *": "allow",
305
343
  "npx *": "allow",
306
344
  "node *": "allow",
307
- "git diff*": "allow",
308
- "git log*": "allow",
309
- "git show*": "allow",
345
+ "bun *": "allow",
346
+ "pnpm *": "allow",
347
+ "yarn *": "allow",
348
+ "python *": "allow",
349
+ "python3 *": "allow",
350
+ "pip *": "allow",
351
+ "pip3 *": "allow",
352
+ "uv *": "allow",
353
+ "poetry *": "allow",
354
+ "go *": "allow",
355
+ "cargo *": "allow",
356
+ "make *": "allow",
357
+ "cmake *": "allow",
358
+ "git *": "allow",
310
359
  "mkdir *": "allow",
311
360
  "cp *": "allow",
312
361
  "rm *": "allow",
313
362
  "mv *": "allow",
314
363
  "cat *": "allow",
315
364
  "ls *": "allow",
365
+ "dir *": "allow",
316
366
  "rg *": "allow",
317
367
  "grep *": "allow",
318
- "find *": "allow"
368
+ "find *": "allow",
369
+ "echo *": "allow",
370
+ "node --test": "allow",
371
+ "npm test": "allow",
372
+ "pytest *": "allow"
319
373
  },
320
374
  "task": "deny"
321
375
  }
@@ -389,12 +443,17 @@
389
443
  "find *": "allow",
390
444
  "cat *": "allow",
391
445
  "ls *": "allow",
446
+ "dir *": "allow",
392
447
  "git log*": "allow",
393
448
  "git diff*": "allow",
394
449
  "git show*": "allow",
395
450
  "git blame*": "allow",
396
451
  "node --version": "allow",
397
452
  "npm --version": "allow",
453
+ "python --version": "allow",
454
+ "python3 --version": "allow",
455
+ "go version": "allow",
456
+ "cargo --version": "allow",
398
457
  "which *": "allow",
399
458
  "where *": "allow"
400
459
  },
@@ -417,6 +476,19 @@
417
476
  "npm *": "allow",
418
477
  "npx *": "allow",
419
478
  "node *": "allow",
479
+ "bun *": "allow",
480
+ "pnpm *": "allow",
481
+ "yarn *": "allow",
482
+ "python *": "allow",
483
+ "python3 *": "allow",
484
+ "pip *": "allow",
485
+ "pip3 *": "allow",
486
+ "uv *": "allow",
487
+ "poetry *": "allow",
488
+ "go *": "allow",
489
+ "cargo *": "allow",
490
+ "make *": "allow",
491
+ "cmake *": "allow",
420
492
  "git *": "allow",
421
493
  "mkdir *": "allow",
422
494
  "cp *": "allow",
@@ -424,10 +496,14 @@
424
496
  "mv *": "allow",
425
497
  "cat *": "allow",
426
498
  "ls *": "allow",
499
+ "dir *": "allow",
427
500
  "rg *": "allow",
428
501
  "grep *": "allow",
429
502
  "find *": "allow",
430
- "node --test": "allow"
503
+ "echo *": "allow",
504
+ "node --test": "allow",
505
+ "npm test": "allow",
506
+ "pytest *": "allow"
431
507
  },
432
508
  "task": "deny"
433
509
  }
@@ -445,14 +521,25 @@
445
521
  "write": "deny",
446
522
  "bash": {
447
523
  "*": "deny",
524
+ "node *": "allow",
525
+ "bun *": "allow",
526
+ "npm *": "allow",
527
+ "npx *": "allow",
528
+ "python *": "allow",
529
+ "python3 *": "allow",
530
+ "go *": "allow",
531
+ "cargo *": "allow",
532
+ "node --test": "allow",
533
+ "npm test": "allow",
534
+ "pytest *": "allow",
448
535
  "rg *": "allow",
449
536
  "grep *": "allow",
450
537
  "find *": "allow",
451
538
  "cat *": "allow",
539
+ "ls *": "allow",
540
+ "dir *": "allow",
452
541
  "git diff*": "allow",
453
- "git log*": "allow",
454
- "node --test": "allow",
455
- "npm test": "allow"
542
+ "git log*": "allow"
456
543
  },
457
544
  "task": "deny"
458
545
  }