ctx-sync 1.0.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 (145) hide show
  1. package/dist/commands/audit.d.ts +76 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +367 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/config.d.ts +58 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +114 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/dir.d.ts +56 -0
  10. package/dist/commands/dir.d.ts.map +1 -0
  11. package/dist/commands/dir.js +172 -0
  12. package/dist/commands/dir.js.map +1 -0
  13. package/dist/commands/docker.d.ts +140 -0
  14. package/dist/commands/docker.d.ts.map +1 -0
  15. package/dist/commands/docker.js +380 -0
  16. package/dist/commands/docker.js.map +1 -0
  17. package/dist/commands/env.d.ts +96 -0
  18. package/dist/commands/env.d.ts.map +1 -0
  19. package/dist/commands/env.js +352 -0
  20. package/dist/commands/env.js.map +1 -0
  21. package/dist/commands/init.d.ts +89 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +272 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/key.d.ts +92 -0
  26. package/dist/commands/key.d.ts.map +1 -0
  27. package/dist/commands/key.js +274 -0
  28. package/dist/commands/key.js.map +1 -0
  29. package/dist/commands/list.d.ts +38 -0
  30. package/dist/commands/list.d.ts.map +1 -0
  31. package/dist/commands/list.js +84 -0
  32. package/dist/commands/list.js.map +1 -0
  33. package/dist/commands/note.d.ts +151 -0
  34. package/dist/commands/note.d.ts.map +1 -0
  35. package/dist/commands/note.js +411 -0
  36. package/dist/commands/note.js.map +1 -0
  37. package/dist/commands/pull.d.ts +47 -0
  38. package/dist/commands/pull.d.ts.map +1 -0
  39. package/dist/commands/pull.js +94 -0
  40. package/dist/commands/pull.js.map +1 -0
  41. package/dist/commands/push.d.ts +40 -0
  42. package/dist/commands/push.d.ts.map +1 -0
  43. package/dist/commands/push.js +94 -0
  44. package/dist/commands/push.js.map +1 -0
  45. package/dist/commands/restore.d.ts +116 -0
  46. package/dist/commands/restore.d.ts.map +1 -0
  47. package/dist/commands/restore.js +336 -0
  48. package/dist/commands/restore.js.map +1 -0
  49. package/dist/commands/service.d.ts +83 -0
  50. package/dist/commands/service.d.ts.map +1 -0
  51. package/dist/commands/service.js +259 -0
  52. package/dist/commands/service.js.map +1 -0
  53. package/dist/commands/show.d.ts +63 -0
  54. package/dist/commands/show.d.ts.map +1 -0
  55. package/dist/commands/show.js +243 -0
  56. package/dist/commands/show.js.map +1 -0
  57. package/dist/commands/status.d.ts +53 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +150 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/sync.d.ts +105 -0
  62. package/dist/commands/sync.d.ts.map +1 -0
  63. package/dist/commands/sync.js +243 -0
  64. package/dist/commands/sync.js.map +1 -0
  65. package/dist/commands/team.d.ts +79 -0
  66. package/dist/commands/team.d.ts.map +1 -0
  67. package/dist/commands/team.js +233 -0
  68. package/dist/commands/team.js.map +1 -0
  69. package/dist/commands/track.d.ts +109 -0
  70. package/dist/commands/track.d.ts.map +1 -0
  71. package/dist/commands/track.js +406 -0
  72. package/dist/commands/track.js.map +1 -0
  73. package/dist/core/command-validator.d.ts +100 -0
  74. package/dist/core/command-validator.d.ts.map +1 -0
  75. package/dist/core/command-validator.js +299 -0
  76. package/dist/core/command-validator.js.map +1 -0
  77. package/dist/core/config-store.d.ts +76 -0
  78. package/dist/core/config-store.d.ts.map +1 -0
  79. package/dist/core/config-store.js +148 -0
  80. package/dist/core/config-store.js.map +1 -0
  81. package/dist/core/directories-handler.d.ts +116 -0
  82. package/dist/core/directories-handler.d.ts.map +1 -0
  83. package/dist/core/directories-handler.js +199 -0
  84. package/dist/core/directories-handler.js.map +1 -0
  85. package/dist/core/docker-handler.d.ts +183 -0
  86. package/dist/core/docker-handler.d.ts.map +1 -0
  87. package/dist/core/docker-handler.js +515 -0
  88. package/dist/core/docker-handler.js.map +1 -0
  89. package/dist/core/encryption.d.ts +79 -0
  90. package/dist/core/encryption.d.ts.map +1 -0
  91. package/dist/core/encryption.js +111 -0
  92. package/dist/core/encryption.js.map +1 -0
  93. package/dist/core/env-handler.d.ts +128 -0
  94. package/dist/core/env-handler.d.ts.map +1 -0
  95. package/dist/core/env-handler.js +272 -0
  96. package/dist/core/env-handler.js.map +1 -0
  97. package/dist/core/git-sync.d.ts +88 -0
  98. package/dist/core/git-sync.d.ts.map +1 -0
  99. package/dist/core/git-sync.js +143 -0
  100. package/dist/core/git-sync.js.map +1 -0
  101. package/dist/core/key-store.d.ts +51 -0
  102. package/dist/core/key-store.d.ts.map +1 -0
  103. package/dist/core/key-store.js +108 -0
  104. package/dist/core/key-store.js.map +1 -0
  105. package/dist/core/log-sanitizer.d.ts +72 -0
  106. package/dist/core/log-sanitizer.d.ts.map +1 -0
  107. package/dist/core/log-sanitizer.js +202 -0
  108. package/dist/core/log-sanitizer.js.map +1 -0
  109. package/dist/core/path-validator.d.ts +37 -0
  110. package/dist/core/path-validator.d.ts.map +1 -0
  111. package/dist/core/path-validator.js +127 -0
  112. package/dist/core/path-validator.js.map +1 -0
  113. package/dist/core/recipients.d.ts +99 -0
  114. package/dist/core/recipients.d.ts.map +1 -0
  115. package/dist/core/recipients.js +206 -0
  116. package/dist/core/recipients.js.map +1 -0
  117. package/dist/core/services-handler.d.ts +113 -0
  118. package/dist/core/services-handler.d.ts.map +1 -0
  119. package/dist/core/services-handler.js +176 -0
  120. package/dist/core/services-handler.js.map +1 -0
  121. package/dist/core/state-manager.d.ts +96 -0
  122. package/dist/core/state-manager.d.ts.map +1 -0
  123. package/dist/core/state-manager.js +165 -0
  124. package/dist/core/state-manager.js.map +1 -0
  125. package/dist/core/transport.d.ts +28 -0
  126. package/dist/core/transport.d.ts.map +1 -0
  127. package/dist/core/transport.js +79 -0
  128. package/dist/core/transport.js.map +1 -0
  129. package/dist/index.d.ts +20 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +80 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/types/index.d.ts +5 -0
  134. package/dist/types/index.d.ts.map +1 -0
  135. package/dist/types/index.js +2 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/utils/errors.d.ts +81 -0
  138. package/dist/utils/errors.d.ts.map +1 -0
  139. package/dist/utils/errors.js +191 -0
  140. package/dist/utils/errors.js.map +1 -0
  141. package/dist/utils/secure-memory.d.ts +65 -0
  142. package/dist/utils/secure-memory.d.ts.map +1 -0
  143. package/dist/utils/secure-memory.js +86 -0
  144. package/dist/utils/secure-memory.js.map +1 -0
  145. package/package.json +58 -0
@@ -0,0 +1,259 @@
1
+ /**
2
+ * `ctx-sync service` command group.
3
+ *
4
+ * Manages running service state:
5
+ * - `service add <project> <name>` — add / update a service.
6
+ * - `service remove <project> <name>` — remove a service.
7
+ * - `service list [project]` — list tracked services.
8
+ * - `service start <project>` — present auto-start commands for approval.
9
+ *
10
+ * **Security:** `service start` commands go through the command validator.
11
+ * All start commands require explicit user confirmation — there is no
12
+ * `--yes` or `--no-confirm` bypass.
13
+ *
14
+ * @module commands/service
15
+ */
16
+ import { execSync } from 'node:child_process';
17
+ import { withErrorHandler } from '../utils/errors.js';
18
+ import { STATE_FILES } from '@ctx-sync/shared';
19
+ import { identityToRecipient } from 'age-encryption';
20
+ import { loadKey } from '../core/key-store.js';
21
+ import { readState } from '../core/state-manager.js';
22
+ import { commitState } from '../core/git-sync.js';
23
+ import { presentCommandsForApproval, } from '../core/command-validator.js';
24
+ import { createService, validateService, addService, removeService, loadProjectServices, loadServices, listServiceProjects, getAutoStartServices, } from '../core/services-handler.js';
25
+ import { getConfigDir, getSyncDir } from './init.js';
26
+ // ─── Core Logic ───────────────────────────────────────────────────────────
27
+ /**
28
+ * Resolve project name from argument or current directory context.
29
+ */
30
+ async function resolveProjectName(projectArg, syncDir, privateKey) {
31
+ // Check if the project exists in tracked state
32
+ const stateData = await readState(syncDir, privateKey, 'state');
33
+ if (stateData) {
34
+ const match = stateData.projects.find((p) => p.name === projectArg);
35
+ if (match)
36
+ return match.name;
37
+ }
38
+ return projectArg;
39
+ }
40
+ /**
41
+ * Execute `ctx-sync service add <project> <name>`.
42
+ */
43
+ export async function executeServiceAdd(project, name, options) {
44
+ const configDir = getConfigDir();
45
+ const syncDir = getSyncDir();
46
+ const privateKey = loadKey(configDir);
47
+ const publicKey = await identityToRecipient(privateKey);
48
+ const projectName = await resolveProjectName(project, syncDir, privateKey);
49
+ const service = createService(projectName, name, options.port, options.command, options.autoStart ?? false);
50
+ // Validate the service entry
51
+ const errors = validateService(service);
52
+ if (errors.length > 0) {
53
+ throw new Error(`Invalid service:\n ${errors.join('\n ')}`);
54
+ }
55
+ await addService(syncDir, service, publicKey, privateKey);
56
+ // Commit to sync repo
57
+ if (!options.noSync) {
58
+ await commitState(syncDir, [STATE_FILES.SERVICES, STATE_FILES.MANIFEST], `service: add ${projectName}/${name}`);
59
+ }
60
+ return {
61
+ projectName,
62
+ serviceName: name,
63
+ port: options.port,
64
+ command: options.command,
65
+ autoStart: options.autoStart ?? false,
66
+ };
67
+ }
68
+ /**
69
+ * Execute `ctx-sync service remove <project> <name>`.
70
+ */
71
+ export async function executeServiceRemove(project, name, noSync = false) {
72
+ const configDir = getConfigDir();
73
+ const syncDir = getSyncDir();
74
+ const privateKey = loadKey(configDir);
75
+ const publicKey = await identityToRecipient(privateKey);
76
+ const projectName = await resolveProjectName(project, syncDir, privateKey);
77
+ const removed = await removeService(syncDir, projectName, name, publicKey, privateKey);
78
+ if (removed && !noSync) {
79
+ await commitState(syncDir, [STATE_FILES.SERVICES, STATE_FILES.MANIFEST], `service: remove ${projectName}/${name}`);
80
+ }
81
+ return removed;
82
+ }
83
+ /**
84
+ * Build commands for service start (without executing).
85
+ */
86
+ export function buildServiceStartCommands(services) {
87
+ return services.map((s) => ({
88
+ command: s.command,
89
+ label: `Service: ${s.name} (port ${String(s.port)})`,
90
+ cwd: undefined,
91
+ }));
92
+ }
93
+ /**
94
+ * Execute `ctx-sync service start <project>`.
95
+ *
96
+ * Shows auto-start services for user approval, then executes approved ones.
97
+ */
98
+ export async function executeServiceStart(project, options = {}) {
99
+ const configDir = getConfigDir();
100
+ const syncDir = getSyncDir();
101
+ const privateKey = loadKey(configDir);
102
+ const projectName = await resolveProjectName(project, syncDir, privateKey);
103
+ const autoStart = await getAutoStartServices(syncDir, privateKey, projectName);
104
+ if (autoStart.length === 0) {
105
+ return {
106
+ projectName,
107
+ commandsPresented: [],
108
+ approval: { approved: [], rejected: [], skippedAll: false },
109
+ executedCommands: [],
110
+ failedCommands: [],
111
+ };
112
+ }
113
+ const pendingCommands = buildServiceStartCommands(autoStart);
114
+ // Present for approval (handles interactive/non-interactive mode)
115
+ const approval = await presentCommandsForApproval(pendingCommands, {
116
+ interactive: !options.noInteractive,
117
+ promptFn: options.promptFn,
118
+ selectFn: options.selectFn,
119
+ });
120
+ const executedCommands = [];
121
+ const failedCommands = [];
122
+ for (const cmd of approval.approved) {
123
+ try {
124
+ execSync(cmd.command, { stdio: 'inherit', timeout: 30_000 });
125
+ executedCommands.push(cmd.command);
126
+ }
127
+ catch (err) {
128
+ failedCommands.push({
129
+ command: cmd.command,
130
+ error: err instanceof Error ? err.message : String(err),
131
+ });
132
+ }
133
+ }
134
+ return {
135
+ projectName,
136
+ commandsPresented: pendingCommands,
137
+ approval,
138
+ executedCommands,
139
+ failedCommands,
140
+ };
141
+ }
142
+ /**
143
+ * Execute `ctx-sync service list [project]`.
144
+ */
145
+ export async function executeServiceList(project) {
146
+ const configDir = getConfigDir();
147
+ const syncDir = getSyncDir();
148
+ const privateKey = loadKey(configDir);
149
+ if (project) {
150
+ const projectName = await resolveProjectName(project, syncDir, privateKey);
151
+ const services = await loadProjectServices(syncDir, privateKey, projectName);
152
+ return [{ project: projectName, services }];
153
+ }
154
+ // All projects
155
+ const state = await loadServices(syncDir, privateKey);
156
+ const projects = await listServiceProjects(syncDir, privateKey);
157
+ return projects.map((p) => ({
158
+ project: p,
159
+ services: state.services.filter((s) => s.project === p),
160
+ }));
161
+ }
162
+ // ─── Commander Registration ───────────────────────────────────────────────
163
+ /**
164
+ * Register the `ctx-sync service` command group on the given program.
165
+ */
166
+ export function registerServiceCommand(program) {
167
+ const serviceCmd = program
168
+ .command('service')
169
+ .description('Manage tracked development services');
170
+ // ── service add ───────────────────────────────────────────────────
171
+ serviceCmd
172
+ .command('add <project> <name>')
173
+ .description('Add or update a tracked service')
174
+ .requiredOption('-p, --port <port>', 'Port number', parseInt)
175
+ .requiredOption('-c, --command <cmd>', 'Start command')
176
+ .option('-a, --auto-start', 'Mark as auto-start', false)
177
+ .option('--no-sync', 'Skip committing to sync repo')
178
+ .action(withErrorHandler(async (project, name, opts) => {
179
+ const result = await executeServiceAdd(project, name, {
180
+ port: opts.port,
181
+ command: opts.command,
182
+ autoStart: opts.autoStart,
183
+ noSync: !opts.sync,
184
+ });
185
+ console.log(`✓ Service "${result.serviceName}" added to project "${result.projectName}"`);
186
+ console.log(` Port: ${String(result.port)}`);
187
+ console.log(` Command: ${result.command}`);
188
+ if (result.autoStart) {
189
+ console.log(' Auto-start: yes');
190
+ }
191
+ }));
192
+ // ── service remove ────────────────────────────────────────────────
193
+ serviceCmd
194
+ .command('remove <project> <name>')
195
+ .description('Remove a tracked service')
196
+ .option('--no-sync', 'Skip committing to sync repo')
197
+ .action(withErrorHandler(async (project, name, opts) => {
198
+ const removed = await executeServiceRemove(project, name, !opts.sync);
199
+ if (removed) {
200
+ console.log(`✓ Service "${name}" removed from project "${project}"`);
201
+ }
202
+ else {
203
+ console.log(`Service "${name}" not found in project "${project}"`);
204
+ }
205
+ }));
206
+ // ── service list ──────────────────────────────────────────────────
207
+ serviceCmd
208
+ .command('list [project]')
209
+ .description('List tracked services')
210
+ .action(withErrorHandler(async (project) => {
211
+ const results = await executeServiceList(project);
212
+ if (results.length === 0 || results.every((r) => r.services.length === 0)) {
213
+ console.log('No services tracked.');
214
+ return;
215
+ }
216
+ for (const group of results) {
217
+ if (group.services.length === 0)
218
+ continue;
219
+ console.log(`\n📦 ${group.project}:`);
220
+ for (const svc of group.services) {
221
+ const auto = svc.autoStart ? ' [auto-start]' : '';
222
+ console.log(` ${svc.name} — port ${String(svc.port)}${auto}`);
223
+ console.log(` command: ${svc.command}`);
224
+ }
225
+ }
226
+ }));
227
+ // ── service start ─────────────────────────────────────────────────
228
+ serviceCmd
229
+ .command('start <project>')
230
+ .description('Start auto-start services (requires approval)')
231
+ .option('-n, --no-interactive', 'Show commands without executing')
232
+ .action(withErrorHandler(async (project, opts) => {
233
+ const result = await executeServiceStart(project, {
234
+ noInteractive: !opts.interactive,
235
+ });
236
+ if (result.commandsPresented.length === 0) {
237
+ console.log(`No auto-start services found for project "${result.projectName}".`);
238
+ return;
239
+ }
240
+ if (result.approval.skippedAll) {
241
+ console.log('Service commands (non-interactive — skipped):');
242
+ for (const cmd of result.commandsPresented) {
243
+ console.log(` ${cmd.label}: ${cmd.command}`);
244
+ }
245
+ console.log('\n⚠ Non-interactive mode — commands shown but not executed.');
246
+ return;
247
+ }
248
+ if (result.executedCommands.length > 0) {
249
+ console.log(`✓ Started ${String(result.executedCommands.length)} service(s)`);
250
+ }
251
+ if (result.failedCommands.length > 0) {
252
+ console.error(`✗ ${String(result.failedCommands.length)} service(s) failed to start`);
253
+ for (const f of result.failedCommands) {
254
+ console.error(` ${f.command}: ${f.error}`);
255
+ }
256
+ }
257
+ }));
258
+ }
259
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * `ctx-sync show <project>` command.
3
+ *
4
+ * Decrypts and displays the full context for a project — state,
5
+ * env var count, mental context, Docker services, running services —
6
+ * in a readable, formatted terminal output.
7
+ *
8
+ * This is the "at-a-glance" view that answers: "What was I doing on
9
+ * this project, and what do I need to get back to work?"
10
+ *
11
+ * @module commands/show
12
+ */
13
+ import type { Command } from 'commander';
14
+ import type { Project, ProjectMentalContext } from '@ctx-sync/shared';
15
+ /** Result of the show command */
16
+ export interface ShowResult {
17
+ /** The project entry */
18
+ project: Project;
19
+ /** Number of env vars for the project */
20
+ envVarCount: number;
21
+ /** Mental context for the project (if any) */
22
+ mentalContext: ProjectMentalContext | null;
23
+ /** Docker state for the project (if any) */
24
+ dockerServices: Array<{
25
+ name: string;
26
+ image: string;
27
+ port: number;
28
+ autoStart: boolean;
29
+ }>;
30
+ /** Running services for the project (if any) */
31
+ services: Array<{
32
+ name: string;
33
+ port: number;
34
+ command: string;
35
+ autoStart: boolean;
36
+ }>;
37
+ }
38
+ /**
39
+ * Execute the show command logic.
40
+ *
41
+ * Decrypts all relevant state files and assembles a complete project
42
+ * context snapshot.
43
+ *
44
+ * @param projectName - The name of the project to show.
45
+ * @returns The full project context.
46
+ */
47
+ export declare function executeShow(projectName: string): Promise<ShowResult>;
48
+ /**
49
+ * Format the project context for terminal display.
50
+ *
51
+ * Produces a readable, chalk-formatted output string that shows
52
+ * all available context at a glance.
53
+ *
54
+ * @param result - The show result to format.
55
+ * @param useChalk - Whether to use chalk for formatting (default: true).
56
+ * @returns Formatted string for terminal output.
57
+ */
58
+ export declare function formatShowOutput(result: ShowResult, _useChalk?: boolean): string;
59
+ /**
60
+ * Register the `show` command on the given Commander program.
61
+ */
62
+ export declare function registerShowCommand(program: Command): void;
63
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAEV,OAAO,EAKP,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAK1B,iCAAiC;AACjC,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,aAAa,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3C,4CAA4C;IAC5C,cAAc,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,gDAAgD;IAChD,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAwE1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,UAAO,GAAG,MAAM,CAuH7E;AAiBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgC1D"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * `ctx-sync show <project>` command.
3
+ *
4
+ * Decrypts and displays the full context for a project — state,
5
+ * env var count, mental context, Docker services, running services —
6
+ * in a readable, formatted terminal output.
7
+ *
8
+ * This is the "at-a-glance" view that answers: "What was I doing on
9
+ * this project, and what do I need to get back to work?"
10
+ *
11
+ * @module commands/show
12
+ */
13
+ import * as fs from 'node:fs';
14
+ import * as path from 'node:path';
15
+ import { withErrorHandler } from '../utils/errors.js';
16
+ import { loadKey } from '../core/key-store.js';
17
+ import { readState } from '../core/state-manager.js';
18
+ import { getConfigDir, getSyncDir } from './init.js';
19
+ /**
20
+ * Execute the show command logic.
21
+ *
22
+ * Decrypts all relevant state files and assembles a complete project
23
+ * context snapshot.
24
+ *
25
+ * @param projectName - The name of the project to show.
26
+ * @returns The full project context.
27
+ */
28
+ export async function executeShow(projectName) {
29
+ const configDir = getConfigDir();
30
+ const syncDir = getSyncDir();
31
+ // Verify sync dir exists
32
+ if (!fs.existsSync(syncDir) || !fs.existsSync(path.join(syncDir, '.git'))) {
33
+ throw new Error('No sync repository found. Run `ctx-sync init` first.');
34
+ }
35
+ // Load key
36
+ const privateKey = loadKey(configDir);
37
+ // 1. Find the project in state
38
+ const state = await readState(syncDir, privateKey, 'state');
39
+ if (!state) {
40
+ throw new Error('No state file found. Track a project first with `ctx-sync track`.');
41
+ }
42
+ const project = state.projects.find((p) => p.name === projectName || p.id === projectName);
43
+ if (!project) {
44
+ const availableNames = state.projects.map((p) => p.name).join(', ');
45
+ throw new Error(`Project "${projectName}" not found.\n` +
46
+ (availableNames
47
+ ? `Available projects: ${availableNames}`
48
+ : 'No projects tracked yet. Run `ctx-sync track` first.'));
49
+ }
50
+ // 2. Count env vars
51
+ const envVars = await readState(syncDir, privateKey, 'env-vars');
52
+ const projectEnvVars = envVars?.[project.name] ?? {};
53
+ const envVarCount = Object.keys(projectEnvVars).length;
54
+ // 3. Load mental context
55
+ const mentalContextData = await readState(syncDir, privateKey, 'mental-context');
56
+ const mentalContext = mentalContextData?.[project.name] ?? null;
57
+ // 4. Load Docker state
58
+ const dockerState = await readState(syncDir, privateKey, 'docker-state');
59
+ const projectDocker = dockerState?.[project.name];
60
+ const dockerServices = projectDocker?.services.map((s) => ({
61
+ name: s.name,
62
+ image: s.image,
63
+ port: s.port,
64
+ autoStart: s.autoStart,
65
+ })) ?? [];
66
+ // 5. Load service state
67
+ const serviceState = await readState(syncDir, privateKey, 'services');
68
+ const services = serviceState?.services
69
+ .filter((s) => s.project === project.name)
70
+ .map((s) => ({
71
+ name: s.name,
72
+ port: s.port,
73
+ command: s.command,
74
+ autoStart: s.autoStart,
75
+ })) ?? [];
76
+ return {
77
+ project,
78
+ envVarCount,
79
+ mentalContext,
80
+ dockerServices,
81
+ services,
82
+ };
83
+ }
84
+ /**
85
+ * Format the project context for terminal display.
86
+ *
87
+ * Produces a readable, chalk-formatted output string that shows
88
+ * all available context at a glance.
89
+ *
90
+ * @param result - The show result to format.
91
+ * @param useChalk - Whether to use chalk for formatting (default: true).
92
+ * @returns Formatted string for terminal output.
93
+ */
94
+ export function formatShowOutput(result, _useChalk = true) {
95
+ const lines = [];
96
+ // Header
97
+ lines.push('');
98
+ lines.push(` Project: ${result.project.name}`);
99
+ lines.push(` ──────────────────────────────────`);
100
+ // Project info
101
+ lines.push('');
102
+ lines.push(` 📂 Directory: ${result.project.path}`);
103
+ lines.push(` 🌿 Branch: ${result.project.git.branch}`);
104
+ lines.push(` 🔐 Env vars: ${result.envVarCount}`);
105
+ if (result.project.git.hasUncommitted) {
106
+ lines.push(` ⚠ Uncommitted changes`);
107
+ }
108
+ if (result.project.git.stashCount > 0) {
109
+ lines.push(` 📦 Stash count: ${result.project.git.stashCount}`);
110
+ }
111
+ lines.push(` 🕐 Last accessed: ${formatTimestamp(result.project.lastAccessed)}`);
112
+ // Mental context
113
+ if (result.mentalContext) {
114
+ lines.push('');
115
+ lines.push(' 📝 Mental Context');
116
+ lines.push(' ─────────────────');
117
+ if (result.mentalContext.currentTask) {
118
+ lines.push(` Task: "${result.mentalContext.currentTask}"`);
119
+ }
120
+ if (result.mentalContext.lastWorkingOn) {
121
+ const lwo = result.mentalContext.lastWorkingOn;
122
+ lines.push('');
123
+ lines.push(` Last file: ${lwo.file}:${lwo.line}`);
124
+ if (lwo.description) {
125
+ lines.push(` ${lwo.description}`);
126
+ }
127
+ }
128
+ if (result.mentalContext.blockers.length > 0) {
129
+ lines.push('');
130
+ lines.push(' ⛔ Blockers:');
131
+ for (const blocker of result.mentalContext.blockers) {
132
+ const priority = blocker.priority === 'high' ? ' [HIGH]' : '';
133
+ lines.push(` • ${blocker.description}${priority}`);
134
+ }
135
+ }
136
+ if (result.mentalContext.nextSteps.length > 0) {
137
+ lines.push('');
138
+ lines.push(' 📋 Next Steps:');
139
+ for (const step of result.mentalContext.nextSteps) {
140
+ lines.push(` • ${step}`);
141
+ }
142
+ }
143
+ if (result.mentalContext.relatedLinks.length > 0) {
144
+ lines.push('');
145
+ lines.push(' 🔗 Related Links:');
146
+ for (const link of result.mentalContext.relatedLinks) {
147
+ if (link.title !== link.url) {
148
+ lines.push(` • ${link.title}: ${link.url}`);
149
+ }
150
+ else {
151
+ lines.push(` • ${link.url}`);
152
+ }
153
+ }
154
+ }
155
+ if (result.mentalContext.breadcrumbs.length > 0) {
156
+ lines.push('');
157
+ lines.push(' 🍞 Breadcrumbs:');
158
+ for (const crumb of result.mentalContext.breadcrumbs) {
159
+ lines.push(` • ${crumb.note}`);
160
+ }
161
+ }
162
+ }
163
+ // Docker services
164
+ if (result.dockerServices.length > 0) {
165
+ lines.push('');
166
+ lines.push(' 🐳 Docker Services');
167
+ lines.push(' ──────────────────');
168
+ for (const svc of result.dockerServices) {
169
+ const autoStart = svc.autoStart ? ' (auto-start)' : '';
170
+ lines.push(` • ${svc.name} — ${svc.image} (port ${svc.port})${autoStart}`);
171
+ }
172
+ }
173
+ // Running services
174
+ if (result.services.length > 0) {
175
+ lines.push('');
176
+ lines.push(' ⚡ Services');
177
+ lines.push(' ──────────');
178
+ for (const svc of result.services) {
179
+ const autoStart = svc.autoStart ? ' (auto-start)' : '';
180
+ lines.push(` • ${svc.name} — \`${svc.command}\` (port ${svc.port})${autoStart}`);
181
+ }
182
+ }
183
+ // No context sections at all
184
+ if (!result.mentalContext &&
185
+ result.dockerServices.length === 0 &&
186
+ result.services.length === 0 &&
187
+ result.envVarCount === 0) {
188
+ lines.push('');
189
+ lines.push(' No additional context recorded yet.');
190
+ lines.push(' Use `ctx-sync note` to add mental context.');
191
+ lines.push(' Use `ctx-sync env import` to track environment variables.');
192
+ }
193
+ lines.push('');
194
+ return lines.join('\n');
195
+ }
196
+ /**
197
+ * Format an ISO timestamp for human-readable display.
198
+ *
199
+ * @param isoTimestamp - ISO 8601 timestamp string.
200
+ * @returns Formatted date/time string.
201
+ */
202
+ function formatTimestamp(isoTimestamp) {
203
+ try {
204
+ const date = new Date(isoTimestamp);
205
+ return date.toLocaleString();
206
+ }
207
+ catch {
208
+ return isoTimestamp;
209
+ }
210
+ }
211
+ /**
212
+ * Register the `show` command on the given Commander program.
213
+ */
214
+ export function registerShowCommand(program) {
215
+ program
216
+ .command('show <project>')
217
+ .description('Show full context for a tracked project')
218
+ .action(withErrorHandler(async (projectName) => {
219
+ const chalk = (await import('chalk')).default;
220
+ const result = await executeShow(projectName);
221
+ const output = formatShowOutput(result);
222
+ console.log(output);
223
+ // Summary line
224
+ const sections = [];
225
+ if (result.mentalContext) {
226
+ sections.push('mental context');
227
+ }
228
+ if (result.envVarCount > 0) {
229
+ sections.push(`${result.envVarCount} env vars`);
230
+ }
231
+ if (result.dockerServices.length > 0) {
232
+ sections.push(`${result.dockerServices.length} Docker services`);
233
+ }
234
+ if (result.services.length > 0) {
235
+ sections.push(`${result.services.length} services`);
236
+ }
237
+ if (sections.length > 0) {
238
+ console.log(chalk.dim(` Context includes: ${sections.join(', ')}`));
239
+ console.log('');
240
+ }
241
+ }));
242
+ }
243
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * `ctx-sync status` command.
3
+ *
4
+ * Shows sync status (last sync time, pending changes, remote connectivity)
5
+ * and per-project status (branch, uncommitted changes).
6
+ *
7
+ * @module commands/status
8
+ */
9
+ import type { Command } from 'commander';
10
+ /** Sync status information */
11
+ export interface SyncInfo {
12
+ /** Last sync timestamp from manifest */
13
+ lastSync: string | null;
14
+ /** Number of pending (uncommitted) changes in the sync repo */
15
+ pendingChanges: number;
16
+ /** Whether the sync repo has a remote configured */
17
+ hasRemote: boolean;
18
+ /** Whether the sync repo is clean */
19
+ isClean: boolean;
20
+ /** Number of commits ahead of remote */
21
+ ahead: number;
22
+ /** Number of commits behind remote */
23
+ behind: number;
24
+ }
25
+ /** Per-project status */
26
+ export interface ProjectStatus {
27
+ name: string;
28
+ path: string;
29
+ branch: string;
30
+ hasUncommitted: boolean;
31
+ stashCount: number;
32
+ lastAccessed: string;
33
+ }
34
+ /** Result returned by executeStatus */
35
+ export interface StatusResult {
36
+ sync: SyncInfo;
37
+ projects: ProjectStatus[];
38
+ }
39
+ /**
40
+ * Execute the status command logic.
41
+ *
42
+ * 1. Read manifest for last sync time.
43
+ * 2. Get sync repo status (pending changes, remote).
44
+ * 3. Read state.age for per-project info.
45
+ *
46
+ * @returns Status result with sync and project info.
47
+ */
48
+ export declare function executeStatus(): Promise<StatusResult>;
49
+ /**
50
+ * Register the `status` command on the given Commander program.
51
+ */
52
+ export declare function registerStatusCommand(program: Command): void;
53
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,8BAA8B;AAC9B,MAAM,WAAW,QAAQ;IACvB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+DAA+D;IAC/D,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yBAAyB;AACzB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,CAwE3D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqE5D"}