@pugi/cli 0.1.0-beta.2 → 0.1.0-beta.20
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/THIRD_PARTY_NOTICES.md +40 -0
- package/assets/pugi-mascot.ansi +15 -40
- package/bin/run.js +33 -1
- package/dist/commands/jobs-watch.js +201 -0
- package/dist/commands/jobs.js +15 -0
- package/dist/core/agent-progress/cleanup.js +134 -0
- package/dist/core/agent-progress/schema.js +144 -0
- package/dist/core/agent-progress/writer.js +101 -0
- package/dist/core/compact/auto-trigger.js +96 -0
- package/dist/core/compact/buffer-rewriter.js +115 -0
- package/dist/core/compact/summarizer.js +196 -0
- package/dist/core/compact/token-counter.js +108 -0
- package/dist/core/consensus/diff-capture.js +73 -0
- package/dist/core/context/index.js +7 -0
- package/dist/core/context/markdown-traverse.js +255 -0
- package/dist/core/cost/rate-card.js +129 -0
- package/dist/core/cost/tracker.js +221 -0
- package/dist/core/denial-tracking/index.js +8 -0
- package/dist/core/denial-tracking/state.js +264 -0
- package/dist/core/diagnostics/probe-runner.js +93 -0
- package/dist/core/diagnostics/probes/api.js +46 -0
- package/dist/core/diagnostics/probes/auth.js +86 -0
- package/dist/core/diagnostics/probes/cli-version.js +127 -0
- package/dist/core/diagnostics/probes/config.js +72 -0
- package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
- package/dist/core/diagnostics/probes/disk.js +81 -0
- package/dist/core/diagnostics/probes/git.js +65 -0
- package/dist/core/diagnostics/probes/mcp.js +75 -0
- package/dist/core/diagnostics/probes/node.js +59 -0
- package/dist/core/diagnostics/probes/pnpm.js +36 -0
- package/dist/core/diagnostics/probes/session.js +74 -0
- package/dist/core/diagnostics/probes/status-snapshot.js +442 -0
- package/dist/core/diagnostics/probes/workspace.js +63 -0
- package/dist/core/diagnostics/types.js +70 -0
- package/dist/core/edits/dispatch.js +218 -2
- package/dist/core/edits/journal.js +199 -0
- package/dist/core/edits/layer-d-ast.js +557 -14
- package/dist/core/edits/verify-hook.js +273 -0
- package/dist/core/edits/worktree.js +111 -18
- package/dist/core/engine/anvil-client.js +115 -5
- package/dist/core/engine/budgets.js +89 -0
- package/dist/core/engine/context-prefix.js +155 -0
- package/dist/core/engine/intent.js +260 -0
- package/dist/core/engine/native-pugi.js +744 -210
- package/dist/core/engine/prompts.js +61 -6
- package/dist/core/engine/strip-internal-fields.js +124 -0
- package/dist/core/engine/tool-bridge.js +818 -31
- package/dist/core/file-cache.js +113 -1
- package/dist/core/init/scaffold.js +195 -0
- package/dist/core/lsp/client.js +174 -29
- package/dist/core/mcp/client.js +75 -6
- package/dist/core/mcp/http-server.js +553 -0
- package/dist/core/mcp/permission.js +190 -0
- package/dist/core/mcp/registry.js +24 -2
- package/dist/core/mcp/server-tools.js +219 -0
- package/dist/core/mcp/server.js +397 -0
- package/dist/core/permissions/gate.js +187 -0
- package/dist/core/permissions/index.js +18 -0
- package/dist/core/permissions/mode.js +102 -0
- package/dist/core/permissions/state.js +160 -0
- package/dist/core/permissions/tool-class.js +93 -0
- package/dist/core/repl/codebase-survey.js +308 -0
- package/dist/core/repl/history.js +11 -1
- package/dist/core/repl/init-interview.js +457 -0
- package/dist/core/repl/model-pricing.js +135 -0
- package/dist/core/repl/onboarding-state.js +297 -0
- package/dist/core/repl/session.js +719 -29
- package/dist/core/repl/slash-commands.js +133 -9
- package/dist/core/retry-budget/budget.js +284 -0
- package/dist/core/retry-budget/index.js +5 -0
- package/dist/core/settings.js +71 -0
- package/dist/core/skills/defaults.js +457 -0
- package/dist/core/subagents/dispatcher-real.js +600 -0
- package/dist/core/subagents/dispatcher.js +113 -24
- package/dist/core/subagents/index.js +18 -5
- package/dist/core/subagents/isolation-matrix.js +213 -0
- package/dist/core/subagents/spawn.js +19 -4
- package/dist/core/transport/version-interceptor.js +166 -0
- package/dist/index.js +28 -0
- package/dist/runtime/bootstrap.js +190 -0
- package/dist/runtime/cli.js +1588 -266
- package/dist/runtime/commands/compact.js +296 -0
- package/dist/runtime/commands/cost.js +199 -0
- package/dist/runtime/commands/delegate.js +289 -0
- package/dist/runtime/commands/doctor.js +369 -0
- package/dist/runtime/commands/lsp.js +187 -5
- package/dist/runtime/commands/mcp.js +824 -0
- package/dist/runtime/commands/patch.js +17 -0
- package/dist/runtime/commands/permissions.js +87 -0
- package/dist/runtime/commands/report.js +299 -0
- package/dist/runtime/commands/review-consensus.js +17 -2
- package/dist/runtime/commands/roster.js +117 -0
- package/dist/runtime/commands/status.js +178 -0
- package/dist/runtime/commands/worktree.js +50 -6
- package/dist/runtime/headless.js +543 -0
- package/dist/runtime/load-hooks-or-exit.js +71 -0
- package/dist/runtime/plan-decompose.js +531 -0
- package/dist/runtime/version.js +65 -0
- package/dist/tools/agent-tool.js +206 -0
- package/dist/tools/apply-patch.js +281 -39
- package/dist/tools/ask-user-question.js +213 -0
- package/dist/tools/ask-user.js +115 -0
- package/dist/tools/file-tools.js +85 -14
- package/dist/tools/mcp-tool.js +260 -0
- package/dist/tools/multi-edit.js +361 -0
- package/dist/tools/registry.js +22 -2
- package/dist/tools/skill-tool.js +96 -0
- package/dist/tools/tasks.js +208 -0
- package/dist/tools/web-fetch.js +147 -2
- package/dist/tools/web-search.js +458 -0
- package/dist/tui/agent-progress-card.js +111 -0
- package/dist/tui/agent-tree.js +10 -0
- package/dist/tui/ask-modal.js +2 -2
- package/dist/tui/ask-user-question-prompt.js +192 -0
- package/dist/tui/compact-banner.js +54 -0
- package/dist/tui/conversation-pane.js +69 -8
- package/dist/tui/cost-table.js +111 -0
- package/dist/tui/doctor-table.js +31 -0
- package/dist/tui/input-box.js +1 -1
- package/dist/tui/markdown-render.js +4 -4
- package/dist/tui/repl-render.js +276 -37
- package/dist/tui/repl-splash.js +2 -2
- package/dist/tui/repl.js +25 -6
- package/dist/tui/splash.js +1 -1
- package/dist/tui/status-bar.js +94 -16
- package/dist/tui/status-table.js +7 -0
- package/dist/tui/tool-stream-pane.js +7 -0
- package/dist/tui/update-banner.js +20 -2
- package/docs/examples/codegraph.mcp.json +10 -0
- package/package.json +9 -6
package/dist/tui/status-bar.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
+
import { formatCostUsd, formatTokens } from '../core/repl/model-pricing.js';
|
|
4
|
+
/**
|
|
5
|
+
* Window during which the per-turn delta flash stays visible on the
|
|
6
|
+
* cost-meter row. CEO spec: ~2 seconds after completion. Past that, the
|
|
7
|
+
* flash dimms out and the row shows session totals only.
|
|
8
|
+
*/
|
|
9
|
+
const TURN_DELTA_FLASH_MS = 2_000;
|
|
3
10
|
/**
|
|
4
11
|
* Cyan dot glyphs across the pulse cycle. Three steps keep the motion
|
|
5
12
|
* subtle - a true gradient would force an Ink rerender on every
|
|
@@ -17,8 +24,73 @@ export function StatusBar(props) {
|
|
|
17
24
|
// first. When the connection is healthy (`on_watch` / `connecting`),
|
|
18
25
|
// the FSM dispatch state takes over to show the dispatch lifecycle
|
|
19
26
|
// (`dispatching` / `tool: read` / `aborting` / etc.).
|
|
20
|
-
const status = composeStatusLabel(props.connection, props.dispatchState, props.dispatchToolLabel);
|
|
21
|
-
|
|
27
|
+
const status = composeStatusLabel(props.connection, props.dispatchState, props.dispatchToolLabel, props.lastCompletedOutcome);
|
|
28
|
+
// α7 cost-meter sprint — the cost row anchors above the legacy
|
|
29
|
+
// dispatch-state line so the operator's eye lands on the meter first
|
|
30
|
+
// (matches Claude Code TUI footer rhythm). The session-elapsed slot
|
|
31
|
+
// uses sessionStartedAtEpochMs (REPL boot), distinct from the
|
|
32
|
+
// per-brief `elapsedLabel` on the row below.
|
|
33
|
+
const costRow = renderCostMeterRow(props.sessionTokensIn ?? 0, props.sessionTokensOut ?? 0, props.sessionCostUsd ?? 0, props.sessionStartedAtEpochMs, now);
|
|
34
|
+
const deltaFlash = renderTurnDeltaFlash(props.lastTurnDelta, now);
|
|
35
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: `↑ ${costRow.tokensInLabel}` }), _jsx(Text, { dimColor: true, children: ' ' }), _jsx(Text, { color: "cyan", children: `↓ ${costRow.tokensOutLabel}` }), _jsx(Text, { dimColor: true, children: ` · ` }), _jsx(Text, { bold: true, children: costRow.costLabel }), _jsx(Text, { dimColor: true, children: ` · ${costRow.elapsedLabel}` }), deltaFlash ? (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: ' ' }), _jsx(Text, { color: "green", children: deltaFlash })] })) : null] }), _jsxs(Box, { children: [_jsx(Text, { color: status.color, children: `${glyph ?? '●'} ${status.label}` }), _jsx(Text, { dimColor: true, children: ` · ${props.activeAgentCount} agents · ` }), _jsx(Text, { children: `↓ ${tokenLabel} tokens` }), _jsx(Text, { dimColor: true, children: ` · ${elapsedLabel}` })] }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: `${formatCount(props.pugiMdCount)} PUGI.md · ${formatCount(props.mcpServerCount)} MCP · ${formatCount(props.skillCount)} skills · ${formatQuota(props.quotaPct)} quota` }) })] }));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* α7 cost-meter sprint — assemble the cost-meter row labels. Pure helper
|
|
39
|
+
* so the snapshot tests assert the formatted shape without standing up
|
|
40
|
+
* an Ink renderer.
|
|
41
|
+
*/
|
|
42
|
+
export function renderCostMeterRow(tokensIn, tokensOut, costUsd, sessionStartedAtEpochMs, nowEpochMs) {
|
|
43
|
+
const elapsedMs = typeof sessionStartedAtEpochMs === 'number'
|
|
44
|
+
? Math.max(0, nowEpochMs - sessionStartedAtEpochMs)
|
|
45
|
+
: 0;
|
|
46
|
+
return {
|
|
47
|
+
tokensInLabel: formatTokens(tokensIn),
|
|
48
|
+
tokensOutLabel: formatTokens(tokensOut),
|
|
49
|
+
costLabel: formatCostUsd(costUsd),
|
|
50
|
+
elapsedLabel: formatElapsedShort(elapsedMs),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* α7 cost-meter sprint — render the per-turn delta flash when the most
|
|
55
|
+
* recent turn completed within the flash window. Returns null when no
|
|
56
|
+
* turn has completed yet OR the flash has expired (the elapsed slot
|
|
57
|
+
* gets the slot back). The flash format mirrors the spec:
|
|
58
|
+
*
|
|
59
|
+
* `+200/+1.1k +$0.01`
|
|
60
|
+
*
|
|
61
|
+
* Exported for snapshot tests.
|
|
62
|
+
*/
|
|
63
|
+
export function renderTurnDeltaFlash(delta, nowEpochMs) {
|
|
64
|
+
if (!delta)
|
|
65
|
+
return null;
|
|
66
|
+
const elapsedSinceMs = nowEpochMs - delta.completedAtEpochMs;
|
|
67
|
+
if (elapsedSinceMs < 0 || elapsedSinceMs > TURN_DELTA_FLASH_MS)
|
|
68
|
+
return null;
|
|
69
|
+
const inLabel = formatTokens(delta.tokensIn);
|
|
70
|
+
const outLabel = formatTokens(delta.tokensOut);
|
|
71
|
+
const costLabel = delta.costUsd > 0 ? ` +${formatCostUsd(delta.costUsd)}` : '';
|
|
72
|
+
return `+${inLabel}/+${outLabel}${costLabel}`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* α7 cost-meter sprint — local copy of the session elapsed formatter.
|
|
76
|
+
* Mirrors the helper in `core/repl/session.ts` so the status bar stays
|
|
77
|
+
* a pure leaf component without a circular import on session.ts (the
|
|
78
|
+
* model-pricing module's `formatDuration` is similar but ships an
|
|
79
|
+
* `XhYm` ceiling that does not match the CEO spec's `2m44s` shape).
|
|
80
|
+
*/
|
|
81
|
+
function formatElapsedShort(elapsedMs) {
|
|
82
|
+
if (!Number.isFinite(elapsedMs) || elapsedMs <= 0)
|
|
83
|
+
return '0s';
|
|
84
|
+
const totalSec = Math.floor(elapsedMs / 1000);
|
|
85
|
+
if (totalSec < 60)
|
|
86
|
+
return `${totalSec}s`;
|
|
87
|
+
const min = Math.floor(totalSec / 60);
|
|
88
|
+
const sec = totalSec % 60;
|
|
89
|
+
if (min < 60)
|
|
90
|
+
return `${min}m${sec.toString().padStart(2, '0')}s`;
|
|
91
|
+
const hr = Math.floor(min / 60);
|
|
92
|
+
const restMin = min % 60;
|
|
93
|
+
return `${hr}h${restMin.toString().padStart(2, '0')}m`;
|
|
22
94
|
}
|
|
23
95
|
/**
|
|
24
96
|
* Render a count badge — number if defined, `—` placeholder otherwise.
|
|
@@ -75,7 +147,7 @@ export function connectionLabel(connection) {
|
|
|
75
147
|
* `tool: <kind>` upstream so we just concatenate; null falls through
|
|
76
148
|
* to the bare `tool` placeholder.
|
|
77
149
|
*/
|
|
78
|
-
function composeStatusLabel(connection, dispatchState, toolLabel) {
|
|
150
|
+
function composeStatusLabel(connection, dispatchState, toolLabel, lastCompletedOutcome) {
|
|
79
151
|
// Transport health wins.
|
|
80
152
|
if (connection === 'offline' || connection === 'reconnecting') {
|
|
81
153
|
return connectionLabel(connection);
|
|
@@ -93,6 +165,16 @@ function composeStatusLabel(connection, dispatchState, toolLabel) {
|
|
|
93
165
|
case 'awaiting_response':
|
|
94
166
|
return { label: 'dispatching', color: 'cyan' };
|
|
95
167
|
case 'completed':
|
|
168
|
+
// Branch on the work-done outcome so the bottom-bar tells the
|
|
169
|
+
// same truth as the agent-tree (2026-05-26 — memory
|
|
170
|
+
// feedback_no_fake_dispatch_promises). `'replied'` = text-only
|
|
171
|
+
// turn, render with the same neutral gray + arrow used in the
|
|
172
|
+
// agent-tree. `'shipped'` = real side-effect (or older server
|
|
173
|
+
// that omits the outcome field). Defaults to `'shipped'` so
|
|
174
|
+
// older callers without the prop wired stay back-compat.
|
|
175
|
+
if (lastCompletedOutcome === 'replied') {
|
|
176
|
+
return { label: 'replied', color: 'gray' };
|
|
177
|
+
}
|
|
96
178
|
return { label: 'shipped', color: 'green' };
|
|
97
179
|
case 'idle':
|
|
98
180
|
case undefined:
|
|
@@ -111,18 +193,14 @@ function formatElapsed(startedAt, now) {
|
|
|
111
193
|
const seconds = Math.floor((ms % 60_000) / 1000);
|
|
112
194
|
return `${minutes}m ${seconds.toString().padStart(2, '0')}s`;
|
|
113
195
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (total < 1_000_000)
|
|
123
|
-
return `${(total / 1_000).toFixed(1)}k`;
|
|
124
|
-
return `${(total / 1_000_000).toFixed(1)}m`;
|
|
125
|
-
}
|
|
196
|
+
// `formatTokens` for the downstream-throughput slot is imported from
|
|
197
|
+
// `core/repl/model-pricing.ts` — single source of truth for token
|
|
198
|
+
// formatting across the cost-meter row, `/cost` slash, and the legacy
|
|
199
|
+
// downstream-tokens slot. The shape is identical to the prior local
|
|
200
|
+
// helper (`<1000` raw, `<1m` one-decimal k, `≥1m` one-decimal m); the
|
|
201
|
+
// only semantic difference is non-finite / negative inputs render as
|
|
202
|
+
// `0` instead of throwing, matching the cost-meter row's defensive
|
|
203
|
+
// posture.
|
|
126
204
|
function clampPhase(phase) {
|
|
127
205
|
if (typeof phase !== 'number' || Number.isNaN(phase))
|
|
128
206
|
return 0;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function StatusTable({ snapshot }) {
|
|
4
|
+
const labelWidth = Math.max('Label'.length, ...snapshot.fields.map((f) => f.label.length));
|
|
5
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Pugi status" }) }), snapshot.fields.map((field) => (_jsxs(Box, { children: [_jsxs(Text, { children: [field.label.padEnd(labelWidth, ' '), " "] }), field.available ? (_jsx(Text, { children: field.value })) : (_jsx(Text, { dimColor: true, children: field.value }))] }, field.key))), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["CLI ", snapshot.meta.cliVersion, " Node ", snapshot.meta.nodeVersion, " cwd ", snapshot.meta.cwd] }) })] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=status-table.js.map
|
|
@@ -64,6 +64,13 @@ function toolDisplayName(tool) {
|
|
|
64
64
|
switch (tool) {
|
|
65
65
|
case 'read':
|
|
66
66
|
return 'Read';
|
|
67
|
+
case 'write':
|
|
68
|
+
// 2026-05-27 — Write is the most operator-visible tool for the
|
|
69
|
+
// codegen-dispatch surface (Hiroshi writing index.html / style.css
|
|
70
|
+
// / script.js for a tic-tac-toe brief). Add the display name so
|
|
71
|
+
// the tool stream pane renders ✓ Write(index.html) instead of an
|
|
72
|
+
// unlabeled placeholder. Mirrors the Claude Code Write rendering.
|
|
73
|
+
return 'Write';
|
|
67
74
|
case 'edit':
|
|
68
75
|
return 'Edit';
|
|
69
76
|
case 'bash':
|
|
@@ -1,8 +1,26 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
-
import { upgradeCommand } from '../runtime/update-check.js';
|
|
3
|
+
import { compareVersions, upgradeCommand, } from '../runtime/update-check.js';
|
|
4
|
+
import { getCachedServerRecommendation } from '../core/transport/version-interceptor.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the `latest` value the banner should show. Exported so the
|
|
7
|
+
* spec can lock the merge logic without rendering Ink.
|
|
8
|
+
*/
|
|
9
|
+
export function resolveDisplayedLatest(npmLatest, serverRecommended) {
|
|
10
|
+
if (!serverRecommended)
|
|
11
|
+
return npmLatest;
|
|
12
|
+
return compareVersions(serverRecommended, npmLatest) > 0
|
|
13
|
+
? serverRecommended
|
|
14
|
+
: npmLatest;
|
|
15
|
+
}
|
|
4
16
|
export function UpdateBanner({ result }) {
|
|
5
17
|
const command = upgradeCommand(result.method);
|
|
6
|
-
|
|
18
|
+
// Read the cache lazily inside the render so a server response that
|
|
19
|
+
// landed AFTER the banner was constructed still shows up on the next
|
|
20
|
+
// re-render. The cache lookup is a single map read — cheap enough to
|
|
21
|
+
// do per render.
|
|
22
|
+
const serverRecommended = getCachedServerRecommendation();
|
|
23
|
+
const displayedLatest = resolveDisplayedLatest(result.latest, serverRecommended);
|
|
24
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: '─ ' }), _jsx(Text, { bold: true, color: "#3da9fc", children: 'Pugi ' }), _jsx(Text, { children: result.installed }), _jsx(Text, { dimColor: true, children: ' (installed) → ' }), _jsx(Text, { bold: true, children: displayedLatest }), _jsx(Text, { dimColor: true, children: ' (latest)' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: ' Update: ' }), _jsx(Text, { color: "#3da9fc", children: command })] }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: ' Skip with PUGI_SKIP_UPDATE_BANNER=1' }) })] }));
|
|
7
25
|
}
|
|
8
26
|
//# sourceMappingURL=update-banner.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pugi/cli",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.20",
|
|
4
4
|
"description": "Pugi CLI - terminal-native software execution system",
|
|
5
5
|
"homepage": "https://pugi.io",
|
|
6
6
|
"repository": {
|
|
@@ -29,8 +29,10 @@
|
|
|
29
29
|
"bin/run.js",
|
|
30
30
|
"dist/**/*.js",
|
|
31
31
|
"assets/**/*.ansi",
|
|
32
|
+
"docs/examples/**/*.json",
|
|
32
33
|
"README.md",
|
|
33
|
-
"LICENSE"
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"THIRD_PARTY_NOTICES.md"
|
|
34
36
|
],
|
|
35
37
|
"engines": {
|
|
36
38
|
"node": ">=22.5.0"
|
|
@@ -46,13 +48,13 @@
|
|
|
46
48
|
"ink": "^5.0.1",
|
|
47
49
|
"linkedom": "^0.18.12",
|
|
48
50
|
"react": "^18.3.1",
|
|
49
|
-
"tar": "^
|
|
51
|
+
"tar": "^7.5.11",
|
|
50
52
|
"tinyglobby": "^0.2.16",
|
|
51
53
|
"turndown": "^7.2.4",
|
|
52
54
|
"undici": "^8.3.0",
|
|
53
55
|
"zod": "^3.23.0",
|
|
54
56
|
"@pugi/personas": "0.1.2",
|
|
55
|
-
"@pugi/sdk": "0.1.0-beta.
|
|
57
|
+
"@pugi/sdk": "0.1.0-beta.20"
|
|
56
58
|
},
|
|
57
59
|
"devDependencies": {
|
|
58
60
|
"@types/node": "^22.0.0",
|
|
@@ -67,9 +69,10 @@
|
|
|
67
69
|
"build": "pnpm --filter @pugi/personas --filter @pugi/sdk build && tsc -p tsconfig.json && node scripts/make-bin-executable.mjs",
|
|
68
70
|
"dev": "tsx src/index.ts",
|
|
69
71
|
"typecheck": "pnpm --filter @pugi/personas --filter @pugi/sdk build && tsc -p tsconfig.json --noEmit",
|
|
70
|
-
"test": "pnpm run build && node --test --import tsx 'test/**/*.spec.ts' 'test/**/*.spec.tsx'",
|
|
72
|
+
"test": "pnpm run check:version-lockstep && pnpm run build && node --test --import tsx 'test/**/*.spec.ts' 'test/**/*.spec.tsx'",
|
|
71
73
|
"version:cli": "tsx src/index.ts version",
|
|
72
74
|
"doctor": "tsx src/index.ts doctor --json",
|
|
73
|
-
"
|
|
75
|
+
"check:version-lockstep": "bash ../../scripts/check-version-lockstep.sh",
|
|
76
|
+
"pack:smoke": "pnpm run check:version-lockstep && node scripts/pack-smoke.mjs"
|
|
74
77
|
}
|
|
75
78
|
}
|