@mod-computer/cli 0.2.4 → 0.2.5
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/package.json +3 -3
- package/dist/app.js +0 -227
- package/dist/cli.bundle.js.map +0 -7
- package/dist/cli.js +0 -132
- package/dist/commands/add.js +0 -245
- package/dist/commands/agents-run.js +0 -71
- package/dist/commands/auth.js +0 -259
- package/dist/commands/branch.js +0 -1411
- package/dist/commands/claude-sync.js +0 -772
- package/dist/commands/comment.js +0 -568
- package/dist/commands/diff.js +0 -182
- package/dist/commands/index.js +0 -73
- package/dist/commands/init.js +0 -597
- package/dist/commands/ls.js +0 -135
- package/dist/commands/members.js +0 -687
- package/dist/commands/mv.js +0 -282
- package/dist/commands/recover.js +0 -207
- package/dist/commands/rm.js +0 -257
- package/dist/commands/spec.js +0 -386
- package/dist/commands/status.js +0 -296
- package/dist/commands/sync.js +0 -119
- package/dist/commands/trace.js +0 -1752
- package/dist/commands/workspace.js +0 -447
- package/dist/components/conflict-resolution-ui.js +0 -120
- package/dist/components/messages.js +0 -5
- package/dist/components/thread.js +0 -8
- package/dist/config/features.js +0 -83
- package/dist/containers/branches-container.js +0 -140
- package/dist/containers/directory-container.js +0 -92
- package/dist/containers/thread-container.js +0 -214
- package/dist/containers/threads-container.js +0 -27
- package/dist/containers/workspaces-container.js +0 -27
- package/dist/daemon/conflict-resolution.js +0 -172
- package/dist/daemon/content-hash.js +0 -31
- package/dist/daemon/file-sync.js +0 -985
- package/dist/daemon/index.js +0 -203
- package/dist/daemon/mime-types.js +0 -166
- package/dist/daemon/offline-queue.js +0 -211
- package/dist/daemon/path-utils.js +0 -64
- package/dist/daemon/share-policy.js +0 -83
- package/dist/daemon/wasm-errors.js +0 -189
- package/dist/daemon/worker.js +0 -557
- package/dist/daemon-worker.js +0 -258
- package/dist/errors/workspace-errors.js +0 -48
- package/dist/lib/auth-server.js +0 -216
- package/dist/lib/browser.js +0 -35
- package/dist/lib/diff.js +0 -284
- package/dist/lib/formatters.js +0 -204
- package/dist/lib/git.js +0 -137
- package/dist/lib/local-fs.js +0 -201
- package/dist/lib/prompts.js +0 -56
- package/dist/lib/storage.js +0 -213
- package/dist/lib/trace-formatters.js +0 -314
- package/dist/services/add-service.js +0 -554
- package/dist/services/add-validation.js +0 -124
- package/dist/services/automatic-file-tracker.js +0 -303
- package/dist/services/cli-orchestrator.js +0 -227
- package/dist/services/feature-flags.js +0 -187
- package/dist/services/file-import-service.js +0 -283
- package/dist/services/file-transformation-service.js +0 -218
- package/dist/services/logger.js +0 -44
- package/dist/services/mod-config.js +0 -67
- package/dist/services/modignore-service.js +0 -328
- package/dist/services/sync-daemon.js +0 -244
- package/dist/services/thread-notification-service.js +0 -50
- package/dist/services/thread-service.js +0 -147
- package/dist/stores/use-directory-store.js +0 -96
- package/dist/stores/use-threads-store.js +0 -46
- package/dist/stores/use-workspaces-store.js +0 -54
- package/dist/types/add-types.js +0 -99
- package/dist/types/config.js +0 -16
- package/dist/types/index.js +0 -2
- package/dist/types/workspace-connection.js +0 -53
- package/dist/types.js +0 -1
package/dist/commands/auth.js
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
// glassware[type="implementation", id="impl-cli-auth-command--649dd0cd", specifications="specification-spec-auth-login--c8f45e62,specification-spec-auth-status--36efb6a8,specification-spec-auth-logout--79cb4081"]
|
|
2
|
-
import { readConfig, writeConfig } from '../lib/storage.js';
|
|
3
|
-
import { openBrowser } from '../lib/browser.js';
|
|
4
|
-
import { startAuthServer } from '../lib/auth-server.js';
|
|
5
|
-
import { createModUser } from '@mod/mod-core';
|
|
6
|
-
import { addUserToSharePolicy } from '../daemon/share-policy.js';
|
|
7
|
-
// Auth worker URL - configurable via environment variable
|
|
8
|
-
// Uses the Cloudflare Worker for OAuth
|
|
9
|
-
const AUTH_WORKER_URL = process.env.MOD_AUTH_URL || 'https://mod-auth-worker.mod-workers.workers.dev';
|
|
10
|
-
export async function authCommand(args, repo) {
|
|
11
|
-
const [subcommand, ...rest] = args;
|
|
12
|
-
switch (subcommand) {
|
|
13
|
-
case 'login':
|
|
14
|
-
await handleLogin(rest, repo);
|
|
15
|
-
break;
|
|
16
|
-
case 'logout':
|
|
17
|
-
await handleLogout();
|
|
18
|
-
break;
|
|
19
|
-
case 'status':
|
|
20
|
-
await handleStatus();
|
|
21
|
-
break;
|
|
22
|
-
default:
|
|
23
|
-
if (!subcommand) {
|
|
24
|
-
await handleStatus();
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
console.error('Usage: mod auth <login|logout|status>');
|
|
28
|
-
console.error('Available commands:');
|
|
29
|
-
console.error(' login [--dev] Sign in with Google OAuth (or use --dev for local testing)');
|
|
30
|
-
console.error(' logout Sign out and clear credentials');
|
|
31
|
-
console.error(' status Show current authentication state');
|
|
32
|
-
process.exit(1);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
process.exit(0);
|
|
36
|
-
}
|
|
37
|
-
// glassware[type="implementation", id="impl-handle-login--58bdb73b", specifications="specification-spec-auth-login--c8f45e62,specification-spec-open-browser--397b6a28,specification-spec-manual-url--b37b2760,specification-spec-validate-token--d3856b2d,specification-spec-success-message--b3bb1875,specification-spec-create-user-doc--282489ae,specification-spec-register-user-doc--e611f1db"]
|
|
38
|
-
async function handleLogin(args = [], repo) {
|
|
39
|
-
// Check for --dev flag
|
|
40
|
-
const isDev = args.includes('--dev');
|
|
41
|
-
// Check if already authenticated
|
|
42
|
-
const config = readConfig();
|
|
43
|
-
if (config.auth) {
|
|
44
|
-
console.log(`Already signed in as ${config.auth.email}`);
|
|
45
|
-
console.log('');
|
|
46
|
-
console.log('Run `mod auth logout` to sign out first.');
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
// Dev mode: create local user without OAuth
|
|
50
|
-
if (isDev) {
|
|
51
|
-
await handleDevLogin(repo);
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
// Start localhost server to receive callback
|
|
55
|
-
const { port, result, close } = await startAuthServer();
|
|
56
|
-
// Build auth URL with callback port
|
|
57
|
-
const authUrl = `${AUTH_WORKER_URL}/auth/cli?port=${port}`;
|
|
58
|
-
console.log('Opening browser to sign in...');
|
|
59
|
-
// Try to open browser
|
|
60
|
-
const opened = await openBrowser(authUrl);
|
|
61
|
-
if (!opened) {
|
|
62
|
-
console.log('');
|
|
63
|
-
console.log('Could not open browser. Please visit:');
|
|
64
|
-
console.log(authUrl);
|
|
65
|
-
console.log('');
|
|
66
|
-
}
|
|
67
|
-
console.log('Waiting for authentication...');
|
|
68
|
-
try {
|
|
69
|
-
// Wait for auth callback
|
|
70
|
-
const authResult = await result;
|
|
71
|
-
// Validate token with server and get existing userDocId
|
|
72
|
-
let userDocId;
|
|
73
|
-
let authUserId;
|
|
74
|
-
try {
|
|
75
|
-
const authProfile = await validateAndGetAuthProfile(authResult.googleIdToken);
|
|
76
|
-
userDocId = authProfile.userDocId;
|
|
77
|
-
authUserId = authProfile.userId;
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
// If validation fails, continue - we'll create user doc below
|
|
81
|
-
}
|
|
82
|
-
// If no userDocId (new user), create user document and register with server
|
|
83
|
-
if (!userDocId) {
|
|
84
|
-
try {
|
|
85
|
-
const modUser = createModUser(repo);
|
|
86
|
-
const userDoc = await modUser.findOrCreate({
|
|
87
|
-
email: authResult.email,
|
|
88
|
-
name: authResult.name,
|
|
89
|
-
googleId: authResult.googleId,
|
|
90
|
-
avatar: null,
|
|
91
|
-
});
|
|
92
|
-
userDocId = userDoc.id;
|
|
93
|
-
// Register the new userDocId with auth worker
|
|
94
|
-
await registerUserDoc(authResult.googleIdToken, userDocId);
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
console.warn('Could not create/register user document:', error);
|
|
98
|
-
// Continue without userDocId - it can be set up later
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
// Add user doc to share policy if available
|
|
102
|
-
if (userDocId) {
|
|
103
|
-
addUserToSharePolicy(userDocId);
|
|
104
|
-
}
|
|
105
|
-
// Store credentials in config
|
|
106
|
-
const updatedConfig = readConfig();
|
|
107
|
-
updatedConfig.auth = {
|
|
108
|
-
googleIdToken: authResult.googleIdToken,
|
|
109
|
-
userId: authUserId || '',
|
|
110
|
-
googleId: authResult.googleId,
|
|
111
|
-
email: authResult.email,
|
|
112
|
-
name: authResult.name,
|
|
113
|
-
userDocId: userDocId || '',
|
|
114
|
-
};
|
|
115
|
-
writeConfig(updatedConfig);
|
|
116
|
-
console.log('');
|
|
117
|
-
console.log(`Signed in as ${authResult.email}`);
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
if (error instanceof Error) {
|
|
121
|
-
if (error.message.includes('timed out')) {
|
|
122
|
-
console.error('');
|
|
123
|
-
console.error('Authentication timed out. Please try again.');
|
|
124
|
-
}
|
|
125
|
-
else if (error.message.includes('cancelled')) {
|
|
126
|
-
console.error('');
|
|
127
|
-
console.error('Authentication cancelled.');
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
console.error('');
|
|
131
|
-
console.error(`Authentication failed: ${error.message}`);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
process.exit(1);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// glassware[type="implementation", id="impl-handle-logout--1f8e80ea", specifications="specification-spec-auth-logout--79cb4081,specification-spec-logout-message--2785cc24"]
|
|
138
|
-
async function handleLogout() {
|
|
139
|
-
const config = readConfig();
|
|
140
|
-
if (!config.auth) {
|
|
141
|
-
console.log('Not signed in.');
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
const email = config.auth.email;
|
|
145
|
-
// Clear auth from config
|
|
146
|
-
config.auth = null;
|
|
147
|
-
writeConfig(config);
|
|
148
|
-
console.log('Signed out successfully');
|
|
149
|
-
console.log(`Removed credentials for ${email}`);
|
|
150
|
-
}
|
|
151
|
-
// glassware[type="implementation", id="impl-handle-status--b14ce725", specifications="specification-spec-auth-status--36efb6a8,specification-spec-status-output--b8935802"]
|
|
152
|
-
async function handleStatus() {
|
|
153
|
-
const config = readConfig();
|
|
154
|
-
if (!config.auth) {
|
|
155
|
-
console.log('Not signed in.');
|
|
156
|
-
console.log('');
|
|
157
|
-
console.log('Sign in to sync with collaborators: mod auth login');
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
console.log(`Signed in as ${config.auth.email}`);
|
|
161
|
-
if (config.auth.name && config.auth.name !== config.auth.email) {
|
|
162
|
-
console.log(`Name: ${config.auth.name}`);
|
|
163
|
-
}
|
|
164
|
-
console.log('Token expires: never');
|
|
165
|
-
// Check if token is still valid (optional)
|
|
166
|
-
try {
|
|
167
|
-
await validateAndGetAuthProfile(config.auth.googleIdToken);
|
|
168
|
-
console.log('Token status: valid');
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
console.log('Token status: could not verify (server unavailable)');
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// glassware[type="implementation", id="impl-validate-token--562d976d", specifications="specification-spec-validate-token--d3856b2d,specification-spec-load-user-doc--c7a835b0,specification-spec-auth-user-id--de3afa93"]
|
|
175
|
-
/**
|
|
176
|
-
* Validate token with server and get auth profile.
|
|
177
|
-
* Returns existing userDocId for returning users, or empty string for new users.
|
|
178
|
-
*/
|
|
179
|
-
async function validateAndGetAuthProfile(token) {
|
|
180
|
-
const response = await fetch(`${AUTH_WORKER_URL}/auth/me`, {
|
|
181
|
-
headers: {
|
|
182
|
-
Authorization: `Bearer ${token}`,
|
|
183
|
-
},
|
|
184
|
-
});
|
|
185
|
-
if (!response.ok) {
|
|
186
|
-
throw new Error('Token validation failed');
|
|
187
|
-
}
|
|
188
|
-
const data = (await response.json());
|
|
189
|
-
return {
|
|
190
|
-
userId: data.id || '',
|
|
191
|
-
userDocId: data.userDocId || '',
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
export async function fetchAuthProfile(token) {
|
|
195
|
-
return validateAndGetAuthProfile(token);
|
|
196
|
-
}
|
|
197
|
-
// glassware[type="implementation", id="impl-register-user-doc--c699a7d3", specifications="specification-spec-register-user-doc--e611f1db"]
|
|
198
|
-
/**
|
|
199
|
-
* Register a new userDocId with the auth worker.
|
|
200
|
-
* Called for new users after creating their Automerge user document.
|
|
201
|
-
*/
|
|
202
|
-
async function registerUserDoc(token, userDocId) {
|
|
203
|
-
const response = await fetch(`${AUTH_WORKER_URL}/auth/register-doc`, {
|
|
204
|
-
method: 'POST',
|
|
205
|
-
headers: {
|
|
206
|
-
'Authorization': `Bearer ${token}`,
|
|
207
|
-
'Content-Type': 'application/json',
|
|
208
|
-
},
|
|
209
|
-
body: JSON.stringify({ userDocId }),
|
|
210
|
-
});
|
|
211
|
-
if (!response.ok) {
|
|
212
|
-
throw new Error(`Failed to register user doc: ${response.status}`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
// glassware[type="implementation", id="impl-dev-login--d3f76c9b", specifications="specification-spec-create-user-doc--282489ae,specification-spec-token-storage--26199fe8"]
|
|
216
|
-
/**
|
|
217
|
-
* Handle dev login - creates a local user document for testing without OAuth.
|
|
218
|
-
* This allows testing the full flow (auth → workspace creation → syncing) on localhost.
|
|
219
|
-
* Uses a shared dev@localhost user that both CLI and web app can access.
|
|
220
|
-
*/
|
|
221
|
-
async function handleDevLogin(repo) {
|
|
222
|
-
console.log('Setting up development authentication...');
|
|
223
|
-
const modUser = createModUser(repo);
|
|
224
|
-
try {
|
|
225
|
-
// Use findOrCreate to get shared dev user across CLI and web app
|
|
226
|
-
console.log('Looking for dev@localhost user...');
|
|
227
|
-
const userDoc = await modUser.findOrCreate({
|
|
228
|
-
email: 'dev@localhost',
|
|
229
|
-
name: 'Dev User',
|
|
230
|
-
googleId: 'dev-google-id',
|
|
231
|
-
avatar: null,
|
|
232
|
-
});
|
|
233
|
-
console.log('Using dev user document:', userDoc.id);
|
|
234
|
-
// Add user doc to share policy so it can sync
|
|
235
|
-
addUserToSharePolicy(userDoc.id);
|
|
236
|
-
// Store dev credentials in config
|
|
237
|
-
const config = readConfig();
|
|
238
|
-
config.auth = {
|
|
239
|
-
googleIdToken: 'dev-token',
|
|
240
|
-
userId: 'dev-user',
|
|
241
|
-
googleId: 'dev-google-id',
|
|
242
|
-
email: 'dev@localhost',
|
|
243
|
-
name: 'Dev User',
|
|
244
|
-
userDocId: userDoc.id,
|
|
245
|
-
};
|
|
246
|
-
writeConfig(config);
|
|
247
|
-
console.log('');
|
|
248
|
-
console.log('✓ Signed in as dev@localhost');
|
|
249
|
-
console.log(` User Document ID: ${userDoc.id}`);
|
|
250
|
-
console.log('');
|
|
251
|
-
console.log('Note: This is development mode for local testing.');
|
|
252
|
-
console.log('Workspaces will sync via ws://localhost:3030');
|
|
253
|
-
console.log('The web app will use the same dev@localhost user.');
|
|
254
|
-
}
|
|
255
|
-
catch (error) {
|
|
256
|
-
console.error('Failed to setup dev user:', error.message);
|
|
257
|
-
process.exit(1);
|
|
258
|
-
}
|
|
259
|
-
}
|