@kaitranntt/ccs 4.4.0 → 5.0.1

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 (262) hide show
  1. package/README.md +98 -7
  2. package/VERSION +1 -1
  3. package/config/base-agy.settings.json +10 -0
  4. package/config/base-codex.settings.json +10 -0
  5. package/config/base-gemini.settings.json +10 -0
  6. package/dist/auth/auth-commands.d.ts +52 -0
  7. package/dist/auth/auth-commands.d.ts.map +1 -0
  8. package/dist/auth/auth-commands.js +479 -0
  9. package/dist/auth/auth-commands.js.map +1 -0
  10. package/dist/auth/profile-detector.d.ts +68 -0
  11. package/dist/auth/profile-detector.d.ts.map +1 -0
  12. package/dist/auth/profile-detector.js +209 -0
  13. package/dist/auth/profile-detector.js.map +1 -0
  14. package/dist/auth/profile-registry.d.ts +60 -0
  15. package/dist/auth/profile-registry.d.ts.map +1 -0
  16. package/dist/auth/profile-registry.js +188 -0
  17. package/dist/auth/profile-registry.js.map +1 -0
  18. package/dist/ccs.d.ts +10 -0
  19. package/dist/ccs.d.ts.map +1 -0
  20. package/dist/ccs.js +320 -0
  21. package/dist/ccs.js.map +1 -0
  22. package/dist/cliproxy/auth-handler.d.ts +95 -0
  23. package/dist/cliproxy/auth-handler.d.ts.map +1 -0
  24. package/dist/cliproxy/auth-handler.js +443 -0
  25. package/dist/cliproxy/auth-handler.js.map +1 -0
  26. package/dist/cliproxy/base-config-loader.d.ts +42 -0
  27. package/dist/cliproxy/base-config-loader.d.ts.map +1 -0
  28. package/dist/cliproxy/base-config-loader.js +123 -0
  29. package/dist/cliproxy/base-config-loader.js.map +1 -0
  30. package/dist/cliproxy/binary-manager.d.ts +104 -0
  31. package/dist/cliproxy/binary-manager.d.ts.map +1 -0
  32. package/dist/cliproxy/binary-manager.js +567 -0
  33. package/dist/cliproxy/binary-manager.js.map +1 -0
  34. package/dist/cliproxy/cliproxy-executor.d.ts +33 -0
  35. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -0
  36. package/dist/cliproxy/cliproxy-executor.js +297 -0
  37. package/dist/cliproxy/cliproxy-executor.js.map +1 -0
  38. package/dist/cliproxy/config-generator.d.ts +89 -0
  39. package/dist/cliproxy/config-generator.d.ts.map +1 -0
  40. package/dist/cliproxy/config-generator.js +263 -0
  41. package/dist/cliproxy/config-generator.js.map +1 -0
  42. package/dist/cliproxy/index.d.ts +13 -0
  43. package/dist/cliproxy/index.d.ts.map +1 -0
  44. package/dist/cliproxy/index.js +62 -0
  45. package/dist/cliproxy/index.js.map +1 -0
  46. package/dist/cliproxy/platform-detector.d.ts +48 -0
  47. package/dist/cliproxy/platform-detector.d.ts.map +1 -0
  48. package/dist/cliproxy/platform-detector.js +118 -0
  49. package/dist/cliproxy/platform-detector.js.map +1 -0
  50. package/dist/cliproxy/types.d.ts +169 -0
  51. package/dist/cliproxy/types.d.ts.map +1 -0
  52. package/dist/cliproxy/types.js +7 -0
  53. package/dist/cliproxy/types.js.map +1 -0
  54. package/dist/commands/doctor-command.d.ts +10 -0
  55. package/dist/commands/doctor-command.d.ts.map +1 -0
  56. package/dist/commands/doctor-command.js +44 -0
  57. package/dist/commands/doctor-command.js.map +1 -0
  58. package/dist/commands/help-command.d.ts +5 -0
  59. package/dist/commands/help-command.d.ts.map +1 -0
  60. package/dist/commands/help-command.js +104 -0
  61. package/dist/commands/help-command.js.map +1 -0
  62. package/dist/commands/install-command.d.ts +14 -0
  63. package/dist/commands/install-command.d.ts.map +1 -0
  64. package/dist/commands/install-command.js +39 -0
  65. package/dist/commands/install-command.js.map +1 -0
  66. package/dist/commands/shell-completion-command.d.ts +10 -0
  67. package/dist/commands/shell-completion-command.d.ts.map +1 -0
  68. package/dist/commands/shell-completion-command.js +85 -0
  69. package/dist/commands/shell-completion-command.js.map +1 -0
  70. package/dist/commands/sync-command.d.ts +10 -0
  71. package/dist/commands/sync-command.d.ts.map +1 -0
  72. package/dist/commands/sync-command.js +59 -0
  73. package/dist/commands/sync-command.js.map +1 -0
  74. package/dist/commands/update-command.d.ts +12 -0
  75. package/dist/commands/update-command.d.ts.map +1 -0
  76. package/dist/commands/update-command.js +295 -0
  77. package/dist/commands/update-command.js.map +1 -0
  78. package/dist/commands/version-command.d.ts +10 -0
  79. package/dist/commands/version-command.d.ts.map +1 -0
  80. package/dist/commands/version-command.js +100 -0
  81. package/dist/commands/version-command.js.map +1 -0
  82. package/dist/delegation/delegation-handler.d.ts +60 -0
  83. package/dist/delegation/delegation-handler.d.ts.map +1 -0
  84. package/dist/delegation/delegation-handler.js +174 -0
  85. package/dist/delegation/delegation-handler.js.map +1 -0
  86. package/dist/delegation/headless-executor.d.ts +114 -0
  87. package/dist/delegation/headless-executor.d.ts.map +1 -0
  88. package/dist/delegation/headless-executor.js +562 -0
  89. package/dist/delegation/headless-executor.js.map +1 -0
  90. package/dist/delegation/result-formatter.d.ts +108 -0
  91. package/dist/delegation/result-formatter.d.ts.map +1 -0
  92. package/dist/delegation/result-formatter.js +391 -0
  93. package/dist/delegation/result-formatter.js.map +1 -0
  94. package/dist/delegation/session-manager.d.ts +58 -0
  95. package/dist/delegation/session-manager.d.ts.map +1 -0
  96. package/dist/delegation/session-manager.js +153 -0
  97. package/dist/delegation/session-manager.js.map +1 -0
  98. package/dist/delegation/settings-parser.d.ts +31 -0
  99. package/dist/delegation/settings-parser.d.ts.map +1 -0
  100. package/dist/delegation/settings-parser.js +107 -0
  101. package/dist/delegation/settings-parser.js.map +1 -0
  102. package/dist/glmt/delta-accumulator.d.ts +210 -0
  103. package/dist/glmt/delta-accumulator.d.ts.map +1 -0
  104. package/dist/glmt/delta-accumulator.js +351 -0
  105. package/dist/glmt/delta-accumulator.js.map +1 -0
  106. package/dist/glmt/glmt-proxy.d.ts +72 -0
  107. package/dist/glmt/glmt-proxy.d.ts.map +1 -0
  108. package/dist/glmt/glmt-proxy.js +427 -0
  109. package/dist/glmt/glmt-proxy.js.map +1 -0
  110. package/dist/glmt/glmt-transformer.d.ts +265 -0
  111. package/dist/glmt/glmt-transformer.d.ts.map +1 -0
  112. package/dist/glmt/glmt-transformer.js +832 -0
  113. package/dist/glmt/glmt-transformer.js.map +1 -0
  114. package/dist/glmt/locale-enforcer.d.ts +38 -0
  115. package/dist/glmt/locale-enforcer.d.ts.map +1 -0
  116. package/dist/glmt/locale-enforcer.js +69 -0
  117. package/dist/glmt/locale-enforcer.js.map +1 -0
  118. package/dist/glmt/reasoning-enforcer.d.ts +52 -0
  119. package/dist/glmt/reasoning-enforcer.d.ts.map +1 -0
  120. package/dist/glmt/reasoning-enforcer.js +151 -0
  121. package/dist/glmt/reasoning-enforcer.js.map +1 -0
  122. package/dist/glmt/sse-parser.d.ts +47 -0
  123. package/dist/glmt/sse-parser.d.ts.map +1 -0
  124. package/dist/glmt/sse-parser.js +93 -0
  125. package/dist/glmt/sse-parser.js.map +1 -0
  126. package/dist/management/doctor.d.ts +104 -0
  127. package/dist/management/doctor.d.ts.map +1 -0
  128. package/dist/management/doctor.js +673 -0
  129. package/dist/management/doctor.js.map +1 -0
  130. package/dist/management/instance-manager.d.ts +57 -0
  131. package/dist/management/instance-manager.d.ts.map +1 -0
  132. package/dist/management/instance-manager.js +195 -0
  133. package/dist/management/instance-manager.js.map +1 -0
  134. package/dist/management/recovery-manager.d.ts +39 -0
  135. package/dist/management/recovery-manager.d.ts.map +1 -0
  136. package/dist/management/recovery-manager.js +141 -0
  137. package/dist/management/recovery-manager.js.map +1 -0
  138. package/dist/management/shared-manager.d.ts +47 -0
  139. package/dist/management/shared-manager.d.ts.map +1 -0
  140. package/dist/management/shared-manager.js +388 -0
  141. package/dist/management/shared-manager.js.map +1 -0
  142. package/dist/types/cli.d.ts +50 -0
  143. package/dist/types/cli.d.ts.map +1 -0
  144. package/dist/types/cli.js +16 -0
  145. package/dist/types/cli.js.map +1 -0
  146. package/dist/types/config.d.ts +51 -0
  147. package/dist/types/config.d.ts.map +1 -0
  148. package/dist/types/config.js +26 -0
  149. package/dist/types/config.js.map +1 -0
  150. package/dist/types/delegation.d.ts +61 -0
  151. package/dist/types/delegation.d.ts.map +1 -0
  152. package/dist/types/delegation.js +6 -0
  153. package/dist/types/delegation.js.map +1 -0
  154. package/dist/types/glmt.d.ts +95 -0
  155. package/dist/types/glmt.d.ts.map +1 -0
  156. package/dist/types/glmt.js +7 -0
  157. package/dist/types/glmt.js.map +1 -0
  158. package/dist/types/index.d.ts +13 -0
  159. package/dist/types/index.d.ts.map +1 -0
  160. package/dist/types/index.js +16 -0
  161. package/dist/types/index.js.map +1 -0
  162. package/dist/types/utils.d.ts +36 -0
  163. package/dist/types/utils.d.ts.map +1 -0
  164. package/dist/types/utils.js +22 -0
  165. package/dist/types/utils.js.map +1 -0
  166. package/dist/utils/claude-detector.d.ts +14 -0
  167. package/dist/utils/claude-detector.d.ts.map +1 -0
  168. package/dist/utils/claude-detector.js +112 -0
  169. package/dist/utils/claude-detector.js.map +1 -0
  170. package/dist/utils/claude-dir-installer.d.ts +46 -0
  171. package/dist/utils/claude-dir-installer.d.ts.map +1 -0
  172. package/dist/utils/claude-dir-installer.js +289 -0
  173. package/dist/utils/claude-dir-installer.js.map +1 -0
  174. package/dist/utils/claude-symlink-manager.d.ts +61 -0
  175. package/dist/utils/claude-symlink-manager.d.ts.map +1 -0
  176. package/dist/utils/claude-symlink-manager.js +291 -0
  177. package/dist/utils/claude-symlink-manager.js.map +1 -0
  178. package/dist/utils/config-manager.d.ts +32 -0
  179. package/dist/utils/config-manager.d.ts.map +1 -0
  180. package/dist/utils/config-manager.js +143 -0
  181. package/dist/utils/config-manager.js.map +1 -0
  182. package/dist/utils/delegation-validator.d.ts +39 -0
  183. package/dist/utils/delegation-validator.d.ts.map +1 -0
  184. package/dist/utils/delegation-validator.js +161 -0
  185. package/dist/utils/delegation-validator.js.map +1 -0
  186. package/dist/utils/error-codes.d.ts +36 -0
  187. package/dist/utils/error-codes.d.ts.map +1 -0
  188. package/dist/utils/error-codes.js +63 -0
  189. package/dist/utils/error-codes.js.map +1 -0
  190. package/dist/utils/error-manager.d.ts +59 -0
  191. package/dist/utils/error-manager.d.ts.map +1 -0
  192. package/dist/utils/error-manager.js +228 -0
  193. package/dist/utils/error-manager.js.map +1 -0
  194. package/dist/utils/helpers.d.ts +27 -0
  195. package/dist/utils/helpers.d.ts.map +1 -0
  196. package/dist/utils/helpers.js +150 -0
  197. package/dist/utils/helpers.js.map +1 -0
  198. package/dist/utils/package-manager-detector.d.ts +14 -0
  199. package/dist/utils/package-manager-detector.d.ts.map +1 -0
  200. package/dist/utils/package-manager-detector.js +162 -0
  201. package/dist/utils/package-manager-detector.js.map +1 -0
  202. package/dist/utils/progress-indicator.d.ts +52 -0
  203. package/dist/utils/progress-indicator.d.ts.map +1 -0
  204. package/dist/utils/progress-indicator.js +102 -0
  205. package/dist/utils/progress-indicator.js.map +1 -0
  206. package/dist/utils/prompt.d.ts +29 -0
  207. package/dist/utils/prompt.d.ts.map +1 -0
  208. package/dist/utils/prompt.js +116 -0
  209. package/dist/utils/prompt.js.map +1 -0
  210. package/dist/utils/shell-completion.d.ts +52 -0
  211. package/dist/utils/shell-completion.d.ts.map +1 -0
  212. package/dist/utils/shell-completion.js +231 -0
  213. package/dist/utils/shell-completion.js.map +1 -0
  214. package/dist/utils/shell-executor.d.ts +15 -0
  215. package/dist/utils/shell-executor.d.ts.map +1 -0
  216. package/dist/utils/shell-executor.js +57 -0
  217. package/dist/utils/shell-executor.js.map +1 -0
  218. package/dist/utils/update-checker.d.ts +48 -0
  219. package/dist/utils/update-checker.d.ts.map +1 -0
  220. package/dist/utils/update-checker.js +241 -0
  221. package/dist/utils/update-checker.js.map +1 -0
  222. package/lib/ccs +21 -1907
  223. package/lib/ccs.ps1 +26 -1800
  224. package/lib/error-codes.ps1 +2 -1
  225. package/lib/prompt.ps1 +2 -2
  226. package/package.json +31 -11
  227. package/scripts/add-shebang.js +39 -0
  228. package/scripts/bump-version.sh +25 -37
  229. package/scripts/dev-install.sh +32 -11
  230. package/scripts/postinstall.js +29 -29
  231. package/bin/auth/auth-commands.js +0 -499
  232. package/bin/auth/profile-detector.js +0 -204
  233. package/bin/auth/profile-registry.js +0 -225
  234. package/bin/ccs.js +0 -1034
  235. package/bin/delegation/README.md +0 -191
  236. package/bin/delegation/delegation-handler.js +0 -212
  237. package/bin/delegation/headless-executor.js +0 -618
  238. package/bin/delegation/result-formatter.js +0 -485
  239. package/bin/delegation/session-manager.js +0 -157
  240. package/bin/delegation/settings-parser.js +0 -109
  241. package/bin/glmt/delta-accumulator.js +0 -276
  242. package/bin/glmt/glmt-proxy.js +0 -495
  243. package/bin/glmt/glmt-transformer.js +0 -999
  244. package/bin/glmt/locale-enforcer.js +0 -72
  245. package/bin/glmt/reasoning-enforcer.js +0 -173
  246. package/bin/glmt/sse-parser.js +0 -96
  247. package/bin/management/doctor.js +0 -721
  248. package/bin/management/instance-manager.js +0 -202
  249. package/bin/management/recovery-manager.js +0 -135
  250. package/bin/management/shared-manager.js +0 -402
  251. package/bin/utils/claude-detector.js +0 -73
  252. package/bin/utils/claude-dir-installer.js +0 -283
  253. package/bin/utils/claude-symlink-manager.js +0 -289
  254. package/bin/utils/config-manager.js +0 -103
  255. package/bin/utils/delegation-validator.js +0 -154
  256. package/bin/utils/error-codes.js +0 -59
  257. package/bin/utils/error-manager.js +0 -165
  258. package/bin/utils/helpers.js +0 -136
  259. package/bin/utils/progress-indicator.js +0 -111
  260. package/bin/utils/prompt.js +0 -134
  261. package/bin/utils/shell-completion.js +0 -256
  262. package/bin/utils/update-checker.js +0 -243
@@ -1,191 +0,0 @@
1
- # CCS Delegation Module
2
-
3
- Enhanced Claude Code delegation system for multi-model task delegation.
4
-
5
- ## Files
6
-
7
- ### Core Components
8
- - **headless-executor.js** (405 lines) - Main executor, spawns `claude -p` with enhanced features
9
- - **session-manager.js** (156 lines) - Session persistence and cost tracking
10
- - **settings-parser.js** (88 lines) - Parse tool restrictions from settings
11
- - **result-formatter.js** (326 lines) - Terminal output formatting
12
-
13
- **Total**: 975 lines (down from 1,755 lines - 44% reduction)
14
-
15
- ## Features
16
-
17
- ### Enhanced Headless Execution
18
- - Stream-JSON output parsing (`--output-format stream-json`)
19
- - Real-time tool use visibility in TTY
20
- - Permission mode acceptEdits (`--permission-mode acceptEdits`)
21
- - Tool restrictions from `.claude/settings.local.json`
22
- - Multi-turn session management (`--resume <session-id>`)
23
- - Time-based limits (10 min default timeout with graceful termination)
24
- - Cost tracking and aggregation
25
-
26
- ### Session Management
27
- - Persistence: `~/.ccs/delegation-sessions.json`
28
- - Resume via `/ccs:continue` (auto-detects profile)
29
- - Auto-cleanup expired sessions (>30 days)
30
- - Cost aggregation across turns
31
-
32
- ### Settings
33
- - Profile location: `~/.ccs/{profile}.settings.json`
34
- - Examples: `glm.settings.json`, `kimi.settings.json`, `glmt.settings.json`
35
- - Tool restrictions from `.claude/settings.local.json`
36
-
37
- ## Usage
38
-
39
- ### Basic Delegation
40
- ```javascript
41
- const { HeadlessExecutor } = require('./headless-executor');
42
-
43
- const result = await HeadlessExecutor.execute('glm', 'Refactor auth.js', {
44
- cwd: '/path/to/project',
45
- outputFormat: 'stream-json',
46
- permissionMode: 'acceptEdits',
47
- timeout: 600000 // 10 minutes
48
- });
49
-
50
- console.log(result.sessionId); // For multi-turn
51
- console.log(result.totalCost); // Cost in USD
52
- console.log(result.content); // Result text
53
- ```
54
-
55
- ### Multi-Turn Sessions
56
- ```javascript
57
- // Start session
58
- const result1 = await HeadlessExecutor.execute('glm', 'Implement feature');
59
- const sessionId = result1.sessionId;
60
-
61
- // Continue session
62
- const result2 = await HeadlessExecutor.execute('glm', 'Add tests', {
63
- resumeSession: true
64
- });
65
-
66
- // Or with specific session ID
67
- const result3 = await HeadlessExecutor.execute('glm', 'Run tests', {
68
- sessionId: sessionId
69
- });
70
- ```
71
-
72
- ### Tool Restrictions
73
- Create `.claude/settings.local.json`:
74
- ```json
75
- {
76
- "permissions": {
77
- "allow": ["Bash(git:*)", "Read", "Edit"],
78
- "deny": ["Bash(rm:*)", "Bash(sudo:*)"]
79
- }
80
- }
81
- ```
82
-
83
- Automatically applied as CLI flags:
84
- ```bash
85
- --allowedTools "Bash(git:*)" "Read" "Edit" \
86
- --disallowedTools "Bash(rm:*)" "Bash(sudo:*)"
87
- ```
88
-
89
- ## Slash Commands
90
-
91
- The delegation system is invoked via simple slash commands in `.claude/commands/ccs/`:
92
-
93
- ### Basic Commands
94
- - `/ccs "task"` - Delegate task (auto-selects best profile)
95
- - `/ccs --glm "task"` - Force GLM-4.6 delegation
96
- - `/ccs --kimi "task"` - Force Kimi delegation (long-context)
97
-
98
- ### Session Continuation
99
- - `/ccs:continue "follow-up"` - Resume last delegation session (auto-detect profile)
100
- - `/ccs:continue --glm "follow-up"` - Resume with specific profile switch
101
-
102
- Each command directly invokes:
103
- ```bash
104
- claude -p "$ARGUMENTS" \
105
- --settings ~/.ccs/{profile}.settings.json \
106
- --output-format stream-json \
107
- --permission-mode acceptEdits
108
- ```
109
-
110
- ## Debug Mode
111
-
112
- ```bash
113
- export CCS_DEBUG=1
114
- ```
115
-
116
- Enables verbose logging:
117
- - Permission mode selection
118
- - Session resumption details
119
- - Tool restrictions parsing
120
- - CLI args construction
121
- - Session persistence events
122
-
123
- ## Testing
124
-
125
- ```bash
126
- # Run all delegation tests
127
- node tests/unit/delegation/json-output.test.js
128
- node tests/unit/delegation/permission-mode.test.js
129
- node tests/unit/delegation/session-manager.test.js
130
- node tests/unit/delegation/settings-parser.test.js
131
- node tests/unit/delegation/max-turns.test.js
132
- node tests/unit/delegation/result-formatter.test.js
133
- ```
134
-
135
- **Test Coverage:**
136
- - JSON output parsing (6 tests)
137
- - Permission modes (11 tests)
138
- - Session management (7 tests)
139
- - Settings parser (6 tests)
140
- - Auto max-turns (14 tests)
141
- - Result formatting (14 tests)
142
- - **Total: 58 tests**
143
-
144
- ## Architecture
145
-
146
- ```
147
- User → SlashCommand (/ccs)
148
- → ccs-delegation skill (auto-selects profile)
149
- → Directly invokes: claude -p
150
- → HeadlessExecutor (monitors execution)
151
- → SessionManager (load last session)
152
- → SettingsParser (tool restrictions)
153
- → Parse JSON response
154
- → SessionManager (store/update)
155
- → ResultFormatter.format()
156
- → Display to user
157
- ```
158
-
159
- **Key Simplification**: Slash commands invoke `claude -p` directly. No intermediate delegation engine or rule system - just direct headless execution with enhanced features.
160
-
161
- ## File Permissions
162
-
163
- All files should be `644` (rw-r--r--):
164
- ```bash
165
- chmod 644 bin/delegation/*.js
166
- ```
167
-
168
- ## Dependencies
169
-
170
- - Node.js 14+
171
- - Claude CLI installed and in PATH
172
- - Profile settings configured in `~/.ccs/{profile}.settings.json`
173
-
174
- ## Migration from Legacy System
175
-
176
- **Removed components** (as of 2025-11-15):
177
- - ~~delegation-engine.js~~ - Rule-based decision engine (unused)
178
- - ~~cwd-resolver.js~~ - Working directory resolution (unused)
179
- - ~~rules-schema.js~~ - Schema validation (unused)
180
- - ~~delegation-rules.json~~ - Configuration file (not created)
181
-
182
- **Why removed**: Current slash commands directly invoke `claude -p` without intermediate orchestration. The delegation engine, CWD resolver, and rules schema were designed for a more complex system that was never fully integrated.
183
-
184
- **Result**: 44% code reduction (1,755 → 975 lines) with same functionality.
185
-
186
- ## References
187
-
188
- - Official docs: https://code.claude.com/docs/en/headless.md
189
- - Skill: `.claude/skills/ccs-delegation/`
190
- - Commands: `.claude/commands/ccs/`
191
- - Tests: `tests/unit/delegation/`
@@ -1,212 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- const { HeadlessExecutor } = require('./headless-executor');
5
- const { SessionManager } = require('./session-manager');
6
- const { ResultFormatter } = require('./result-formatter');
7
- const { DelegationValidator } = require('../utils/delegation-validator');
8
- const { SettingsParser } = require('./settings-parser');
9
-
10
- /**
11
- * Delegation command handler
12
- * Routes -p flag commands to HeadlessExecutor with enhanced features
13
- */
14
- class DelegationHandler {
15
- /**
16
- * Route delegation command
17
- * @param {Array<string>} args - Full args array from ccs.js
18
- */
19
- async route(args) {
20
- try {
21
- // 1. Parse args into { profile, prompt, options }
22
- const parsed = this._parseArgs(args);
23
-
24
- // 2. Detect special profiles (glm:continue, kimi:continue)
25
- if (parsed.profile.includes(':continue')) {
26
- return await this._handleContinue(parsed);
27
- }
28
-
29
- // 3. Validate profile
30
- this._validateProfile(parsed.profile);
31
-
32
- // 4. Execute via HeadlessExecutor
33
- const result = await HeadlessExecutor.execute(
34
- parsed.profile,
35
- parsed.prompt,
36
- parsed.options
37
- );
38
-
39
- // 5. Format and display results
40
- const formatted = ResultFormatter.format(result);
41
- console.log(formatted);
42
-
43
- // 6. Exit with proper code
44
- process.exit(result.exitCode || 0);
45
- } catch (error) {
46
- console.error(`[X] Delegation error: ${error.message}`);
47
- if (process.env.CCS_DEBUG) {
48
- console.error(error.stack);
49
- }
50
- process.exit(1);
51
- }
52
- }
53
-
54
- /**
55
- * Handle continue command (resume last session)
56
- * @param {Object} parsed - Parsed args
57
- */
58
- async _handleContinue(parsed) {
59
- const baseProfile = parsed.profile.replace(':continue', '');
60
-
61
- // Get last session from SessionManager
62
- const sessionMgr = new SessionManager();
63
- const lastSession = sessionMgr.getLastSession(baseProfile);
64
-
65
- if (!lastSession) {
66
- console.error(`[X] No previous session found for ${baseProfile}`);
67
- console.error(` Start a new session first with: ccs ${baseProfile} -p "task"`);
68
- process.exit(1);
69
- }
70
-
71
- // Execute with resume flag
72
- const result = await HeadlessExecutor.execute(
73
- baseProfile,
74
- parsed.prompt,
75
- {
76
- ...parsed.options,
77
- resumeSession: true,
78
- sessionId: lastSession.sessionId
79
- }
80
- );
81
-
82
- const formatted = ResultFormatter.format(result);
83
- console.log(formatted);
84
-
85
- process.exit(result.exitCode || 0);
86
- }
87
-
88
- /**
89
- * Parse args into structured format
90
- * @param {Array<string>} args - Raw args
91
- * @returns {Object} { profile, prompt, options }
92
- */
93
- _parseArgs(args) {
94
- // Extract profile (first non-flag arg or 'default')
95
- const profile = this._extractProfile(args);
96
-
97
- // Extract prompt from -p or --prompt
98
- const prompt = this._extractPrompt(args);
99
-
100
- // Extract options (--timeout, --permission-mode, etc.)
101
- const options = this._extractOptions(args);
102
-
103
- return { profile, prompt, options };
104
- }
105
-
106
- /**
107
- * Extract profile from args (first non-flag arg)
108
- * @param {Array<string>} args - Args array
109
- * @returns {string} Profile name
110
- */
111
- _extractProfile(args) {
112
- // Find first arg that doesn't start with '-' and isn't -p value
113
- let skipNext = false;
114
- for (let i = 0; i < args.length; i++) {
115
- if (skipNext) {
116
- skipNext = false;
117
- continue;
118
- }
119
-
120
- if (args[i] === '-p' || args[i] === '--prompt') {
121
- skipNext = true;
122
- continue;
123
- }
124
-
125
- if (!args[i].startsWith('-')) {
126
- return args[i];
127
- }
128
- }
129
-
130
- // No profile specified, return null (will error in validation)
131
- return null;
132
- }
133
-
134
- /**
135
- * Extract prompt from -p flag
136
- * @param {Array<string>} args - Args array
137
- * @returns {string} Prompt text
138
- */
139
- _extractPrompt(args) {
140
- const pIndex = args.indexOf('-p');
141
- const promptIndex = args.indexOf('--prompt');
142
-
143
- const index = pIndex !== -1 ? pIndex : promptIndex;
144
-
145
- if (index === -1 || index === args.length - 1) {
146
- console.error('[X] Missing prompt after -p flag');
147
- console.error(' Usage: ccs glm -p "task description"');
148
- process.exit(1);
149
- }
150
-
151
- return args[index + 1];
152
- }
153
-
154
- /**
155
- * Extract options from remaining args
156
- * @param {Array<string>} args - Args array
157
- * @returns {Object} Options for HeadlessExecutor
158
- */
159
- _extractOptions(args) {
160
- const cwd = process.cwd();
161
-
162
- // Read default permission mode from .claude/settings.local.json
163
- // Falls back to 'acceptEdits' if file doesn't exist
164
- const defaultPermissionMode = SettingsParser.parseDefaultPermissionMode(cwd);
165
-
166
- const options = {
167
- cwd,
168
- outputFormat: 'stream-json',
169
- permissionMode: defaultPermissionMode
170
- };
171
-
172
- // Parse permission-mode (CLI flag overrides settings file)
173
- const permModeIndex = args.indexOf('--permission-mode');
174
- if (permModeIndex !== -1 && permModeIndex < args.length - 1) {
175
- options.permissionMode = args[permModeIndex + 1];
176
- }
177
-
178
- // Parse timeout
179
- const timeoutIndex = args.indexOf('--timeout');
180
- if (timeoutIndex !== -1 && timeoutIndex < args.length - 1) {
181
- options.timeout = parseInt(args[timeoutIndex + 1], 10);
182
- }
183
-
184
- return options;
185
- }
186
-
187
- /**
188
- * Validate profile exists and is configured
189
- * @param {string} profile - Profile name
190
- */
191
- _validateProfile(profile) {
192
- if (!profile) {
193
- console.error('[X] No profile specified');
194
- console.error(' Usage: ccs <profile> -p "task"');
195
- console.error(' Examples: ccs glm -p "task", ccs kimi -p "task"');
196
- process.exit(1);
197
- }
198
-
199
- // Use DelegationValidator to check profile
200
- const validation = DelegationValidator.validate(profile);
201
- if (!validation.valid) {
202
- console.error(`[X] Profile '${profile}' is not configured for delegation`);
203
- console.error(` ${validation.error}`);
204
- console.error('');
205
- console.error(' Run: ccs doctor');
206
- console.error(' Or configure: ~/.ccs/${profile}.settings.json');
207
- process.exit(1);
208
- }
209
- }
210
- }
211
-
212
- module.exports = DelegationHandler;