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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/dist/cjs/auth.d.ts +4 -0
  4. package/dist/cjs/auth.d.ts.map +1 -0
  5. package/dist/cjs/auth.js +191 -0
  6. package/dist/cjs/auth.js.map +1 -0
  7. package/dist/cjs/config.d.ts +24 -0
  8. package/dist/cjs/config.d.ts.map +1 -0
  9. package/dist/cjs/config.js +55 -0
  10. package/dist/cjs/config.js.map +1 -0
  11. package/dist/cjs/deploy.d.ts +18 -0
  12. package/dist/cjs/deploy.d.ts.map +1 -0
  13. package/dist/cjs/deploy.js +89 -0
  14. package/dist/cjs/deploy.js.map +1 -0
  15. package/dist/cjs/issue.d.ts +18 -0
  16. package/dist/cjs/issue.d.ts.map +1 -0
  17. package/dist/cjs/issue.js +79 -0
  18. package/dist/cjs/issue.js.map +1 -0
  19. package/dist/cjs/logs.d.ts +7 -0
  20. package/dist/cjs/logs.d.ts.map +1 -0
  21. package/dist/cjs/logs.js +75 -0
  22. package/dist/cjs/logs.js.map +1 -0
  23. package/dist/cjs/package.json +1 -0
  24. package/dist/cjs/setup.d.ts +8 -0
  25. package/dist/cjs/setup.d.ts.map +1 -0
  26. package/dist/cjs/setup.js +110 -0
  27. package/dist/cjs/setup.js.map +1 -0
  28. package/dist/cjs/status.d.ts +6 -0
  29. package/dist/cjs/status.d.ts.map +1 -0
  30. package/dist/cjs/status.js +171 -0
  31. package/dist/cjs/status.js.map +1 -0
  32. package/dist/cjs/sync.d.ts +8 -0
  33. package/dist/cjs/sync.d.ts.map +1 -0
  34. package/dist/cjs/sync.js +201 -0
  35. package/dist/cjs/sync.js.map +1 -0
  36. package/dist/cjs/utils/brand.d.ts +5 -0
  37. package/dist/cjs/utils/brand.d.ts.map +1 -0
  38. package/dist/cjs/utils/brand.js +8 -0
  39. package/dist/cjs/utils/brand.js.map +1 -0
  40. package/dist/cjs/utils/git.d.ts +11 -0
  41. package/dist/cjs/utils/git.d.ts.map +1 -0
  42. package/dist/cjs/utils/git.js +92 -0
  43. package/dist/cjs/utils/git.js.map +1 -0
  44. package/dist/cjs/utils/logger.d.ts +2 -0
  45. package/dist/cjs/utils/logger.d.ts.map +1 -0
  46. package/dist/cjs/utils/logger.js +26 -0
  47. package/dist/cjs/utils/logger.js.map +1 -0
  48. package/dist/cjs/validate.d.ts +22 -0
  49. package/dist/cjs/validate.d.ts.map +1 -0
  50. package/dist/cjs/validate.js +169 -0
  51. package/dist/cjs/validate.js.map +1 -0
  52. package/dist/esm/auth.d.ts +4 -0
  53. package/dist/esm/auth.d.ts.map +1 -0
  54. package/dist/esm/auth.js +191 -0
  55. package/dist/esm/auth.js.map +1 -0
  56. package/dist/esm/cli.d.ts +3 -0
  57. package/dist/esm/cli.d.ts.map +1 -0
  58. package/dist/esm/cli.js +348 -0
  59. package/dist/esm/cli.js.map +1 -0
  60. package/dist/esm/config.d.ts +24 -0
  61. package/dist/esm/config.d.ts.map +1 -0
  62. package/dist/esm/config.js +55 -0
  63. package/dist/esm/config.js.map +1 -0
  64. package/dist/esm/deploy.d.ts +18 -0
  65. package/dist/esm/deploy.d.ts.map +1 -0
  66. package/dist/esm/deploy.js +89 -0
  67. package/dist/esm/deploy.js.map +1 -0
  68. package/dist/esm/issue.d.ts +18 -0
  69. package/dist/esm/issue.d.ts.map +1 -0
  70. package/dist/esm/issue.js +79 -0
  71. package/dist/esm/issue.js.map +1 -0
  72. package/dist/esm/logs.d.ts +7 -0
  73. package/dist/esm/logs.d.ts.map +1 -0
  74. package/dist/esm/logs.js +75 -0
  75. package/dist/esm/logs.js.map +1 -0
  76. package/dist/esm/setup.d.ts +8 -0
  77. package/dist/esm/setup.d.ts.map +1 -0
  78. package/dist/esm/setup.js +110 -0
  79. package/dist/esm/setup.js.map +1 -0
  80. package/dist/esm/status.d.ts +6 -0
  81. package/dist/esm/status.d.ts.map +1 -0
  82. package/dist/esm/status.js +171 -0
  83. package/dist/esm/status.js.map +1 -0
  84. package/dist/esm/sync.d.ts +8 -0
  85. package/dist/esm/sync.d.ts.map +1 -0
  86. package/dist/esm/sync.js +201 -0
  87. package/dist/esm/sync.js.map +1 -0
  88. package/dist/esm/utils/brand.d.ts +5 -0
  89. package/dist/esm/utils/brand.d.ts.map +1 -0
  90. package/dist/esm/utils/brand.js +8 -0
  91. package/dist/esm/utils/brand.js.map +1 -0
  92. package/dist/esm/utils/git.d.ts +11 -0
  93. package/dist/esm/utils/git.d.ts.map +1 -0
  94. package/dist/esm/utils/git.js +92 -0
  95. package/dist/esm/utils/git.js.map +1 -0
  96. package/dist/esm/utils/logger.d.ts +2 -0
  97. package/dist/esm/utils/logger.d.ts.map +1 -0
  98. package/dist/esm/utils/logger.js +26 -0
  99. package/dist/esm/utils/logger.js.map +1 -0
  100. package/dist/esm/validate.d.ts +22 -0
  101. package/dist/esm/validate.d.ts.map +1 -0
  102. package/dist/esm/validate.js +169 -0
  103. package/dist/esm/validate.js.map +1 -0
  104. package/dist/tsconfig.tsbuildinfo +1 -0
  105. package/package.json +54 -0
@@ -0,0 +1,79 @@
1
+ import chalk from 'chalk';
2
+ import { getApiKey, getServerUrl } from './config.js';
3
+ /**
4
+ * Create or update an issue via the GuideMode API
5
+ */
6
+ export async function createIssue(options) {
7
+ const apiKey = await getApiKey();
8
+ if (!apiKey) {
9
+ console.error(chalk.red('✗ Not authenticated'));
10
+ console.log(chalk.gray('Run "guidemode login" to authenticate first'));
11
+ process.exit(1);
12
+ }
13
+ const serverUrl = await getServerUrl();
14
+ // Generate external ID if not provided
15
+ const externalId = options.externalId || `manual-issue-${crypto.randomUUID()}`;
16
+ // Parse labels from comma-separated string
17
+ const labels = options.labels ? options.labels.split(',').map(l => l.trim()) : undefined;
18
+ const payload = {
19
+ projectKey: options.repository,
20
+ externalId,
21
+ title: options.title,
22
+ type: options.type,
23
+ state: options.state,
24
+ body: options.body,
25
+ url: options.url,
26
+ labels,
27
+ assigneeUsername: options.assignee,
28
+ closedAt: options.closedAt,
29
+ };
30
+ try {
31
+ const response = await fetch(`${serverUrl}/api/webhooks/v1/issues`, {
32
+ method: 'POST',
33
+ headers: {
34
+ Authorization: `Bearer ${apiKey}`,
35
+ 'Content-Type': 'application/json',
36
+ },
37
+ body: JSON.stringify(payload),
38
+ });
39
+ if (!response.ok) {
40
+ const errorData = (await response.json());
41
+ if (response.status === 401) {
42
+ console.error(chalk.red('✗ Authentication failed'));
43
+ console.log(chalk.gray('Your API key may have expired. Run "guidemode login" to re-authenticate'));
44
+ process.exit(1);
45
+ }
46
+ if (response.status === 400 && errorData.details) {
47
+ console.error(chalk.red('✗ Validation failed:'));
48
+ for (const detail of errorData.details) {
49
+ console.error(chalk.gray(` ${detail.path}: ${detail.message}`));
50
+ }
51
+ process.exit(1);
52
+ }
53
+ console.error(chalk.red(`✗ Error: ${errorData.error}`));
54
+ process.exit(1);
55
+ }
56
+ const result = (await response.json());
57
+ if (options.json) {
58
+ console.log(JSON.stringify(result, null, 2));
59
+ }
60
+ else {
61
+ const actionVerb = result.action === 'created' ? 'Created' : 'Updated';
62
+ console.log(chalk.green(`✓ ${actionVerb} issue successfully`));
63
+ console.log(chalk.gray(` ID: ${result.id}`));
64
+ console.log(chalk.gray(` External ID: ${result.externalId}`));
65
+ console.log(chalk.gray(` Repository: ${options.repository}`));
66
+ console.log(chalk.gray(` Type: ${options.type}`));
67
+ console.log(chalk.gray(` State: ${options.state}`));
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (error instanceof TypeError && error.message.includes('fetch')) {
72
+ console.error(chalk.red('✗ Network error: Could not connect to server'));
73
+ console.log(chalk.gray(`Server URL: ${serverUrl}`));
74
+ process.exit(1);
75
+ }
76
+ throw error;
77
+ }
78
+ }
79
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface LogsOptions {
2
+ lines?: number;
3
+ errors?: boolean;
4
+ follow?: boolean;
5
+ }
6
+ export declare function runLogs(options?: LogsOptions): Promise<void>;
7
+ //# sourceMappingURL=logs.d.ts.map
@@ -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"}
@@ -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,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,6 @@
1
+ export interface StatusOptions {
2
+ verbose?: boolean;
3
+ json?: boolean;
4
+ }
5
+ export declare function runStatus(options?: StatusOptions): Promise<void>;
6
+ //# sourceMappingURL=status.d.ts.map
@@ -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(), 10_000);
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,8 @@
1
+ export interface SyncOptions {
2
+ sessionId?: string;
3
+ transcriptPath?: string;
4
+ cwd?: string;
5
+ hookEvent?: string;
6
+ }
7
+ export declare function runSync(options?: SyncOptions): Promise<void>;
8
+ //# sourceMappingURL=sync.d.ts.map
@@ -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"}