@xortex/xcode 3.1.0 → 3.1.1
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/bin/xcode +1 -1
- package/entrypoints/cli.tsx +1 -1
- package/macro.ts +1 -1
- package/package.json +54 -1
- package/INSTALLATION.md +0 -285
- package/QUICKSTART.md +0 -151
- package/SYSTEM_PROMPT.md +0 -583
- package/SYSTEM_PROMPT_EXTRACTED.md +0 -1
- package/Untitled +0 -1
- package/bun.lock +0 -645
- package/costHook.ts +0 -22
- package/dialogLaunchers.tsx +0 -133
- package/extract_prompt.ts +0 -304
- package/inspect.js +0 -7
- package/install.sh +0 -221
- package/moreright/useMoreRight.tsx +0 -26
- package/native-ts/color-diff/index.ts +0 -999
- package/native-ts/file-index/index.ts +0 -370
- package/native-ts/yoga-layout/enums.ts +0 -134
- package/native-ts/yoga-layout/index.ts +0 -2578
- package/outputStyles/loadOutputStylesDir.ts +0 -98
- package/patch-box.js +0 -54
- package/patch-compact.js +0 -13
- package/patch-condensed-center.js +0 -13
- package/patch-condensed-row.js +0 -13
- package/patch-condensed.js +0 -13
- package/patch-final.js +0 -58
- package/patch-input-body.js +0 -46
- package/patch-input-body2.js +0 -35
- package/patch-input-style.js +0 -13
- package/patch-input-width.js +0 -13
- package/patch-layout.js +0 -87
- package/patch-logo-row.js +0 -12
- package/patch-width.js +0 -13
- package/patch-width2.js +0 -13
- package/patch2.js +0 -74
- package/patch3.js +0 -13
- package/plugins/builtinPlugins.ts +0 -159
- package/plugins/bundled/index.ts +0 -23
- package/projectOnboardingState.ts +0 -83
- package/public/claude-files.png +0 -0
- package/public/leak-tweet.png +0 -0
- package/replLauncher.tsx +0 -27
- package/server/createDirectConnectSession.ts +0 -88
- package/server/directConnectManager.ts +0 -213
- package/server/types.ts +0 -57
- package/stub_types.sh +0 -13
- package/vim/motions.ts +0 -82
- package/vim/operators.ts +0 -556
- package/vim/textObjects.ts +0 -186
- package/vim/transitions.ts +0 -490
- package/vim/types.ts +0 -199
package/costHook.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { useEffect } from 'react'
|
|
2
|
-
import { formatTotalCost, saveCurrentSessionCosts } from './cost-tracker.js'
|
|
3
|
-
import { hasConsoleBillingAccess } from './utils/billing.js'
|
|
4
|
-
import type { FpsMetrics } from './utils/fpsTracker.js'
|
|
5
|
-
|
|
6
|
-
export function useCostSummary(
|
|
7
|
-
getFpsMetrics?: () => FpsMetrics | undefined,
|
|
8
|
-
): void {
|
|
9
|
-
useEffect(() => {
|
|
10
|
-
const f = () => {
|
|
11
|
-
if (hasConsoleBillingAccess()) {
|
|
12
|
-
process.stdout.write('\n' + formatTotalCost() + '\n')
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
saveCurrentSessionCosts(getFpsMetrics?.())
|
|
16
|
-
}
|
|
17
|
-
process.on('exit', f)
|
|
18
|
-
return () => {
|
|
19
|
-
process.off('exit', f)
|
|
20
|
-
}
|
|
21
|
-
}, [])
|
|
22
|
-
}
|
package/dialogLaunchers.tsx
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thin launchers for one-off dialog JSX sites in main.tsx.
|
|
3
|
-
* Each launcher dynamically imports its component and wires the `done` callback
|
|
4
|
-
* identically to the original inline call site. Zero behavior change.
|
|
5
|
-
*
|
|
6
|
-
* Part of the main.tsx React/JSX extraction effort. See sibling PRs
|
|
7
|
-
* perf/extract-interactive-helpers and perf/launch-repl.
|
|
8
|
-
*/
|
|
9
|
-
import React from 'react';
|
|
10
|
-
import type { AssistantSession } from './assistant/sessionDiscovery.js';
|
|
11
|
-
import type { StatsStore } from './context/stats.js';
|
|
12
|
-
import type { Root } from './ink.js';
|
|
13
|
-
import { renderAndRun, showSetupDialog } from './interactiveHelpers.js';
|
|
14
|
-
import { KeybindingSetup } from './keybindings/KeybindingProviderSetup.js';
|
|
15
|
-
import type { AppState } from './state/AppStateStore.js';
|
|
16
|
-
import type { AgentMemoryScope } from './tools/AgentTool/agentMemory.js';
|
|
17
|
-
import type { TeleportRemoteResponse } from './utils/conversationRecovery.js';
|
|
18
|
-
import type { FpsMetrics } from './utils/fpsTracker.js';
|
|
19
|
-
import type { ValidationError } from './utils/settings/validation.js';
|
|
20
|
-
|
|
21
|
-
// Type-only access to ResumeConversation's Props via the module type.
|
|
22
|
-
// No runtime cost - erased at compile time.
|
|
23
|
-
type ResumeConversationProps = React.ComponentProps<typeof import('./screens/ResumeConversation.js').ResumeConversation>;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Site ~3173: SnapshotUpdateDialog (agent memory snapshot update prompt).
|
|
27
|
-
* Original callback wiring: onComplete={done}, onCancel={() => done('keep')}.
|
|
28
|
-
*/
|
|
29
|
-
export async function launchSnapshotUpdateDialog(root: Root, props: {
|
|
30
|
-
agentType: string;
|
|
31
|
-
scope: AgentMemoryScope;
|
|
32
|
-
snapshotTimestamp: string;
|
|
33
|
-
}): Promise<'merge' | 'keep' | 'replace'> {
|
|
34
|
-
const {
|
|
35
|
-
SnapshotUpdateDialog
|
|
36
|
-
} = await import('./components/agents/SnapshotUpdateDialog.js');
|
|
37
|
-
return showSetupDialog<'merge' | 'keep' | 'replace'>(root, done => <SnapshotUpdateDialog agentType={props.agentType} scope={props.scope} snapshotTimestamp={props.snapshotTimestamp} onComplete={done} onCancel={() => done('keep')} />);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Site ~3250: InvalidSettingsDialog (settings validation errors).
|
|
42
|
-
* Original callback wiring: onContinue={done}, onExit passed through from caller.
|
|
43
|
-
*/
|
|
44
|
-
export async function launchInvalidSettingsDialog(root: Root, props: {
|
|
45
|
-
settingsErrors: ValidationError[];
|
|
46
|
-
onExit: () => void;
|
|
47
|
-
}): Promise<void> {
|
|
48
|
-
const {
|
|
49
|
-
InvalidSettingsDialog
|
|
50
|
-
} = await import('./components/InvalidSettingsDialog.js');
|
|
51
|
-
return showSetupDialog(root, done => <InvalidSettingsDialog settingsErrors={props.settingsErrors} onContinue={done} onExit={props.onExit} />);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Site ~4229: AssistantSessionChooser (pick a bridge session to attach to).
|
|
56
|
-
* Original callback wiring: onSelect={id => done(id)}, onCancel={() => done(null)}.
|
|
57
|
-
*/
|
|
58
|
-
export async function launchAssistantSessionChooser(root: Root, props: {
|
|
59
|
-
sessions: AssistantSession[];
|
|
60
|
-
}): Promise<string | null> {
|
|
61
|
-
const {
|
|
62
|
-
AssistantSessionChooser
|
|
63
|
-
} = await import('./assistant/AssistantSessionChooser.js');
|
|
64
|
-
return showSetupDialog<string | null>(root, done => <AssistantSessionChooser sessions={props.sessions} onSelect={id => done(id)} onCancel={() => done(null)} />);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* `claude assistant` found zero sessions — show the same install wizard
|
|
69
|
-
* as `/assistant` when daemon.json is empty. Resolves to the installed dir on
|
|
70
|
-
* success, null on cancel. Rejects on install failure so the caller can
|
|
71
|
-
* distinguish errors from user cancellation.
|
|
72
|
-
*/
|
|
73
|
-
export async function launchAssistantInstallWizard(root: Root): Promise<string | null> {
|
|
74
|
-
const {
|
|
75
|
-
NewInstallWizard,
|
|
76
|
-
computeDefaultInstallDir
|
|
77
|
-
} = await import('./commands/assistant/assistant.js');
|
|
78
|
-
const defaultDir = await computeDefaultInstallDir();
|
|
79
|
-
let rejectWithError: (reason: Error) => void;
|
|
80
|
-
const errorPromise = new Promise<never>((_, reject) => {
|
|
81
|
-
rejectWithError = reject;
|
|
82
|
-
});
|
|
83
|
-
const resultPromise = showSetupDialog<string | null>(root, done => <NewInstallWizard defaultDir={defaultDir} onInstalled={dir => done(dir)} onCancel={() => done(null)} onError={message => rejectWithError(new Error(`Installation failed: ${message}`))} />);
|
|
84
|
-
return Promise.race([resultPromise, errorPromise]);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Site ~4549: TeleportResumeWrapper (interactive teleport session picker).
|
|
89
|
-
* Original callback wiring: onComplete={done}, onCancel={() => done(null)}, source="cliArg".
|
|
90
|
-
*/
|
|
91
|
-
export async function launchTeleportResumeWrapper(root: Root): Promise<TeleportRemoteResponse | null> {
|
|
92
|
-
const {
|
|
93
|
-
TeleportResumeWrapper
|
|
94
|
-
} = await import('./components/TeleportResumeWrapper.js');
|
|
95
|
-
return showSetupDialog<TeleportRemoteResponse | null>(root, done => <TeleportResumeWrapper onComplete={done} onCancel={() => done(null)} source="cliArg" />);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Site ~4597: TeleportRepoMismatchDialog (pick a local checkout of the target repo).
|
|
100
|
-
* Original callback wiring: onSelectPath={done}, onCancel={() => done(null)}.
|
|
101
|
-
*/
|
|
102
|
-
export async function launchTeleportRepoMismatchDialog(root: Root, props: {
|
|
103
|
-
targetRepo: string;
|
|
104
|
-
initialPaths: string[];
|
|
105
|
-
}): Promise<string | null> {
|
|
106
|
-
const {
|
|
107
|
-
TeleportRepoMismatchDialog
|
|
108
|
-
} = await import('./components/TeleportRepoMismatchDialog.js');
|
|
109
|
-
return showSetupDialog<string | null>(root, done => <TeleportRepoMismatchDialog targetRepo={props.targetRepo} initialPaths={props.initialPaths} onSelectPath={done} onCancel={() => done(null)} />);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Site ~4903: ResumeConversation mount (interactive session picker).
|
|
114
|
-
* Uses renderAndRun, NOT showSetupDialog. Wraps in <App><KeybindingSetup>.
|
|
115
|
-
* Preserves original Promise.all parallelism between getWorktreePaths and imports.
|
|
116
|
-
*/
|
|
117
|
-
export async function launchResumeChooser(root: Root, appProps: {
|
|
118
|
-
getFpsMetrics: () => FpsMetrics | undefined;
|
|
119
|
-
stats: StatsStore;
|
|
120
|
-
initialState: AppState;
|
|
121
|
-
}, worktreePathsPromise: Promise<string[]>, resumeProps: Omit<ResumeConversationProps, 'worktreePaths'>): Promise<void> {
|
|
122
|
-
const [worktreePaths, {
|
|
123
|
-
ResumeConversation
|
|
124
|
-
}, {
|
|
125
|
-
App
|
|
126
|
-
}] = await Promise.all([worktreePathsPromise, import('./screens/ResumeConversation.js'), import('./components/App.js')]);
|
|
127
|
-
await renderAndRun(root, <App getFpsMetrics={appProps.getFpsMetrics} stats={appProps.stats} initialState={appProps.initialState}>
|
|
128
|
-
<KeybindingSetup>
|
|
129
|
-
<ResumeConversation {...resumeProps} worktreePaths={worktreePaths} />
|
|
130
|
-
</KeybindingSetup>
|
|
131
|
-
</App>);
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkFzc2lzdGFudFNlc3Npb24iLCJTdGF0c1N0b3JlIiwiUm9vdCIsInJlbmRlckFuZFJ1biIsInNob3dTZXR1cERpYWxvZyIsIktleWJpbmRpbmdTZXR1cCIsIkFwcFN0YXRlIiwiQWdlbnRNZW1vcnlTY29wZSIsIlRlbGVwb3J0UmVtb3RlUmVzcG9uc2UiLCJGcHNNZXRyaWNzIiwiVmFsaWRhdGlvbkVycm9yIiwiUmVzdW1lQ29udmVyc2F0aW9uUHJvcHMiLCJDb21wb25lbnRQcm9wcyIsIlJlc3VtZUNvbnZlcnNhdGlvbiIsImxhdW5jaFNuYXBzaG90VXBkYXRlRGlhbG9nIiwicm9vdCIsInByb3BzIiwiYWdlbnRUeXBlIiwic2NvcGUiLCJzbmFwc2hvdFRpbWVzdGFtcCIsIlByb21pc2UiLCJTbmFwc2hvdFVwZGF0ZURpYWxvZyIsImRvbmUiLCJsYXVuY2hJbnZhbGlkU2V0dGluZ3NEaWFsb2ciLCJzZXR0aW5nc0Vycm9ycyIsIm9uRXhpdCIsIkludmFsaWRTZXR0aW5nc0RpYWxvZyIsImxhdW5jaEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIiwic2Vzc2lvbnMiLCJBc3Npc3RhbnRTZXNzaW9uQ2hvb3NlciIsImlkIiwibGF1bmNoQXNzaXN0YW50SW5zdGFsbFdpemFyZCIsIk5ld0luc3RhbGxXaXphcmQiLCJjb21wdXRlRGVmYXVsdEluc3RhbGxEaXIiLCJkZWZhdWx0RGlyIiwicmVqZWN0V2l0aEVycm9yIiwicmVhc29uIiwiRXJyb3IiLCJlcnJvclByb21pc2UiLCJfIiwicmVqZWN0IiwicmVzdWx0UHJvbWlzZSIsImRpciIsIm1lc3NhZ2UiLCJyYWNlIiwibGF1bmNoVGVsZXBvcnRSZXN1bWVXcmFwcGVyIiwiVGVsZXBvcnRSZXN1bWVXcmFwcGVyIiwibGF1bmNoVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2ciLCJ0YXJnZXRSZXBvIiwiaW5pdGlhbFBhdGhzIiwiVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2ciLCJsYXVuY2hSZXN1bWVDaG9vc2VyIiwiYXBwUHJvcHMiLCJnZXRGcHNNZXRyaWNzIiwic3RhdHMiLCJpbml0aWFsU3RhdGUiLCJ3b3JrdHJlZVBhdGhzUHJvbWlzZSIsInJlc3VtZVByb3BzIiwiT21pdCIsIndvcmt0cmVlUGF0aHMiLCJBcHAiLCJhbGwiXSwic291cmNlcyI6WyJkaWFsb2dMYXVuY2hlcnMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpbiBsYXVuY2hlcnMgZm9yIG9uZS1vZmYgZGlhbG9nIEpTWCBzaXRlcyBpbiBtYWluLnRzeC5cbiAqIEVhY2ggbGF1bmNoZXIgZHluYW1pY2FsbHkgaW1wb3J0cyBpdHMgY29tcG9uZW50IGFuZCB3aXJlcyB0aGUgYGRvbmVgIGNhbGxiYWNrXG4gKiBpZGVudGljYWxseSB0byB0aGUgb3JpZ2luYWwgaW5saW5lIGNhbGwgc2l0ZS4gWmVybyBiZWhhdmlvciBjaGFuZ2UuXG4gKlxuICogUGFydCBvZiB0aGUgbWFpbi50c3ggUmVhY3QvSlNYIGV4dHJhY3Rpb24gZWZmb3J0LiBTZWUgc2libGluZyBQUnNcbiAqIHBlcmYvZXh0cmFjdC1pbnRlcmFjdGl2ZS1oZWxwZXJzIGFuZCBwZXJmL2xhdW5jaC1yZXBsLlxuICovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IEFzc2lzdGFudFNlc3Npb24gfSBmcm9tICcuL2Fzc2lzdGFudC9zZXNzaW9uRGlzY292ZXJ5LmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0c1N0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3N0YXRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBSb290IH0gZnJvbSAnLi9pbmsuanMnXG5pbXBvcnQgeyByZW5kZXJBbmRSdW4sIHNob3dTZXR1cERpYWxvZyB9IGZyb20gJy4vaW50ZXJhY3RpdmVIZWxwZXJzLmpzJ1xuaW1wb3J0IHsgS2V5YmluZGluZ1NldHVwIH0gZnJvbSAnLi9rZXliaW5kaW5ncy9LZXliaW5kaW5nUHJvdmlkZXJTZXR1cC5qcydcbmltcG9ydCB0eXBlIHsgQXBwU3RhdGUgfSBmcm9tICcuL3N0YXRlL0FwcFN0YXRlU3RvcmUuanMnXG5pbXBvcnQgdHlwZSB7IEFnZW50TWVtb3J5U2NvcGUgfSBmcm9tICcuL3Rvb2xzL0FnZW50VG9vbC9hZ2VudE1lbW9yeS5qcydcbmltcG9ydCB0eXBlIHsgVGVsZXBvcnRSZW1vdGVSZXNwb25zZSB9IGZyb20gJy4vdXRpbHMvY29udmVyc2F0aW9uUmVjb3ZlcnkuanMnXG5pbXBvcnQgdHlwZSB7IEZwc01ldHJpY3MgfSBmcm9tICcuL3V0aWxzL2Zwc1RyYWNrZXIuanMnXG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vdXRpbHMvc2V0dGluZ3MvdmFsaWRhdGlvbi5qcydcblxuLy8gVHlwZS1vbmx5IGFjY2VzcyB0byBSZXN1bWVDb252ZXJzYXRpb24ncyBQcm9wcyB2aWEgdGhlIG1vZHVsZSB0eXBlLlxuLy8gTm8gcnVudGltZSBjb3N0IC0gZXJhc2VkIGF0IGNvbXBpbGUgdGltZS5cbnR5cGUgUmVzdW1lQ29udmVyc2F0aW9uUHJvcHMgPSBSZWFjdC5Db21wb25lbnRQcm9wczxcbiAgdHlwZW9mIGltcG9ydCgnLi9zY3JlZW5zL1Jlc3VtZUNvbnZlcnNhdGlvbi5qcycpLlJlc3VtZUNvbnZlcnNhdGlvblxuPlxuXG4vKipcbiAqIFNpdGUgfjMxNzM6IFNuYXBzaG90VXBkYXRlRGlhbG9nIChhZ2VudCBtZW1vcnkgc25hcHNob3QgdXBkYXRlIHByb21wdCkuXG4gKiBPcmlnaW5hbCBjYWxsYmFjayB3aXJpbmc6IG9uQ29tcGxldGU9e2RvbmV9LCBvbkNhbmNlbD17KCkgPT4gZG9uZSgna2VlcCcpfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFNuYXBzaG90VXBkYXRlRGlhbG9nKFxuICByb290OiBSb290LFxuICBwcm9wczoge1xuICAgIGFnZW50VHlwZTogc3RyaW5nXG4gICAgc2NvcGU6IEFnZW50TWVtb3J5U2NvcGVcbiAgICBzbmFwc2hvdFRpbWVzdGFtcDogc3RyaW5nXG4gIH0sXG4pOiBQcm9taXNlPCdtZXJnZScgfCAna2VlcCcgfCAncmVwbGFjZSc+IHtcbiAgY29uc3QgeyBTbmFwc2hvdFVwZGF0ZURpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL2NvbXBvbmVudHMvYWdlbnRzL1NuYXBzaG90VXBkYXRlRGlhbG9nLmpzJ1xuICApXG4gIHJldHVybiBzaG93U2V0dXBEaWFsb2c8J21lcmdlJyB8ICdrZWVwJyB8ICdyZXBsYWNlJz4ocm9vdCwgZG9uZSA9PiAoXG4gICAgPFNuYXBzaG90VXBkYXRlRGlhbG9nXG4gICAgICBhZ2VudFR5cGU9e3Byb3BzLmFnZW50VHlwZX1cbiAgICAgIHNjb3BlPXtwcm9wcy5zY29wZX1cbiAgICAgIHNuYXBzaG90VGltZXN0YW1wPXtwcm9wcy5zbmFwc2hvdFRpbWVzdGFtcH1cbiAgICAgIG9uQ29tcGxldGU9e2RvbmV9XG4gICAgICBvbkNhbmNlbD17KCkgPT4gZG9uZSgna2VlcCcpfVxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+MzI1MDogSW52YWxpZFNldHRpbmdzRGlhbG9nIChzZXR0aW5ncyB2YWxpZGF0aW9uIGVycm9ycykuXG4gKiBPcmlnaW5hbCBjYWxsYmFjayB3aXJpbmc6IG9uQ29udGludWU9e2RvbmV9LCBvbkV4aXQgcGFzc2VkIHRocm91Z2ggZnJvbSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hJbnZhbGlkU2V0dGluZ3NEaWFsb2coXG4gIHJvb3Q6IFJvb3QsXG4gIHByb3BzOiB7XG4gICAgc2V0dGluZ3NFcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdXG4gICAgb25FeGl0OiAoKSA9PiB2b2lkXG4gIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBJbnZhbGlkU2V0dGluZ3NEaWFsb2cgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi9jb21wb25lbnRzL0ludmFsaWRTZXR0aW5nc0RpYWxvZy5qcydcbiAgKVxuICByZXR1cm4gc2hvd1NldHVwRGlhbG9nKHJvb3QsIGRvbmUgPT4gKFxuICAgIDxJbnZhbGlkU2V0dGluZ3NEaWFsb2dcbiAgICAgIHNldHRpbmdzRXJyb3JzPXtwcm9wcy5zZXR0aW5nc0Vycm9yc31cbiAgICAgIG9uQ29udGludWU9e2RvbmV9XG4gICAgICBvbkV4aXQ9e3Byb3BzLm9uRXhpdH1cbiAgICAvPlxuICApKVxufVxuXG4vKipcbiAqIFNpdGUgfjQyMjk6IEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIChwaWNrIGEgYnJpZGdlIHNlc3Npb24gdG8gYXR0YWNoIHRvKS5cbiAqIE9yaWdpbmFsIGNhbGxiYWNrIHdpcmluZzogb25TZWxlY3Q9e2lkID0+IGRvbmUoaWQpfSwgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXNzaXN0YW50U2Vzc2lvbkNob29zZXIoXG4gIHJvb3Q6IFJvb3QsXG4gIHByb3BzOiB7IHNlc3Npb25zOiBBc3Npc3RhbnRTZXNzaW9uW10gfSxcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCB7IEFzc2lzdGFudFNlc3Npb25DaG9vc2VyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJy4vYXNzaXN0YW50L0Fzc2lzdGFudFNlc3Npb25DaG9vc2VyLmpzJ1xuICApXG4gIHJldHVybiBzaG93U2V0dXBEaWFsb2c8c3RyaW5nIHwgbnVsbD4ocm9vdCwgZG9uZSA9PiAoXG4gICAgPEFzc2lzdGFudFNlc3Npb25DaG9vc2VyXG4gICAgICBzZXNzaW9ucz17cHJvcHMuc2Vzc2lvbnN9XG4gICAgICBvblNlbGVjdD17aWQgPT4gZG9uZShpZCl9XG4gICAgICBvbkNhbmNlbD17KCkgPT4gZG9uZShudWxsKX1cbiAgICAvPlxuICApKVxufVxuXG4vKipcbiAqIGBjbGF1ZGUgYXNzaXN0YW50YCBmb3VuZCB6ZXJvIHNlc3Npb25zIOKAlCBzaG93IHRoZSBzYW1lIGluc3RhbGwgd2l6YXJkXG4gKiBhcyBgL2Fzc2lzdGFudGAgd2hlbiBkYWVtb24uanNvbiBpcyBlbXB0eS4gUmVzb2x2ZXMgdG8gdGhlIGluc3RhbGxlZCBkaXIgb25cbiAqIHN1Y2Nlc3MsIG51bGwgb24gY2FuY2VsLiBSZWplY3RzIG9uIGluc3RhbGwgZmFpbHVyZSBzbyB0aGUgY2FsbGVyIGNhblxuICogZGlzdGluZ3Vpc2ggZXJyb3JzIGZyb20gdXNlciBjYW5jZWxsYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hBc3Npc3RhbnRJbnN0YWxsV2l6YXJkKFxuICByb290OiBSb290LFxuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHsgTmV3SW5zdGFsbFdpemFyZCwgY29tcHV0ZURlZmF1bHRJbnN0YWxsRGlyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJy4vY29tbWFuZHMvYXNzaXN0YW50L2Fzc2lzdGFudC5qcydcbiAgKVxuICBjb25zdCBkZWZhdWx0RGlyID0gYXdhaXQgY29tcHV0ZURlZmF1bHRJbnN0YWxsRGlyKClcbiAgbGV0IHJlamVjdFdpdGhFcnJvcjogKHJlYXNvbjogRXJyb3IpID0+IHZvaWRcbiAgY29uc3QgZXJyb3JQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICByZWplY3RXaXRoRXJyb3IgPSByZWplY3RcbiAgfSlcbiAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHNob3dTZXR1cERpYWxvZzxzdHJpbmcgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8TmV3SW5zdGFsbFdpemFyZFxuICAgICAgZGVmYXVsdERpcj17ZGVmYXVsdERpcn1cbiAgICAgIG9uSW5zdGFsbGVkPXtkaXIgPT4gZG9uZShkaXIpfVxuICAgICAgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9XG4gICAgICBvbkVycm9yPXttZXNzYWdlID0+XG4gICAgICAgIHJlamVjdFdpdGhFcnJvcihuZXcgRXJyb3IoYEluc3RhbGxhdGlvbiBmYWlsZWQ6ICR7bWVzc2FnZX1gKSlcbiAgICAgIH1cbiAgICAvPlxuICApKVxuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZXN1bHRQcm9taXNlLCBlcnJvclByb21pc2VdKVxufVxuXG4vKipcbiAqIFNpdGUgfjQ1NDk6IFRlbGVwb3J0UmVzdW1lV3JhcHBlciAoaW50ZXJhY3RpdmUgdGVsZXBvcnQgc2Vzc2lvbiBwaWNrZXIpLlxuICogT3JpZ2luYWwgY2FsbGJhY2sgd2lyaW5nOiBvbkNvbXBsZXRlPXtkb25lfSwgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9LCBzb3VyY2U9XCJjbGlBcmdcIi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFRlbGVwb3J0UmVzdW1lV3JhcHBlcihcbiAgcm9vdDogUm9vdCxcbik6IFByb21pc2U8VGVsZXBvcnRSZW1vdGVSZXNwb25zZSB8IG51bGw+IHtcbiAgY29uc3QgeyBUZWxlcG9ydFJlc3VtZVdyYXBwZXIgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi9jb21wb25lbnRzL1RlbGVwb3J0UmVzdW1lV3JhcHBlci5qcydcbiAgKVxuICByZXR1cm4gc2hvd1NldHVwRGlhbG9nPFRlbGVwb3J0UmVtb3RlUmVzcG9uc2UgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8VGVsZXBvcnRSZXN1bWVXcmFwcGVyXG4gICAgICBvbkNvbXBsZXRlPXtkb25lfVxuICAgICAgb25DYW5jZWw9eygpID0+IGRvbmUobnVsbCl9XG4gICAgICBzb3VyY2U9XCJjbGlBcmdcIlxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+NDU5NzogVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2cgKHBpY2sgYSBsb2NhbCBjaGVja291dCBvZiB0aGUgdGFyZ2V0IHJlcG8pLlxuICogT3JpZ2luYWwgY2FsbGJhY2sgd2lyaW5nOiBvblNlbGVjdFBhdGg9e2RvbmV9LCBvbkNhbmNlbD17KCkgPT4gZG9uZShudWxsKX0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hUZWxlcG9ydFJlcG9NaXNtYXRjaERpYWxvZyhcbiAgcm9vdDogUm9vdCxcbiAgcHJvcHM6IHtcbiAgICB0YXJnZXRSZXBvOiBzdHJpbmdcbiAgICBpbml0aWFsUGF0aHM6IHN0cmluZ1tdXG4gIH0sXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgeyBUZWxlcG9ydFJlcG9NaXNtYXRjaERpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL2NvbXBvbmVudHMvVGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2cuanMnXG4gIClcbiAgcmV0dXJuIHNob3dTZXR1cERpYWxvZzxzdHJpbmcgfCBudWxsPihyb290LCBkb25lID0+IChcbiAgICA8VGVsZXBvcnRSZXBvTWlzbWF0Y2hEaWFsb2dcbiAgICAgIHRhcmdldFJlcG89e3Byb3BzLnRhcmdldFJlcG99XG4gICAgICBpbml0aWFsUGF0aHM9e3Byb3BzLmluaXRpYWxQYXRoc31cbiAgICAgIG9uU2VsZWN0UGF0aD17ZG9uZX1cbiAgICAgIG9uQ2FuY2VsPXsoKSA9PiBkb25lKG51bGwpfVxuICAgIC8+XG4gICkpXG59XG5cbi8qKlxuICogU2l0ZSB+NDkwMzogUmVzdW1lQ29udmVyc2F0aW9uIG1vdW50IChpbnRlcmFjdGl2ZSBzZXNzaW9uIHBpY2tlcikuXG4gKiBVc2VzIHJlbmRlckFuZFJ1biwgTk9UIHNob3dTZXR1cERpYWxvZy4gV3JhcHMgaW4gPEFwcD48S2V5YmluZGluZ1NldHVwPi5cbiAqIFByZXNlcnZlcyBvcmlnaW5hbCBQcm9taXNlLmFsbCBwYXJhbGxlbGlzbSBiZXR3ZWVuIGdldFdvcmt0cmVlUGF0aHMgYW5kIGltcG9ydHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hSZXN1bWVDaG9vc2VyKFxuICByb290OiBSb290LFxuICBhcHBQcm9wczoge1xuICAgIGdldEZwc01ldHJpY3M6ICgpID0+IEZwc01ldHJpY3MgfCB1bmRlZmluZWRcbiAgICBzdGF0czogU3RhdHNTdG9yZVxuICAgIGluaXRpYWxTdGF0ZTogQXBwU3RhdGVcbiAgfSxcbiAgd29ya3RyZWVQYXRoc1Byb21pc2U6IFByb21pc2U8c3RyaW5nW10+LFxuICByZXN1bWVQcm9wczogT21pdDxSZXN1bWVDb252ZXJzYXRpb25Qcm9wcywgJ3dvcmt0cmVlUGF0aHMnPixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbd29ya3RyZWVQYXRocywgeyBSZXN1bWVDb252ZXJzYXRpb24gfSwgeyBBcHAgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgd29ya3RyZWVQYXRoc1Byb21pc2UsXG4gICAgaW1wb3J0KCcuL3NjcmVlbnMvUmVzdW1lQ29udmVyc2F0aW9uLmpzJyksXG4gICAgaW1wb3J0KCcuL2NvbXBvbmVudHMvQXBwLmpzJyksXG4gIF0pXG4gIGF3YWl0IHJlbmRlckFuZFJ1bihcbiAgICByb290LFxuICAgIDxBcHBcbiAgICAgIGdldEZwc01ldHJpY3M9e2FwcFByb3BzLmdldEZwc01ldHJpY3N9XG4gICAgICBzdGF0cz17YXBwUHJvcHMuc3RhdHN9XG4gICAgICBpbml0aWFsU3RhdGU9e2FwcFByb3BzLmluaXRpYWxTdGF0ZX1cbiAgICA+XG4gICAgICA8S2V5YmluZGluZ1NldHVwPlxuICAgICAgICA8UmVzdW1lQ29udmVyc2F0aW9uIHsuLi5yZXN1bWVQcm9wc30gd29ya3RyZWVQYXRocz17d29ya3RyZWVQYXRoc30gLz5cbiAgICAgIDwvS2V5YmluZGluZ1NldHVwPlxuICAgIDwvQXBwPixcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsY0FBY0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBQ3ZFLGNBQWNDLFVBQVUsUUFBUSxvQkFBb0I7QUFDcEQsY0FBY0MsSUFBSSxRQUFRLFVBQVU7QUFDcEMsU0FBU0MsWUFBWSxFQUFFQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3ZFLFNBQVNDLGVBQWUsUUFBUSwwQ0FBMEM7QUFDMUUsY0FB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
|
package/extract_prompt.ts
DELETED
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* extract_prompt.ts
|
|
3
|
-
* Extracts and prints the real Claude Code system prompt by directly
|
|
4
|
-
* reading and evaluating all prompt-generating functions from source.
|
|
5
|
-
* Run with: bun extract_prompt.ts
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// ── Mock bun:bundle feature() macro (always returns false for clean external build) ──
|
|
9
|
-
// We patch this before any module loads it
|
|
10
|
-
const Module = require('module')
|
|
11
|
-
const originalLoad = Module._load
|
|
12
|
-
Module._load = function (request: string, ...args: unknown[]) {
|
|
13
|
-
if (request === 'bun:bundle') {
|
|
14
|
-
return { feature: (_: string) => false }
|
|
15
|
-
}
|
|
16
|
-
return originalLoad.call(this, request, ...args)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// ── Read raw source file and extract string content from template literals ──
|
|
20
|
-
import { readFileSync } from 'fs'
|
|
21
|
-
import { join } from 'path'
|
|
22
|
-
|
|
23
|
-
const ROOT = import.meta.dir
|
|
24
|
-
|
|
25
|
-
function readSource(rel: string): string {
|
|
26
|
-
return readFileSync(join(ROOT, rel), 'utf-8')
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Extract all backtick template literal bodies from a function by name
|
|
30
|
-
function extractTemplateLiterals(src: string): string[] {
|
|
31
|
-
const results: string[] = []
|
|
32
|
-
let i = 0
|
|
33
|
-
while (i < src.length) {
|
|
34
|
-
if (src[i] === '`') {
|
|
35
|
-
let j = i + 1
|
|
36
|
-
let body = ''
|
|
37
|
-
while (j < src.length) {
|
|
38
|
-
if (src[j] === '\\') { body += src[j] + src[j+1]; j += 2; continue }
|
|
39
|
-
if (src[j] === '`') break
|
|
40
|
-
body += src[j]
|
|
41
|
-
j++
|
|
42
|
-
}
|
|
43
|
-
results.push(body)
|
|
44
|
-
i = j + 1
|
|
45
|
-
} else {
|
|
46
|
-
i++
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return results
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// ── Extract sections from prompts.ts ────────────────────────────────────────
|
|
53
|
-
|
|
54
|
-
const promptsSrc = readSource('constants/prompts.ts')
|
|
55
|
-
const systemSrc = readSource('constants/system.ts')
|
|
56
|
-
const coordSrc = readSource('coordinator/coordinatorMode.ts')
|
|
57
|
-
const cyberSrc = readSource('constants/cyberRiskInstruction.ts')
|
|
58
|
-
|
|
59
|
-
// Pull CYBER_RISK_INSTRUCTION
|
|
60
|
-
const cyberMatch = cyberSrc.match(/CYBER_RISK_INSTRUCTION\s*=\s*`([^`]+)`/)
|
|
61
|
-
const CYBER_RISK = cyberMatch?.[1] ?? '[cyber risk instruction not found]'
|
|
62
|
-
|
|
63
|
-
// Pull coordinator system prompt (between the return template literal)
|
|
64
|
-
const coordMatch = coordSrc.match(/return\s*`(You are Claude Code, an AI assistant[\s\S]+?)`\s*\}/)
|
|
65
|
-
const COORDINATOR_PROMPT = coordMatch?.[1] ?? '[coordinator prompt not found]'
|
|
66
|
-
|
|
67
|
-
// Helper: extract named function body
|
|
68
|
-
function getFunctionBody(src: string, fnName: string): string {
|
|
69
|
-
const idx = src.indexOf(`function ${fnName}(`)
|
|
70
|
-
if (idx === -1) return `[${fnName} not found]`
|
|
71
|
-
let depth = 0
|
|
72
|
-
let start = -1
|
|
73
|
-
for (let i = idx; i < src.length; i++) {
|
|
74
|
-
if (src[i] === '{') { if (start === -1) start = i; depth++ }
|
|
75
|
-
else if (src[i] === '}') { depth--; if (depth === 0) return src.slice(start, i+1) }
|
|
76
|
-
}
|
|
77
|
-
return `[${fnName} body unterminated]`
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Extract all return template strings from a function
|
|
81
|
-
function getReturnStrings(fnBody: string): string[] {
|
|
82
|
-
// Find return `...` blocks
|
|
83
|
-
const results: string[] = []
|
|
84
|
-
const matches = fnBody.matchAll(/return\s*`([\s\S]*?)`/g)
|
|
85
|
-
for (const m of matches) results.push(m[1])
|
|
86
|
-
return results
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ── Manually inline relevant prompt section text ─────────────────────────────
|
|
90
|
-
|
|
91
|
-
// 1. getSimpleIntroSection
|
|
92
|
-
const introFn = getFunctionBody(promptsSrc, 'getSimpleIntroSection')
|
|
93
|
-
const introStr = getReturnStrings(introFn)
|
|
94
|
-
|
|
95
|
-
// 2. getSimpleSystemSection
|
|
96
|
-
const sysFn = getFunctionBody(promptsSrc, 'getSimpleSystemSection')
|
|
97
|
-
|
|
98
|
-
// 3. getSimpleDoingTasksSection
|
|
99
|
-
const doingFn = getFunctionBody(promptsSrc, 'getSimpleDoingTasksSection')
|
|
100
|
-
|
|
101
|
-
// 4. getActionsSection
|
|
102
|
-
const actionsFn = getFunctionBody(promptsSrc, 'getActionsSection')
|
|
103
|
-
const actionsStr = getReturnStrings(actionsFn)
|
|
104
|
-
|
|
105
|
-
// 5. getOutputEfficiencySection
|
|
106
|
-
const effFn = getFunctionBody(promptsSrc, 'getOutputEfficiencySection')
|
|
107
|
-
const effStrings = getReturnStrings(effFn)
|
|
108
|
-
|
|
109
|
-
// 6. computeSimpleEnvInfo - template
|
|
110
|
-
const envFn = getFunctionBody(promptsSrc, 'computeSimpleEnvInfo')
|
|
111
|
-
const envTemplate = getReturnStrings(envFn)
|
|
112
|
-
|
|
113
|
-
// 7. getScratchpadInstructions
|
|
114
|
-
const scratchFn = getFunctionBody(promptsSrc, 'getScratchpadInstructions')
|
|
115
|
-
const scratchStr = getReturnStrings(scratchFn)
|
|
116
|
-
|
|
117
|
-
// 8. DEFAULT_AGENT_PROMPT
|
|
118
|
-
const agentMatch = promptsSrc.match(/DEFAULT_AGENT_PROMPT\s*=\s*`([^`]+)`/)
|
|
119
|
-
const DEFAULT_AGENT_PROMPT = agentMatch?.[1] ?? '[not found]'
|
|
120
|
-
|
|
121
|
-
// 9. SUMMARIZE_TOOL_RESULTS_SECTION
|
|
122
|
-
const sumMatch = promptsSrc.match(/SUMMARIZE_TOOL_RESULTS_SECTION\s*=\s*`([^`]+)`/)
|
|
123
|
-
const SUMMARIZE = sumMatch?.[1] ?? '[not found]'
|
|
124
|
-
|
|
125
|
-
// 10. getSystemRemindersSection
|
|
126
|
-
const remMatch = promptsSrc.match(/function getSystemRemindersSection[\s\S]*?return\s*`([\s\S]*?)`/)
|
|
127
|
-
const SYSTEM_REMINDERS = remMatch?.[1] ?? '[not found]'
|
|
128
|
-
|
|
129
|
-
// 11. getHooksSection
|
|
130
|
-
const hooksMatch = promptsSrc.match(/function getHooksSection[\s\S]*?return\s*`([\s\S]*?)`/)
|
|
131
|
-
const HOOKS = hooksMatch?.[1] ?? '[not found]'
|
|
132
|
-
|
|
133
|
-
// 12. getFunctionResultClearingSection template
|
|
134
|
-
const frcMatch = promptsSrc.match(/return\s*`# Function Result Clearing[\s\S]*?`/)
|
|
135
|
-
const FRC = frcMatch?.[0]?.replace(/^return\s*`/, '').replace(/`$/, '') ?? '[not found]'
|
|
136
|
-
|
|
137
|
-
// 13. Token budget section
|
|
138
|
-
const tokenMatch = promptsSrc.match(/'token_budget',\s*\(\)\s*=>\s*'([\s\S]*?)',/)
|
|
139
|
-
const TOKEN_BUDGET = tokenMatch?.[1] ?? '[not found]'
|
|
140
|
-
|
|
141
|
-
// 14. Proactive section
|
|
142
|
-
const proactiveFn = getFunctionBody(promptsSrc, 'getProactiveSection')
|
|
143
|
-
const proactiveStr = getReturnStrings(proactiveFn)
|
|
144
|
-
|
|
145
|
-
// 15. getSimpleToneAndStyleSection items
|
|
146
|
-
const toneFn = getFunctionBody(promptsSrc, 'getSimpleToneAndStyleSection')
|
|
147
|
-
|
|
148
|
-
// 16. getMcpInstructions template
|
|
149
|
-
const mcpMatch = promptsSrc.match(/return\s*`# MCP Server Instructions[\s\S]*?`/)
|
|
150
|
-
const MCP_TEMPLATE = mcpMatch?.[0]?.replace(/^return\s*`/, '').replace(/`$/, '') ?? '[not found]'
|
|
151
|
-
|
|
152
|
-
// ── Build and print the full prompt ──────────────────────────────────────────
|
|
153
|
-
|
|
154
|
-
const HR = '\n' + '='.repeat(80) + '\n'
|
|
155
|
-
const output: string[] = []
|
|
156
|
-
|
|
157
|
-
output.push(`# CLAUDE CODE — REAL SYSTEM PROMPT (Extracted from Source)`)
|
|
158
|
-
output.push(`Generated by extract_prompt.ts — reads directly from constants/prompts.ts\n`)
|
|
159
|
-
|
|
160
|
-
output.push(HR)
|
|
161
|
-
output.push(`## SECTION 0 — IDENTITY PREFIX`)
|
|
162
|
-
output.push(`\`\`\``)
|
|
163
|
-
output.push(`You are Claude Code, Anthropic's official CLI for Claude.`)
|
|
164
|
-
output.push(`\`\`\``)
|
|
165
|
-
|
|
166
|
-
output.push(HR)
|
|
167
|
-
output.push(`## SECTION 1 — SIMPLE MODE (env CLAUDE_CODE_SIMPLE=1)`)
|
|
168
|
-
output.push(`\`\`\``)
|
|
169
|
-
output.push(`You are Claude Code, Anthropic's official CLI for Claude.\n\nCWD: <cwd>\nDate: <session start date>`)
|
|
170
|
-
output.push(`\`\`\``)
|
|
171
|
-
|
|
172
|
-
output.push(HR)
|
|
173
|
-
output.push(`## SECTION 2 — INTRO (getSimpleIntroSection)`)
|
|
174
|
-
output.push(`\`\`\``)
|
|
175
|
-
output.push(`\nYou are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\n${CYBER_RISK}\nIMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.`)
|
|
176
|
-
output.push(`\`\`\``)
|
|
177
|
-
|
|
178
|
-
output.push(HR)
|
|
179
|
-
output.push(`## SECTION 3 — SYSTEM (getSimpleSystemSection)`)
|
|
180
|
-
// Extract bullet items from the array literal in getSimpleSystemSection
|
|
181
|
-
const systemItemsMatch = promptsSrc.match(/function getSimpleSystemSection[\s\S]*?const items = \[([\s\S]*?)\]/m)
|
|
182
|
-
if (systemItemsMatch) {
|
|
183
|
-
// Pull backtick strings out of the items array
|
|
184
|
-
const itemsBlock = systemItemsMatch[1]
|
|
185
|
-
const ticks = extractTemplateLiterals(itemsBlock)
|
|
186
|
-
|
|
187
|
-
// Replace HOOKS placeholder
|
|
188
|
-
const finalItems = ticks.map(t => t.replace(/\${getHooksSection\(\)}/, HOOKS))
|
|
189
|
-
|
|
190
|
-
output.push(`\`\`\``)
|
|
191
|
-
output.push(`# System`)
|
|
192
|
-
finalItems.forEach(item => output.push(` - ${item}`))
|
|
193
|
-
output.push(`\`\`\``)
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
output.push(HR)
|
|
197
|
-
output.push(`## SECTION 4 — ACTIONS (getActionsSection)`)
|
|
198
|
-
output.push(`\`\`\``)
|
|
199
|
-
if (actionsStr[0]) output.push(actionsStr[0].replace(/\\n/g, '\n'))
|
|
200
|
-
output.push(`\`\`\``)
|
|
201
|
-
|
|
202
|
-
output.push(HR)
|
|
203
|
-
output.push(`## SECTION 5 — DOING TASKS (getSimpleDoingTasksSection) — key items`)
|
|
204
|
-
// Extract the outer items array
|
|
205
|
-
const doingItemsRegex = /`The user will primarily[\s\S]*?`/g
|
|
206
|
-
const doingMatches = [...doingFn.matchAll(/`([^`]{20,})`/g)].map(m => m[1]).filter(s => !s.includes('${'))
|
|
207
|
-
output.push(`\`\`\``)
|
|
208
|
-
output.push(`# Doing tasks`)
|
|
209
|
-
doingMatches.slice(0, 15).forEach(i => output.push(` - ${i}`))
|
|
210
|
-
output.push(`\`\`\``)
|
|
211
|
-
|
|
212
|
-
output.push(HR)
|
|
213
|
-
output.push(`## SECTION 6 — TONE AND STYLE (getSimpleToneAndStyleSection)`)
|
|
214
|
-
const toneItems = [...toneFn.matchAll(/`([^`]{20,})`/g)].map(m => m[1]).filter(s => !s.includes('${'))
|
|
215
|
-
output.push(`\`\`\``)
|
|
216
|
-
output.push(`# Tone and style`)
|
|
217
|
-
toneItems.forEach(i => output.push(` - ${i}`))
|
|
218
|
-
output.push(`\`\`\``)
|
|
219
|
-
|
|
220
|
-
output.push(HR)
|
|
221
|
-
output.push(`## SECTION 7 — OUTPUT EFFICIENCY (getOutputEfficiencySection)`)
|
|
222
|
-
output.push(`\`\`\``)
|
|
223
|
-
if (effStrings[1]) output.push(effStrings[1])
|
|
224
|
-
else if (effStrings[0]) output.push(effStrings[0])
|
|
225
|
-
output.push(`\`\`\``)
|
|
226
|
-
|
|
227
|
-
output.push(HR)
|
|
228
|
-
output.push(`## SECTION 8 — ENVIRONMENT (computeSimpleEnvInfo) — template`)
|
|
229
|
-
output.push(`\`\`\``)
|
|
230
|
-
output.push(`# Environment
|
|
231
|
-
You have been invoked in the following environment:
|
|
232
|
-
- Primary working directory: <cwd>
|
|
233
|
-
- Is a git repository: Yes/No
|
|
234
|
-
- Platform: darwin/linux/win32
|
|
235
|
-
- Shell: zsh/bash
|
|
236
|
-
- OS Version: Darwin 25.x.x
|
|
237
|
-
- You are powered by the model named <model>. The exact model ID is <model-id>.
|
|
238
|
-
- Assistant knowledge cutoff is <date>.
|
|
239
|
-
- The most recent Claude model family is Claude 4.5/4.6. Model IDs — Opus 4.6: 'claude-opus-4-6', Sonnet 4.6: 'claude-sonnet-4-6', Haiku 4.5: 'claude-haiku-4-5-20251001'. When building AI applications, default to the latest and most capable Claude models.
|
|
240
|
-
- Claude Code is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).
|
|
241
|
-
- Fast mode for Claude Code uses the same Claude Opus 4.6 model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`)
|
|
242
|
-
output.push(`\`\`\``)
|
|
243
|
-
|
|
244
|
-
output.push(HR)
|
|
245
|
-
output.push(`## SECTION 9 — SYSTEM REMINDERS (getSystemRemindersSection)`)
|
|
246
|
-
output.push(`\`\`\``)
|
|
247
|
-
output.push(SYSTEM_REMINDERS)
|
|
248
|
-
output.push(`\`\`\``)
|
|
249
|
-
|
|
250
|
-
output.push(HR)
|
|
251
|
-
output.push(`## SECTION 10 — SUMMARIZE TOOL RESULTS`)
|
|
252
|
-
output.push(`\`\`\``)
|
|
253
|
-
output.push(SUMMARIZE)
|
|
254
|
-
output.push(`\`\`\``)
|
|
255
|
-
|
|
256
|
-
output.push(HR)
|
|
257
|
-
output.push(`## SECTION 11 — SCRATCHPAD DIRECTORY (getScratchpadInstructions)`)
|
|
258
|
-
output.push(`\`\`\``)
|
|
259
|
-
if (scratchStr[0]) output.push(scratchStr[0])
|
|
260
|
-
output.push(`\`\`\``)
|
|
261
|
-
|
|
262
|
-
output.push(HR)
|
|
263
|
-
output.push(`## SECTION 12 — MCP SERVER INSTRUCTIONS TEMPLATE`)
|
|
264
|
-
output.push(`\`\`\``)
|
|
265
|
-
output.push(MCP_TEMPLATE)
|
|
266
|
-
output.push(`\`\`\``)
|
|
267
|
-
|
|
268
|
-
output.push(HR)
|
|
269
|
-
output.push(`## SECTION 13 — FUNCTION RESULT CLEARING`)
|
|
270
|
-
output.push(`\`\`\``)
|
|
271
|
-
output.push(FRC)
|
|
272
|
-
output.push(`\`\`\``)
|
|
273
|
-
|
|
274
|
-
output.push(HR)
|
|
275
|
-
output.push(`## SECTION 14 — TOKEN BUDGET`)
|
|
276
|
-
output.push(`\`\`\``)
|
|
277
|
-
output.push(TOKEN_BUDGET)
|
|
278
|
-
output.push(`\`\`\``)
|
|
279
|
-
|
|
280
|
-
output.push(HR)
|
|
281
|
-
output.push(`## SECTION 15 — DEFAULT AGENT PROMPT`)
|
|
282
|
-
output.push(`\`\`\``)
|
|
283
|
-
output.push(DEFAULT_AGENT_PROMPT)
|
|
284
|
-
output.push(`\`\`\``)
|
|
285
|
-
|
|
286
|
-
output.push(HR)
|
|
287
|
-
output.push(`## SECTION 16 — COORDINATOR MODE SYSTEM PROMPT`)
|
|
288
|
-
output.push(`\`\`\``)
|
|
289
|
-
output.push(COORDINATOR_PROMPT)
|
|
290
|
-
output.push(`\`\`\``)
|
|
291
|
-
|
|
292
|
-
output.push(HR)
|
|
293
|
-
output.push(`## SECTION 17 — AUTONOMOUS / PROACTIVE MODE SECTION`)
|
|
294
|
-
output.push(`\`\`\``)
|
|
295
|
-
if (proactiveStr[0]) output.push(proactiveStr[0])
|
|
296
|
-
output.push(`\`\`\``)
|
|
297
|
-
|
|
298
|
-
const finalOutput = output.join('\n')
|
|
299
|
-
console.log(finalOutput)
|
|
300
|
-
|
|
301
|
-
// Also write to file
|
|
302
|
-
import { writeFileSync } from 'fs'
|
|
303
|
-
writeFileSync(join(ROOT, 'SYSTEM_PROMPT_EXTRACTED.md'), finalOutput, 'utf-8')
|
|
304
|
-
console.error('\n\nWritten to SYSTEM_PROMPT_EXTRACTED.md')
|
package/inspect.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const inputPath = 'components/PromptInput/PromptInput.tsx';
|
|
3
|
-
const src = fs.readFileSync(inputPath, 'utf8');
|
|
4
|
-
|
|
5
|
-
// Extract the prompt rendering logic to understand it
|
|
6
|
-
const match = src.match(/borderLeft=\{messages\.length === 0.*?(?=minHeight=\{messages\.length)/s);
|
|
7
|
-
console.log(match ? match[0] : "Not found");
|