@productbrain/cli 0.1.0-beta.40 → 0.1.0-beta.42

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.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * pb admin — Builder operations surface (WP-312 S2, FEAT-969).
3
+ *
4
+ * Subcommand group exposing admin operations via /api/admin (STD-101).
5
+ * Separate from /api/mcp knowledge operations (BR-109).
6
+ *
7
+ * Categories:
8
+ * pb admin seed → seed operations (S3)
9
+ * pb admin inspect → inspect operations (S4)
10
+ *
11
+ * Shared flags: --dry-run, --json (inherited from global program)
12
+ * Environment sourced from active profile (same as all other pb commands).
13
+ */
14
+ import { Command } from 'commander';
15
+ /** Build the admin subcommand group for registration in index.ts. */
16
+ export declare function createAdminCommand(): Command;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,OAAO,CAgD5C"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * pb admin — Builder operations surface (WP-312 S2, FEAT-969).
3
+ *
4
+ * Subcommand group exposing admin operations via /api/admin (STD-101).
5
+ * Separate from /api/mcp knowledge operations (BR-109).
6
+ *
7
+ * Categories:
8
+ * pb admin seed → seed operations (S3)
9
+ * pb admin inspect → inspect operations (S4)
10
+ *
11
+ * Shared flags: --dry-run, --json (inherited from global program)
12
+ * Environment sourced from active profile (same as all other pb commands).
13
+ */
14
+ import { Command } from 'commander';
15
+ import { getConfig } from '../../lib/config.js';
16
+ import { adminBanner, bold, heading, hint } from '../../lib/style.js';
17
+ import { attachInspectCommands } from './inspect.js';
18
+ import { attachSeedCommands } from './seed.js';
19
+ import { SEED_COMMAND_ENTRIES } from './seed.js';
20
+ /** Build the admin subcommand group for registration in index.ts. */
21
+ export function createAdminCommand() {
22
+ const admin = new Command('admin')
23
+ .description('Builder operations: seed, inspect (WP-312)')
24
+ .action(() => {
25
+ let siteUrl = '';
26
+ try {
27
+ siteUrl = getConfig().siteUrl;
28
+ }
29
+ catch {
30
+ // Not configured — show banner without env
31
+ }
32
+ if (siteUrl) {
33
+ adminBanner(siteUrl);
34
+ }
35
+ else {
36
+ process.stdout.write(`\n${bold('⚡ pb admin')}\n\n`);
37
+ }
38
+ process.stdout.write(`${heading('Commands')}\n\n`);
39
+ process.stdout.write(` ${bold('seed')} Seed workspace data — ${SEED_COMMAND_ENTRIES.length} operations\n`);
40
+ process.stdout.write(` ${bold('inspect')} Inspect workspace state — health, collections, users, drafts\n`);
41
+ process.stdout.write('\n');
42
+ process.stdout.write(`${heading('Quick start')}\n\n`);
43
+ hint('pb admin seed list List all seed operations');
44
+ hint('pb admin seed run <name> Run one seed operation');
45
+ hint('pb admin inspect health Combined workspace health dashboard');
46
+ hint('pb admin inspect collections Collection counts + completeness');
47
+ process.stdout.write('\n');
48
+ hint('pb admin seed --help');
49
+ hint('pb admin inspect --help');
50
+ process.stdout.write('\n');
51
+ });
52
+ const seed = new Command('seed')
53
+ .description('Seed workspace data — system collections, glossary entries, etc.');
54
+ attachSeedCommands(seed);
55
+ const inspect = new Command('inspect')
56
+ .description('Inspect workspace state — entries, collections, relation integrity, etc.');
57
+ attachInspectCommands(inspect);
58
+ admin.addCommand(seed);
59
+ admin.addCommand(inspect);
60
+ return admin;
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAO,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,qEAAqE;AACrE,MAAM,UAAU,kBAAkB;IAChC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;SAC/B,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,OAAO,GAAG,SAAS,EAAE,CAAC,OAAO,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,iCAAiC,oBAAoB,CAAC,MAAM,eAAe,CAAC,CAAC;QACnH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,qEAAqE,CAAC,CAAC;QAChH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,8DAA8D,CAAC,CAAC;QACrE,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACnE,IAAI,CAAC,yEAAyE,CAAC,CAAC;QAChF,IAAI,CAAC,sEAAsE,CAAC,CAAC;QAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7B,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC7B,WAAW,CAAC,kEAAkE,CAAC,CAAC;IAEnF,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;SACnC,WAAW,CAAC,0EAA0E,CAAC,CAAC;IAE3F,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE1B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * pb admin inspect — read-only workspace and platform inspection (WP-312 S4, FEAT-971).
3
+ *
4
+ * Command names mirror `convex/admin/commandManifest.ts` — behavior is server-side (STD-101).
5
+ */
6
+ import { Command } from 'commander';
7
+ /** Session or explicit `--workspace-id`. */
8
+ export declare function resolveWorkspaceArg(explicit?: string): string | undefined;
9
+ export declare function requireWorkspaceArg(explicit?: string): string;
10
+ /** Attach inspect subcommands to the `inspect` Commander node. */
11
+ export declare function attachInspectCommands(inspect: Command): void;
12
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/commands/admin/inspect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,4CAA4C;AAC5C,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAS7D;AAuXD,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgL5D"}
@@ -0,0 +1,415 @@
1
+ /**
2
+ * pb admin inspect — read-only workspace and platform inspection (WP-312 S4, FEAT-971).
3
+ *
4
+ * Command names mirror `convex/admin/commandManifest.ts` — behavior is server-side (STD-101).
5
+ */
6
+ import { adminCall } from '../../lib/client.js';
7
+ import { getConfig } from '../../lib/config.js';
8
+ import { CLIError, ErrorCode } from '../../lib/errors.js';
9
+ import { readSession } from '../../lib/session.js';
10
+ import { isJsonMode } from '../../lib/runner.js';
11
+ import { withSpinner } from '../../lib/spinner.js';
12
+ import { adminBanner, bold, cyan, dim, formatCheck, green, heading, hint, icons, red, yellow, } from '../../lib/style.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Workspace arg helpers (same contract as seed S3)
15
+ // ---------------------------------------------------------------------------
16
+ /** Session or explicit `--workspace-id`. */
17
+ export function resolveWorkspaceArg(explicit) {
18
+ if (explicit)
19
+ return explicit;
20
+ return readSession()?.workspaceId;
21
+ }
22
+ export function requireWorkspaceArg(explicit) {
23
+ const id = resolveWorkspaceArg(explicit);
24
+ if (!id) {
25
+ throw new CLIError('Workspace id required — pass --workspace-id or run `pb session start` in this project.', { code: ErrorCode.VALIDATION_FAILED, category: 'validation' });
26
+ }
27
+ return id;
28
+ }
29
+ function renderReadinessSummary(r) {
30
+ if (!r)
31
+ return dim('—');
32
+ const total = r.total ?? 0;
33
+ const pending = r.toMigrate ?? 0;
34
+ if (pending === 0)
35
+ return `${green(icons.pass)} ${total} collections — config current`;
36
+ return `${yellow(icons.warn)} ${total} collections — ${yellow(String(pending))} pending migration`;
37
+ }
38
+ function renderConsistencySummary(c) {
39
+ if (!c || c.error)
40
+ return dim(c?.error ?? '—');
41
+ const checked = c.totalChecked ?? 0;
42
+ const invalid = c.invalidCount ?? 0;
43
+ const unvalidated = (c.unvalidated ?? []).reduce((a, u) => a + u.entryCount, 0);
44
+ const gaps = (c.purposeGaps ?? []).length;
45
+ const main = invalid === 0
46
+ ? `${green(icons.pass)} ${checked} checked — ${green('clean')}`
47
+ : `${red(icons.fail)} ${checked} checked — ${red(`${invalid} invalid`)}`;
48
+ const extras = [];
49
+ if (unvalidated > 0)
50
+ extras.push(`${unvalidated} unvalidated`);
51
+ if (gaps > 0)
52
+ extras.push(`${gaps} purpose gaps`);
53
+ return extras.length > 0 ? `${main} ${dim(extras.join(', '))}` : main;
54
+ }
55
+ function renderDraftsSummary(d) {
56
+ if (!d || d.error)
57
+ return dim(d?.error ?? '—');
58
+ const count = d.totalDraftCount ?? 0;
59
+ if (count === 0)
60
+ return `${green(icons.pass)} No uncommitted drafts`;
61
+ const oldest = d.oldestDraftAgeDays != null ? ` ${dim(`oldest: ${d.oldestDraftAgeDays}d`)}` : '';
62
+ return `${yellow(icons.warn)} ${bold(String(count))} drafts${oldest}`;
63
+ }
64
+ function filterCompletenessForWorkspace(completeness, workspaceId) {
65
+ if (!completeness || typeof completeness !== 'object') {
66
+ return { global: completeness, workspaceFindings: [] };
67
+ }
68
+ const c = completeness;
69
+ const findings = Array.isArray(c.findings) ? c.findings : [];
70
+ const workspaceFindings = findings.filter((f) => f.workspaceId === workspaceId);
71
+ return { global: completeness, workspaceFindings };
72
+ }
73
+ function printHealthDashboard(data) {
74
+ adminBanner(getConfig().siteUrl);
75
+ process.stdout.write(`${bold('Health dashboard')}\n\n`);
76
+ const r = data.readiness;
77
+ process.stdout.write(`${heading('Readiness config')}\n`);
78
+ process.stdout.write(` ${renderReadinessSummary(r)}\n`);
79
+ if (r?.toMigrate && r.toMigrate > 0) {
80
+ hint('pb admin seed run readiness-config Apply pending migration');
81
+ }
82
+ process.stdout.write('\n');
83
+ if (!data.workspaceId) {
84
+ process.stdout.write(dim(' Workspace panels require --workspace-id (or an active session).\n\n'));
85
+ hint('pb session start Start session with workspace context');
86
+ process.stdout.write('\n');
87
+ return;
88
+ }
89
+ // Collections
90
+ process.stdout.write(`${heading('Collections')}\n`);
91
+ const cols = data.collections;
92
+ if (cols?.workspace) {
93
+ process.stdout.write(` ${bold(cols.workspace.name)} ${dim(`(${cols.workspace.slug})`)} ${dim(`${cols.totalCollections ?? 0} collections, ${(cols.totalEntries ?? 0).toLocaleString()} entries`)}\n`);
94
+ // Show completeness overview if available
95
+ const { workspaceFindings } = filterCompletenessForWorkspace(data.collections, data.workspaceId);
96
+ const withGaps = workspaceFindings.filter((f) => f.missing.length > 0);
97
+ if (withGaps.length > 0) {
98
+ process.stdout.write(` ${yellow(icons.warn)} ${withGaps.length} collections with completeness gaps\n`);
99
+ }
100
+ else {
101
+ process.stdout.write(` ${green(icons.pass)} All collections complete\n`);
102
+ }
103
+ }
104
+ else {
105
+ process.stdout.write(` ${dim('—')}\n`);
106
+ }
107
+ process.stdout.write('\n');
108
+ // Data consistency
109
+ process.stdout.write(`${heading('Data consistency')}\n`);
110
+ process.stdout.write(` ${renderConsistencySummary(data.consistency)}\n\n`);
111
+ // Drafts
112
+ process.stdout.write(`${heading('Draft debt')}\n`);
113
+ process.stdout.write(` ${renderDraftsSummary(data.drafts)}\n\n`);
114
+ hint('pb admin inspect collections --workspace-id <id> Collection detail + gaps');
115
+ hint('pb admin inspect drafts --workspace-id <id> Draft breakdown');
116
+ hint('pb admin inspect data-consistency --workspace-id <id>');
117
+ process.stdout.write('\n');
118
+ }
119
+ function printCollectionsMerged(workspaceId, collection, completeness, workspaceFindings) {
120
+ adminBanner(getConfig().siteUrl);
121
+ process.stdout.write(`${bold('Collections + completeness')}\n`);
122
+ process.stdout.write(dim(`workspaceId: ${workspaceId}`) + '\n\n');
123
+ if (collection && typeof collection === 'object' && 'collections' in collection) {
124
+ const c = collection;
125
+ const ws = c.workspace;
126
+ process.stdout.write(`${bold(ws.name)} ${dim(`(${ws.slug})`)} ${dim(`${c.totalCollections} collections, ${(c.totalEntries ?? 0).toLocaleString()} entries`)}\n\n`);
127
+ const missingBySlug = new Map();
128
+ for (const f of workspaceFindings) {
129
+ missingBySlug.set(f.slug, f.missing);
130
+ }
131
+ const wSlug = 24;
132
+ const wCount = 8;
133
+ process.stdout.write(`${bold('Slug'.padEnd(wSlug))} ${bold('Entries'.padStart(wCount))} ${bold('Completeness')}\n`);
134
+ process.stdout.write(dim('─'.repeat(wSlug + wCount + 20)) + '\n');
135
+ for (const row of c.collections) {
136
+ const gaps = missingBySlug.get(row.slug);
137
+ const gapStr = gaps && gaps.length > 0 ? red(gaps.join(', ')) : green(icons.pass + ' ok');
138
+ process.stdout.write(`${cyan(row.slug.padEnd(wSlug))} ${String(row.entryCount).padStart(wCount)} ${gapStr}\n`);
139
+ }
140
+ process.stdout.write('\n');
141
+ }
142
+ else {
143
+ process.stdout.write(dim(JSON.stringify(collection, null, 2)) + '\n');
144
+ }
145
+ if (workspaceFindings.length > 0) {
146
+ const withGaps = workspaceFindings.filter((f) => f.missing.length > 0);
147
+ process.stdout.write(`${heading('Completeness gaps for this workspace')} ${dim(`(${withGaps.length} collections)`)}\n`);
148
+ for (const f of withGaps.slice(0, 10)) {
149
+ process.stdout.write(` ${red(icons.fail)} ${f.slug.padEnd(24)} ${dim(f.missing.join(', '))}\n`);
150
+ }
151
+ if (withGaps.length > 10) {
152
+ process.stdout.write(` ${dim(`... ${withGaps.length - 10} more`)}\n`);
153
+ }
154
+ process.stdout.write('\n');
155
+ }
156
+ hint('inspect:collection-completeness is platform-wide; results above are filtered to this workspace.');
157
+ }
158
+ function printPeopleDuplicates(workspaceId, duplicates) {
159
+ adminBanner(getConfig().siteUrl);
160
+ if (!Array.isArray(duplicates)) {
161
+ process.stdout.write(dim(JSON.stringify(duplicates, null, 2)) + '\n');
162
+ return;
163
+ }
164
+ const forWs = duplicates.filter((d) => String(d.workspaceId) === String(workspaceId));
165
+ process.stdout.write(`${bold('People duplicates')} ${dim(`— workspaceId: ${workspaceId}`)}\n\n`);
166
+ if (forWs.length === 0) {
167
+ process.stdout.write(` ${formatCheck('pass', 'Duplicates', 'None found for this workspace.')}\n`);
168
+ return;
169
+ }
170
+ process.stdout.write(` ${red(icons.fail)} ${forWs.length} duplicate group(s):\n\n`);
171
+ for (const d of forWs) {
172
+ process.stdout.write(dim(JSON.stringify(d, null, 2)) + '\n\n');
173
+ }
174
+ }
175
+ function printWorkspaceDiagnostic(data) {
176
+ adminBanner(getConfig().siteUrl);
177
+ if (!data || typeof data !== 'object' || 'error' in data) {
178
+ const msg = data?.error ?? 'Unknown error';
179
+ process.stdout.write(`${red(icons.fail)} ${msg}\n`);
180
+ return;
181
+ }
182
+ const d = data;
183
+ process.stdout.write(`${bold('Workspace')} ${dim('—')} ${bold(d.workspace.name)} ${dim(`(${d.workspace.slug})`)}\n\n`);
184
+ for (const [slug, info] of Object.entries(d.targetCollections)) {
185
+ const status = info.exists ? 'pass' : 'fail';
186
+ const detail = info.exists ? `${info.entryCount} entries` : 'missing';
187
+ process.stdout.write(` ${formatCheck(status, slug, detail)}\n`);
188
+ }
189
+ process.stdout.write('\n');
190
+ process.stdout.write(` ${d.totalCollections} total collections\n`);
191
+ const slugList = d.allCollectionSlugs.join(', ');
192
+ const truncated = slugList.length > 100 ? slugList.slice(0, 100) + '...' : slugList;
193
+ process.stdout.write(` ${dim(truncated)}\n`);
194
+ }
195
+ function printDataConsistency(data) {
196
+ adminBanner(getConfig().siteUrl);
197
+ if (!data || typeof data !== 'object' || 'error' in data) {
198
+ const msg = data?.error ?? 'Unknown error';
199
+ process.stdout.write(`${red(icons.fail)} ${msg}\n`);
200
+ return;
201
+ }
202
+ const d = data;
203
+ process.stdout.write(`${bold('Data consistency')} ${dim(`— ${d.workspace.name} (${d.workspace.slug})`)}\n\n`);
204
+ const checked = d.totalChecked ?? 0;
205
+ const invalid = d.invalidCount ?? 0;
206
+ const unvalidatedEntries = (d.unvalidated ?? []).reduce((a, u) => a + u.entryCount, 0);
207
+ const purposeGapCount = (d.purposeGaps ?? []).length;
208
+ process.stdout.write(` ${formatCheck(invalid === 0 ? 'pass' : 'fail', `${checked} checked`, invalid === 0 ? 'clean' : `${invalid} invalid`)}\n`);
209
+ if (unvalidatedEntries > 0) {
210
+ process.stdout.write(` ${formatCheck('warn', `${unvalidatedEntries} unvalidated`, `(${(d.unvalidated ?? []).length} schemaless collections)`)}\n`);
211
+ }
212
+ if (purposeGapCount > 0) {
213
+ process.stdout.write(` ${formatCheck('warn', `${purposeGapCount} purpose gaps`, '(collection purpose < 20 chars)')}\n`);
214
+ }
215
+ if (d.invalid && d.invalid.length > 0) {
216
+ process.stdout.write(`\n${heading('Invalid entries')}\n`);
217
+ for (const e of d.invalid.slice(0, 10)) {
218
+ process.stdout.write(` ${red(icons.fail)} ${e.entryId.padEnd(12)} ${dim(e.collectionSlug.padEnd(20))} ${dim(e.errors[0] ?? '')}\n`);
219
+ }
220
+ if (d.invalid.length > 10) {
221
+ process.stdout.write(` ${dim(`... ${d.invalid.length - 10} more`)}\n`);
222
+ }
223
+ }
224
+ if ((d.unvalidated ?? []).length > 0) {
225
+ process.stdout.write(`\n${heading('Schemaless collections')}\n`);
226
+ for (const u of d.unvalidated ?? []) {
227
+ process.stdout.write(` ${cyan(u.collectionSlug.padEnd(26))} ${dim(String(u.entryCount))} entries\n`);
228
+ }
229
+ }
230
+ if (purposeGapCount > 0) {
231
+ process.stdout.write(`\n${heading('Purpose gaps')}\n`);
232
+ for (const g of d.purposeGaps ?? []) {
233
+ process.stdout.write(` ${cyan(g.collectionSlug.padEnd(26))} ${dim(`${g.purposeLength} chars`)}\n`);
234
+ }
235
+ }
236
+ process.stdout.write('\n');
237
+ }
238
+ function printDraftDebt(data) {
239
+ adminBanner(getConfig().siteUrl);
240
+ if (!data || typeof data !== 'object' || 'error' in data) {
241
+ const msg = data?.error ?? 'Unknown error';
242
+ process.stdout.write(`${red(icons.fail)} ${msg}\n`);
243
+ return;
244
+ }
245
+ const d = data;
246
+ process.stdout.write(`${bold('Draft debt')} ${dim(`— ${d.workspace.name} (${d.workspace.slug})`)}\n\n`);
247
+ const total = d.totalDraftCount ?? 0;
248
+ if (total === 0) {
249
+ process.stdout.write(` ${formatCheck('pass', 'Drafts', 'None — all entries committed.')}\n`);
250
+ return;
251
+ }
252
+ const oldestStr = d.oldestDraftAgeDays != null ? ` ${dim(`oldest: ${d.oldestDraftAgeDays}d`)}` : '';
253
+ process.stdout.write(` ${yellow(icons.warn)} ${bold(String(total))} uncommitted drafts${oldestStr}\n\n`);
254
+ const byCol = d.byCollection ?? {};
255
+ const sorted = Object.entries(byCol).sort(([, a], [, b]) => b.count - a.count);
256
+ const wSlug = Math.max(12, ...sorted.map(([s]) => s.length));
257
+ process.stdout.write(`${bold('Collection'.padEnd(wSlug))} ${bold('Count')} ${bold('Oldest')}\n`);
258
+ process.stdout.write(dim('─'.repeat(wSlug + 20)) + '\n');
259
+ for (const [slug, bucket] of sorted) {
260
+ const oldest = bucket.entries[0]?.ageDays;
261
+ const oldestLabel = oldest != null ? `${oldest}d` : '—';
262
+ process.stdout.write(`${cyan(slug.padEnd(wSlug))} ${String(bucket.count).padStart(5)} ${dim(oldestLabel)}\n`);
263
+ }
264
+ process.stdout.write('\n');
265
+ hint('pb capture "..." Commit or kill drafts to clear debt');
266
+ }
267
+ // ---------------------------------------------------------------------------
268
+ // Attach inspect subcommands
269
+ // ---------------------------------------------------------------------------
270
+ /** Attach inspect subcommands to the `inspect` Commander node. */
271
+ export function attachInspectCommands(inspect) {
272
+ // Default action when `pb admin inspect` is invoked with no subcommand.
273
+ inspect.action(() => {
274
+ let siteUrl = '';
275
+ try {
276
+ siteUrl = getConfig().siteUrl;
277
+ }
278
+ catch { /* not configured */ }
279
+ if (siteUrl)
280
+ adminBanner(siteUrl);
281
+ process.stdout.write(`${heading('Inspect commands')}\n\n`);
282
+ const cmds = [
283
+ { name: 'health', desc: 'Combined dashboard — readiness + collections + consistency + drafts' },
284
+ { name: 'workspace', desc: 'Target collection health (roles, teams, principles, ...)' },
285
+ { name: 'collections', desc: 'Entry counts + completeness signals per collection' },
286
+ { name: 'users', desc: 'Duplicate (workspaceId, clerkUserId) people entries' },
287
+ { name: 'data-consistency', desc: 'Schema validation — invalid and unvalidated entries' },
288
+ { name: 'drafts', desc: 'Uncommitted draft debt — counts and age' },
289
+ ];
290
+ const wName = Math.max(...cmds.map((c) => c.name.length));
291
+ for (const cmd of cmds) {
292
+ process.stdout.write(` ${cyan(cmd.name.padEnd(wName))} ${dim(cmd.desc)}\n`);
293
+ }
294
+ process.stdout.write('\n');
295
+ process.stdout.write(` ${dim('All inspect commands are read-only — no confirmation required.')}\n\n`);
296
+ hint('pb admin inspect health --workspace-id <id>');
297
+ hint('pb admin inspect collections --workspace-id <id>');
298
+ process.stdout.write('\n');
299
+ });
300
+ inspect
301
+ .command('health')
302
+ .description('Combined dashboard: readiness + collection counts + consistency + draft debt')
303
+ .option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
304
+ .action(async (options) => {
305
+ const ws = resolveWorkspaceArg(options.workspaceId);
306
+ const payload = await withSpinner('Loading health dashboard', async () => {
307
+ if (!ws) {
308
+ const readiness = await adminCall('inspect:readiness-config', {});
309
+ return {
310
+ readiness,
311
+ collections: null,
312
+ consistency: null,
313
+ drafts: null,
314
+ workspaceId: null,
315
+ };
316
+ }
317
+ const [readiness, collections, consistency, drafts] = await Promise.all([
318
+ adminCall('inspect:readiness-config', {}),
319
+ adminCall('inspect:collection', { workspaceId: ws }),
320
+ adminCall('diagnose:data-consistency', { workspaceId: ws }),
321
+ adminCall('diagnose:draft-debt', { workspaceId: ws }),
322
+ ]);
323
+ return { readiness, collections, consistency, drafts, workspaceId: ws };
324
+ });
325
+ if (isJsonMode()) {
326
+ process.stdout.write(JSON.stringify({
327
+ readiness: payload.readiness,
328
+ collections: payload.collections,
329
+ consistency: payload.consistency,
330
+ drafts: payload.drafts,
331
+ }, null, 2) + '\n');
332
+ return;
333
+ }
334
+ printHealthDashboard({
335
+ readiness: payload.readiness,
336
+ collections: payload.collections,
337
+ consistency: payload.consistency,
338
+ drafts: payload.drafts,
339
+ workspaceId: payload.workspaceId ?? null,
340
+ });
341
+ });
342
+ inspect
343
+ .command('workspace')
344
+ .description('Target collection health — roles, teams, principles, policies, business-rules, glossary')
345
+ .option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
346
+ .action(async (options) => {
347
+ const ws = requireWorkspaceArg(options.workspaceId);
348
+ const data = await withSpinner('Diagnosing workspace', () => adminCall('diagnose:workspace', { workspaceId: ws }));
349
+ if (isJsonMode()) {
350
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
351
+ return;
352
+ }
353
+ printWorkspaceDiagnostic(data);
354
+ });
355
+ inspect
356
+ .command('collections')
357
+ .description('Collection entry counts + completeness signals')
358
+ .option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
359
+ .action(async (options) => {
360
+ const ws = requireWorkspaceArg(options.workspaceId);
361
+ const [collection, completeness] = await withSpinner('Inspecting collections', () => Promise.all([
362
+ adminCall('inspect:collection', { workspaceId: ws }),
363
+ adminCall('inspect:collection-completeness', { limit: 500 }),
364
+ ]));
365
+ const { workspaceFindings } = filterCompletenessForWorkspace(completeness, ws);
366
+ if (isJsonMode()) {
367
+ process.stdout.write(JSON.stringify({ collection, completeness, workspaceCompletenessFindings: workspaceFindings }, null, 2) + '\n');
368
+ return;
369
+ }
370
+ printCollectionsMerged(ws, collection, completeness, workspaceFindings);
371
+ });
372
+ inspect
373
+ .command('users')
374
+ .description('Duplicate people entries (workspaceId + clerkUserId pairs)')
375
+ .option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
376
+ .action(async (options) => {
377
+ const ws = requireWorkspaceArg(options.workspaceId);
378
+ const duplicates = await withSpinner('Checking people duplicates', () => adminCall('inspect:people-duplicates', {}));
379
+ if (isJsonMode()) {
380
+ const list = Array.isArray(duplicates)
381
+ ? duplicates.filter((d) => String(d.workspaceId) === String(ws))
382
+ : duplicates;
383
+ process.stdout.write(JSON.stringify({ workspaceId: ws, duplicates: list }, null, 2) + '\n');
384
+ return;
385
+ }
386
+ printPeopleDuplicates(ws, duplicates);
387
+ });
388
+ inspect
389
+ .command('data-consistency')
390
+ .description('Schema validation — invalid entries, unvalidated collections, purpose gaps')
391
+ .option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
392
+ .action(async (options) => {
393
+ const ws = requireWorkspaceArg(options.workspaceId);
394
+ const data = await withSpinner('Running data consistency check', () => adminCall('diagnose:data-consistency', { workspaceId: ws }));
395
+ if (isJsonMode()) {
396
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
397
+ return;
398
+ }
399
+ printDataConsistency(data);
400
+ });
401
+ inspect
402
+ .command('drafts')
403
+ .description('Uncommitted draft debt — total, breakdown by collection, oldest age')
404
+ .option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
405
+ .action(async (options) => {
406
+ const ws = requireWorkspaceArg(options.workspaceId);
407
+ const data = await withSpinner('Checking draft debt', () => adminCall('diagnose:draft-debt', { workspaceId: ws }));
408
+ if (isJsonMode()) {
409
+ process.stdout.write(JSON.stringify(data, null, 2) + '\n');
410
+ return;
411
+ }
412
+ printDraftDebt(data);
413
+ });
414
+ }
415
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/commands/admin/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for pb admin inspect helpers — resolveWorkspaceArg / requireWorkspaceArg (WP-312 S4, FEAT-971).
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=inspect.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.test.d.ts","sourceRoot":"","sources":["../../../src/commands/admin/inspect.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Tests for pb admin inspect helpers — resolveWorkspaceArg / requireWorkspaceArg (WP-312 S4, FEAT-971).
3
+ */
4
+ import { describe, it, expect, vi } from 'vitest';
5
+ import { readSession } from '../../lib/session.js';
6
+ import { resolveWorkspaceArg, requireWorkspaceArg } from './inspect.js';
7
+ vi.mock('../../lib/session.js', () => ({
8
+ readSession: vi.fn(() => null),
9
+ }));
10
+ describe('resolveWorkspaceArg', () => {
11
+ it('returns explicit id when provided', () => {
12
+ expect(resolveWorkspaceArg('ws-explicit')).toBe('ws-explicit');
13
+ });
14
+ it('returns undefined when no explicit id and session mocked null', () => {
15
+ expect(resolveWorkspaceArg()).toBeUndefined();
16
+ expect(resolveWorkspaceArg(undefined)).toBeUndefined();
17
+ });
18
+ });
19
+ describe('requireWorkspaceArg', () => {
20
+ it('returns explicit id when provided', () => {
21
+ expect(requireWorkspaceArg('ws-123')).toBe('ws-123');
22
+ });
23
+ it('throws when missing and no session', () => {
24
+ expect(() => requireWorkspaceArg()).toThrow(/Workspace id required/);
25
+ expect(() => requireWorkspaceArg(undefined)).toThrow(/Workspace id required/);
26
+ });
27
+ });
28
+ describe('resolveWorkspaceArg with session', () => {
29
+ it('falls back to session workspaceId', () => {
30
+ vi.mocked(readSession).mockReturnValueOnce({
31
+ sessionId: 's1',
32
+ workspaceId: 'ws-from-session',
33
+ workspaceName: 'Test',
34
+ startedAt: '',
35
+ entriesCaptured: [],
36
+ });
37
+ expect(resolveWorkspaceArg()).toBe('ws-from-session');
38
+ });
39
+ });
40
+ //# sourceMappingURL=inspect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.test.js","sourceRoot":"","sources":["../../../src/commands/admin/inspect.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExE,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;CAC/B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QAC9C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC;YACzC,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,iBAAiB;YAC9B,aAAa,EAAE,MAAM;YACrB,SAAS,EAAE,EAAE;YACb,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}