commandmate 0.1.10 → 0.1.11

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 (139) hide show
  1. package/.env.example +8 -3
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/app-build-manifest.json +11 -11
  4. package/.next/app-path-routes-manifest.json +1 -1
  5. package/.next/build-manifest.json +2 -2
  6. package/.next/cache/.tsbuildinfo +1 -1
  7. package/.next/cache/config.json +3 -3
  8. package/.next/cache/webpack/client-production/0.pack +0 -0
  9. package/.next/cache/webpack/client-production/1.pack +0 -0
  10. package/.next/cache/webpack/client-production/2.pack +0 -0
  11. package/.next/cache/webpack/client-production/index.pack +0 -0
  12. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  13. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  14. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  15. package/.next/cache/webpack/server-production/0.pack +0 -0
  16. package/.next/cache/webpack/server-production/index.pack +0 -0
  17. package/.next/next-server.js.nft.json +1 -1
  18. package/.next/prerender-manifest.json +1 -1
  19. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/server/app/_not-found.html +1 -1
  21. package/.next/server/app/_not-found.rsc +1 -1
  22. package/.next/server/app/api/external-apps/[id]/health/route.js +11 -12
  23. package/.next/server/app/api/external-apps/[id]/route.js +14 -15
  24. package/.next/server/app/api/external-apps/route.js +12 -13
  25. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  26. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  27. package/.next/server/app/api/repositories/clone/route.js +1 -1
  28. package/.next/server/app/api/repositories/route.js +1 -1
  29. package/.next/server/app/api/repositories/scan/route.js +1 -1
  30. package/.next/server/app/api/repositories/sync/route.js +1 -1
  31. package/.next/server/app/api/slash-commands.body +1 -1
  32. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  33. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  34. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  35. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  36. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  37. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  38. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  39. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  40. package/.next/server/app/api/worktrees/[id]/logs/route.js +7 -7
  41. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  42. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  43. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  44. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  45. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  46. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  47. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  48. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  49. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  50. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  51. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  52. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  53. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  54. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  55. package/.next/server/app/api/worktrees/route.js +1 -1
  56. package/.next/server/app/index.html +2 -2
  57. package/.next/server/app/index.rsc +2 -2
  58. package/.next/server/app/page_client-reference-manifest.js +1 -1
  59. package/.next/server/app/proxy/[...path]/route.js +12 -13
  60. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/worktrees/[id]/page.js +3 -3
  62. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app/worktrees/[id]/simple-terminal/page_client-reference-manifest.js +1 -1
  64. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app-paths-manifest.json +10 -10
  66. package/.next/server/chunks/1318.js +4 -4
  67. package/.next/server/chunks/1528.js +1 -1
  68. package/.next/server/chunks/7425.js +97 -48
  69. package/.next/server/chunks/9723.js +1 -1
  70. package/.next/server/functions-config-manifest.json +1 -1
  71. package/.next/server/middleware-manifest.json +5 -5
  72. package/.next/server/pages/404.html +1 -1
  73. package/.next/server/pages/500.html +1 -1
  74. package/.next/server/server-reference-manifest.json +1 -1
  75. package/.next/server/src/middleware.js +2 -2
  76. package/.next/server/src/middleware.js.map +1 -1
  77. package/.next/static/chunks/app/worktrees/[id]/page-720605c2fb074444.js +1 -0
  78. package/.next/trace +5 -5
  79. package/dist/cli/commands/init.d.ts.map +1 -1
  80. package/dist/cli/commands/init.js +6 -4
  81. package/dist/cli/commands/start.d.ts +2 -0
  82. package/dist/cli/commands/start.d.ts.map +1 -1
  83. package/dist/cli/commands/start.js +64 -17
  84. package/dist/cli/commands/status.d.ts +4 -1
  85. package/dist/cli/commands/status.d.ts.map +1 -1
  86. package/dist/cli/commands/status.js +95 -6
  87. package/dist/cli/commands/stop.d.ts +2 -0
  88. package/dist/cli/commands/stop.d.ts.map +1 -1
  89. package/dist/cli/commands/stop.js +27 -10
  90. package/dist/cli/index.js +16 -2
  91. package/dist/cli/types/index.d.ts +20 -0
  92. package/dist/cli/types/index.d.ts.map +1 -1
  93. package/dist/cli/utils/daemon-factory.d.ts +105 -0
  94. package/dist/cli/utils/daemon-factory.d.ts.map +1 -0
  95. package/dist/cli/utils/daemon-factory.js +117 -0
  96. package/dist/cli/utils/daemon.d.ts.map +1 -1
  97. package/dist/cli/utils/daemon.js +4 -0
  98. package/dist/cli/utils/env-setup.d.ts +24 -12
  99. package/dist/cli/utils/env-setup.d.ts.map +1 -1
  100. package/dist/cli/utils/env-setup.js +64 -43
  101. package/dist/cli/utils/input-validators.d.ts +103 -0
  102. package/dist/cli/utils/input-validators.d.ts.map +1 -0
  103. package/dist/cli/utils/input-validators.js +163 -0
  104. package/dist/cli/utils/install-context.d.ts +53 -0
  105. package/dist/cli/utils/install-context.d.ts.map +1 -0
  106. package/dist/cli/utils/install-context.js +96 -0
  107. package/dist/cli/utils/pid-manager.d.ts +34 -0
  108. package/dist/cli/utils/pid-manager.d.ts.map +1 -1
  109. package/dist/cli/utils/pid-manager.js +43 -0
  110. package/dist/cli/utils/port-allocator.d.ts +108 -0
  111. package/dist/cli/utils/port-allocator.d.ts.map +1 -0
  112. package/dist/cli/utils/port-allocator.js +166 -0
  113. package/dist/cli/utils/resource-resolvers.d.ts +92 -0
  114. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -0
  115. package/dist/cli/utils/resource-resolvers.js +175 -0
  116. package/dist/cli/utils/worktree-detector.d.ts +82 -0
  117. package/dist/cli/utils/worktree-detector.d.ts.map +1 -0
  118. package/dist/cli/utils/worktree-detector.js +221 -0
  119. package/dist/lib/errors.d.ts +111 -0
  120. package/dist/lib/errors.d.ts.map +1 -0
  121. package/dist/lib/errors.js +153 -0
  122. package/dist/server/server.js +3 -0
  123. package/dist/server/src/cli/utils/install-context.js +96 -0
  124. package/dist/server/src/config/system-directories.js +40 -0
  125. package/dist/server/src/lib/auto-yes-manager.js +325 -0
  126. package/dist/server/src/lib/auto-yes-resolver.js +34 -0
  127. package/dist/server/src/lib/cli-patterns.js +6 -1
  128. package/dist/server/src/lib/db-instance.js +12 -2
  129. package/dist/server/src/lib/db-migrations.js +68 -1
  130. package/dist/server/src/lib/db-path-resolver.js +99 -0
  131. package/dist/server/src/lib/db.js +21 -0
  132. package/dist/server/src/lib/env.js +52 -3
  133. package/dist/server/src/lib/worktrees.js +36 -1
  134. package/dist/server/src/types/external-apps.js +20 -0
  135. package/package.json +1 -1
  136. package/.next/static/chunks/app/worktrees/[id]/page-aea2d5e7e28955be.js +0 -1
  137. /package/.next/static/chunks/app/{page-96a8aa2ec30a44e9.js → page-fe35d61f14b90a51.js} +0 -0
  138. /package/.next/static/{8o5rUyZun0GklIHWDgkmv → gRNW5YXY43KqCKbCdaJoJ}/_buildManifest.js +0 -0
  139. /package/.next/static/{8o5rUyZun0GklIHWDgkmv → gRNW5YXY43KqCKbCdaJoJ}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAuB,MAAM,UAAU,CAAC;AAuI5D;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIrE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAuB,MAAM,UAAU,CAAC;AA0I5D;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIrE"}
@@ -18,13 +18,14 @@ const security_logger_1 = require("../utils/security-logger");
18
18
  const logger = new logger_1.CLILogger();
19
19
  /**
20
20
  * Create default configuration (non-interactive mode)
21
+ * Issue #135: Use getDefaultDbPath() for dynamic DB path resolution
21
22
  */
22
23
  function createDefaultConfig() {
23
24
  return {
24
25
  CM_ROOT_DIR: (0, env_setup_1.sanitizePath)(process.env.CM_ROOT_DIR || env_setup_1.DEFAULT_ROOT_DIR),
25
26
  CM_PORT: env_setup_1.ENV_DEFAULTS.CM_PORT,
26
27
  CM_BIND: env_setup_1.ENV_DEFAULTS.CM_BIND,
27
- CM_DB_PATH: env_setup_1.ENV_DEFAULTS.CM_DB_PATH,
28
+ CM_DB_PATH: (0, env_setup_1.getDefaultDbPath)(), // Issue #135: Use absolute path
28
29
  CM_LOG_LEVEL: env_setup_1.ENV_DEFAULTS.CM_LOG_LEVEL,
29
30
  CM_LOG_FORMAT: env_setup_1.ENV_DEFAULTS.CM_LOG_FORMAT,
30
31
  };
@@ -75,11 +76,12 @@ async function promptForConfig() {
75
76
  logger.info(` Bind address: 0.0.0.0`);
76
77
  logger.info(` Auth token generated: ${authToken.substring(0, 8)}...`);
77
78
  }
78
- // CM_DB_PATH
79
+ // CM_DB_PATH - Issue #135: Use getDefaultDbPath() for absolute path
80
+ const defaultDbPath = (0, env_setup_1.getDefaultDbPath)();
79
81
  const dbPathInput = await (0, prompt_1.prompt)('Database path (CM_DB_PATH)', {
80
- default: env_setup_1.ENV_DEFAULTS.CM_DB_PATH,
82
+ default: defaultDbPath,
81
83
  });
82
- const dbPath = dbPathInput || env_setup_1.ENV_DEFAULTS.CM_DB_PATH;
84
+ const dbPath = dbPathInput || defaultDbPath;
83
85
  return {
84
86
  CM_ROOT_DIR: rootDir,
85
87
  CM_PORT: port,
@@ -2,12 +2,14 @@
2
2
  * Start Command
3
3
  * Issue #96: npm install CLI support
4
4
  * Issue #125: Use getEnvPath and getPidFilePath for correct path resolution
5
+ * Issue #136: Add --issue and --auto-port flags for worktree support
5
6
  * Start CommandMate server
6
7
  */
7
8
  import { StartOptions } from '../types';
8
9
  /**
9
10
  * Execute start command
10
11
  * Issue #125: Use getEnvPath and getPidFilePath for correct path resolution
12
+ * Issue #136: Support --issue and --auto-port flags for worktree servers
11
13
  */
12
14
  export declare function startCommand(options: StartOptions): Promise<void>;
13
15
  //# sourceMappingURL=start.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,YAAY,EAA6B,MAAM,UAAU,CAAC;AASnE;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoJvE"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,YAAY,EAA6B,MAAM,UAAU,CAAC;AAYnE;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoMvE"}
@@ -3,6 +3,7 @@
3
3
  * Start Command
4
4
  * Issue #96: npm install CLI support
5
5
  * Issue #125: Use getEnvPath and getPidFilePath for correct path resolution
6
+ * Issue #136: Add --issue and --auto-port flags for worktree support
6
7
  * Start CommandMate server
7
8
  */
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -16,48 +17,84 @@ const daemon_1 = require("../utils/daemon");
16
17
  const security_logger_1 = require("../utils/security-logger");
17
18
  const paths_1 = require("../utils/paths");
18
19
  const env_setup_1 = require("../utils/env-setup");
20
+ const input_validators_1 = require("../utils/input-validators");
21
+ const port_allocator_1 = require("../utils/port-allocator");
22
+ const resource_resolvers_1 = require("../utils/resource-resolvers");
19
23
  const logger = new logger_1.CLILogger();
20
24
  /**
21
25
  * Execute start command
22
26
  * Issue #125: Use getEnvPath and getPidFilePath for correct path resolution
27
+ * Issue #136: Support --issue and --auto-port flags for worktree servers
23
28
  */
24
29
  async function startCommand(options) {
25
30
  try {
31
+ // Issue #136: Validate issue number if provided
32
+ if (options.issue !== undefined) {
33
+ const validation = (0, input_validators_1.validateIssueNoResult)(options.issue);
34
+ if (!validation.valid) {
35
+ logger.error(`Invalid issue number: ${validation.error}`);
36
+ process.exit(types_1.ExitCode.START_FAILED);
37
+ return;
38
+ }
39
+ }
26
40
  // Issue #125: Check for .env file at correct location
27
- const envPath = (0, env_setup_1.getEnvPath)();
28
- const pidFilePath = (0, env_setup_1.getPidFilePath)();
29
- if (!(0, fs_1.existsSync)(envPath)) {
30
- logger.error(`.env file not found at ${envPath}`);
41
+ // Issue #136: Use issue number for worktree-specific paths
42
+ const envPath = (0, env_setup_1.getEnvPath)(options.issue);
43
+ const pidFilePath = (0, env_setup_1.getPidFilePath)(options.issue);
44
+ // Issue #136: Worktree-specific server label
45
+ const serverLabel = options.issue !== undefined
46
+ ? `Issue #${options.issue} server`
47
+ : 'Main server';
48
+ // Issue #136: For worktree servers, main .env must exist but worktree-specific .env is optional
49
+ const mainEnvPath = (0, env_setup_1.getEnvPath)();
50
+ if (!(0, fs_1.existsSync)(mainEnvPath)) {
51
+ logger.error(`.env file not found at ${mainEnvPath}`);
31
52
  logger.info('Run "commandmate init" to create a configuration file');
32
53
  process.exit(types_1.ExitCode.CONFIG_ERROR);
33
54
  return;
34
55
  }
35
56
  const daemonManager = new daemon_1.DaemonManager(pidFilePath);
57
+ // Issue #136: Handle auto-port allocation for worktree servers
58
+ let port = options.port;
59
+ if (options.autoPort && options.issue !== undefined) {
60
+ const portAllocator = port_allocator_1.PortAllocator.getInstance();
61
+ port = portAllocator.allocate(options.issue);
62
+ logger.info(`Auto-allocated port ${port} for Issue #${options.issue}`);
63
+ }
64
+ // Issue #136: Set worktree-specific DB path
65
+ let dbPath;
66
+ if (options.issue !== undefined) {
67
+ const dbResolver = new resource_resolvers_1.DbPathResolver();
68
+ dbPath = dbResolver.resolve(options.issue);
69
+ logger.info(`Using database: ${dbPath}`);
70
+ }
36
71
  // Daemon mode
37
72
  if (options.daemon) {
38
73
  // Check if already running
39
74
  if (await daemonManager.isRunning()) {
40
75
  const status = await daemonManager.getStatus();
41
- logger.error(`Server is already running (PID: ${status?.pid})`);
76
+ logger.error(`${serverLabel} is already running (PID: ${status?.pid})`);
42
77
  process.exit(types_1.ExitCode.START_FAILED);
43
78
  return;
44
79
  }
45
- logger.info('Starting server in background...');
80
+ logger.info(`Starting ${serverLabel} in background...`);
46
81
  try {
47
82
  const pid = await daemonManager.start({
48
83
  dev: options.dev,
49
- port: options.port,
84
+ port: port,
85
+ // Issue #136: Pass DB path for worktree servers
86
+ dbPath: dbPath,
50
87
  });
51
- logger.success(`Server started in background (PID: ${pid})`);
52
- const port = options.port || parseInt(process.env.CM_PORT || '3000', 10);
88
+ logger.success(`${serverLabel} started in background (PID: ${pid})`);
89
+ const actualPort = port || parseInt(process.env.CM_PORT || '3000', 10);
53
90
  const bind = process.env.CM_BIND || '127.0.0.1';
54
- const url = `http://${bind === '0.0.0.0' ? '127.0.0.1' : bind}:${port}`;
91
+ const url = `http://${bind === '0.0.0.0' ? '127.0.0.1' : bind}:${actualPort}`;
55
92
  logger.info(`URL: ${url}`);
56
93
  (0, security_logger_1.logSecurityEvent)({
57
94
  timestamp: new Date().toISOString(),
58
95
  command: 'start',
59
96
  action: 'success',
60
- details: `Daemon started (PID: ${pid})`,
97
+ details: `Daemon started (PID: ${pid})${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
61
98
  });
62
99
  process.exit(types_1.ExitCode.SUCCESS);
63
100
  }
@@ -76,21 +113,31 @@ async function startCommand(options) {
76
113
  }
77
114
  // Foreground mode (default)
78
115
  const npmScript = options.dev ? 'dev' : 'start';
79
- logger.info(`Starting server in foreground (${options.dev ? 'development' : 'production'} mode)...`);
116
+ logger.info(`Starting ${serverLabel} in foreground (${options.dev ? 'development' : 'production'} mode)...`);
80
117
  // Issue #125: Load .env file from correct location (same as daemon mode)
81
- const envResult = (0, dotenv_1.config)({ path: envPath });
82
- if (envResult.error) {
83
- logger.warn(`Failed to load .env file at ${envPath}: ${envResult.error.message}`);
118
+ // Issue #136: Load main .env first, then overlay worktree-specific .env if exists
119
+ const mainEnvResult = (0, dotenv_1.config)({ path: mainEnvPath });
120
+ let envResult = mainEnvResult;
121
+ if (options.issue !== undefined && (0, fs_1.existsSync)(envPath) && envPath !== mainEnvPath) {
122
+ envResult = (0, dotenv_1.config)({ path: envPath, override: true });
123
+ }
124
+ if (mainEnvResult.error) {
125
+ logger.warn(`Failed to load .env file at ${mainEnvPath}: ${mainEnvResult.error.message}`);
84
126
  logger.info('Continuing with existing environment variables');
85
127
  }
86
128
  // Build environment by merging process.env with .env values
87
129
  const env = {
88
130
  ...process.env,
131
+ ...(mainEnvResult.parsed || {}),
89
132
  ...(envResult.parsed || {}),
90
133
  };
91
134
  // Command line options override .env values
92
- if (options.port) {
93
- env.CM_PORT = String(options.port);
135
+ if (port) {
136
+ env.CM_PORT = String(port);
137
+ }
138
+ // Issue #136: Set DB path for worktree servers
139
+ if (dbPath) {
140
+ env.CM_DB_PATH = dbPath;
94
141
  }
95
142
  // Issue #125: Security warnings for external access
96
143
  const bindAddress = env.CM_BIND || '127.0.0.1';
@@ -2,11 +2,14 @@
2
2
  * Status Command
3
3
  * Issue #96: npm install CLI support
4
4
  * Issue #125: Use getPidFilePath and load .env for correct settings display
5
+ * Issue #136: Add --issue and --all flags for worktree-specific status
5
6
  * Display CommandMate server status
6
7
  */
8
+ import { StatusOptions } from '../types';
7
9
  /**
8
10
  * Execute status command
9
11
  * Issue #125: Use getPidFilePath and load .env for correct settings display
12
+ * Issue #136: Support --issue and --all flags
10
13
  */
11
- export declare function statusCommand(): Promise<void>;
14
+ export declare function statusCommand(options?: StatusOptions): Promise<void>;
12
15
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDnD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAA6B,aAAa,EAAE,MAAM,UAAU,CAAC;AAqFpE;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6E9E"}
@@ -3,32 +3,118 @@
3
3
  * Status Command
4
4
  * Issue #96: npm install CLI support
5
5
  * Issue #125: Use getPidFilePath and load .env for correct settings display
6
+ * Issue #136: Add --issue and --all flags for worktree-specific status
6
7
  * Display CommandMate server status
7
8
  */
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
9
10
  exports.statusCommand = statusCommand;
10
11
  const dotenv_1 = require("dotenv");
12
+ const fs_1 = require("fs");
11
13
  const types_1 = require("../types");
12
14
  const logger_1 = require("../utils/logger");
13
15
  const daemon_1 = require("../utils/daemon");
14
16
  const env_setup_1 = require("../utils/env-setup");
17
+ const input_validators_1 = require("../utils/input-validators");
15
18
  const logger = new logger_1.CLILogger();
19
+ /**
20
+ * Show status for a single server (main or issue-specific)
21
+ */
22
+ async function showSingleStatus(issueNo) {
23
+ const pidFilePath = (0, env_setup_1.getPidFilePath)(issueNo);
24
+ const envPath = (0, env_setup_1.getEnvPath)(issueNo);
25
+ // Load .env so getStatus() can access correct CM_PORT and CM_BIND values
26
+ (0, dotenv_1.config)({ path: envPath });
27
+ const daemonManager = new daemon_1.DaemonManager(pidFilePath);
28
+ const status = await daemonManager.getStatus();
29
+ const serverLabel = issueNo !== undefined
30
+ ? `Issue #${issueNo}`
31
+ : 'Main Server';
32
+ console.log('');
33
+ console.log(`CommandMate Status - ${serverLabel}`);
34
+ console.log('='.repeat(40));
35
+ if (status === null) {
36
+ console.log('Status: Stopped (no PID file)');
37
+ return;
38
+ }
39
+ if (!status.running) {
40
+ console.log('Status: Not running (stale PID file)');
41
+ console.log('');
42
+ const startCmd = issueNo !== undefined
43
+ ? `commandmate start --issue ${issueNo}`
44
+ : 'commandmate start';
45
+ console.log(`Run "${startCmd}" to start the server`);
46
+ return;
47
+ }
48
+ console.log(`Status: Running (PID: ${status.pid})`);
49
+ if (status.port) {
50
+ console.log(`Port: ${status.port}`);
51
+ }
52
+ if (status.uptime !== undefined) {
53
+ console.log(`Uptime: ${logger_1.CLILogger.formatDuration(status.uptime)}`);
54
+ }
55
+ if (status.url) {
56
+ console.log(`URL: ${status.url}`);
57
+ }
58
+ }
59
+ /**
60
+ * Show status for all servers (main + all worktrees)
61
+ * Issue #136: --all flag support
62
+ */
63
+ async function showAllStatus() {
64
+ // Show main server status
65
+ await showSingleStatus();
66
+ // Check for worktree PID files
67
+ try {
68
+ const pidsDir = (0, env_setup_1.getPidsDir)();
69
+ const files = (0, fs_1.readdirSync)(pidsDir).filter(f => f.endsWith('.pid'));
70
+ for (const file of files) {
71
+ const issueNo = parseInt(file.replace('.pid', ''), 10);
72
+ if (!isNaN(issueNo)) {
73
+ await showSingleStatus(issueNo);
74
+ }
75
+ }
76
+ }
77
+ catch {
78
+ // pids directory may not exist yet
79
+ }
80
+ console.log('');
81
+ }
16
82
  /**
17
83
  * Execute status command
18
84
  * Issue #125: Use getPidFilePath and load .env for correct settings display
85
+ * Issue #136: Support --issue and --all flags
19
86
  */
20
- async function statusCommand() {
87
+ async function statusCommand(options = {}) {
21
88
  try {
89
+ // Issue #136: Handle --all flag
90
+ if (options.all) {
91
+ await showAllStatus();
92
+ process.exit(types_1.ExitCode.SUCCESS);
93
+ return;
94
+ }
95
+ // Issue #136: Validate issue number if provided
96
+ if (options.issue !== undefined) {
97
+ const validation = (0, input_validators_1.validateIssueNoResult)(options.issue);
98
+ if (!validation.valid) {
99
+ logger.error(`Invalid issue number: ${validation.error}`);
100
+ process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
101
+ return;
102
+ }
103
+ }
22
104
  // Issue #125: Get PID file path and load .env for correct settings
23
- const pidFilePath = (0, env_setup_1.getPidFilePath)();
24
- const envPath = (0, env_setup_1.getEnvPath)();
105
+ // Issue #136: Use issue number for worktree-specific PID file
106
+ const pidFilePath = (0, env_setup_1.getPidFilePath)(options.issue);
107
+ const envPath = (0, env_setup_1.getEnvPath)(options.issue);
25
108
  // Load .env so getStatus() can access correct CM_PORT and CM_BIND values
26
109
  (0, dotenv_1.config)({ path: envPath });
27
110
  const daemonManager = new daemon_1.DaemonManager(pidFilePath);
28
111
  const status = await daemonManager.getStatus();
112
+ const serverLabel = options.issue !== undefined
113
+ ? `Issue #${options.issue}`
114
+ : 'Main Server';
29
115
  console.log('');
30
- console.log('CommandMate Status');
31
- console.log('==================');
116
+ console.log(`CommandMate Status - ${serverLabel}`);
117
+ console.log('='.repeat(40));
32
118
  if (status === null) {
33
119
  console.log('Status: Stopped (no PID file)');
34
120
  process.exit(types_1.ExitCode.SUCCESS);
@@ -37,7 +123,10 @@ async function statusCommand() {
37
123
  if (!status.running) {
38
124
  console.log('Status: Not running (stale PID file)');
39
125
  console.log('');
40
- console.log('Run "commandmate start" to start the server');
126
+ const startCmd = options.issue !== undefined
127
+ ? `commandmate start --issue ${options.issue}`
128
+ : 'commandmate start';
129
+ console.log(`Run "${startCmd}" to start the server`);
41
130
  process.exit(types_1.ExitCode.SUCCESS);
42
131
  return;
43
132
  }
@@ -2,12 +2,14 @@
2
2
  * Stop Command
3
3
  * Issue #96: npm install CLI support
4
4
  * Issue #125: Use getPidFilePath for correct path resolution
5
+ * Issue #136: Add --issue flag for worktree-specific server stop
5
6
  * Stop CommandMate server
6
7
  */
7
8
  import { StopOptions } from '../types';
8
9
  /**
9
10
  * Execute stop command
10
11
  * Issue #125: Use getPidFilePath for correct path resolution
12
+ * Issue #136: Support --issue flag for worktree-specific server stop
11
13
  */
12
14
  export declare function stopCommand(options: StopOptions): Promise<void>;
13
15
  //# sourceMappingURL=stop.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AAQlE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyErE"}
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AASlE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFrE"}
@@ -3,6 +3,7 @@
3
3
  * Stop Command
4
4
  * Issue #96: npm install CLI support
5
5
  * Issue #125: Use getPidFilePath for correct path resolution
6
+ * Issue #136: Add --issue flag for worktree-specific server stop
6
7
  * Stop CommandMate server
7
8
  */
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -12,25 +13,41 @@ const logger_1 = require("../utils/logger");
12
13
  const daemon_1 = require("../utils/daemon");
13
14
  const security_logger_1 = require("../utils/security-logger");
14
15
  const env_setup_1 = require("../utils/env-setup");
16
+ const input_validators_1 = require("../utils/input-validators");
15
17
  const logger = new logger_1.CLILogger();
16
18
  /**
17
19
  * Execute stop command
18
20
  * Issue #125: Use getPidFilePath for correct path resolution
21
+ * Issue #136: Support --issue flag for worktree-specific server stop
19
22
  */
20
23
  async function stopCommand(options) {
21
24
  try {
25
+ // Issue #136: Validate issue number if provided
26
+ if (options.issue !== undefined) {
27
+ const validation = (0, input_validators_1.validateIssueNoResult)(options.issue);
28
+ if (!validation.valid) {
29
+ logger.error(`Invalid issue number: ${validation.error}`);
30
+ process.exit(types_1.ExitCode.STOP_FAILED);
31
+ return;
32
+ }
33
+ }
22
34
  // Issue #125: Get PID file path from correct location
23
- const pidFilePath = (0, env_setup_1.getPidFilePath)();
35
+ // Issue #136: Use issue number for worktree-specific PID file
36
+ const pidFilePath = (0, env_setup_1.getPidFilePath)(options.issue);
24
37
  const daemonManager = new daemon_1.DaemonManager(pidFilePath);
38
+ // Issue #136: Show which server we're stopping
39
+ const serverLabel = options.issue !== undefined
40
+ ? `Issue #${options.issue} server`
41
+ : 'Main server';
25
42
  // Check if running
26
43
  if (!(await daemonManager.isRunning())) {
27
44
  const status = await daemonManager.getStatus();
28
45
  if (status === null) {
29
- logger.info('Server is not running (no PID file found)');
46
+ logger.info(`${serverLabel} is not running (no PID file found)`);
30
47
  logger.info('Status: Stopped');
31
48
  }
32
49
  else {
33
- logger.info('Server is not running (stale PID file)');
50
+ logger.info(`${serverLabel} is not running (stale PID file)`);
34
51
  }
35
52
  process.exit(types_1.ExitCode.SUCCESS);
36
53
  return;
@@ -38,35 +55,35 @@ async function stopCommand(options) {
38
55
  const status = await daemonManager.getStatus();
39
56
  const pid = status?.pid;
40
57
  if (options.force) {
41
- logger.warn(`Force stopping server (PID: ${pid})...`);
58
+ logger.warn(`Force stopping ${serverLabel} (PID: ${pid})...`);
42
59
  (0, security_logger_1.logSecurityEvent)({
43
60
  timestamp: new Date().toISOString(),
44
61
  command: 'stop',
45
62
  action: 'warning',
46
- details: `--force flag used (SIGKILL) on PID ${pid}`,
63
+ details: `--force flag used (SIGKILL) on PID ${pid}${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
47
64
  });
48
65
  }
49
66
  else {
50
- logger.info(`Stopping server (PID: ${pid})...`);
67
+ logger.info(`Stopping ${serverLabel} (PID: ${pid})...`);
51
68
  }
52
69
  const result = await daemonManager.stop(options.force);
53
70
  if (result) {
54
- logger.success('Server stopped');
71
+ logger.success(`${serverLabel} stopped`);
55
72
  (0, security_logger_1.logSecurityEvent)({
56
73
  timestamp: new Date().toISOString(),
57
74
  command: 'stop',
58
75
  action: 'success',
59
- details: `Server stopped (PID: ${pid})`,
76
+ details: `Server stopped (PID: ${pid})${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
60
77
  });
61
78
  process.exit(types_1.ExitCode.SUCCESS);
62
79
  }
63
80
  else {
64
- logger.error('Failed to stop server');
81
+ logger.error(`Failed to stop ${serverLabel}`);
65
82
  (0, security_logger_1.logSecurityEvent)({
66
83
  timestamp: new Date().toISOString(),
67
84
  command: 'stop',
68
85
  action: 'failure',
69
- details: `Failed to stop PID ${pid}`,
86
+ details: `Failed to stop PID ${pid}${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
70
87
  });
71
88
  process.exit(types_1.ExitCode.STOP_FAILED);
72
89
  }
package/dist/cli/index.js CHANGED
@@ -30,35 +30,49 @@ program
30
30
  });
31
31
  });
32
32
  // Start command
33
+ // Issue #136: Add --issue and --auto-port flags for worktree support
33
34
  program
34
35
  .command('start')
35
36
  .description('Start the CommandMate server')
36
37
  .option('--dev', 'Start in development mode')
37
38
  .option('--daemon', 'Run in background')
38
39
  .option('-p, --port <number>', 'Override port number', parseInt)
40
+ .option('-i, --issue <number>', 'Start worktree server for specific issue', parseInt)
41
+ .option('--auto-port', 'Automatically allocate port for worktree server')
39
42
  .action(async (options) => {
40
43
  await (0, start_1.startCommand)({
41
44
  dev: options.dev,
42
45
  daemon: options.daemon,
43
46
  port: options.port,
47
+ issue: options.issue,
48
+ autoPort: options.autoPort,
44
49
  });
45
50
  });
46
51
  // Stop command
52
+ // Issue #136: Add --issue flag for worktree-specific server stop
47
53
  program
48
54
  .command('stop')
49
55
  .description('Stop the CommandMate server')
50
56
  .option('-f, --force', 'Force stop (SIGKILL)')
57
+ .option('-i, --issue <number>', 'Stop worktree server for specific issue', parseInt)
51
58
  .action(async (options) => {
52
59
  await (0, stop_1.stopCommand)({
53
60
  force: options.force,
61
+ issue: options.issue,
54
62
  });
55
63
  });
56
64
  // Status command
65
+ // Issue #136: Add --issue and --all flags for worktree-specific status
57
66
  program
58
67
  .command('status')
59
68
  .description('Show server status')
60
- .action(async () => {
61
- await (0, status_1.statusCommand)();
69
+ .option('-i, --issue <number>', 'Show status for specific issue worktree', parseInt)
70
+ .option('-a, --all', 'Show status for all servers (main + worktrees)')
71
+ .action(async (options) => {
72
+ await (0, status_1.statusCommand)({
73
+ issue: options.issue,
74
+ all: options.all,
75
+ });
62
76
  });
63
77
  // Parse and execute
64
78
  program.parse();
@@ -25,6 +25,7 @@ export interface InitOptions {
25
25
  }
26
26
  /**
27
27
  * Options for start command
28
+ * Issue #136: Added issue and autoPort for worktree support
28
29
  */
29
30
  export interface StartOptions {
30
31
  /** Start in development mode */
@@ -33,13 +34,32 @@ export interface StartOptions {
33
34
  daemon?: boolean;
34
35
  /** Override port number */
35
36
  port?: number;
37
+ /** Issue number for worktree-specific server (Issue #136) */
38
+ issue?: number;
39
+ /** Automatically allocate an available port (Issue #136) */
40
+ autoPort?: boolean;
41
+ /** Override database path for worktree server (Issue #136) */
42
+ dbPath?: string;
36
43
  }
37
44
  /**
38
45
  * Options for stop command
46
+ * Issue #136: Added issue for worktree support
39
47
  */
40
48
  export interface StopOptions {
41
49
  /** Force stop (SIGKILL) */
42
50
  force?: boolean;
51
+ /** Issue number for worktree-specific server (Issue #136) */
52
+ issue?: number;
53
+ }
54
+ /**
55
+ * Options for status command
56
+ * Issue #136: New interface for worktree support
57
+ */
58
+ export interface StatusOptions {
59
+ /** Issue number for worktree-specific status (Issue #136) */
60
+ issue?: number;
61
+ /** Show status for all running servers (Issue #136) */
62
+ all?: boolean;
43
63
  }
44
64
  /**
45
65
  * Daemon process status
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/types/index.ts"],"names":[],"mappings":"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"}