@secondcontext/btx-cli 0.0.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/README.md +83 -0
- package/btx.js +3 -0
- package/dist/api.d.ts +6 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +72 -0
- package/dist/api.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +394 -0
- package/dist/bin.js.map +1 -0
- package/dist/bootstrap.d.ts +7 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +91 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +158 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime-cli.d.ts +13 -0
- package/dist/runtime-cli.d.ts.map +1 -0
- package/dist/runtime-cli.js +2088 -0
- package/dist/runtime-cli.js.map +1 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# @secondcontext/btx-cli
|
|
2
|
+
|
|
3
|
+
Canonical source for the BTX CLI.
|
|
4
|
+
|
|
5
|
+
This package owns the shared BTX command surface used by:
|
|
6
|
+
|
|
7
|
+
- standalone coding sessions that should run `btx ...`
|
|
8
|
+
- the BTX desktop app, which bundles this package into `code/projects/desktop-app/resources/btx-cli.cjs`
|
|
9
|
+
|
|
10
|
+
## Current state
|
|
11
|
+
|
|
12
|
+
- Source of truth: `src/bin.ts` and `src/runtime-cli.ts`
|
|
13
|
+
- Desktop bundle is generated from this package
|
|
14
|
+
- Public npm package name: `@secondcontext/btx-cli`
|
|
15
|
+
- Public binary name: `btx`
|
|
16
|
+
- `--json` is the machine-readable mode for commands that return BTX data
|
|
17
|
+
|
|
18
|
+
## Local workflow
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm run build --prefix code/packages/btx-cli
|
|
22
|
+
npm run build:btx-cli --prefix code/projects/desktop-app
|
|
23
|
+
npm run test:btx-cli --prefix code/projects/desktop-app
|
|
24
|
+
npm run validate --prefix code
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Local package testing
|
|
28
|
+
|
|
29
|
+
Build and pack the package:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm run pack:btx-cli --prefix code
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Install the tarball into a clean repo or temp directory:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm init -y
|
|
39
|
+
npm install /absolute/path/to/code/packages/btx-cli/secondcontext-btx-cli-0.0.1.tgz
|
|
40
|
+
./node_modules/.bin/btx --help
|
|
41
|
+
./node_modules/.bin/btx repo status --json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Supported standalone flow
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
btx projects
|
|
48
|
+
btx repo link <project-id>
|
|
49
|
+
btx bootstrap all
|
|
50
|
+
btx context get --json
|
|
51
|
+
btx tasks list --json
|
|
52
|
+
btx session start --runtime codex --label "Investigate feature X"
|
|
53
|
+
btx session checkpoint --type decision --content "Keep desktop and standalone CLI on one contract"
|
|
54
|
+
btx session finish --summary "Recorded outcome and next steps"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Auth and repo state
|
|
58
|
+
|
|
59
|
+
- Auth is read from `~/.btx/auth-session.json`, with a fallback to the desktop app auth session store
|
|
60
|
+
- Repo linkage is stored in `.btx/btx.json`
|
|
61
|
+
- External session state is stored in `~/.btx/runtime-state.json`
|
|
62
|
+
|
|
63
|
+
Until the package is published, the desktop app remains the easiest way to seed the auth session that the standalone CLI reads.
|
|
64
|
+
|
|
65
|
+
## First npm publish
|
|
66
|
+
|
|
67
|
+
Dry-run the publish from the monorepo root:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm run publish:btx-cli:dry-run --prefix code
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then publish from `code/packages/btx-cli`:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm publish
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Expected manual npm steps:
|
|
80
|
+
|
|
81
|
+
- Log in to npm with an account that can publish under `@secondcontext`
|
|
82
|
+
- Ensure the `@secondcontext` scope is configured for public packages
|
|
83
|
+
- If you want an open-source package, add a real `LICENSE` file before publishing and replace the current `UNLICENSED` marker in `package.json`
|
package/btx.js
ADDED
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RuntimeCliEnv } from './runtime-cli.js';
|
|
2
|
+
export declare function apiGet<T>(env: RuntimeCliEnv, path: string): Promise<T>;
|
|
3
|
+
export declare function projectApiGet<T>(env: RuntimeCliEnv, path: string): Promise<T>;
|
|
4
|
+
export declare function projectApiPost<T>(env: RuntimeCliEnv, path: string, body?: unknown): Promise<T>;
|
|
5
|
+
export declare function projectApiPatch<T>(env: RuntimeCliEnv, path: string, body?: unknown): Promise<T>;
|
|
6
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AA4FrD,wBAAsB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAE5E;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAGnF;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAGZ;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,CAAC,CAAC,CAGZ"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { requireAccessToken, requireProjectId, writeStoredAuthSession, } from './config.js';
|
|
2
|
+
async function refreshAccessToken(env) {
|
|
3
|
+
if (!env.BTX_REFRESH_TOKEN || !env.BTX_SUPABASE_URL || !env.BTX_SUPABASE_ANON_KEY)
|
|
4
|
+
return null;
|
|
5
|
+
const response = await fetch(`${env.BTX_SUPABASE_URL}/auth/v1/token?grant_type=refresh_token`, {
|
|
6
|
+
method: 'POST',
|
|
7
|
+
headers: {
|
|
8
|
+
'content-type': 'application/json',
|
|
9
|
+
apikey: env.BTX_SUPABASE_ANON_KEY,
|
|
10
|
+
},
|
|
11
|
+
body: JSON.stringify({ refresh_token: env.BTX_REFRESH_TOKEN }),
|
|
12
|
+
});
|
|
13
|
+
if (!response.ok)
|
|
14
|
+
return null;
|
|
15
|
+
const data = (await response.json());
|
|
16
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
17
|
+
const session = {
|
|
18
|
+
access_token: data.access_token,
|
|
19
|
+
refresh_token: data.refresh_token,
|
|
20
|
+
expires_at: nowSeconds + data.expires_in,
|
|
21
|
+
supabase_url: env.BTX_SUPABASE_URL,
|
|
22
|
+
supabase_anon_key: env.BTX_SUPABASE_ANON_KEY,
|
|
23
|
+
api_url: env.BTX_API_URL,
|
|
24
|
+
};
|
|
25
|
+
writeStoredAuthSession(session);
|
|
26
|
+
env.BTX_ACCESS_TOKEN = data.access_token;
|
|
27
|
+
env.BTX_REFRESH_TOKEN = data.refresh_token;
|
|
28
|
+
return data.access_token;
|
|
29
|
+
}
|
|
30
|
+
async function requestWithAuth(env, url, method, body) {
|
|
31
|
+
const token = requireAccessToken(env);
|
|
32
|
+
const doRequest = async (accessToken) => fetch(url, {
|
|
33
|
+
method,
|
|
34
|
+
headers: {
|
|
35
|
+
'content-type': 'application/json',
|
|
36
|
+
authorization: `Bearer ${accessToken}`,
|
|
37
|
+
},
|
|
38
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
39
|
+
});
|
|
40
|
+
let response = await doRequest(token);
|
|
41
|
+
if (response.status === 401) {
|
|
42
|
+
const refreshed = await refreshAccessToken(env);
|
|
43
|
+
if (!refreshed) {
|
|
44
|
+
throw new Error('BTX auth token expired. Sign in again through BTX desktop or provide a fresh token.');
|
|
45
|
+
}
|
|
46
|
+
response = await doRequest(refreshed);
|
|
47
|
+
}
|
|
48
|
+
if (response.status === 429) {
|
|
49
|
+
throw new Error('BTX API rate limited the request. Please wait a moment and try again.');
|
|
50
|
+
}
|
|
51
|
+
const json = (await response.json());
|
|
52
|
+
if (!response.ok || !json.ok) {
|
|
53
|
+
throw new Error(typeof json.error === 'string' ? json.error : JSON.stringify(json.error) || `Request failed (${response.status})`);
|
|
54
|
+
}
|
|
55
|
+
return json.data;
|
|
56
|
+
}
|
|
57
|
+
export async function apiGet(env, path) {
|
|
58
|
+
return requestWithAuth(env, `${env.BTX_API_URL}/api${path}`, 'GET');
|
|
59
|
+
}
|
|
60
|
+
export async function projectApiGet(env, path) {
|
|
61
|
+
const projectId = requireProjectId(env);
|
|
62
|
+
return requestWithAuth(env, `${env.BTX_API_URL}/api/projects/${projectId}${path}`, 'GET');
|
|
63
|
+
}
|
|
64
|
+
export async function projectApiPost(env, path, body) {
|
|
65
|
+
const projectId = requireProjectId(env);
|
|
66
|
+
return requestWithAuth(env, `${env.BTX_API_URL}/api/projects/${projectId}${path}`, 'POST', body);
|
|
67
|
+
}
|
|
68
|
+
export async function projectApiPatch(env, path, body) {
|
|
69
|
+
const projectId = requireProjectId(env);
|
|
70
|
+
return requestWithAuth(env, `${env.BTX_API_URL}/api/projects/${projectId}${path}`, 'PATCH', body);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { spawnSync } from 'node:child_process';
|
|
5
|
+
import { apiGet, projectApiPatch, projectApiPost } from './api.js';
|
|
6
|
+
import { bootstrapAgents } from './bootstrap.js';
|
|
7
|
+
import { clearActiveSession, findRepoRoot, getActiveSession, loadRepoConfig, resolveRuntimeEnv, setActiveSession, writeRepoConfig, } from './config.js';
|
|
8
|
+
import { runRuntimeCli } from './runtime-cli.js';
|
|
9
|
+
const RUNTIME_RESOURCES = new Set([
|
|
10
|
+
'tasks',
|
|
11
|
+
'sessions',
|
|
12
|
+
'contacts',
|
|
13
|
+
'orgs',
|
|
14
|
+
'meetings',
|
|
15
|
+
'leads',
|
|
16
|
+
'user',
|
|
17
|
+
'intro-paths',
|
|
18
|
+
'search',
|
|
19
|
+
'context',
|
|
20
|
+
'pages',
|
|
21
|
+
'hiring-types',
|
|
22
|
+
'hiring-candidates',
|
|
23
|
+
]);
|
|
24
|
+
function parseArgs(argv) {
|
|
25
|
+
const positional = [];
|
|
26
|
+
const flags = {};
|
|
27
|
+
let index = 0;
|
|
28
|
+
while (index < argv.length) {
|
|
29
|
+
const arg = argv[index];
|
|
30
|
+
if (arg.startsWith('--')) {
|
|
31
|
+
const key = arg.slice(2);
|
|
32
|
+
const next = argv[index + 1];
|
|
33
|
+
if (next !== undefined && !next.startsWith('--')) {
|
|
34
|
+
flags[key] = next;
|
|
35
|
+
index += 2;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
flags[key] = 'true';
|
|
39
|
+
index += 1;
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
positional.push(arg);
|
|
44
|
+
index += 1;
|
|
45
|
+
}
|
|
46
|
+
return { positional, flags };
|
|
47
|
+
}
|
|
48
|
+
function die(message) {
|
|
49
|
+
process.stderr.write(`Error: ${message}\n`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
function isJson(flags) {
|
|
53
|
+
return flags.json === 'true';
|
|
54
|
+
}
|
|
55
|
+
function printJson(value) {
|
|
56
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
57
|
+
}
|
|
58
|
+
function printHelp() {
|
|
59
|
+
console.log(`BTX CLI
|
|
60
|
+
|
|
61
|
+
Usage:
|
|
62
|
+
btx <command> [flags]
|
|
63
|
+
btx <resource> <subcommand> [flags]
|
|
64
|
+
|
|
65
|
+
Standalone commands:
|
|
66
|
+
btx projects List BTX projects you can access
|
|
67
|
+
btx repo link <project-id> Link the current repo to a BTX project
|
|
68
|
+
btx repo status Show current repo BTX status
|
|
69
|
+
btx bootstrap <agent> Write BTX instructions into AGENTS.md and/or CLAUDE.md
|
|
70
|
+
btx session start Start or resume the active BTX coding session for this repo
|
|
71
|
+
btx session status Show the active BTX coding session
|
|
72
|
+
btx session checkpoint Record progress, risk, decision, blocker, or note
|
|
73
|
+
btx session finish Close the active BTX coding session
|
|
74
|
+
|
|
75
|
+
BTX resources:
|
|
76
|
+
tasks, contacts, orgs, leads, meetings, user, intro-paths,
|
|
77
|
+
search, context, pages, sessions, hiring-types, hiring-candidates
|
|
78
|
+
|
|
79
|
+
Examples:
|
|
80
|
+
btx projects
|
|
81
|
+
btx repo link <project-id>
|
|
82
|
+
btx bootstrap all
|
|
83
|
+
btx context get
|
|
84
|
+
btx tasks list --json
|
|
85
|
+
btx tasks list
|
|
86
|
+
btx session start --runtime codex --label "Implement project telemetry"
|
|
87
|
+
btx session checkpoint --type risk --content "Task meaning is still ambiguous across sessions"
|
|
88
|
+
btx session finish --summary "Finished CLI bootstrap and repo linking flow"
|
|
89
|
+
|
|
90
|
+
All commands that return BTX data support --json for machine-readable output.`);
|
|
91
|
+
}
|
|
92
|
+
function bestEffortGitBranch(repoRoot) {
|
|
93
|
+
const result = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
|
|
94
|
+
cwd: repoRoot,
|
|
95
|
+
encoding: 'utf8',
|
|
96
|
+
});
|
|
97
|
+
if (result.status !== 0)
|
|
98
|
+
return null;
|
|
99
|
+
return result.stdout.trim() || null;
|
|
100
|
+
}
|
|
101
|
+
async function handleProjects(flags) {
|
|
102
|
+
const env = resolveRuntimeEnv();
|
|
103
|
+
const projects = await apiGet(env, '/projects');
|
|
104
|
+
if (isJson(flags)) {
|
|
105
|
+
printJson(projects);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (projects.length === 0) {
|
|
109
|
+
console.log('No BTX projects available.');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
for (const project of projects) {
|
|
113
|
+
console.log(`${project.name}`);
|
|
114
|
+
console.log(` ID: ${project.id}`);
|
|
115
|
+
if (project.role)
|
|
116
|
+
console.log(` Role: ${project.role}`);
|
|
117
|
+
console.log();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function handleRepoLink(projectId, flags) {
|
|
121
|
+
if (!projectId)
|
|
122
|
+
die('Usage: btx repo link <project-id>');
|
|
123
|
+
const env = resolveRuntimeEnv();
|
|
124
|
+
const projects = await apiGet(env, '/projects');
|
|
125
|
+
const project = projects.find((item) => item.id === projectId);
|
|
126
|
+
if (!project) {
|
|
127
|
+
die(`Project ${projectId} is not accessible with the current BTX auth session.`);
|
|
128
|
+
}
|
|
129
|
+
const repoRoot = findRepoRoot();
|
|
130
|
+
writeRepoConfig(repoRoot, {
|
|
131
|
+
projectId: project.id,
|
|
132
|
+
projectName: project.name,
|
|
133
|
+
apiBase: env.BTX_API_URL,
|
|
134
|
+
linkedAt: new Date().toISOString(),
|
|
135
|
+
});
|
|
136
|
+
if (isJson(flags)) {
|
|
137
|
+
printJson({
|
|
138
|
+
repoRoot,
|
|
139
|
+
projectId: project.id,
|
|
140
|
+
projectName: project.name,
|
|
141
|
+
apiBase: env.BTX_API_URL,
|
|
142
|
+
linked: true,
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
console.log(`Linked ${repoRoot}`);
|
|
147
|
+
console.log(`Project: ${project.name}`);
|
|
148
|
+
console.log(`ID: ${project.id}`);
|
|
149
|
+
}
|
|
150
|
+
function handleRepoStatus(flags) {
|
|
151
|
+
const repoRoot = findRepoRoot();
|
|
152
|
+
const repoConfig = loadRepoConfig(repoRoot);
|
|
153
|
+
const activeSession = getActiveSession(repoRoot);
|
|
154
|
+
const env = resolveRuntimeEnv();
|
|
155
|
+
const status = {
|
|
156
|
+
repoRoot,
|
|
157
|
+
linked: !!repoConfig,
|
|
158
|
+
projectId: repoConfig?.projectId ?? null,
|
|
159
|
+
projectName: repoConfig?.projectName ?? null,
|
|
160
|
+
apiBase: env.BTX_API_URL ?? null,
|
|
161
|
+
hasAuthToken: !!env.BTX_ACCESS_TOKEN,
|
|
162
|
+
activeSession,
|
|
163
|
+
};
|
|
164
|
+
if (isJson(flags)) {
|
|
165
|
+
printJson(status);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
console.log(`Repo root: ${repoRoot}`);
|
|
169
|
+
if (!repoConfig) {
|
|
170
|
+
console.log('Linked project: none');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log(`Linked project: ${repoConfig.projectName ?? 'BTX Project'} (${repoConfig.projectId})`);
|
|
174
|
+
}
|
|
175
|
+
console.log(`API base: ${env.BTX_API_URL}`);
|
|
176
|
+
console.log(`Auth token available: ${env.BTX_ACCESS_TOKEN ? 'yes' : 'no'}`);
|
|
177
|
+
if (activeSession) {
|
|
178
|
+
console.log(`Active session: ${activeSession.label} (${activeSession.sessionId})`);
|
|
179
|
+
console.log(`Runtime: ${activeSession.runtime}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log('Active session: none');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async function handleBootstrap(targetArg, flags) {
|
|
186
|
+
const target = targetArg === 'claude' || targetArg === 'codex' || targetArg === 'all'
|
|
187
|
+
? targetArg
|
|
188
|
+
: 'all';
|
|
189
|
+
const result = bootstrapAgents(target);
|
|
190
|
+
if (isJson(flags)) {
|
|
191
|
+
printJson({
|
|
192
|
+
repoRoot: result.repoRoot,
|
|
193
|
+
projectId: result.projectId,
|
|
194
|
+
projectName: result.projectName,
|
|
195
|
+
files: result.files.map((filePath) => path.relative(result.repoRoot, filePath)),
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
console.log(`Bootstrapped BTX instructions for ${result.projectName} (${result.projectId}).`);
|
|
200
|
+
for (const filePath of result.files) {
|
|
201
|
+
console.log(` ${path.relative(result.repoRoot, filePath)}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function getCurrentSessionOrDie(repoRoot) {
|
|
205
|
+
const active = getActiveSession(repoRoot);
|
|
206
|
+
if (!active) {
|
|
207
|
+
die('No active BTX session for this repo. Run `btx session start --label "<goal>"` first.');
|
|
208
|
+
}
|
|
209
|
+
return active;
|
|
210
|
+
}
|
|
211
|
+
async function handleSessionStart(flags) {
|
|
212
|
+
const repoRoot = findRepoRoot();
|
|
213
|
+
const env = resolveRuntimeEnv(repoRoot);
|
|
214
|
+
const repoConfig = loadRepoConfig(repoRoot);
|
|
215
|
+
if (!repoConfig) {
|
|
216
|
+
die('This repo is not linked to BTX yet. Run `btx repo link <project-id>` first.');
|
|
217
|
+
}
|
|
218
|
+
const existing = getActiveSession(repoRoot);
|
|
219
|
+
if (existing && flags.fresh !== 'true') {
|
|
220
|
+
if (isJson(flags)) {
|
|
221
|
+
printJson(existing);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.log(`Reusing active session ${existing.sessionId}`);
|
|
225
|
+
console.log(`Label: ${existing.label}`);
|
|
226
|
+
console.log(`Runtime: ${existing.runtime}`);
|
|
227
|
+
}
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const runtime = flags.runtime || 'external-cli';
|
|
231
|
+
const sessionId = flags['session-id'] || randomUUID();
|
|
232
|
+
const label = flags.label || `External coding session in ${path.basename(repoRoot)}`;
|
|
233
|
+
const branch = bestEffortGitBranch(repoRoot);
|
|
234
|
+
const sessionType = flags.type || 'code';
|
|
235
|
+
const startedAt = new Date().toISOString();
|
|
236
|
+
await projectApiPost(env, '/sessions', {
|
|
237
|
+
sessionId,
|
|
238
|
+
label,
|
|
239
|
+
sessionType,
|
|
240
|
+
executionMode: 'external-cli',
|
|
241
|
+
runtime,
|
|
242
|
+
status: 'open',
|
|
243
|
+
messageCount: 0,
|
|
244
|
+
sessionMetadata: {
|
|
245
|
+
repoRoot,
|
|
246
|
+
repoName: path.basename(repoRoot),
|
|
247
|
+
gitBranch: branch,
|
|
248
|
+
tool: 'btx-cli',
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
const activeSession = {
|
|
252
|
+
sessionId,
|
|
253
|
+
projectId: repoConfig.projectId,
|
|
254
|
+
label,
|
|
255
|
+
runtime,
|
|
256
|
+
startedAt,
|
|
257
|
+
repoRoot,
|
|
258
|
+
};
|
|
259
|
+
setActiveSession(repoRoot, activeSession);
|
|
260
|
+
if (isJson(flags)) {
|
|
261
|
+
printJson(activeSession);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
console.log(`Started BTX session ${sessionId}`);
|
|
265
|
+
console.log(`Label: ${label}`);
|
|
266
|
+
console.log(`Runtime: ${runtime}`);
|
|
267
|
+
}
|
|
268
|
+
function handleSessionStatus(flags) {
|
|
269
|
+
const repoRoot = findRepoRoot();
|
|
270
|
+
const active = getActiveSession(repoRoot);
|
|
271
|
+
if (isJson(flags)) {
|
|
272
|
+
printJson(active);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (!active) {
|
|
276
|
+
console.log('No active BTX session for this repo.');
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
console.log(`Session: ${active.sessionId}`);
|
|
280
|
+
console.log(`Label: ${active.label}`);
|
|
281
|
+
console.log(`Runtime: ${active.runtime}`);
|
|
282
|
+
console.log(`Started: ${active.startedAt}`);
|
|
283
|
+
}
|
|
284
|
+
async function handleSessionCheckpoint(flags) {
|
|
285
|
+
const repoRoot = findRepoRoot();
|
|
286
|
+
const active = getCurrentSessionOrDie(repoRoot);
|
|
287
|
+
const type = flags.type || 'note';
|
|
288
|
+
const content = flags.content;
|
|
289
|
+
if (!content) {
|
|
290
|
+
die('Usage: btx session checkpoint --type note|risk|decision|blocker|progress|assumption --content "..."');
|
|
291
|
+
}
|
|
292
|
+
const env = resolveRuntimeEnv(repoRoot, {
|
|
293
|
+
BTX_SESSION_ID: active.sessionId,
|
|
294
|
+
BTX_PROJECT_ID: active.projectId,
|
|
295
|
+
});
|
|
296
|
+
const activity = await projectApiPost(env, '/session-activities', {
|
|
297
|
+
sessionId: active.sessionId,
|
|
298
|
+
type,
|
|
299
|
+
content,
|
|
300
|
+
metadata: {
|
|
301
|
+
runtime: active.runtime,
|
|
302
|
+
repoRoot,
|
|
303
|
+
via: 'btx-cli',
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
if (isJson(flags)) {
|
|
307
|
+
printJson(activity);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
console.log(`Saved ${type} checkpoint to session ${active.sessionId}`);
|
|
311
|
+
}
|
|
312
|
+
async function handleSessionFinish(flags) {
|
|
313
|
+
const repoRoot = findRepoRoot();
|
|
314
|
+
const active = getCurrentSessionOrDie(repoRoot);
|
|
315
|
+
const env = resolveRuntimeEnv(repoRoot, {
|
|
316
|
+
BTX_SESSION_ID: active.sessionId,
|
|
317
|
+
BTX_PROJECT_ID: active.projectId,
|
|
318
|
+
});
|
|
319
|
+
if (flags.summary) {
|
|
320
|
+
await projectApiPost(env, '/session-activities', {
|
|
321
|
+
sessionId: active.sessionId,
|
|
322
|
+
type: 'summary',
|
|
323
|
+
content: flags.summary,
|
|
324
|
+
metadata: {
|
|
325
|
+
runtime: active.runtime,
|
|
326
|
+
repoRoot,
|
|
327
|
+
via: 'btx-cli',
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
const closedAt = new Date().toISOString();
|
|
332
|
+
await projectApiPatch(env, '/sessions', {
|
|
333
|
+
sessionId: active.sessionId,
|
|
334
|
+
status: 'closed',
|
|
335
|
+
closedAt,
|
|
336
|
+
});
|
|
337
|
+
clearActiveSession(repoRoot);
|
|
338
|
+
if (isJson(flags)) {
|
|
339
|
+
printJson({ sessionId: active.sessionId, closedAt });
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
console.log(`Closed BTX session ${active.sessionId}`);
|
|
343
|
+
}
|
|
344
|
+
async function handleSession(positionals, flags) {
|
|
345
|
+
const subcommand = positionals[1];
|
|
346
|
+
switch (subcommand) {
|
|
347
|
+
case 'start':
|
|
348
|
+
return handleSessionStart(flags);
|
|
349
|
+
case 'status':
|
|
350
|
+
return handleSessionStatus(flags);
|
|
351
|
+
case 'checkpoint':
|
|
352
|
+
return handleSessionCheckpoint(flags);
|
|
353
|
+
case 'finish':
|
|
354
|
+
return handleSessionFinish(flags);
|
|
355
|
+
default:
|
|
356
|
+
die('Usage: btx session <start|status|checkpoint|finish> [...]');
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
async function main() {
|
|
360
|
+
const argv = process.argv.slice(2);
|
|
361
|
+
const { positional, flags } = parseArgs(argv);
|
|
362
|
+
const command = positional[0];
|
|
363
|
+
if (!command || command === '--help' || command === 'help') {
|
|
364
|
+
printHelp();
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (RUNTIME_RESOURCES.has(command)) {
|
|
368
|
+
await runRuntimeCli(argv, resolveRuntimeEnv());
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
switch (command) {
|
|
372
|
+
case 'projects':
|
|
373
|
+
return handleProjects(flags);
|
|
374
|
+
case 'repo':
|
|
375
|
+
switch (positional[1]) {
|
|
376
|
+
case 'link':
|
|
377
|
+
return handleRepoLink(positional[2], flags);
|
|
378
|
+
case 'status':
|
|
379
|
+
return handleRepoStatus(flags);
|
|
380
|
+
default:
|
|
381
|
+
die('Usage: btx repo <link|status> [...]');
|
|
382
|
+
}
|
|
383
|
+
case 'bootstrap':
|
|
384
|
+
return handleBootstrap(positional[1], flags);
|
|
385
|
+
case 'session':
|
|
386
|
+
return handleSession(positional, flags);
|
|
387
|
+
default:
|
|
388
|
+
die(`Unknown command: ${command}. Run \`btx --help\`.`);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
main().catch((error) => {
|
|
392
|
+
die(error instanceof Error ? error.message : String(error));
|
|
393
|
+
});
|
|
394
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AA2EA,wBAAgB,eAAe,CAC7B,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,EAClC,QAAQ,SAAgB,GACvB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAuB/E"}
|