surfcode 0.0.0-stage → 0.1.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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -2
  3. package/assets/surfcode-logo.gif +0 -0
  4. package/dist/cli/auth.js +315 -0
  5. package/dist/cli/auth.js.map +1 -0
  6. package/dist/cli/config.js +228 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/headless.js +355 -0
  9. package/dist/cli/headless.js.map +1 -0
  10. package/dist/cli/inspect.js +462 -0
  11. package/dist/cli/inspect.js.map +1 -0
  12. package/dist/cli/interactive.js +130 -0
  13. package/dist/cli/interactive.js.map +1 -0
  14. package/dist/cli/sessions.js +170 -0
  15. package/dist/cli/sessions.js.map +1 -0
  16. package/dist/cli/sync.js +190 -0
  17. package/dist/cli/sync.js.map +1 -0
  18. package/dist/cli/util.js +345 -0
  19. package/dist/cli/util.js.map +1 -0
  20. package/dist/cli.js +485 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/core/agent.js +281 -0
  23. package/dist/core/agent.js.map +1 -0
  24. package/dist/core/agents.js +55 -0
  25. package/dist/core/agents.js.map +1 -0
  26. package/dist/core/auth.js +107 -0
  27. package/dist/core/auth.js.map +1 -0
  28. package/dist/core/catalog.js +306 -0
  29. package/dist/core/catalog.js.map +1 -0
  30. package/dist/core/chat/anthropic.js +222 -0
  31. package/dist/core/chat/anthropic.js.map +1 -0
  32. package/dist/core/chat/common.js +367 -0
  33. package/dist/core/chat/common.js.map +1 -0
  34. package/dist/core/chat/google.js +180 -0
  35. package/dist/core/chat/google.js.map +1 -0
  36. package/dist/core/chat/index.js +80 -0
  37. package/dist/core/chat/index.js.map +1 -0
  38. package/dist/core/chat/openai.js +164 -0
  39. package/dist/core/chat/openai.js.map +1 -0
  40. package/dist/core/chat/types.js +2 -0
  41. package/dist/core/chat/types.js.map +1 -0
  42. package/dist/core/clipboard.js +34 -0
  43. package/dist/core/clipboard.js.map +1 -0
  44. package/dist/core/compact.js +39 -0
  45. package/dist/core/compact.js.map +1 -0
  46. package/dist/core/config.js +211 -0
  47. package/dist/core/config.js.map +1 -0
  48. package/dist/core/delegate.js +184 -0
  49. package/dist/core/delegate.js.map +1 -0
  50. package/dist/core/effort.js +80 -0
  51. package/dist/core/effort.js.map +1 -0
  52. package/dist/core/errors.js +32 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/free.js +21 -0
  55. package/dist/core/free.js.map +1 -0
  56. package/dist/core/github.js +445 -0
  57. package/dist/core/github.js.map +1 -0
  58. package/dist/core/paths.js +51 -0
  59. package/dist/core/paths.js.map +1 -0
  60. package/dist/core/prompt.js +95 -0
  61. package/dist/core/prompt.js.map +1 -0
  62. package/dist/core/provider.js +298 -0
  63. package/dist/core/provider.js.map +1 -0
  64. package/dist/core/session.js +159 -0
  65. package/dist/core/session.js.map +1 -0
  66. package/dist/core/sync.js +126 -0
  67. package/dist/core/sync.js.map +1 -0
  68. package/dist/core/types.js +2 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/core/usage.js +127 -0
  71. package/dist/core/usage.js.map +1 -0
  72. package/dist/core/workspace.js +70 -0
  73. package/dist/core/workspace.js.map +1 -0
  74. package/dist/data/models.json +1 -0
  75. package/dist/sync/server.js +179 -0
  76. package/dist/sync/server.js.map +1 -0
  77. package/dist/tools/diff.js +21 -0
  78. package/dist/tools/diff.js.map +1 -0
  79. package/dist/tools/files.js +227 -0
  80. package/dist/tools/files.js.map +1 -0
  81. package/dist/tools/github.js +238 -0
  82. package/dist/tools/github.js.map +1 -0
  83. package/dist/tools/index.js +34 -0
  84. package/dist/tools/index.js.map +1 -0
  85. package/dist/tools/search.js +231 -0
  86. package/dist/tools/search.js.map +1 -0
  87. package/dist/tools/shell.js +118 -0
  88. package/dist/tools/shell.js.map +1 -0
  89. package/dist/tools/todos.js +50 -0
  90. package/dist/tools/todos.js.map +1 -0
  91. package/dist/tools/webfetch.js +108 -0
  92. package/dist/tools/webfetch.js.map +1 -0
  93. package/dist/tui/App.js +3002 -0
  94. package/dist/tui/App.js.map +1 -0
  95. package/dist/tui/ansi.js +151 -0
  96. package/dist/tui/ansi.js.map +1 -0
  97. package/dist/tui/commands.js +61 -0
  98. package/dist/tui/commands.js.map +1 -0
  99. package/dist/tui/explorer.js +152 -0
  100. package/dist/tui/explorer.js.map +1 -0
  101. package/dist/tui/icons.js +21 -0
  102. package/dist/tui/icons.js.map +1 -0
  103. package/dist/tui/layout.js +324 -0
  104. package/dist/tui/layout.js.map +1 -0
  105. package/dist/tui/markdown.js +335 -0
  106. package/dist/tui/markdown.js.map +1 -0
  107. package/dist/tui/overlays.js +316 -0
  108. package/dist/tui/overlays.js.map +1 -0
  109. package/dist/tui/render.js +234 -0
  110. package/dist/tui/render.js.map +1 -0
  111. package/dist/tui/theme.js +148 -0
  112. package/dist/tui/theme.js.map +1 -0
  113. package/dist/tui/types.js +73 -0
  114. package/dist/tui/types.js.map +1 -0
  115. package/dist/version.js +3 -0
  116. package/dist/version.js.map +1 -0
  117. package/package.json +75 -4
@@ -0,0 +1,445 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { chmod, mkdtemp, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join, relative } from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { getStoredKey, mask } from './auth.js';
7
+ import { SurfError, errorMessage } from './errors.js';
8
+ import { resolveWorkspacePath } from './workspace.js';
9
+ const execFileAsync = promisify(execFile);
10
+ const API = 'https://api.github.com';
11
+ const TOKEN_KEY = 'github';
12
+ const TOKEN_ENV = ['GITHUB_TOKEN', 'GH_TOKEN'];
13
+ const REPO_PART = /^[A-Za-z0-9._-]{1,100}$/;
14
+ function validRepoPart(part) {
15
+ return REPO_PART.test(part) && part !== '.' && part !== '..';
16
+ }
17
+ const DEFAULT_EXCLUDES = [
18
+ '.git',
19
+ 'node_modules',
20
+ 'bower_components',
21
+ 'dist',
22
+ 'build',
23
+ 'out',
24
+ 'coverage',
25
+ '.next',
26
+ '.nuxt',
27
+ '.svelte-kit',
28
+ '.turbo',
29
+ '.cache',
30
+ '.parcel-cache',
31
+ '.yarn',
32
+ '.pnpm-store',
33
+ '.venv',
34
+ 'venv',
35
+ '__pycache__',
36
+ '.pytest_cache',
37
+ '.mypy_cache',
38
+ '.ruff_cache'
39
+ ];
40
+ export async function githubTokenStatus() {
41
+ const stored = await getStoredKey(TOKEN_KEY);
42
+ if (stored)
43
+ return { configured: true, source: 'auth', masked: mask(stored) };
44
+ for (const name of TOKEN_ENV) {
45
+ const value = process.env[name]?.trim();
46
+ if (value)
47
+ return { configured: true, source: 'env', envName: name, masked: mask(value) };
48
+ }
49
+ return { configured: false };
50
+ }
51
+ export async function getGithubToken() {
52
+ const stored = await getStoredKey(TOKEN_KEY);
53
+ if (stored)
54
+ return stored;
55
+ for (const name of TOKEN_ENV) {
56
+ const value = process.env[name]?.trim();
57
+ if (value)
58
+ return value;
59
+ }
60
+ return undefined;
61
+ }
62
+ export async function requireGithubToken() {
63
+ const token = await getGithubToken();
64
+ if (!token) {
65
+ throw new SurfError('No GitHub token is configured.', {
66
+ hint: 'Run /github login in the TUI, `surf auth github`, or set GITHUB_TOKEN. Never paste a token into the chat.'
67
+ });
68
+ }
69
+ return token;
70
+ }
71
+ export function parseGithubRepo(input) {
72
+ const cleaned = input
73
+ .trim()
74
+ .replace(/^https?:\/\/github\.com\//i, '')
75
+ .replace(/\.git$/i, '')
76
+ .replace(/\/+$/, '');
77
+ const parts = cleaned.split('/').filter(Boolean);
78
+ if (parts.length === 1) {
79
+ const name = parts[0];
80
+ if (!validRepoPart(name)) {
81
+ throw new SurfError(`Invalid repository name "${name}".`, {
82
+ hint: 'Use letters, numbers, dots, dashes, or underscores.'
83
+ });
84
+ }
85
+ return { name };
86
+ }
87
+ if (parts.length === 2) {
88
+ const owner = parts[0];
89
+ const name = parts[1];
90
+ if (!validRepoPart(owner) || !validRepoPart(name)) {
91
+ throw new SurfError(`Invalid GitHub repository "${input}".`, {
92
+ hint: 'Use owner/name, for example surfcode/demo.'
93
+ });
94
+ }
95
+ return { owner, name };
96
+ }
97
+ throw new SurfError(`Invalid GitHub repository "${input}".`, {
98
+ hint: 'Use a repository name or owner/name.'
99
+ });
100
+ }
101
+ export async function githubViewer(token) {
102
+ const data = await githubRequest('/user', { token });
103
+ if (typeof data.login !== 'string' || !data.login) {
104
+ throw new SurfError('GitHub returned an unexpected user response.');
105
+ }
106
+ return {
107
+ login: data.login,
108
+ name: typeof data.name === 'string' ? data.name : undefined,
109
+ htmlUrl: typeof data.html_url === 'string' ? data.html_url : undefined
110
+ };
111
+ }
112
+ export async function createGithubRepository(options) {
113
+ if (typeof options.private !== 'boolean') {
114
+ throw new SurfError('Specify whether the repository is private.', {
115
+ hint: 'Pass private: true for a private repository or private: false for a public one.'
116
+ });
117
+ }
118
+ const parsed = parseGithubRepo(options.name);
119
+ const owner = options.owner?.trim() || parsed.owner;
120
+ const viewer = await githubViewer(options.token);
121
+ const target = owner && owner.toLowerCase() !== viewer.login.toLowerCase()
122
+ ? `/orgs/${encodeURIComponent(owner)}/repos`
123
+ : '/user/repos';
124
+ const data = await githubRequest(target, {
125
+ token: options.token,
126
+ method: 'POST',
127
+ body: {
128
+ name: parsed.name,
129
+ private: options.private,
130
+ description: options.description?.slice(0, 350) || undefined,
131
+ auto_init: false,
132
+ has_issues: true,
133
+ has_projects: false,
134
+ has_wiki: false
135
+ }
136
+ });
137
+ return repositoryFromApi(data);
138
+ }
139
+ export async function githubGitState(cwd) {
140
+ const inside = await gitMaybe(cwd, ['rev-parse', '--is-inside-work-tree']);
141
+ if (inside?.trim() !== 'true') {
142
+ return { repo: false, dirty: false, commits: 0 };
143
+ }
144
+ const [symbolic, head, remote, status, count] = await Promise.all([
145
+ gitMaybe(cwd, ['symbolic-ref', '--short', 'HEAD']),
146
+ gitMaybe(cwd, ['rev-parse', '--abbrev-ref', 'HEAD']),
147
+ gitMaybe(cwd, ['remote', 'get-url', 'origin']),
148
+ gitMaybe(cwd, ['status', '--porcelain']),
149
+ gitMaybe(cwd, ['rev-list', '--count', 'HEAD'])
150
+ ]);
151
+ return {
152
+ repo: true,
153
+ // An empty repository has no HEAD commit yet, but symbolic-ref still
154
+ // names the unborn branch, which is exactly what the first push needs.
155
+ branch: symbolic?.trim() || head?.trim() || undefined,
156
+ remote: remote?.trim() ? sanitizeRemoteUrl(remote.trim()) : undefined,
157
+ dirty: Boolean(status?.trim()),
158
+ commits: Number.parseInt(count?.trim() || '0', 10) || 0
159
+ };
160
+ }
161
+ export async function ensureGitRepository(cwd) {
162
+ const before = await githubGitState(cwd);
163
+ if (before.repo)
164
+ return { created: false, state: before };
165
+ try {
166
+ await runGit(cwd, ['init', '-b', 'main']);
167
+ }
168
+ catch {
169
+ await runGit(cwd, ['init']);
170
+ await runGit(cwd, ['symbolic-ref', 'HEAD', 'refs/heads/main']);
171
+ }
172
+ return { created: true, state: await githubGitState(cwd) };
173
+ }
174
+ export async function gitRemote(cwd) {
175
+ const url = await gitMaybe(cwd, ['remote', 'get-url', 'origin']);
176
+ return url?.trim() ? sanitizeRemoteUrl(url.trim()) : undefined;
177
+ }
178
+ export async function setGithubRemote(cwd, cloneUrl, replace = false) {
179
+ const clean = sanitizeRemoteUrl(cloneUrl);
180
+ const existing = await gitRemote(cwd);
181
+ if (existing && !replace)
182
+ return { changed: false, existing, remote: existing };
183
+ if (existing)
184
+ await runGit(cwd, ['remote', 'set-url', 'origin', clean]);
185
+ else
186
+ await runGit(cwd, ['remote', 'add', 'origin', clean]);
187
+ return { changed: true, remote: clean };
188
+ }
189
+ /**
190
+ * Stage a change set, commit it, and push with the token supplied through an
191
+ * askpass helper. The token never appears in a URL, the git config, or argv.
192
+ */
193
+ export async function publishToGithub(cwd, options) {
194
+ const token = await requireGithubToken();
195
+ const message = options.message.trim();
196
+ if (!message)
197
+ throw new SurfError('A commit message is required.');
198
+ if (message.length > 4_000)
199
+ throw new SurfError('The commit message is too long.');
200
+ if (/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(message)) {
201
+ throw new SurfError('The commit message contains control characters.');
202
+ }
203
+ const { state } = await ensureGitRepository(cwd);
204
+ const remote = state.remote ?? (await gitRemote(cwd));
205
+ if (!remote) {
206
+ throw new SurfError('This project has no origin remote.', {
207
+ hint: 'Use github_create_repo first, or add an origin remote and try again.'
208
+ });
209
+ }
210
+ await stage(cwd, options.files);
211
+ const staged = (await runGit(cwd, ['diff', '--cached', '--name-only']))
212
+ .split('\n')
213
+ .map((line) => line.trim())
214
+ .filter(Boolean);
215
+ const branch = options.branch?.trim() || (await currentBranch(cwd)) || 'main';
216
+ if (!/^[A-Za-z0-9._/-]{1,240}$/.test(branch) || branch.startsWith('-') || branch.includes('..')) {
217
+ throw new SurfError(`Invalid branch name "${branch}".`);
218
+ }
219
+ let commit;
220
+ if (staged.length > 0) {
221
+ commit = await commitWithHint(cwd, message);
222
+ }
223
+ else if (state.commits === 0) {
224
+ throw new SurfError('Nothing was staged for the first commit.', {
225
+ hint: 'Check .gitignore, or pass specific files to upload.'
226
+ });
227
+ }
228
+ let pushed = false;
229
+ if (options.push !== false) {
230
+ await withAskpass(token, async (env) => {
231
+ await runGit(cwd, ['push', '-u', 'origin', `HEAD:${branch}`], { env, timeout: 180_000 });
232
+ });
233
+ pushed = true;
234
+ }
235
+ return {
236
+ branch,
237
+ commit,
238
+ remote,
239
+ pushed,
240
+ files: staged,
241
+ nothingToCommit: staged.length === 0
242
+ };
243
+ }
244
+ export function sanitizeRemoteUrl(value) {
245
+ const trimmed = value.trim();
246
+ try {
247
+ const url = new URL(trimmed);
248
+ if (url.username || url.password) {
249
+ url.username = '';
250
+ url.password = '';
251
+ }
252
+ return url.toString().replace(/\/$/, '');
253
+ }
254
+ catch {
255
+ return trimmed.replace(/\/\/[^/@\s]+@/, '//');
256
+ }
257
+ }
258
+ export function redactToken(text, token) {
259
+ if (!token)
260
+ return text;
261
+ return text.split(token).join('[redacted]');
262
+ }
263
+ async function stage(cwd, files) {
264
+ if (files && files.length > 0) {
265
+ const paths = files
266
+ .map((file) => file.trim())
267
+ .filter(Boolean)
268
+ .map((file) => {
269
+ if (file.startsWith(':') || file.startsWith('!')) {
270
+ throw new SurfError(`Unsupported pathspec "${file}".`, {
271
+ hint: 'Pass ordinary workspace-relative file or directory paths.'
272
+ });
273
+ }
274
+ const resolved = resolveWorkspacePath(file, cwd, false);
275
+ if (resolved.relative === '.')
276
+ throw new SurfError('Pass a file or directory, not the workspace root.');
277
+ return relative(cwd, resolved.absolute).split('\\').join('/');
278
+ });
279
+ if (paths.length === 0)
280
+ throw new SurfError('No files were selected.');
281
+ await runGit(cwd, ['add', '--', ...paths]);
282
+ return;
283
+ }
284
+ await runGit(cwd, [
285
+ 'add',
286
+ '-A',
287
+ '--',
288
+ '.',
289
+ ...DEFAULT_EXCLUDES.map((directory) => `:(exclude)${directory}`)
290
+ ]);
291
+ }
292
+ async function currentBranch(cwd) {
293
+ return (await gitMaybe(cwd, ['symbolic-ref', '--short', 'HEAD']))?.trim() || undefined;
294
+ }
295
+ async function commitWithHint(cwd, message) {
296
+ try {
297
+ await runGit(cwd, ['commit', '-m', message]);
298
+ }
299
+ catch (error) {
300
+ const text = errorMessage(error);
301
+ if (/user\.name|user\.email|author identity|empty ident/i.test(text)) {
302
+ throw new SurfError('Git needs an author identity before it can commit.', {
303
+ hint: 'Run `git config user.name "Your Name"` and `git config user.email "you@example.com"`, then retry.'
304
+ });
305
+ }
306
+ throw error;
307
+ }
308
+ return (await runGit(cwd, ['rev-parse', '--short', 'HEAD'])).trim();
309
+ }
310
+ async function runGit(cwd, args, options = {}) {
311
+ try {
312
+ const { stdout } = await execFileAsync('git', args, {
313
+ cwd,
314
+ timeout: options.timeout ?? 120_000,
315
+ maxBuffer: 10 * 1024 * 1024,
316
+ env: { ...process.env, ...options.env },
317
+ windowsHide: true
318
+ });
319
+ return stdout;
320
+ }
321
+ catch (error) {
322
+ const failure = error;
323
+ if (failure.code === 'ENOENT') {
324
+ throw new SurfError('Git is not installed or is not on PATH.');
325
+ }
326
+ const detail = (failure.stderr || failure.stdout || failure.message || 'git failed').trim();
327
+ const token = options.env?.SURFCODE_GITHUB_TOKEN;
328
+ throw new SurfError(redactToken(detail, token).slice(0, 2_000), {
329
+ hint: 'Fix the git error, then retry. SurfCode never stores the GitHub token in the remote URL.'
330
+ });
331
+ }
332
+ }
333
+ async function gitMaybe(cwd, args) {
334
+ try {
335
+ return await runGit(cwd, args, { timeout: 8_000 });
336
+ }
337
+ catch {
338
+ return undefined;
339
+ }
340
+ }
341
+ async function withAskpass(token, run) {
342
+ const directory = await mkdtemp(join(tmpdir(), 'surfcode-git-'));
343
+ const windows = process.platform === 'win32';
344
+ const file = join(directory, windows ? 'askpass.cmd' : 'askpass.sh');
345
+ const script = windows
346
+ ? '@echo off\r\necho %~1 | findstr /I "username" >nul\r\nif %errorlevel%==0 (echo x-access-token) else (echo %SURFCODE_GITHUB_TOKEN%)\r\n'
347
+ : '#!/bin/sh\ncase "$1" in\n *[Uu]sername*) printf \'%s\\n\' "x-access-token" ;;\n *) printf \'%s\\n\' "$SURFCODE_GITHUB_TOKEN" ;;\nesac\n';
348
+ await writeFile(file, script, { mode: windows ? undefined : 0o700 });
349
+ if (!windows)
350
+ await chmod(file, 0o700);
351
+ try {
352
+ return await run({
353
+ GIT_ASKPASS: file,
354
+ GIT_TERMINAL_PROMPT: '0',
355
+ SURFCODE_GITHUB_TOKEN: token
356
+ });
357
+ }
358
+ finally {
359
+ await rm(directory, { recursive: true, force: true });
360
+ }
361
+ }
362
+ async function githubRequest(path, options) {
363
+ let response;
364
+ try {
365
+ response = await fetch(`${API}${path}`, {
366
+ method: options.method ?? 'GET',
367
+ headers: {
368
+ Accept: 'application/vnd.github+json',
369
+ Authorization: `Bearer ${options.token}`,
370
+ 'X-GitHub-Api-Version': '2022-11-28',
371
+ 'User-Agent': 'SurfCode'
372
+ },
373
+ body: options.body === undefined ? undefined : JSON.stringify(options.body),
374
+ signal: AbortSignal.timeout(20_000)
375
+ });
376
+ }
377
+ catch (error) {
378
+ throw new SurfError(`Could not reach GitHub: ${errorMessage(error)}`, {
379
+ hint: 'Check your network connection and try again.'
380
+ });
381
+ }
382
+ const text = await response.text();
383
+ let data;
384
+ try {
385
+ data = text ? JSON.parse(text) : undefined;
386
+ }
387
+ catch {
388
+ data = undefined;
389
+ }
390
+ if (!response.ok)
391
+ throw githubHttpError(response.status, data);
392
+ return data;
393
+ }
394
+ function githubHttpError(status, data) {
395
+ const message = data && typeof data === 'object' && typeof data.message === 'string'
396
+ ? data.message
397
+ : undefined;
398
+ const base = `GitHub API ${status}${message ? `: ${message}` : ''}`;
399
+ if (status === 401) {
400
+ return new SurfError(base, {
401
+ hint: 'The token was rejected. Run /github login or `surf auth github` with a fresh personal access token.'
402
+ });
403
+ }
404
+ if (status === 403) {
405
+ return new SurfError(base, {
406
+ hint: 'The token may lack the repo scope, or the GitHub rate limit was reached. Check the token and try later.'
407
+ });
408
+ }
409
+ if (status === 404) {
410
+ return new SurfError(base, {
411
+ hint: 'Check the repository owner and name. A fine-grained token also needs access to that organization.'
412
+ });
413
+ }
414
+ if (status === 422) {
415
+ return new SurfError(base, {
416
+ hint: 'The repository name may already exist or be invalid. Choose another name or reuse the existing repository.'
417
+ });
418
+ }
419
+ return new SurfError(base);
420
+ }
421
+ function repositoryFromApi(data) {
422
+ const owner = data.owner && typeof data.owner === 'object' && typeof data.owner.login === 'string'
423
+ ? data.owner.login
424
+ : '';
425
+ const name = typeof data.name === 'string' ? data.name : '';
426
+ const fullName = typeof data.full_name === 'string' ? data.full_name : owner && name ? `${owner}/${name}` : name;
427
+ const htmlUrl = typeof data.html_url === 'string' ? data.html_url : '';
428
+ const cloneUrl = typeof data.clone_url === 'string'
429
+ ? data.clone_url
430
+ : htmlUrl
431
+ ? `${htmlUrl.replace(/\/$/, '')}.git`
432
+ : '';
433
+ if (!fullName || !htmlUrl || !cloneUrl) {
434
+ throw new SurfError('GitHub returned an incomplete repository response.');
435
+ }
436
+ return {
437
+ name,
438
+ owner,
439
+ fullName,
440
+ htmlUrl,
441
+ cloneUrl,
442
+ private: data.private === true
443
+ };
444
+ }
445
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/core/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import envPaths from 'env-paths';
2
+ import { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ export function getPaths() {
5
+ const override = process.env.SURFCODE_HOME?.trim();
6
+ const base = override
7
+ ? { config: override, data: override, cache: override }
8
+ : envPaths('surfcode', { suffix: '' });
9
+ return {
10
+ configDir: base.config,
11
+ dataDir: base.data,
12
+ cacheDir: base.cache,
13
+ configFile: join(base.config, 'config.json'),
14
+ authFile: join(base.config, 'auth.json'),
15
+ sessionsDir: join(base.data, 'sessions'),
16
+ modelsCache: join(base.cache, 'models.json')
17
+ };
18
+ }
19
+ export async function ensurePaths() {
20
+ const paths = getPaths();
21
+ await Promise.all([
22
+ mkdir(paths.configDir, { recursive: true, mode: 0o700 }),
23
+ mkdir(paths.dataDir, { recursive: true, mode: 0o700 }),
24
+ mkdir(paths.cacheDir, { recursive: true, mode: 0o700 }),
25
+ mkdir(paths.sessionsDir, { recursive: true, mode: 0o700 })
26
+ ]);
27
+ return paths;
28
+ }
29
+ export async function writeFileAtomic(path, content, mode = 0o600) {
30
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
31
+ const temporary = `${path}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
32
+ await writeFile(temporary, content, { encoding: 'utf8', mode });
33
+ await rename(temporary, path);
34
+ try {
35
+ await chmod(path, mode);
36
+ }
37
+ catch {
38
+ // Best effort on filesystems that do not support chmod.
39
+ }
40
+ }
41
+ export async function readJsonFile(path) {
42
+ try {
43
+ return JSON.parse(await readFile(path, 'utf8'));
44
+ }
45
+ catch (error) {
46
+ if (error.code === 'ENOENT')
47
+ return undefined;
48
+ throw error;
49
+ }
50
+ }
51
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { EFFORT_GUIDANCE } from './effort.js';
6
+ const execFileAsync = promisify(execFile);
7
+ const INSTRUCTION_FILES = ['SURFCODE.md', 'AGENTS.md', 'CLAUDE.md', '.surfcode/instructions.md'];
8
+ export async function buildSystemPrompt(context) {
9
+ const [instructions, git] = await Promise.all([loadInstructions(context.cwd), gitContext(context.cwd)]);
10
+ const date = new Date().toISOString().slice(0, 10);
11
+ const modeRules = context.mode === 'plan'
12
+ ? `You are in PLAN MODE. Research and reason, but do NOT modify files, do NOT run mutating shell commands, and do NOT install packages. Read-only tools are available. Produce a concrete, ordered plan and wait for the user to switch to build mode.`
13
+ : `You are in BUILD MODE. You may read, edit, and run commands to complete the task. Make focused changes, verify them, and report what you changed.`;
14
+ return `You are SurfCode, a terminal-native AI software engineer. You are direct, curious, and exceptionally good at navigating real codebases.
15
+
16
+ # Identity
17
+ - You pair with the user inside their terminal. Be concise and natural, not verbose.
18
+ - Current model: ${context.providerName} / ${context.modelName}
19
+ - Reasoning effort: ${context.effort ? `${context.effort} — ${EFFORT_GUIDANCE[context.effort]}` : 'provider default'}
20
+ - Today: ${date}
21
+ - Workspace: ${context.cwd}
22
+ - Platform: ${process.platform} ${process.arch}
23
+ - Shell: ${process.env.SHELL || process.env.ComSpec || 'unknown'}
24
+ ${git ? `- Git: branch ${git.branch}${git.dirty ? ' (dirty working tree)' : ''}` : '- Git: not a repository'}
25
+
26
+ # Mode
27
+ ${modeRules}
28
+
29
+ ${context.agentWorkers?.length ? `# Multi-model orchestration
30
+ You are the head model for this turn. These worker models are available: ${context.agentWorkers.join(', ')}.
31
+ Use the delegate tool to run independent subtasks in parallel. For reviews, research, debugging, or broad design questions, delegate 2-4 focused tasks before you answer. Give each worker a self-contained instruction, then synthesize and verify their results yourself. Workers cannot edit files or use tools, so keep all real tool work in this conversation. Do not delegate trivial questions.` : ''}
32
+
33
+ # How to work
34
+ 1. Understand first. Inspect the relevant files with read/glob/grep before changing anything.
35
+ 2. For non-trivial tasks, use todo_write to keep a short plan and update it as you go.
36
+ 3. Make surgical changes. Match the project's style, conventions, and dependencies.
37
+ 4. Verify your work with the project's own tests, typecheck, build, or linter when practical.
38
+ 5. Never invent files or APIs. If something is uncertain, inspect it.
39
+ 6. Do not commit, push, amend, or rewrite git history unless the user explicitly asks. The same rule applies to creating GitHub repositories and uploading code.
40
+ 7. Do not print secrets or API keys. Avoid destructive commands unless explicitly requested.
41
+ 8. Prefer rg/grep/glob over broad shell pipelines. Keep outputs focused.
42
+ 9. If a tool fails, read the error and adjust. Do not retry the exact same failing action more than twice.
43
+ 10. End with a short summary of changes and verification. Link file paths as \`path:line\` when useful.
44
+
45
+ # GitHub publishing
46
+ - Use the github tools only when the user explicitly asks to create a repository, upload code, commit, or push. Never publish automatically after finishing a coding task.
47
+ - If the user did not say whether a new repository should be private or public, ask before calling github_create_repo.
48
+ - Start with github_status. Create with github_create_repo, upload the first snapshot with github_upload, and use github_commit for later changes. github_create_repo points origin at the new repository.
49
+ - github_upload with no files takes the whole workspace (common build directories are excluded); pass files or directories for a selective upload. Never upload files outside the workspace.
50
+ - If the token is missing, tell the user to run /github login in the TUI or \`surf auth github\`. Never ask them to paste a token into the chat, and never put a token in a command, remote URL, file, or commit message.
51
+ - Write clear commit messages. Do not force-push, rewrite history, or delete a repository unless the user explicitly requests it.
52
+
53
+ # Tool behavior
54
+ - Tools are executed in the user's workspace and may require approval. If approval is denied, do not work around it; explain and continue with another approach or ask.
55
+ - Paths are relative to the workspace unless absolute.
56
+ - ${context.toolsEnabled ? 'Use the provided tools. Read a file before editing it.' : 'The selected model does not advertise tool support; if tools are unavailable, explain what you would need and ask the user to switch models with /model.'}
57
+
58
+ # Style
59
+ Use GitHub-flavored Markdown. Keep explanations compact. Show code only when it adds value. Do not narrate every tool call. Never start a response with "Certainly" or "Sure". Avoid excessive headings and emoji.${instructions ? `\n\n# Project instructions\n${instructions}` : ''}`;
60
+ }
61
+ async function loadInstructions(cwd) {
62
+ const parts = [];
63
+ const seen = new Set();
64
+ for (const name of INSTRUCTION_FILES) {
65
+ try {
66
+ const content = (await readFile(join(cwd, name), 'utf8')).trim();
67
+ if (!content || seen.has(content))
68
+ continue;
69
+ seen.add(content);
70
+ parts.push(`## ${name}\n${content.slice(0, 20_000)}`);
71
+ }
72
+ catch {
73
+ // Optional.
74
+ }
75
+ }
76
+ if (parts.length === 0)
77
+ return '';
78
+ return parts.join('\n\n').slice(0, 28_000);
79
+ }
80
+ async function gitContext(cwd) {
81
+ try {
82
+ const [branchResult, statusResult] = await Promise.all([
83
+ execFileAsync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, timeout: 1500 }),
84
+ execFileAsync('git', ['status', '--porcelain'], { cwd, timeout: 1500 })
85
+ ]);
86
+ return {
87
+ branch: branchResult.stdout.trim() || 'detached',
88
+ dirty: Boolean(statusResult.stdout.trim())
89
+ };
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/core/prompt.ts"],"names":[],"mappings":"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"}