@deskwork/cli 0.9.7 → 0.9.8

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/dist/cli.js CHANGED
@@ -29,6 +29,7 @@ const SUBCOMMANDS = {
29
29
  pause: () => import("./commands/pause.js"),
30
30
  plan: () => import("./commands/plan.js"),
31
31
  publish: () => import("./commands/publish.js"),
32
+ 'repair-install': () => import("./commands/repair-install.js"),
32
33
  resume: () => import("./commands/resume.js"),
33
34
  'review-cancel': () => import("./commands/review-cancel.js"),
34
35
  'review-help': () => import("./commands/review-help.js"),
@@ -81,7 +82,8 @@ function printUsage() {
81
82
  out.write(' resume restore a Paused entry to its prior stage\n\n');
82
83
  out.write('Maintenance:\n');
83
84
  out.write(' doctor audit/repair binding metadata\n');
84
- out.write(' customize copy a plugin default into .deskwork/<category>/<name>.ts\n\n');
85
+ out.write(' customize copy a plugin default into .deskwork/<category>/<name>.ts\n');
86
+ out.write(' repair-install prune stale entries from Claude Code\'s plugin registry (#89)\n\n');
85
87
  out.write('Review loop:\n');
86
88
  out.write(' review-start enqueue a longform draft for review\n');
87
89
  out.write(' shortform-start enqueue a shortform draft for review\n');
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * deskwork repair-install — recover from Claude Code's stale plugin
3
+ * registry state (issue #89).
4
+ *
5
+ * Symptom: after a series of /plugin install + /plugin marketplace
6
+ * update + /reload-plugins cycles, ~/.claude/plugins/installed_plugins.json
7
+ * accumulates entries pointing at cache directories that no longer
8
+ * exist on disk. Claude Code wires PATH from these stale entries, so
9
+ * `command -v deskwork` returns nothing even though the marketplace
10
+ * clone at ~/.claude/plugins/marketplaces/deskwork/ is intact.
11
+ *
12
+ * The fix on Claude Code's side is registry hygiene (prune entries on
13
+ * write; reconcile against disk on reload). Until that lands, this
14
+ * command lets adopters self-heal: prune deskwork-owned entries whose
15
+ * installPath doesn't exist, then re-install via /plugin install +
16
+ * /reload-plugins to repopulate the cache.
17
+ *
18
+ * Argv shape: no positional args. Optional flags:
19
+ *
20
+ * --dry-run Show what would be pruned without writing.
21
+ * --json Machine-readable output.
22
+ *
23
+ * The CLI dispatcher injects process.cwd() as args[0] when no path-like
24
+ * arg is present; this command ignores it.
25
+ *
26
+ * Exit codes:
27
+ * 0 Registry was already clean OR pruned cleanly.
28
+ * 1 Registry not found, malformed, or unrecognized version.
29
+ */
30
+ interface InstallEntry {
31
+ readonly scope: string;
32
+ readonly installPath: string;
33
+ readonly version: string;
34
+ readonly installedAt?: string;
35
+ readonly lastUpdated?: string;
36
+ readonly gitCommitSha?: string;
37
+ readonly projectPath?: string;
38
+ }
39
+ interface Registry {
40
+ readonly version: number;
41
+ plugins: Record<string, InstallEntry[]>;
42
+ }
43
+ interface PruneReport {
44
+ readonly registryPath: string;
45
+ readonly marketplaceClonePresent: boolean;
46
+ readonly pruned: ReadonlyArray<{
47
+ readonly key: string;
48
+ readonly entry: InstallEntry;
49
+ }>;
50
+ readonly kept: ReadonlyArray<{
51
+ readonly key: string;
52
+ readonly entry: InstallEntry;
53
+ }>;
54
+ readonly missingAfterPrune: ReadonlyArray<string>;
55
+ readonly registryWritten: boolean;
56
+ }
57
+ export declare function run(argv: string[]): Promise<void>;
58
+ export declare function pruneRegistry(registry: Registry, dryRun: boolean): PruneReport;
59
+ export {};
60
+ //# sourceMappingURL=repair-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-install.d.ts","sourceRoot":"","sources":["../../src/commands/repair-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAMH,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,QAAQ;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;CACzC;AAOD,UAAU,WAAW;IACnB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACvF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACrF,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,CA0C9E"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * deskwork repair-install — recover from Claude Code's stale plugin
3
+ * registry state (issue #89).
4
+ *
5
+ * Symptom: after a series of /plugin install + /plugin marketplace
6
+ * update + /reload-plugins cycles, ~/.claude/plugins/installed_plugins.json
7
+ * accumulates entries pointing at cache directories that no longer
8
+ * exist on disk. Claude Code wires PATH from these stale entries, so
9
+ * `command -v deskwork` returns nothing even though the marketplace
10
+ * clone at ~/.claude/plugins/marketplaces/deskwork/ is intact.
11
+ *
12
+ * The fix on Claude Code's side is registry hygiene (prune entries on
13
+ * write; reconcile against disk on reload). Until that lands, this
14
+ * command lets adopters self-heal: prune deskwork-owned entries whose
15
+ * installPath doesn't exist, then re-install via /plugin install +
16
+ * /reload-plugins to repopulate the cache.
17
+ *
18
+ * Argv shape: no positional args. Optional flags:
19
+ *
20
+ * --dry-run Show what would be pruned without writing.
21
+ * --json Machine-readable output.
22
+ *
23
+ * The CLI dispatcher injects process.cwd() as args[0] when no path-like
24
+ * arg is present; this command ignores it.
25
+ *
26
+ * Exit codes:
27
+ * 0 Registry was already clean OR pruned cleanly.
28
+ * 1 Registry not found, malformed, or unrecognized version.
29
+ */
30
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
31
+ import { homedir } from 'node:os';
32
+ import { join } from 'node:path';
33
+ const REGISTRY_PATH = join(homedir(), '.claude/plugins/installed_plugins.json');
34
+ const MARKETPLACE_CLONE = join(homedir(), '.claude/plugins/marketplaces/deskwork');
35
+ const DESKWORK_PLUGINS = ['deskwork', 'deskwork-studio', 'dw-lifecycle'];
36
+ const DESKWORK_KEYS = DESKWORK_PLUGINS.map((p) => `${p}@deskwork`);
37
+ export async function run(argv) {
38
+ const dryRun = argv.includes('--dry-run');
39
+ const json = argv.includes('--json');
40
+ if (!existsSync(REGISTRY_PATH)) {
41
+ process.stderr.write(`installed_plugins.json not found at ${REGISTRY_PATH}\n`);
42
+ process.exit(1);
43
+ }
44
+ let registry;
45
+ try {
46
+ registry = JSON.parse(readFileSync(REGISTRY_PATH, 'utf8'));
47
+ }
48
+ catch (err) {
49
+ const reason = err instanceof Error ? err.message : String(err);
50
+ process.stderr.write(`failed to parse ${REGISTRY_PATH}: ${reason}\n`);
51
+ process.exit(1);
52
+ }
53
+ if (typeof registry.version !== 'number' || registry.version > 2) {
54
+ process.stderr.write(`unrecognized installed_plugins.json version: ${String(registry.version)}\n` +
55
+ `this command was written for version 2 — bail out and edit the file by hand if you trust the change.\n`);
56
+ process.exit(1);
57
+ }
58
+ if (!registry.plugins || typeof registry.plugins !== 'object') {
59
+ process.stderr.write(`installed_plugins.json missing 'plugins' object\n`);
60
+ process.exit(1);
61
+ }
62
+ const report = pruneRegistry(registry, dryRun);
63
+ emit(report, { json });
64
+ process.exit(0);
65
+ }
66
+ export function pruneRegistry(registry, dryRun) {
67
+ const pruned = [];
68
+ const kept = [];
69
+ for (const key of DESKWORK_KEYS) {
70
+ const entries = registry.plugins[key];
71
+ if (!Array.isArray(entries))
72
+ continue;
73
+ const live = [];
74
+ for (const entry of entries) {
75
+ if (entry.installPath && existsSync(entry.installPath)) {
76
+ live.push(entry);
77
+ kept.push({ key, entry });
78
+ }
79
+ else {
80
+ pruned.push({ key, entry });
81
+ }
82
+ }
83
+ if (live.length > 0) {
84
+ registry.plugins[key] = live;
85
+ }
86
+ else {
87
+ delete registry.plugins[key];
88
+ }
89
+ }
90
+ let registryWritten = false;
91
+ if (!dryRun && pruned.length > 0) {
92
+ writeFileSync(REGISTRY_PATH, `${JSON.stringify(registry, null, 2)}\n`, 'utf8');
93
+ registryWritten = true;
94
+ }
95
+ const missingAfterPrune = DESKWORK_PLUGINS.filter((p) => {
96
+ const liveEntries = registry.plugins[`${p}@deskwork`];
97
+ return !liveEntries || liveEntries.length === 0;
98
+ });
99
+ return {
100
+ registryPath: REGISTRY_PATH,
101
+ marketplaceClonePresent: existsSync(MARKETPLACE_CLONE),
102
+ pruned,
103
+ kept,
104
+ missingAfterPrune,
105
+ registryWritten,
106
+ };
107
+ }
108
+ function emit(report, opts) {
109
+ if (opts.json) {
110
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
111
+ return;
112
+ }
113
+ if (report.pruned.length === 0) {
114
+ process.stdout.write('Registry has no stale deskwork entries — install state looks consistent.\n');
115
+ if (report.missingAfterPrune.length > 0) {
116
+ process.stdout.write(`\nNote: no entries registered for: ${report.missingAfterPrune.join(', ')}.\n`);
117
+ process.stdout.write('If you need any of these, install via Claude Code:\n');
118
+ for (const name of report.missingAfterPrune) {
119
+ process.stdout.write(` /plugin install ${name}@deskwork\n`);
120
+ }
121
+ process.stdout.write(' /reload-plugins\n');
122
+ }
123
+ return;
124
+ }
125
+ const verb = report.registryWritten ? 'Pruned' : 'Would prune';
126
+ const count = report.pruned.length;
127
+ process.stdout.write(`${verb} ${count} stale entr${count === 1 ? 'y' : 'ies'} pointing at non-existent paths:\n`);
128
+ for (const { key, entry } of report.pruned) {
129
+ process.stdout.write(` ${key} scope=${entry.scope} version=${entry.version}\n`);
130
+ process.stdout.write(` ${entry.installPath}\n`);
131
+ }
132
+ if (report.kept.length > 0) {
133
+ process.stdout.write(`\nKept ${report.kept.length} live entr${report.kept.length === 1 ? 'y' : 'ies'}:\n`);
134
+ for (const { key, entry } of report.kept) {
135
+ process.stdout.write(` ${key} scope=${entry.scope} version=${entry.version}\n`);
136
+ }
137
+ }
138
+ if (report.registryWritten) {
139
+ process.stdout.write(`\nWrote cleaned registry to ${report.registryPath}\n`);
140
+ }
141
+ else {
142
+ process.stdout.write('\n(dry-run: registry not modified — re-run without --dry-run to apply.)\n');
143
+ }
144
+ if (report.missingAfterPrune.length > 0) {
145
+ process.stdout.write('\nNext steps to restore the bin(s) on PATH:\n');
146
+ process.stdout.write(' In Claude Code, run:\n');
147
+ for (const name of report.missingAfterPrune) {
148
+ process.stdout.write(` /plugin install ${name}@deskwork\n`);
149
+ }
150
+ process.stdout.write(' /reload-plugins\n');
151
+ process.stdout.write('\n Verify with:\n');
152
+ for (const name of report.missingAfterPrune) {
153
+ process.stdout.write(` command -v ${name}\n`);
154
+ }
155
+ }
156
+ if (!report.marketplaceClonePresent) {
157
+ process.stdout.write('\nWarning: marketplace clone at ');
158
+ process.stdout.write(MARKETPLACE_CLONE);
159
+ process.stdout.write(` is missing.\n`);
160
+ process.stdout.write('You may need to re-add the marketplace before /plugin install will work:\n');
161
+ process.stdout.write(' /plugin marketplace add audiocontrol-org/deskwork\n');
162
+ }
163
+ }
164
+ //# sourceMappingURL=repair-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-install.js","sourceRoot":"","sources":["../../src/commands/repair-install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deskwork/cli",
3
- "version": "0.9.7",
3
+ "version": "0.9.8",
4
4
  "type": "module",
5
5
  "description": "Editorial calendar + review CLI for the deskwork plugin",
6
6
  "homepage": "https://github.com/audiocontrol-org/deskwork#readme",
@@ -33,7 +33,7 @@
33
33
  "typecheck": "tsc --noEmit"
34
34
  },
35
35
  "dependencies": {
36
- "@deskwork/core": "0.9.7"
36
+ "@deskwork/core": "0.9.8"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",