guidemode 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/cjs/auth.d.ts +4 -0
- package/dist/cjs/auth.d.ts.map +1 -0
- package/dist/cjs/auth.js +191 -0
- package/dist/cjs/auth.js.map +1 -0
- package/dist/cjs/config.d.ts +24 -0
- package/dist/cjs/config.d.ts.map +1 -0
- package/dist/cjs/config.js +55 -0
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/deploy.d.ts +18 -0
- package/dist/cjs/deploy.d.ts.map +1 -0
- package/dist/cjs/deploy.js +89 -0
- package/dist/cjs/deploy.js.map +1 -0
- package/dist/cjs/issue.d.ts +18 -0
- package/dist/cjs/issue.d.ts.map +1 -0
- package/dist/cjs/issue.js +79 -0
- package/dist/cjs/issue.js.map +1 -0
- package/dist/cjs/logs.d.ts +7 -0
- package/dist/cjs/logs.d.ts.map +1 -0
- package/dist/cjs/logs.js +75 -0
- package/dist/cjs/logs.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/setup.d.ts +8 -0
- package/dist/cjs/setup.d.ts.map +1 -0
- package/dist/cjs/setup.js +110 -0
- package/dist/cjs/setup.js.map +1 -0
- package/dist/cjs/status.d.ts +6 -0
- package/dist/cjs/status.d.ts.map +1 -0
- package/dist/cjs/status.js +171 -0
- package/dist/cjs/status.js.map +1 -0
- package/dist/cjs/sync.d.ts +8 -0
- package/dist/cjs/sync.d.ts.map +1 -0
- package/dist/cjs/sync.js +201 -0
- package/dist/cjs/sync.js.map +1 -0
- package/dist/cjs/utils/brand.d.ts +5 -0
- package/dist/cjs/utils/brand.d.ts.map +1 -0
- package/dist/cjs/utils/brand.js +8 -0
- package/dist/cjs/utils/brand.js.map +1 -0
- package/dist/cjs/utils/git.d.ts +11 -0
- package/dist/cjs/utils/git.d.ts.map +1 -0
- package/dist/cjs/utils/git.js +92 -0
- package/dist/cjs/utils/git.js.map +1 -0
- package/dist/cjs/utils/logger.d.ts +2 -0
- package/dist/cjs/utils/logger.d.ts.map +1 -0
- package/dist/cjs/utils/logger.js +26 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/cjs/validate.d.ts +22 -0
- package/dist/cjs/validate.d.ts.map +1 -0
- package/dist/cjs/validate.js +169 -0
- package/dist/cjs/validate.js.map +1 -0
- package/dist/esm/auth.d.ts +4 -0
- package/dist/esm/auth.d.ts.map +1 -0
- package/dist/esm/auth.js +191 -0
- package/dist/esm/auth.js.map +1 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +348 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/config.d.ts +24 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/config.js +55 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/deploy.d.ts +18 -0
- package/dist/esm/deploy.d.ts.map +1 -0
- package/dist/esm/deploy.js +89 -0
- package/dist/esm/deploy.js.map +1 -0
- package/dist/esm/issue.d.ts +18 -0
- package/dist/esm/issue.d.ts.map +1 -0
- package/dist/esm/issue.js +79 -0
- package/dist/esm/issue.js.map +1 -0
- package/dist/esm/logs.d.ts +7 -0
- package/dist/esm/logs.d.ts.map +1 -0
- package/dist/esm/logs.js +75 -0
- package/dist/esm/logs.js.map +1 -0
- package/dist/esm/setup.d.ts +8 -0
- package/dist/esm/setup.d.ts.map +1 -0
- package/dist/esm/setup.js +110 -0
- package/dist/esm/setup.js.map +1 -0
- package/dist/esm/status.d.ts +6 -0
- package/dist/esm/status.d.ts.map +1 -0
- package/dist/esm/status.js +171 -0
- package/dist/esm/status.js.map +1 -0
- package/dist/esm/sync.d.ts +8 -0
- package/dist/esm/sync.d.ts.map +1 -0
- package/dist/esm/sync.js +201 -0
- package/dist/esm/sync.js.map +1 -0
- package/dist/esm/utils/brand.d.ts +5 -0
- package/dist/esm/utils/brand.d.ts.map +1 -0
- package/dist/esm/utils/brand.js +8 -0
- package/dist/esm/utils/brand.js.map +1 -0
- package/dist/esm/utils/git.d.ts +11 -0
- package/dist/esm/utils/git.d.ts.map +1 -0
- package/dist/esm/utils/git.js +92 -0
- package/dist/esm/utils/git.js.map +1 -0
- package/dist/esm/utils/logger.d.ts +2 -0
- package/dist/esm/utils/logger.d.ts.map +1 -0
- package/dist/esm/utils/logger.js +26 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/validate.d.ts +22 -0
- package/dist/esm/validate.d.ts.map +1 -0
- package/dist/esm/validate.js +169 -0
- package/dist/esm/validate.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/logs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAQD,wBAAsB,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiElE"}
|
package/dist/cjs/logs.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFile, stat, watch } from 'node:fs/promises';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { LOG_FILE } from './config.js';
|
|
4
|
+
import { PREFIX } from './utils/brand.js';
|
|
5
|
+
function colorizeLine(line) {
|
|
6
|
+
if (line.includes('ERROR'))
|
|
7
|
+
return chalk.red(line);
|
|
8
|
+
if (line.includes('WARN'))
|
|
9
|
+
return chalk.yellow(line);
|
|
10
|
+
return line;
|
|
11
|
+
}
|
|
12
|
+
export async function runLogs(options) {
|
|
13
|
+
const lineCount = options?.lines ?? 30;
|
|
14
|
+
const errorsOnly = options?.errors ?? false;
|
|
15
|
+
try {
|
|
16
|
+
await stat(LOG_FILE);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
console.log(chalk.yellow(`${PREFIX} No log file found at:`), LOG_FILE);
|
|
20
|
+
console.log(chalk.gray('Logs will appear after your first sync.'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const content = await readFile(LOG_FILE, 'utf-8');
|
|
24
|
+
let lines = content.split('\n').filter(Boolean);
|
|
25
|
+
if (errorsOnly) {
|
|
26
|
+
lines = lines.filter(l => l.includes('ERROR') || l.includes('WARN'));
|
|
27
|
+
}
|
|
28
|
+
const tail = lines.slice(-lineCount);
|
|
29
|
+
if (tail.length === 0) {
|
|
30
|
+
if (errorsOnly) {
|
|
31
|
+
console.log(`${PREFIX} ${chalk.green('No errors or warnings found.')}`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(chalk.yellow(`${PREFIX} Log file is empty.`));
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const line of tail) {
|
|
39
|
+
console.log(colorizeLine(line));
|
|
40
|
+
}
|
|
41
|
+
if (options?.follow) {
|
|
42
|
+
console.log(chalk.gray('\n--- Following log file (Ctrl+C to stop) ---\n'));
|
|
43
|
+
let lastSize = (await stat(LOG_FILE)).size;
|
|
44
|
+
try {
|
|
45
|
+
const watcher = watch(LOG_FILE);
|
|
46
|
+
for await (const _event of watcher) {
|
|
47
|
+
try {
|
|
48
|
+
const currentStat = await stat(LOG_FILE);
|
|
49
|
+
if (currentStat.size > lastSize) {
|
|
50
|
+
const fd = await import('node:fs/promises');
|
|
51
|
+
const fh = await fd.open(LOG_FILE, 'r');
|
|
52
|
+
const buf = Buffer.alloc(currentStat.size - lastSize);
|
|
53
|
+
await fh.read(buf, 0, buf.length, lastSize);
|
|
54
|
+
await fh.close();
|
|
55
|
+
const newContent = buf.toString('utf-8');
|
|
56
|
+
const newLines = newContent.split('\n').filter(Boolean);
|
|
57
|
+
for (const line of newLines) {
|
|
58
|
+
if (errorsOnly && !line.includes('ERROR') && !line.includes('WARN'))
|
|
59
|
+
continue;
|
|
60
|
+
console.log(colorizeLine(line));
|
|
61
|
+
}
|
|
62
|
+
lastSize = currentStat.size;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// File might be rotated or deleted - keep watching
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Watcher error - exit gracefully
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function detectHooksTarget(): Promise<string>;
|
|
2
|
+
export declare function installHooks(targetPath: string): Promise<void>;
|
|
3
|
+
export interface SetupOptions {
|
|
4
|
+
server?: string;
|
|
5
|
+
force?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function runSetup(options?: SetupOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AA2BA,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CASzD;AAgBD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCpE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCpE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { DEFAULT_SYNC_HOOKS, loadConfig } from './config.js';
|
|
6
|
+
import { loginFlow } from './auth.js';
|
|
7
|
+
import { runStatus } from './status.js';
|
|
8
|
+
import { brandTitle } from './utils/brand.js';
|
|
9
|
+
const GUIDEMODE_HOOK = { type: 'command', command: 'guidemode sync', timeout: 60 };
|
|
10
|
+
const HOOKS_CONFIG = {
|
|
11
|
+
hooks: {
|
|
12
|
+
Stop: [{ hooks: [GUIDEMODE_HOOK] }],
|
|
13
|
+
PreCompact: [{ hooks: [GUIDEMODE_HOOK] }],
|
|
14
|
+
SessionEnd: [{ hooks: [GUIDEMODE_HOOK] }],
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
async function fileExists(path) {
|
|
18
|
+
try {
|
|
19
|
+
await access(path);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function detectHooksTarget() {
|
|
27
|
+
// Check if .claude/ exists in cwd (local project)
|
|
28
|
+
const localClaudeDir = join(process.cwd(), '.claude');
|
|
29
|
+
if (await fileExists(localClaudeDir)) {
|
|
30
|
+
return join(localClaudeDir, 'settings.local.json');
|
|
31
|
+
}
|
|
32
|
+
// Default to global
|
|
33
|
+
return join(homedir(), '.claude', 'settings.local.json');
|
|
34
|
+
}
|
|
35
|
+
function hasGuidemodeHook(entry) {
|
|
36
|
+
// New format: { hooks: [{ command: "guidemode sync" }] }
|
|
37
|
+
if (Array.isArray(entry.hooks)) {
|
|
38
|
+
return entry.hooks.some((h) => typeof h.command === 'string' && h.command.includes('guidemode sync'));
|
|
39
|
+
}
|
|
40
|
+
// Old format: { command: "guidemode sync" }
|
|
41
|
+
return typeof entry.command === 'string' && entry.command.includes('guidemode sync');
|
|
42
|
+
}
|
|
43
|
+
export async function installHooks(targetPath) {
|
|
44
|
+
const targetDir = join(targetPath, '..');
|
|
45
|
+
await mkdir(targetDir, { recursive: true });
|
|
46
|
+
// Read existing settings if present
|
|
47
|
+
let settings = {};
|
|
48
|
+
try {
|
|
49
|
+
const content = await readFile(targetPath, 'utf-8');
|
|
50
|
+
settings = JSON.parse(content);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// No existing settings file
|
|
54
|
+
}
|
|
55
|
+
// Merge hooks into settings
|
|
56
|
+
const existingHooks = (settings.hooks || {});
|
|
57
|
+
const newHooks = { ...existingHooks };
|
|
58
|
+
for (const [event, newEntries] of Object.entries(HOOKS_CONFIG.hooks)) {
|
|
59
|
+
const existing = (existingHooks[event] || []);
|
|
60
|
+
// Remove any old-format guidemode entries
|
|
61
|
+
const filtered = existing.filter(entry => !hasGuidemodeHook(entry));
|
|
62
|
+
// Check if new-format guidemode hook is already present
|
|
63
|
+
const alreadyInstalled = filtered.some(entry => hasGuidemodeHook(entry));
|
|
64
|
+
if (!alreadyInstalled) {
|
|
65
|
+
newHooks[event] = [...filtered, ...newEntries];
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
newHooks[event] = filtered;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
settings.hooks = newHooks;
|
|
72
|
+
await writeFile(targetPath, JSON.stringify(settings, null, 2), { mode: 0o600 });
|
|
73
|
+
}
|
|
74
|
+
export async function runSetup(options) {
|
|
75
|
+
const serverUrl = options?.server || 'https://app.guidemode.dev';
|
|
76
|
+
console.log(brandTitle(chalk.bold('GuideMode Setup\n')));
|
|
77
|
+
// Step 1: Check if already logged in
|
|
78
|
+
const config = await loadConfig();
|
|
79
|
+
if (config.apiKey && !options?.force) {
|
|
80
|
+
const username = config.username || config.name || 'Unknown';
|
|
81
|
+
console.log(chalk.green(`✓ Already logged in as ${username}`));
|
|
82
|
+
if (config.tenantName) {
|
|
83
|
+
console.log(chalk.gray(` Tenant: ${config.tenantName}`));
|
|
84
|
+
}
|
|
85
|
+
console.log(chalk.gray(' Use --force to re-authenticate\n'));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Step 2: Run login flow
|
|
89
|
+
console.log(brandTitle(chalk.bold('Step 1: Authentication\n')));
|
|
90
|
+
await loginFlow(serverUrl);
|
|
91
|
+
console.log();
|
|
92
|
+
}
|
|
93
|
+
// Step 3: Install Claude Code hooks
|
|
94
|
+
console.log(brandTitle(chalk.bold('Step 2: Install Claude Code hooks\n')));
|
|
95
|
+
const targetPath = await detectHooksTarget();
|
|
96
|
+
console.log(chalk.gray(` Target: ${targetPath}`));
|
|
97
|
+
try {
|
|
98
|
+
await installHooks(targetPath);
|
|
99
|
+
const hookEvents = DEFAULT_SYNC_HOOKS.join(', ');
|
|
100
|
+
console.log(chalk.green(`✓ Hooks installed for: ${hookEvents}`));
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error(chalk.red('✗ Failed to install hooks:'), err instanceof Error ? err.message : String(err));
|
|
104
|
+
console.log(chalk.gray(' You can manually add hooks to your Claude Code settings.'));
|
|
105
|
+
}
|
|
106
|
+
// Step 4: Verify
|
|
107
|
+
console.log(brandTitle(chalk.bold('Step 3: Verification\n')));
|
|
108
|
+
await runStatus({ verbose: true });
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/status.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAmFD,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGtE"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { execFile as execFileCb } from 'node:child_process';
|
|
2
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { CONFIG_FILE, DEFAULT_SYNC_HOOKS, LOG_FILE, loadConfig } from './config.js';
|
|
6
|
+
import { PREFIX } from './utils/brand.js';
|
|
7
|
+
const execFile = promisify(execFileCb);
|
|
8
|
+
async function checkDependencies() {
|
|
9
|
+
const missing = [];
|
|
10
|
+
try {
|
|
11
|
+
await execFile('git', ['--version'], { timeout: 5000 });
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
missing.push('git');
|
|
15
|
+
}
|
|
16
|
+
if (missing.length > 0) {
|
|
17
|
+
return { name: 'Dependencies', passed: false, detail: `missing: ${missing.join(' ')}` };
|
|
18
|
+
}
|
|
19
|
+
return { name: 'Dependencies', passed: true };
|
|
20
|
+
}
|
|
21
|
+
async function checkConfig() {
|
|
22
|
+
try {
|
|
23
|
+
await stat(CONFIG_FILE);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {
|
|
27
|
+
name: 'Config',
|
|
28
|
+
passed: false,
|
|
29
|
+
detail: 'not found — run "guidemode setup" to configure',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const config = await loadConfig();
|
|
33
|
+
if (!config.serverUrl) {
|
|
34
|
+
return { name: 'Config', passed: false, detail: 'server URL not configured' };
|
|
35
|
+
}
|
|
36
|
+
if (!config.apiKey) {
|
|
37
|
+
return { name: 'Config', passed: false, detail: 'API key not configured' };
|
|
38
|
+
}
|
|
39
|
+
return { name: 'Config', passed: true, config: Promise.resolve(config) };
|
|
40
|
+
}
|
|
41
|
+
async function checkConnectivity(serverUrl, apiKey) {
|
|
42
|
+
try {
|
|
43
|
+
const controller = new AbortController();
|
|
44
|
+
const timer = setTimeout(() => controller.abort(), 10000);
|
|
45
|
+
const response = await fetch(`${serverUrl}/auth/session`, {
|
|
46
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
47
|
+
signal: controller.signal,
|
|
48
|
+
});
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
if (response.ok) {
|
|
51
|
+
return { name: 'Server', passed: true };
|
|
52
|
+
}
|
|
53
|
+
if (response.status === 401 || response.status === 403) {
|
|
54
|
+
return {
|
|
55
|
+
name: 'Server',
|
|
56
|
+
passed: false,
|
|
57
|
+
detail: `API key invalid (HTTP ${response.status})`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return { name: 'Server', passed: false, detail: `HTTP ${response.status}` };
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
+
if (message.includes('abort')) {
|
|
65
|
+
return { name: 'Server', passed: false, detail: `cannot reach ${serverUrl}` };
|
|
66
|
+
}
|
|
67
|
+
return { name: 'Server', passed: false, detail: `cannot reach ${serverUrl}: ${message}` };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function checkLogs() {
|
|
71
|
+
try {
|
|
72
|
+
const content = await readFile(LOG_FILE, 'utf-8');
|
|
73
|
+
const lines = content.split('\n').slice(-50);
|
|
74
|
+
const errorCount = lines.filter(l => l.includes('ERROR')).length;
|
|
75
|
+
if (errorCount > 0) {
|
|
76
|
+
return { name: 'Logs', passed: true, warning: `${errorCount} recent errors` };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// No log file, that's fine
|
|
81
|
+
}
|
|
82
|
+
return { name: 'Logs', passed: true };
|
|
83
|
+
}
|
|
84
|
+
export async function runStatus(options) {
|
|
85
|
+
const checks = [];
|
|
86
|
+
// Check dependencies
|
|
87
|
+
checks.push(await checkDependencies());
|
|
88
|
+
// Check config
|
|
89
|
+
const configCheck = await checkConfig();
|
|
90
|
+
checks.push(configCheck);
|
|
91
|
+
let config = null;
|
|
92
|
+
if (configCheck.passed) {
|
|
93
|
+
config = await loadConfig();
|
|
94
|
+
}
|
|
95
|
+
// Check connectivity (only if config is valid)
|
|
96
|
+
if (config?.apiKey && config?.serverUrl) {
|
|
97
|
+
checks.push(await checkConnectivity(config.serverUrl, config.apiKey));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
checks.push({ name: 'Server', passed: false, detail: 'cannot test (missing config)' });
|
|
101
|
+
}
|
|
102
|
+
// Check logs
|
|
103
|
+
checks.push(await checkLogs());
|
|
104
|
+
const allOk = checks.every(c => c.passed);
|
|
105
|
+
if (options?.json) {
|
|
106
|
+
const output = {
|
|
107
|
+
ok: allOk,
|
|
108
|
+
checks: checks.map(c => ({
|
|
109
|
+
name: c.name,
|
|
110
|
+
passed: c.passed,
|
|
111
|
+
...(c.detail && { detail: c.detail }),
|
|
112
|
+
...(c.warning && { warning: c.warning }),
|
|
113
|
+
})),
|
|
114
|
+
...(config && {
|
|
115
|
+
user: config.username || config.name,
|
|
116
|
+
tenant: config.tenantName,
|
|
117
|
+
server: config.serverUrl,
|
|
118
|
+
hooks: config.syncHooks || DEFAULT_SYNC_HOOKS,
|
|
119
|
+
}),
|
|
120
|
+
};
|
|
121
|
+
console.log(JSON.stringify(output, null, 2));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Print check line
|
|
125
|
+
const symbols = checks.map(c => (c.passed ? chalk.green(`✓ ${c.name}`) : chalk.red(`✗ ${c.name}`)));
|
|
126
|
+
console.log(`${PREFIX} ${symbols.join(' ')}`);
|
|
127
|
+
// Show details if issues found
|
|
128
|
+
if (!allOk) {
|
|
129
|
+
for (const c of checks) {
|
|
130
|
+
if (!c.passed && c.detail) {
|
|
131
|
+
console.log(chalk.red(` ✗ ${c.name}: ${c.detail}`));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Show warnings
|
|
136
|
+
for (const c of checks) {
|
|
137
|
+
if (c.warning) {
|
|
138
|
+
console.log(chalk.yellow(` ! ${c.name}: ${c.warning}`));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Verbose mode
|
|
142
|
+
if (allOk && options?.verbose && config) {
|
|
143
|
+
const username = config.username || config.name || '?';
|
|
144
|
+
const tenant = config.tenantName || '?';
|
|
145
|
+
console.log(` User: ${username}@${tenant} → ${config.serverUrl}`);
|
|
146
|
+
const hooks = config.syncHooks || DEFAULT_SYNC_HOOKS;
|
|
147
|
+
console.log(` Hooks: ${hooks.join(', ')}`);
|
|
148
|
+
try {
|
|
149
|
+
const content = await readFile(LOG_FILE, 'utf-8');
|
|
150
|
+
const lines = content.split('\n').filter(Boolean);
|
|
151
|
+
const lastUpload = lines
|
|
152
|
+
.filter(l => l.includes('Successfully uploaded') || l.includes('Upload failed') || l.includes('unchanged'))
|
|
153
|
+
.pop();
|
|
154
|
+
if (lastUpload) {
|
|
155
|
+
const stripped = lastUpload.replace(/^.*?\] /, '');
|
|
156
|
+
console.log(` Last: ${stripped}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// No log file
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Summary line
|
|
164
|
+
if (allOk) {
|
|
165
|
+
console.log(`${PREFIX} ${chalk.green('✓ ALL OK')} — Sessions are syncing to GuideMode`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.log(`${PREFIX} ${chalk.red('✗ ISSUES FOUND')} — See above for details`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"AA+FA,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoKlE"}
|
package/dist/cjs/sync.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import { gzip } from 'node:zlib';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { DEFAULT_SYNC_HOOKS, loadConfig } from './config.js';
|
|
6
|
+
import { logToFile } from './utils/logger.js';
|
|
7
|
+
import { detectProjectType, getGitMetadata } from './utils/git.js';
|
|
8
|
+
const gzipAsync = promisify(gzip);
|
|
9
|
+
const FETCH_TIMEOUT = 30000;
|
|
10
|
+
function parseStdin(raw) {
|
|
11
|
+
try {
|
|
12
|
+
const d = JSON.parse(raw);
|
|
13
|
+
return {
|
|
14
|
+
sessionId: d.session_id || '',
|
|
15
|
+
transcriptPath: d.transcript_path || '',
|
|
16
|
+
cwd: d.cwd || '',
|
|
17
|
+
hookEvent: d.hook_event_name || '',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function readStdin() {
|
|
25
|
+
return new Promise(resolve => {
|
|
26
|
+
let data = '';
|
|
27
|
+
process.stdin.setEncoding('utf8');
|
|
28
|
+
process.stdin.on('data', chunk => {
|
|
29
|
+
data += chunk;
|
|
30
|
+
});
|
|
31
|
+
process.stdin.on('end', () => resolve(data));
|
|
32
|
+
// If stdin is a TTY (not piped), resolve immediately
|
|
33
|
+
if (process.stdin.isTTY) {
|
|
34
|
+
resolve('');
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function fetchWithTimeout(url, options) {
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT);
|
|
41
|
+
try {
|
|
42
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function triggerProcessing(apiKey, serverUrl, sessionId, hookEvent) {
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetchWithTimeout(`${serverUrl}/api/session-processing/process/${encodeURIComponent(sessionId)}`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: {
|
|
53
|
+
Authorization: `Bearer ${apiKey}`,
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
},
|
|
56
|
+
body: '{}',
|
|
57
|
+
});
|
|
58
|
+
if (response.ok) {
|
|
59
|
+
await logToFile('INFO', `[${hookEvent}] Triggered processing for session ${sessionId}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const body = await response.text().catch(() => '');
|
|
63
|
+
await logToFile('WARN', `[${hookEvent}] Processing trigger returned HTTP ${response.status}: ${body}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
await logToFile('WARN', `[${hookEvent}] Processing trigger failed for session ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function runSync(options) {
|
|
71
|
+
let input = null;
|
|
72
|
+
if (options?.sessionId && options?.transcriptPath) {
|
|
73
|
+
// CLI arg mode
|
|
74
|
+
input = {
|
|
75
|
+
sessionId: options.sessionId,
|
|
76
|
+
transcriptPath: options.transcriptPath,
|
|
77
|
+
cwd: options.cwd || process.cwd(),
|
|
78
|
+
hookEvent: options.hookEvent || 'Manual',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Stdin mode (hook invocation)
|
|
83
|
+
const raw = await readStdin();
|
|
84
|
+
if (!raw) {
|
|
85
|
+
await logToFile('ERROR', 'No input received on stdin');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
input = parseStdin(raw);
|
|
89
|
+
if (!input) {
|
|
90
|
+
await logToFile('ERROR', 'Failed to parse stdin JSON');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!input.sessionId || !input.transcriptPath) {
|
|
95
|
+
await logToFile('ERROR', 'Missing session_id or transcript_path in input');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const hookEvent = input.hookEvent;
|
|
99
|
+
// Load config
|
|
100
|
+
const config = await loadConfig();
|
|
101
|
+
if (!config.apiKey || !config.serverUrl) {
|
|
102
|
+
await logToFile('INFO', 'No apiKey or serverUrl in config - skipping upload (run setup first)');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Check if this hook event is enabled
|
|
106
|
+
const enabledHooks = config.syncHooks || DEFAULT_SYNC_HOOKS;
|
|
107
|
+
if (hookEvent && !enabledHooks.includes(hookEvent) && hookEvent !== 'Manual') {
|
|
108
|
+
await logToFile('INFO', `Hook ${hookEvent} not enabled in syncHooks config - skipping`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Check transcript file exists
|
|
112
|
+
try {
|
|
113
|
+
await stat(input.transcriptPath);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
await logToFile('ERROR', `Transcript file not found: ${input.transcriptPath}`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
await logToFile('INFO', `[${hookEvent}] Processing session ${input.sessionId} from ${input.transcriptPath}`);
|
|
120
|
+
const { apiKey, serverUrl } = config;
|
|
121
|
+
// Compute SHA256 hash
|
|
122
|
+
const fileContent = await readFile(input.transcriptPath);
|
|
123
|
+
const fileHash = createHash('sha256').update(fileContent).digest('hex');
|
|
124
|
+
// Check hash with server (dedup)
|
|
125
|
+
try {
|
|
126
|
+
const checkUrl = `${serverUrl}/api/agent-sessions/check-hash?sessionId=${encodeURIComponent(input.sessionId)}&fileHash=${fileHash}`;
|
|
127
|
+
const checkResponse = await fetchWithTimeout(checkUrl, {
|
|
128
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
129
|
+
});
|
|
130
|
+
if (checkResponse.ok) {
|
|
131
|
+
const checkData = (await checkResponse.json());
|
|
132
|
+
if (checkData.needsUpload === false) {
|
|
133
|
+
await logToFile('INFO', `[${hookEvent}] Session ${input.sessionId} unchanged (hash match) - skipping upload`);
|
|
134
|
+
// On SessionEnd, still trigger processing even if upload was skipped
|
|
135
|
+
if (hookEvent === 'SessionEnd') {
|
|
136
|
+
await triggerProcessing(apiKey, serverUrl, input.sessionId, hookEvent);
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
await logToFile('WARN', `Hash check returned ${checkResponse.status} - proceeding with upload`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
await logToFile('ERROR', `Hash check request failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Gzip and base64 encode
|
|
150
|
+
const compressed = await gzipAsync(fileContent);
|
|
151
|
+
const content = compressed.toString('base64');
|
|
152
|
+
const fileSize = fileContent.length;
|
|
153
|
+
// Extract git metadata
|
|
154
|
+
const gitMeta = await getGitMetadata(input.cwd);
|
|
155
|
+
const detectedRepoType = await detectProjectType(input.cwd);
|
|
156
|
+
// Build upload payload
|
|
157
|
+
const payload = {
|
|
158
|
+
provider: 'claude-code',
|
|
159
|
+
repositoryName: gitMeta.repoName,
|
|
160
|
+
sessionId: input.sessionId,
|
|
161
|
+
fileName: `${input.sessionId}.jsonl`,
|
|
162
|
+
fileHash,
|
|
163
|
+
content,
|
|
164
|
+
contentEncoding: 'gzip',
|
|
165
|
+
fileSize,
|
|
166
|
+
...(gitMeta.branch && { gitBranch: gitMeta.branch }),
|
|
167
|
+
...(gitMeta.commitHash && { latestCommitHash: gitMeta.commitHash }),
|
|
168
|
+
...(gitMeta.commitHash && { firstCommitHash: gitMeta.commitHash }),
|
|
169
|
+
repositoryMetadata: {
|
|
170
|
+
cwd: input.cwd || '.',
|
|
171
|
+
gitRemoteUrl: gitMeta.remoteUrl,
|
|
172
|
+
detectedRepositoryType: detectedRepoType,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
// Upload to server
|
|
176
|
+
try {
|
|
177
|
+
const uploadResponse = await fetchWithTimeout(`${serverUrl}/api/agent-sessions/upload-v2`, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
Authorization: `Bearer ${apiKey}`,
|
|
181
|
+
'Content-Type': 'application/json',
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify(payload),
|
|
184
|
+
});
|
|
185
|
+
if (uploadResponse.ok) {
|
|
186
|
+
await logToFile('INFO', `[${hookEvent}] Successfully uploaded session ${input.sessionId} (HTTP ${uploadResponse.status})`);
|
|
187
|
+
// On SessionEnd, trigger server-side processing
|
|
188
|
+
if (hookEvent === 'SessionEnd') {
|
|
189
|
+
await triggerProcessing(apiKey, serverUrl, input.sessionId, hookEvent);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const body = await uploadResponse.text().catch(() => '');
|
|
194
|
+
await logToFile('ERROR', `[${hookEvent}] Upload failed with HTTP ${uploadResponse.status}: ${body}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
await logToFile('ERROR', `[${hookEvent}] Upload request failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"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"}
|