praxis-agent 0.12.0 → 0.14.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/README.md CHANGED
@@ -15,6 +15,11 @@ Anthropic/OpenAI-compatible model access. Praxis deliberately excludes
15
15
  accounts, organizations, billing, managed enterprise policy, remote control,
16
16
  IDE surfaces, and telemetry control planes.
17
17
 
18
+ Claude Code 2.1.208 is the compatibility, architecture, and design baseline.
19
+ Every single-user CLI capability remains required unless it falls inside an
20
+ explicit exclusion above. A similar Praxis surface is not a substitute for the
21
+ corresponding Claude command or runtime contract.
22
+
18
23
  ## Requirements
19
24
 
20
25
  - macOS or Linux
@@ -87,8 +92,11 @@ troubleshooting. Run `praxis --help` for the authoritative command surface.
87
92
  `/rewind`, runtime `/cd`, transcript-free
88
93
  `/btw` side questions with background-Agent handoff, interactive
89
94
  `/background` terminal handoff, unified `/status`/`/config`/`/usage` settings
90
- tabs, `/sandbox` mode/dependency/override/config controls, `/mcp`, `/memory` shared
91
- instruction and auto-memory access, and live extension-reload controls,
95
+ tabs, `/sandbox` mode/dependency/override/config controls, local cached
96
+ `/release-notes`, Claude-compatible `/statusline` command execution and setup
97
+ agent, source-aligned `/init` project-instruction onboarding with its enhanced
98
+ skills/hooks flow, `/mcp`, `/memory` shared instruction and auto-memory
99
+ access, and live extension-reload controls,
92
100
  cursor/history composer, per-session model/effort/permission controls,
93
101
  context/status/skill/task dashboards, prompt stash and continuation shortcuts,
94
102
  filterable `@` file and agent references, composer undo, `Ctrl+G` external
@@ -177,8 +185,9 @@ for exact shared data, version boundaries, exclusions, and verification gates.
177
185
 
178
186
  Praxis targets one local OS user working across multiple repositories and
179
187
  sessions. It is CLI-only and provider-capability-aware. Organization, tenant,
180
- RBAC, billing, enterprise gateway, IDE, Chrome, Remote Control, Claude Desktop
181
- import, and hosted review-product surfaces are permanent non-goals.
188
+ RBAC, subscription authentication and billing, enterprise gateway,
189
+ IDE/Desktop/mobile clients, Remote Control, Claude Desktop import, and hosted
190
+ review-product surfaces are permanent non-goals.
182
191
 
183
192
  ## Security and support
184
193
 
@@ -1,7 +1,7 @@
1
1
  import { type ClaudeSidechainPermissionMode } from '../compatibility/claude/sidechain.js';
2
2
  import { type ContextAssembler } from '../core/context.js';
3
3
  import { type ModelProvider, type ModelToolCall, type ModelToolDefinition, type ModelUsage, type PermissionResolver, type PermissionApproval, type PermissionDecision, type PermissionUpdate, type RuntimeEventSink, type ToolExecutionContext, type ToolExecutionResult, type ToolRegistry } from '../core/runtime.js';
4
- import type { ClaudeExtensionCatalog } from '../extensions/claude-extensions.js';
4
+ import { type ClaudeExtensionCatalog } from '../extensions/claude-extensions.js';
5
5
  import type { ClaudeHookRunner } from '../hooks/claude-hooks.js';
6
6
  import { type BackgroundAgentSnapshot } from './background-agent-manager.js';
7
7
  export interface WorkflowAgentRunOptions {
@@ -11,6 +11,7 @@ import { createClaudeHookAttachmentEntries, translateProviderEvents, } from '../
11
11
  import { injectFirstUserMessageContext, } from '../core/context.js';
12
12
  import { ContextBudget } from '../core/context-budget.js';
13
13
  import { AgentRuntime, } from '../core/runtime.js';
14
+ import { BUILTIN_STATUSLINE_AGENT_PATH, } from '../extensions/claude-extensions.js';
14
15
  import { ClaudeHookToolCoordinator } from '../hooks/claude-hook-tools.js';
15
16
  import { ClaudeSidechainStore } from '../persistence/claude-sidechain-store.js';
16
17
  import { InMemorySidechainStore } from '../persistence/in-memory-sidechain-store.js';
@@ -79,6 +80,29 @@ export class StructuredOutputRegistry {
79
80
  });
80
81
  }
81
82
  }
83
+ class RestrictedToolRegistry {
84
+ base;
85
+ allowed;
86
+ constructor(base, names) {
87
+ this.base = base;
88
+ this.allowed = new Set(names);
89
+ }
90
+ definitions() {
91
+ return this.base
92
+ .definitions()
93
+ .filter((definition) => this.allowed.has(definition.name));
94
+ }
95
+ prepare(call, context) {
96
+ if (!this.allowed.has(call.name))
97
+ throw new Error(`Tool ${call.name} is unavailable to this agent`);
98
+ return this.base.prepare(call, context);
99
+ }
100
+ execute(call, context) {
101
+ if (!this.allowed.has(call.name))
102
+ throw new Error(`Tool ${call.name} is unavailable to this agent`);
103
+ return this.base.execute(call, context);
104
+ }
105
+ }
82
106
  function parseAgentInput(call) {
83
107
  const allowed = new Set([
84
108
  'description',
@@ -942,9 +966,16 @@ export class ClaudeSubagentExecutor {
942
966
  permission_mode: options.input.permissionMode ?? 'default',
943
967
  };
944
968
  const nestedTools = this.registry(String(options.root.sessionId), options.spawnDepth, () => options.promptId);
945
- const agentTools = options.outputSchema
946
- ? new StructuredOutputRegistry(structuredOnlyTools, options.outputSchema, options.structuredOutput)
969
+ const builtInStatusLineAgent = this.options.extensions?.agent(options.input.subagentType)?.path ===
970
+ BUILTIN_STATUSLINE_AGENT_PATH;
971
+ const scopedTools = builtInStatusLineAgent
972
+ ? new RestrictedToolRegistry(nestedTools, ['Read', 'Edit'])
947
973
  : nestedTools;
974
+ const agentTools = options.outputSchema
975
+ ? new StructuredOutputRegistry(builtInStatusLineAgent
976
+ ? new RestrictedToolRegistry(structuredOnlyTools, ['Read', 'Edit'])
977
+ : structuredOnlyTools, options.outputSchema, options.structuredOutput)
978
+ : scopedTools;
948
979
  const runtimeTools = this.options.hooks
949
980
  ? new ClaudeHookToolCoordinator({
950
981
  tools: agentTools,
@@ -175,8 +175,10 @@ interface InteractiveAppProps {
175
175
  runtimeSettingsTarget?: ConfigSettingsTarget;
176
176
  notificationWriter?: TuiNotificationWriter;
177
177
  elicitationUrlOpener?: (url: string) => void | Promise<void>;
178
+ releaseNotesLoader?: (configRoot: string) => Promise<string>;
179
+ settingSources?: readonly ClaudeResourceScope[];
178
180
  }
179
- export declare function InteractiveApp({ factory, initialSessions, initialPrompt, initialHistory, signal, onCancel, onTurnChange, onCleanup, onRendererChange, onBackground, axScreenReader, allowNewSession, resume, display, terminalWidth, slashCommands, agents, allowDangerouslySkipPermissions, additionalDirectories, diffLoader, fileLoader, externalEditor, keybindingsConfigRoot, keybindingsFile, keybindingsLoader, keybindingsEditor, memoryFilesLoader, memoryEditor, memoryFolderOpener, suspendProcess, clipboardReader, clipboardWriter, sideQuestionClipboardWriter, exportWriter, permissionRuleStore, sandboxStore: suppliedSandboxStore, recentlyDeniedStore: suppliedRecentlyDeniedStore, terminalSetup: terminalSetupOverride, themeStore, initialThemeSettings, initialThemeLoadError, workspaceDirectoryResolver, workspaceDirectoryCompleter, runtimeSettings: suppliedRuntimeSettings, runtimeSettingsTarget, notificationWriter, elicitationUrlOpener, }: InteractiveAppProps): import("react").JSX.Element;
181
+ export declare function InteractiveApp({ factory, initialSessions, initialPrompt, initialHistory, signal, onCancel, onTurnChange, onCleanup, onRendererChange, onBackground, axScreenReader, allowNewSession, resume, display, terminalWidth, slashCommands, agents, allowDangerouslySkipPermissions, additionalDirectories, diffLoader, fileLoader, externalEditor, keybindingsConfigRoot, keybindingsFile, keybindingsLoader, keybindingsEditor, memoryFilesLoader, memoryEditor, memoryFolderOpener, suspendProcess, clipboardReader, clipboardWriter, sideQuestionClipboardWriter, exportWriter, permissionRuleStore, sandboxStore: suppliedSandboxStore, recentlyDeniedStore: suppliedRecentlyDeniedStore, terminalSetup: terminalSetupOverride, themeStore, initialThemeSettings, initialThemeLoadError, workspaceDirectoryResolver, workspaceDirectoryCompleter, runtimeSettings: suppliedRuntimeSettings, runtimeSettingsTarget, notificationWriter, elicitationUrlOpener, releaseNotesLoader, settingSources, }: InteractiveAppProps): import("react").JSX.Element;
180
182
  export declare function runInteractive(options: {
181
183
  factory: InteractiveServiceFactory;
182
184
  initialPrompt?: string;
@@ -192,6 +194,7 @@ export declare function runInteractive(options: {
192
194
  onBackground?: (request: InteractiveBackgroundRequest) => Promise<InteractiveBackgroundResult>;
193
195
  onBackgrounded?: (result: InteractiveBackgroundResult) => void;
194
196
  runtimeSettings?: PraxisRuntimeSettings;
197
+ settingSources?: readonly ClaudeResourceScope[];
195
198
  }): Promise<number>;
196
199
  export {};
197
200
  //# sourceMappingURL=interactive.d.ts.map
@@ -12,6 +12,8 @@ import { claudePermissionActionKey, claudePermissionRuleMatches, } from '../perm
12
12
  import { redactSensitiveText, sensitiveEnvironmentValues, } from '../platform/sensitive-data.js';
13
13
  import { CommandPalette, BtwPanel, Composer, DiffDashboard, DialogFrame, ExternalEditorWait, HelpMenu, HookDashboard, ListDashboard, MemoryDashboard, MentionPicker, ModelMenu, PermissionDashboard, SelectionMenu, SessionPicker, ThemePicker, CustomThemeEditor, Transcript, WelcomePanel, useTerminalWidth, } from './tui/claude-style.js';
14
14
  import { loadTuiMemoryFiles, openTuiMemoryFolder, } from './tui/memory-files.js';
15
+ import { loadClaudeReleaseNotes } from './tui/release-notes.js';
16
+ import { createClaudeStatusLineInput, StatusLine } from './tui/status-line.js';
15
17
  import { loadGitDiff, visiblePatchLines, } from './tui/git-diff.js';
16
18
  import { addTuiPermissionRule, loadTuiPermissionRules, removeTuiPermissionRule, } from './tui/permission-settings.js';
17
19
  import { createRecentlyDeniedStore, } from './tui/recently-denied.js';
@@ -245,7 +247,7 @@ const HIDDEN_TUI_SLASH_COMMANDS = new Set([
245
247
  'update',
246
248
  'usage',
247
249
  ]);
248
- export function InteractiveApp({ factory, initialSessions, initialPrompt, initialHistory = [], signal, onCancel, onTurnChange, onCleanup, onRendererChange, onBackground, axScreenReader = false, allowNewSession = true, resume, display = { version: 'dev', cwd: process.cwd() }, terminalWidth, slashCommands = EMPTY_SLASH_COMMANDS, agents = EMPTY_AGENTS, allowDangerouslySkipPermissions = false, additionalDirectories = [], diffLoader, fileLoader, externalEditor = editTuiPrompt, keybindingsConfigRoot, keybindingsFile = ensureTuiKeybindingsFile, keybindingsLoader = loadTuiKeybindings, keybindingsEditor = openTuiEditorFile, memoryFilesLoader = (configRoot, cwd) => loadTuiMemoryFiles({ configRoot, cwd }), memoryEditor = openTuiEditorFile, memoryFolderOpener = openTuiMemoryFolder, suspendProcess = suspendTuiProcess, clipboardReader = readTuiClipboard, clipboardWriter = writeTuiClipboard, sideQuestionClipboardWriter = writeTuiOsc52Clipboard, exportWriter = writeConversationExport, permissionRuleStore, sandboxStore: suppliedSandboxStore, recentlyDeniedStore: suppliedRecentlyDeniedStore, terminalSetup: terminalSetupOverride, themeStore, initialThemeSettings, initialThemeLoadError, workspaceDirectoryResolver = resolveTuiWorkspaceDirectory, workspaceDirectoryCompleter = completeTuiWorkspaceDirectory, runtimeSettings: suppliedRuntimeSettings, runtimeSettingsTarget, notificationWriter, elicitationUrlOpener = openTuiUrl, }) {
250
+ export function InteractiveApp({ factory, initialSessions, initialPrompt, initialHistory = [], signal, onCancel, onTurnChange, onCleanup, onRendererChange, onBackground, axScreenReader = false, allowNewSession = true, resume, display = { version: 'dev', cwd: process.cwd() }, terminalWidth, slashCommands = EMPTY_SLASH_COMMANDS, agents = EMPTY_AGENTS, allowDangerouslySkipPermissions = false, additionalDirectories = [], diffLoader, fileLoader, externalEditor = editTuiPrompt, keybindingsConfigRoot, keybindingsFile = ensureTuiKeybindingsFile, keybindingsLoader = loadTuiKeybindings, keybindingsEditor = openTuiEditorFile, memoryFilesLoader = (configRoot, cwd) => loadTuiMemoryFiles({ configRoot, cwd }), memoryEditor = openTuiEditorFile, memoryFolderOpener = openTuiMemoryFolder, suspendProcess = suspendTuiProcess, clipboardReader = readTuiClipboard, clipboardWriter = writeTuiClipboard, sideQuestionClipboardWriter = writeTuiOsc52Clipboard, exportWriter = writeConversationExport, permissionRuleStore, sandboxStore: suppliedSandboxStore, recentlyDeniedStore: suppliedRecentlyDeniedStore, terminalSetup: terminalSetupOverride, themeStore, initialThemeSettings, initialThemeLoadError, workspaceDirectoryResolver = resolveTuiWorkspaceDirectory, workspaceDirectoryCompleter = completeTuiWorkspaceDirectory, runtimeSettings: suppliedRuntimeSettings, runtimeSettingsTarget, notificationWriter, elicitationUrlOpener = openTuiUrl, releaseNotesLoader = (configRoot) => loadClaudeReleaseNotes({ configRoot }), settingSources, }) {
249
251
  const { exit, suspendTerminal, waitUntilRenderFlush } = useApp();
250
252
  const width = useTerminalWidth(terminalWidth);
251
253
  const keybindingsRoot = useMemo(() => resolve(keybindingsConfigRoot ??
@@ -299,6 +301,7 @@ export function InteractiveApp({ factory, initialSessions, initialPrompt, initia
299
301
  const [selectedIndex, setSelectedIndex] = useState(0);
300
302
  const selectedIndexRef = useRef(0);
301
303
  const [sessionId, setSessionId] = useState(resume?.sessionId ?? null);
304
+ const statusLineSessionId = useRef(resume?.sessionId ?? randomUUID());
302
305
  const sessionIdRef = useRef(resume?.sessionId ?? null);
303
306
  sessionIdRef.current = sessionId;
304
307
  const [sessionName, setSessionName] = useState(null);
@@ -2265,10 +2268,14 @@ export function InteractiveApp({ factory, initialSessions, initialPrompt, initia
2265
2268
  setBusy(true);
2266
2269
  setTurnDuration(undefined);
2267
2270
  setCommandPaletteOpen(false);
2268
- setStatus('assembling-context');
2271
+ const submittedCommandName = /^\/([^\s]+)/u.exec(prompt)?.[1]?.toLowerCase();
2272
+ const commandProgressMessage = submittedCommandName
2273
+ ? allSlashCommands.find((command) => command.name.toLowerCase() === submittedCommandName)?.progressMessage
2274
+ : undefined;
2275
+ setStatus(commandProgressMessage ?? 'assembling-context');
2269
2276
  setActiveText('');
2270
2277
  setActiveThinking('');
2271
- if (runtimeSettingsRef.current.tips) {
2278
+ if (runtimeSettingsRef.current.tips && !commandProgressMessage) {
2272
2279
  setStatus(spinnerTip(runtimeSettingsRef.current) ?? 'assembling-context');
2273
2280
  }
2274
2281
  if (shellCommand === undefined)
@@ -4799,11 +4806,13 @@ export function InteractiveApp({ factory, initialSessions, initialPrompt, initia
4799
4806
  updateMenu({ kind: 'help', tabIndex: 0, selectedIndex: 0 });
4800
4807
  }
4801
4808
  else if (prompt === '/new') {
4809
+ statusLineSessionId.current = randomUUID();
4802
4810
  setSessionId(null);
4803
4811
  setPendingFork(false);
4804
4812
  append({ kind: 'notice', text: 'Started a new session.' });
4805
4813
  }
4806
4814
  else if (prompt === '/clear') {
4815
+ statusLineSessionId.current = randomUUID();
4807
4816
  setSessionId(null);
4808
4817
  setPendingFork(false);
4809
4818
  setHistory([]);
@@ -5176,6 +5185,27 @@ export function InteractiveApp({ factory, initialSessions, initialPrompt, initia
5176
5185
  else if (prompt === '/status') {
5177
5186
  openSettings('status');
5178
5187
  }
5188
+ else if (prompt === '/release-notes') {
5189
+ const loading = (async () => {
5190
+ setBusy(true);
5191
+ setStatus('loading release notes');
5192
+ try {
5193
+ append({
5194
+ kind: 'local-result',
5195
+ text: await releaseNotesLoader(keybindingsRoot),
5196
+ });
5197
+ }
5198
+ catch (error) {
5199
+ warn(error);
5200
+ }
5201
+ finally {
5202
+ setBusy(false);
5203
+ setStatus('ready');
5204
+ }
5205
+ })();
5206
+ onTurnChange?.(loading);
5207
+ void loading.finally(() => onTurnChange?.(null));
5208
+ }
5179
5209
  else if (prompt === '/config') {
5180
5210
  openSettings('config');
5181
5211
  }
@@ -5395,7 +5425,39 @@ export function InteractiveApp({ factory, initialSessions, initialPrompt, initia
5395
5425
  ? { prStatus: `PR #${activeSessionSummary.prNumber}` }
5396
5426
  : {}), shortcutsVisible: shortcutsVisible, ...(editorFooterMessage === undefined
5397
5427
  ? {}
5398
- : { footerMessage: editorFooterMessage }) })] }))] })) }) }));
5428
+ : { footerMessage: editorFooterMessage }) }), _jsx(StatusLine, { configRoot: keybindingsRoot, cwd: runtimeCwd, input: createClaudeStatusLineInput({
5429
+ configRoot: keybindingsRoot,
5430
+ cwd: runtimeCwd,
5431
+ projectDir: display.cwd,
5432
+ sessionId: sessionId ?? statusLineSessionId.current,
5433
+ sessionName,
5434
+ ...(runtimeDisplay.model === undefined
5435
+ ? {}
5436
+ : { model: runtimeDisplay.model }),
5437
+ version: runtimeDisplay.version,
5438
+ outputStyle: runtimeSettings.outputStyle,
5439
+ permissionMode: runtimePreferences.permissionMode,
5440
+ additionalDirectories: runtimePreferences.additionalDirectories,
5441
+ ...(usage === undefined ? {} : { usage }),
5442
+ ...(costUsd === undefined ? {} : { costUsd }),
5443
+ ...(runtimeDisplay.contextWindowTokens === undefined
5444
+ ? {}
5445
+ : {
5446
+ contextWindowTokens: runtimeDisplay.contextWindowTokens,
5447
+ }),
5448
+ ...(runtimeSettings.editor === 'vim'
5449
+ ? { vimMode: vimInsertMode ? 'INSERT' : 'NORMAL' }
5450
+ : {}),
5451
+ }), refreshKey: [
5452
+ history.length,
5453
+ runtimePreferences.permissionMode,
5454
+ runtimeDisplay.model,
5455
+ runtimeSettings.outputStyle,
5456
+ vimInsertMode,
5457
+ sessionName,
5458
+ usage?.inputTokens,
5459
+ usage?.outputTokens,
5460
+ ].join(':'), ...(settingSources === undefined ? {} : { settingSources }) })] }))] })) }) }));
5399
5461
  }
5400
5462
  export async function runInteractive(options) {
5401
5463
  const controller = new AbortController();
@@ -5484,7 +5546,9 @@ export async function runInteractive(options) {
5484
5546
  let cleanup = null;
5485
5547
  let backgrounded;
5486
5548
  rendererChange = null;
5487
- const instance = render(_jsx(InteractiveApp, { factory: options.factory, initialSessions: initialSessions, slashCommands: initialSlashCommands, agents: initialAgents, initialHistory: history, runtimeSettings: currentRuntimeSettings, initialThemeSettings: initialThemeSettings, ...(initialThemeLoadError === undefined
5549
+ const instance = render(_jsx(InteractiveApp, { factory: options.factory, initialSessions: initialSessions, slashCommands: initialSlashCommands, agents: initialAgents, initialHistory: history, runtimeSettings: currentRuntimeSettings, ...(options.settingSources === undefined
5550
+ ? {}
5551
+ : { settingSources: options.settingSources }), initialThemeSettings: initialThemeSettings, ...(initialThemeLoadError === undefined
5488
5552
  ? {}
5489
5553
  : { initialThemeLoadError }), ...(currentInitialPrompt === undefined
5490
5554
  ? {}
@@ -1,4 +1,4 @@
1
- export type ClaudeCommandDisposition = 'included' | 'excluded';
1
+ export type ClaudeCommandDisposition = 'included' | 'deferred' | 'excluded';
2
2
  export type ClaudeCommandVisibility = 'visible' | 'hidden' | 'conditional';
3
3
  export interface ClaudeCommandInventoryEntry {
4
4
  name: string;
@@ -12,8 +12,9 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
12
12
  readonly visibility: "visible";
13
13
  }, {
14
14
  readonly name: "advisor";
15
- readonly disposition: "included";
15
+ readonly disposition: "deferred";
16
16
  readonly visibility: "conditional";
17
+ readonly reason: "Conditional advice mode is required parity work and is not implemented yet.";
17
18
  }, {
18
19
  readonly name: "agents";
19
20
  readonly disposition: "included";
@@ -28,17 +29,18 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
28
29
  readonly visibility: "visible";
29
30
  }, {
30
31
  readonly name: "chrome";
31
- readonly disposition: "excluded";
32
+ readonly disposition: "deferred";
32
33
  readonly visibility: "conditional";
33
- readonly reason: "Chrome integration is outside the CLI-only product boundary.";
34
+ readonly reason: "The CLI-driven Chrome integration is required parity work and is not implemented yet.";
34
35
  }, {
35
36
  readonly name: "clear";
36
37
  readonly disposition: "included";
37
38
  readonly visibility: "visible";
38
39
  }, {
39
40
  readonly name: "color";
40
- readonly disposition: "included";
41
+ readonly disposition: "deferred";
41
42
  readonly visibility: "visible";
43
+ readonly reason: "The dedicated /color contract is required; /theme is not a substitute.";
42
44
  }, {
43
45
  readonly name: "compact";
44
46
  readonly disposition: "included";
@@ -62,16 +64,18 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
62
64
  readonly visibility: "conditional";
63
65
  }, {
64
66
  readonly name: "cost";
65
- readonly disposition: "included";
67
+ readonly disposition: "deferred";
66
68
  readonly visibility: "conditional";
69
+ readonly reason: "The dedicated /cost contract is required; /status is not a substitute.";
67
70
  }, {
68
71
  readonly name: "diff";
69
72
  readonly disposition: "included";
70
73
  readonly visibility: "visible";
71
74
  }, {
72
75
  readonly name: "doctor";
73
- readonly disposition: "included";
76
+ readonly disposition: "deferred";
74
77
  readonly visibility: "conditional";
78
+ readonly reason: "Interactive /doctor is required; the top-level command is not a substitute.";
75
79
  }, {
76
80
  readonly name: "effort";
77
81
  readonly disposition: "included";
@@ -82,8 +86,9 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
82
86
  readonly visibility: "visible";
83
87
  }, {
84
88
  readonly name: "fast";
85
- readonly disposition: "included";
89
+ readonly disposition: "deferred";
86
90
  readonly visibility: "conditional";
91
+ readonly reason: "The /fast state flow is required; model and effort controls are not a substitute.";
87
92
  }, {
88
93
  readonly name: "files";
89
94
  readonly disposition: "excluded";
@@ -91,8 +96,9 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
91
96
  readonly reason: "The source command is restricted to the internal Ant user type.";
92
97
  }, {
93
98
  readonly name: "heapdump";
94
- readonly disposition: "included";
99
+ readonly disposition: "deferred";
95
100
  readonly visibility: "hidden";
101
+ readonly reason: "The hidden heap-diagnostic contract is required parity work and is not implemented yet.";
96
102
  }, {
97
103
  readonly name: "help";
98
104
  readonly disposition: "included";
@@ -181,8 +187,9 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
181
187
  readonly visibility: "visible";
182
188
  }, {
183
189
  readonly name: "stats";
184
- readonly disposition: "included";
190
+ readonly disposition: "deferred";
185
191
  readonly visibility: "visible";
192
+ readonly reason: "Historical usage statistics are required parity work and are not implemented yet.";
186
193
  }, {
187
194
  readonly name: "status";
188
195
  readonly disposition: "included";
@@ -253,8 +260,9 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
253
260
  readonly reason: "The source command is the Claude subscription plan-usage panel.";
254
261
  }, {
255
262
  readonly name: "insights";
256
- readonly disposition: "included";
263
+ readonly disposition: "deferred";
257
264
  readonly visibility: "visible";
265
+ readonly reason: "Retrospective insights are required parity work and are not implemented yet.";
258
266
  }, {
259
267
  readonly name: "vim";
260
268
  readonly disposition: "included";
@@ -270,20 +278,24 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
270
278
  readonly visibility: "conditional";
271
279
  }, {
272
280
  readonly name: "buddy";
273
- readonly disposition: "included";
281
+ readonly disposition: "deferred";
274
282
  readonly visibility: "conditional";
283
+ readonly reason: "This conditional source mode is required parity work and is not implemented yet.";
275
284
  }, {
276
285
  readonly name: "proactive";
277
- readonly disposition: "included";
286
+ readonly disposition: "deferred";
278
287
  readonly visibility: "conditional";
288
+ readonly reason: "This conditional source mode is required parity work and is not implemented yet.";
279
289
  }, {
280
290
  readonly name: "brief";
281
- readonly disposition: "included";
291
+ readonly disposition: "deferred";
282
292
  readonly visibility: "conditional";
293
+ readonly reason: "This conditional source mode is required parity work and is not implemented yet.";
283
294
  }, {
284
295
  readonly name: "assistant";
285
- readonly disposition: "included";
296
+ readonly disposition: "deferred";
286
297
  readonly visibility: "conditional";
298
+ readonly reason: "This conditional source mode is required parity work and is not implemented yet.";
287
299
  }, {
288
300
  readonly name: "remote-control";
289
301
  readonly disposition: "excluded";
@@ -296,16 +308,19 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
296
308
  readonly reason: "Remote Control is outside the local-only boundary.";
297
309
  }, {
298
310
  readonly name: "voice";
299
- readonly disposition: "included";
311
+ readonly disposition: "deferred";
300
312
  readonly visibility: "conditional";
313
+ readonly reason: "Conditional voice input is required parity work and is not implemented yet.";
301
314
  }, {
302
315
  readonly name: "think-back";
303
- readonly disposition: "included";
316
+ readonly disposition: "deferred";
304
317
  readonly visibility: "conditional";
318
+ readonly reason: "The conditional retrospective flow is required parity work and is not implemented yet.";
305
319
  }, {
306
320
  readonly name: "thinkback-play";
307
- readonly disposition: "included";
321
+ readonly disposition: "deferred";
308
322
  readonly visibility: "hidden";
323
+ readonly reason: "The hidden retrospective playback flow is required parity work and is not implemented yet.";
309
324
  }, {
310
325
  readonly name: "permissions";
311
326
  readonly disposition: "included";
@@ -361,8 +376,9 @@ export declare const CLAUDE_2_1_208_COMMAND_INVENTORY: readonly [{
361
376
  readonly visibility: "conditional";
362
377
  }, {
363
378
  readonly name: "torch";
364
- readonly disposition: "included";
379
+ readonly disposition: "deferred";
365
380
  readonly visibility: "conditional";
381
+ readonly reason: "This source-gated behavior is required conditional parity work and is not implemented yet.";
366
382
  }];
367
383
  export declare const CLAUDE_2_1_208_COMMAND_BY_NAME: ReadonlyMap<string, ClaudeCommandInventoryEntry>;
368
384
  //# sourceMappingURL=claude-command-inventory.d.ts.map
@@ -4,18 +4,28 @@
4
4
  // disappearing from the parity inventory.
5
5
  export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
6
6
  { name: 'add-dir', disposition: 'included', visibility: 'visible' },
7
- { name: 'advisor', disposition: 'included', visibility: 'conditional' },
7
+ {
8
+ name: 'advisor',
9
+ disposition: 'deferred',
10
+ visibility: 'conditional',
11
+ reason: 'Conditional advice mode is required parity work and is not implemented yet.',
12
+ },
8
13
  { name: 'agents', disposition: 'included', visibility: 'visible' },
9
14
  { name: 'branch', disposition: 'included', visibility: 'visible' },
10
15
  { name: 'btw', disposition: 'included', visibility: 'visible' },
11
16
  {
12
17
  name: 'chrome',
13
- disposition: 'excluded',
18
+ disposition: 'deferred',
14
19
  visibility: 'conditional',
15
- reason: 'Chrome integration is outside the CLI-only product boundary.',
20
+ reason: 'The CLI-driven Chrome integration is required parity work and is not implemented yet.',
16
21
  },
17
22
  { name: 'clear', disposition: 'included', visibility: 'visible' },
18
- { name: 'color', disposition: 'included', visibility: 'visible' },
23
+ {
24
+ name: 'color',
25
+ disposition: 'deferred',
26
+ visibility: 'visible',
27
+ reason: 'The dedicated /color contract is required; /theme is not a substitute.',
28
+ },
19
29
  { name: 'compact', disposition: 'included', visibility: 'visible' },
20
30
  { name: 'config', disposition: 'included', visibility: 'visible' },
21
31
  { name: 'copy', disposition: 'included', visibility: 'visible' },
@@ -26,19 +36,39 @@ export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
26
36
  reason: 'Desktop handoff/import is outside the CLI-only product boundary.',
27
37
  },
28
38
  { name: 'context', disposition: 'included', visibility: 'conditional' },
29
- { name: 'cost', disposition: 'included', visibility: 'conditional' },
39
+ {
40
+ name: 'cost',
41
+ disposition: 'deferred',
42
+ visibility: 'conditional',
43
+ reason: 'The dedicated /cost contract is required; /status is not a substitute.',
44
+ },
30
45
  { name: 'diff', disposition: 'included', visibility: 'visible' },
31
- { name: 'doctor', disposition: 'included', visibility: 'conditional' },
46
+ {
47
+ name: 'doctor',
48
+ disposition: 'deferred',
49
+ visibility: 'conditional',
50
+ reason: 'Interactive /doctor is required; the top-level command is not a substitute.',
51
+ },
32
52
  { name: 'effort', disposition: 'included', visibility: 'visible' },
33
53
  { name: 'exit', disposition: 'included', visibility: 'visible' },
34
- { name: 'fast', disposition: 'included', visibility: 'conditional' },
54
+ {
55
+ name: 'fast',
56
+ disposition: 'deferred',
57
+ visibility: 'conditional',
58
+ reason: 'The /fast state flow is required; model and effort controls are not a substitute.',
59
+ },
35
60
  {
36
61
  name: 'files',
37
62
  disposition: 'excluded',
38
63
  visibility: 'conditional',
39
64
  reason: 'The source command is restricted to the internal Ant user type.',
40
65
  },
41
- { name: 'heapdump', disposition: 'included', visibility: 'hidden' },
66
+ {
67
+ name: 'heapdump',
68
+ disposition: 'deferred',
69
+ visibility: 'hidden',
70
+ reason: 'The hidden heap-diagnostic contract is required parity work and is not implemented yet.',
71
+ },
42
72
  { name: 'help', disposition: 'included', visibility: 'visible' },
43
73
  {
44
74
  name: 'ide',
@@ -89,7 +119,12 @@ export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
89
119
  reason: 'Remote-session URLs and QR codes are outside the local-only boundary.',
90
120
  },
91
121
  { name: 'skills', disposition: 'included', visibility: 'visible' },
92
- { name: 'stats', disposition: 'included', visibility: 'visible' },
122
+ {
123
+ name: 'stats',
124
+ disposition: 'deferred',
125
+ visibility: 'visible',
126
+ reason: 'Historical usage statistics are required parity work and are not implemented yet.',
127
+ },
93
128
  { name: 'status', disposition: 'included', visibility: 'visible' },
94
129
  { name: 'statusline', disposition: 'included', visibility: 'visible' },
95
130
  {
@@ -149,7 +184,12 @@ export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
149
184
  visibility: 'conditional',
150
185
  reason: 'The source command is the Claude subscription plan-usage panel.',
151
186
  },
152
- { name: 'insights', disposition: 'included', visibility: 'visible' },
187
+ {
188
+ name: 'insights',
189
+ disposition: 'deferred',
190
+ visibility: 'visible',
191
+ reason: 'Retrospective insights are required parity work and are not implemented yet.',
192
+ },
153
193
  { name: 'vim', disposition: 'included', visibility: 'visible' },
154
194
  {
155
195
  name: 'web-setup',
@@ -158,10 +198,30 @@ export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
158
198
  reason: 'Remote setup is outside the local-only boundary.',
159
199
  },
160
200
  { name: 'fork', disposition: 'included', visibility: 'conditional' },
161
- { name: 'buddy', disposition: 'included', visibility: 'conditional' },
162
- { name: 'proactive', disposition: 'included', visibility: 'conditional' },
163
- { name: 'brief', disposition: 'included', visibility: 'conditional' },
164
- { name: 'assistant', disposition: 'included', visibility: 'conditional' },
201
+ {
202
+ name: 'buddy',
203
+ disposition: 'deferred',
204
+ visibility: 'conditional',
205
+ reason: 'This conditional source mode is required parity work and is not implemented yet.',
206
+ },
207
+ {
208
+ name: 'proactive',
209
+ disposition: 'deferred',
210
+ visibility: 'conditional',
211
+ reason: 'This conditional source mode is required parity work and is not implemented yet.',
212
+ },
213
+ {
214
+ name: 'brief',
215
+ disposition: 'deferred',
216
+ visibility: 'conditional',
217
+ reason: 'This conditional source mode is required parity work and is not implemented yet.',
218
+ },
219
+ {
220
+ name: 'assistant',
221
+ disposition: 'deferred',
222
+ visibility: 'conditional',
223
+ reason: 'This conditional source mode is required parity work and is not implemented yet.',
224
+ },
165
225
  {
166
226
  name: 'remote-control',
167
227
  disposition: 'excluded',
@@ -174,9 +234,24 @@ export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
174
234
  visibility: 'conditional',
175
235
  reason: 'Remote Control is outside the local-only boundary.',
176
236
  },
177
- { name: 'voice', disposition: 'included', visibility: 'conditional' },
178
- { name: 'think-back', disposition: 'included', visibility: 'conditional' },
179
- { name: 'thinkback-play', disposition: 'included', visibility: 'hidden' },
237
+ {
238
+ name: 'voice',
239
+ disposition: 'deferred',
240
+ visibility: 'conditional',
241
+ reason: 'Conditional voice input is required parity work and is not implemented yet.',
242
+ },
243
+ {
244
+ name: 'think-back',
245
+ disposition: 'deferred',
246
+ visibility: 'conditional',
247
+ reason: 'The conditional retrospective flow is required parity work and is not implemented yet.',
248
+ },
249
+ {
250
+ name: 'thinkback-play',
251
+ disposition: 'deferred',
252
+ visibility: 'hidden',
253
+ reason: 'The hidden retrospective playback flow is required parity work and is not implemented yet.',
254
+ },
180
255
  { name: 'permissions', disposition: 'included', visibility: 'visible' },
181
256
  { name: 'plan', disposition: 'included', visibility: 'visible' },
182
257
  {
@@ -214,7 +289,12 @@ export const CLAUDE_2_1_208_COMMAND_INVENTORY = [
214
289
  },
215
290
  { name: 'tasks', disposition: 'included', visibility: 'visible' },
216
291
  { name: 'workflows', disposition: 'included', visibility: 'conditional' },
217
- { name: 'torch', disposition: 'included', visibility: 'conditional' },
292
+ {
293
+ name: 'torch',
294
+ disposition: 'deferred',
295
+ visibility: 'conditional',
296
+ reason: 'This source-gated behavior is required conditional parity work and is not implemented yet.',
297
+ },
218
298
  ];
219
299
  export const CLAUDE_2_1_208_COMMAND_BY_NAME = new Map(CLAUDE_2_1_208_COMMAND_INVENTORY.map((entry) => [entry.name, entry]));
220
300
  //# sourceMappingURL=claude-command-inventory.js.map
@@ -0,0 +1,10 @@
1
+ export declare const CLAUDE_CHANGELOG_URL = "https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md";
2
+ export interface ReleaseNotesOptions {
3
+ configRoot: string;
4
+ fetcher?: typeof fetch;
5
+ timeoutMs?: number;
6
+ }
7
+ export declare function parseClaudeChangelog(content: string): readonly [version: string, notes: readonly string[]][];
8
+ export declare function formatClaudeReleaseNotes(content: string): string | null;
9
+ export declare function loadClaudeReleaseNotes({ configRoot, fetcher, timeoutMs, }: ReleaseNotesOptions): Promise<string>;
10
+ //# sourceMappingURL=release-notes.d.ts.map