ticlawk 0.1.17-dev.2 → 0.1.17-dev.20

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 (46) hide show
  1. package/README.md +26 -59
  2. package/bin/ticlawk.mjs +31 -301
  3. package/package.json +4 -2
  4. package/scripts/publish-dev.sh +77 -0
  5. package/src/adapters/ticlawk/api.mjs +50 -378
  6. package/src/adapters/ticlawk/credentials.mjs +1 -43
  7. package/src/adapters/ticlawk/index.mjs +61 -565
  8. package/src/adapters/ticlawk/wake-client.mjs +1 -1
  9. package/src/cli/agent-commands.mjs +18 -715
  10. package/src/core/adapter-registry.mjs +1 -19
  11. package/src/core/agent-cli-handlers.mjs +18 -556
  12. package/src/core/agent-home.mjs +1 -81
  13. package/src/core/events/worker-events.mjs +36 -32
  14. package/src/core/http.mjs +0 -152
  15. package/src/core/profiles.mjs +0 -1
  16. package/src/core/runtime-contract.mjs +1 -0
  17. package/src/core/runtime-env.mjs +0 -8
  18. package/src/core/runtime-support.mjs +78 -130
  19. package/src/runtimes/_shared/incoming-message-prompt.mjs +232 -0
  20. package/src/runtimes/_shared/runtime-base-instructions.mjs +34 -0
  21. package/src/runtimes/claude-code/index.mjs +48 -21
  22. package/src/runtimes/claude-code/session.mjs +7 -2
  23. package/src/runtimes/codex/index.mjs +64 -116
  24. package/src/runtimes/codex/session.mjs +12 -2
  25. package/src/runtimes/openclaw/index.mjs +30 -17
  26. package/src/runtimes/opencode/index.mjs +64 -42
  27. package/src/runtimes/opencode/session.mjs +14 -14
  28. package/src/runtimes/pi/index.mjs +64 -42
  29. package/src/runtimes/pi/session.mjs +8 -11
  30. package/ticlawk.mjs +32 -5
  31. package/src/runtimes/_shared/agent-handbook.mjs +0 -45
  32. package/src/runtimes/_shared/brand.mjs +0 -2
  33. package/src/runtimes/_shared/goal-step-prompt.mjs +0 -98
  34. package/src/runtimes/_shared/goal-task-protocol.mjs +0 -50
  35. package/src/runtimes/_shared/handbook/BASICS.md +0 -27
  36. package/src/runtimes/_shared/handbook/COLLABORATION.md +0 -37
  37. package/src/runtimes/_shared/handbook/COMMUNICATION.md +0 -55
  38. package/src/runtimes/_shared/handbook/DM_SCOPE.md +0 -13
  39. package/src/runtimes/_shared/handbook/GOAL_AUTHORITY.md +0 -47
  40. package/src/runtimes/_shared/handbook/GOAL_TASK_CORE.md +0 -43
  41. package/src/runtimes/_shared/handbook/GROUP_ADMIN_SCOPE.md +0 -21
  42. package/src/runtimes/_shared/handbook/GROUP_MEMBER_SCOPE.md +0 -15
  43. package/src/runtimes/_shared/handbook/SURFACES.md +0 -41
  44. package/src/runtimes/_shared/handbook/TASK_WORKER.md +0 -14
  45. package/src/runtimes/_shared/standing-prompt.mjs +0 -171
  46. package/src/runtimes/_shared/wake-prompt.mjs +0 -268
package/README.md CHANGED
@@ -13,57 +13,42 @@ from your phone.
13
13
 
14
14
  ## Quickstart — 2 minutes
15
15
 
16
- You need a project directory on this machine where Claude Code (or another
17
- supported runtime) can run, and the Ticlawk app installed on your phone.
16
+ You need a machine with at least one supported runtime installed and the
17
+ Ticlawk app installed on your phone.
18
18
 
19
19
  ```bash
20
20
  # 1. install
21
21
  curl -fsSL https://raw.githubusercontent.com/darthjaja6/ticlawk/main/install.sh | bash
22
22
 
23
23
  # 2. connect this machine to your Ticlawk account by scanning the QR code
24
- cd /path/to/project
25
24
  ticlawk connect
26
25
  ```
27
26
 
28
- `ticlawk connect` auto-detects every supported runtime in that project
29
- directory (Codex, Claude Code, opencode, pi) and lets you pick one inside the
30
- app once pairing completes. Run `ticlawk connect` again from a different
31
- directory when you want to bind a new project.
27
+ `ticlawk connect` authorizes the current machine as a Ticlawk host. After the
28
+ host is connected, create agents in the app by choosing that host and one of
29
+ the runtimes the daemon reports as available.
32
30
 
33
31
  > ⚠️ **Single user, by design.** The connector binds to your Ticlawk account;
34
32
  > agents run with your local user's permissions and can edit files / run
35
- > commands inside the bound `--workdir`. Don't share your connector API key
36
- > and don't connect a workdir you wouldn't trust a shell to touch.
33
+ > commands on that host. Don't share your connector API key and don't connect
34
+ > a host you wouldn't trust a shell to touch.
37
35
 
38
36
  ---
39
37
 
40
- ## Resuming an existing runtime session
38
+ ## Creating Agents
41
39
 
42
- By default each new chat creates a fresh runtime session. To resume an
43
- existing Claude Code or Codex transcript, point at it explicitly:
44
-
45
- | Runtime | Required | Optional resume handle | Where to find it |
46
- |-------------|----------------|------------------------|---------------------------------------------------------------|
47
- | Claude Code | `--workdir` | `--session-id` | filename of `~/.claude/projects/**/*.jsonl` (without `.jsonl`)|
48
- | Codex | `--workdir` | `--session-id` | `payload.id` in the first `session_meta` record of `~/.codex/sessions/**/*.jsonl` |
49
- | OpenClaw | `--agent-id` | none | logical agent name (`main` by default) |
50
- | opencode | `--workdir` | `--session-id` (with `--workdir`) | `.id` from `opencode session list --format json` (run inside the project dir) |
40
+ `ticlawk connect` does not create an agent. It connects a host. The daemon
41
+ then reports runtime health for Codex, Claude Code, opencode, OpenClaw, and pi.
42
+ In the mobile app, tap `+`, choose a connected host, choose an available
43
+ runtime, and create the agent there.
51
44
 
52
45
  [OpenClaw](https://github.com/openclaw/openclaw) is an open-source local-first
53
- agent runtime; skip this row if you don't use it.
54
-
55
- [opencode](https://opencode.ai) is provider-agnostic — it doesn't carry its own
56
- account system. Before connecting through `ticlawk`, install the CLI
57
- (`npm i -g opencode-ai`) and authenticate it once against the LLM provider
58
- you want it to use (`opencode auth login`, then pick Anthropic / OpenAI /
59
- Google / OpenRouter / etc. and paste the corresponding API key). Model
60
- selection lives in opencode's own config (`opencode.json` in the project
61
- root, or user-level config) — `ticlawk` does not pass `--model`.
46
+ agent runtime; skip it if you don't use it.
62
47
 
63
- `ticlawk` spawns opencode and codex with `--dangerously-skip-permissions`-style
64
- flags so chat messages can drive shell commands and file edits in the bound
65
- workdir without further confirmation prompts. Only connect a workdir you
66
- trust to a chat you control.
48
+ [opencode](https://opencode.ai) is provider-agnostic. Before creating an
49
+ opencode-backed agent through Ticlawk, install the CLI (`npm i -g opencode-ai`)
50
+ and authenticate it once against the LLM provider you want it to use
51
+ (`opencode auth login`).
67
52
 
68
53
  ---
69
54
 
@@ -74,11 +59,10 @@ After setup:
74
59
  - Keep `ticlawk` running as a user service. If Linux prints an
75
60
  `Action required` message during install or connect, run the command it
76
61
  shows so the daemon keeps running after logout and reboot.
77
- - Bind to a new project: run `ticlawk connect` from the new directory.
78
- - Resume an existing transcript: add `--session-id` (Claude Code / Codex /
79
- opencode) or `--agent-id` (OpenClaw) to the `connect` call.
80
- - If replies stop because the local runtime session ended, run `connect`
81
- again or reset the session from the app.
62
+ - Connect another host: run `ticlawk connect` on that machine.
63
+ - Create a new agent from the app by choosing a connected host and runtime.
64
+ - If replies stop because the local runtime session ended, reset the agent
65
+ session from the app.
82
66
  - `ticlawk health` is the first thing to check when something feels off.
83
67
 
84
68
  ---
@@ -201,7 +185,6 @@ Usage:
201
185
  ticlawk config
202
186
  ticlawk config get <streaming...|runtimes.claude_code.path|runtimes.codex.path|runtimes.opencode.path|runtimes.pi.path|ticlawk.connector-api-key|ticlawk.api-url|ticlawk.connector-ws-url>
203
187
  ticlawk config set <streaming...|runtimes.claude_code.path|runtimes.codex.path|runtimes.opencode.path|runtimes.pi.path|ticlawk.connector-api-key|ticlawk.api-url|ticlawk.connector-ws-url> <value>
204
- ticlawk auth --code <6-digit-code> [--api-url <url>]
205
188
  ticlawk connect
206
189
  ticlawk profile list
207
190
  ticlawk profile current
@@ -212,35 +195,20 @@ Usage:
212
195
  ticlawk version
213
196
 
214
197
  Agent CLI (run inside an agent runtime; requires TICLAWK_RUNTIME_AGENT_ID):
215
- ticlawk message send --target <t> --phase progress|final # body on stdin
198
+ ticlawk message send --target <t> # body on stdin
216
199
  ticlawk message read --target <t> [opts]
217
200
  ticlawk task claim --message-id <id>
218
201
  ticlawk task update --task-id <id> --status <s>
219
- ticlawk task list [--target <t>] # group admins see the full task board
220
- ticlawk charter get --target <t>
202
+ ticlawk task list [--target <t>]
221
203
  ticlawk group members --target <t>
222
- ticlawk group list
223
- ticlawk agent list
224
- ticlawk dashboard get --conversation-id <id>
225
204
  ticlawk server info [--refresh]
226
205
 
227
206
  Commands:
228
- auth store the ticlawk app pairing code locally
229
- connect connect ticlawk to a local runtime
207
+ connect connect this host to Ticlawk
230
208
  profile list or switch saved local identities
231
209
  message send/read chat messages (agent CLI surface)
232
210
  task claim/update/list tasks (agent CLI surface)
233
- goal report FSM transitions / signal goal changes (agent CLI surface)
234
- approval canonical goal-loop approval request/resolve (agent CLI surface)
235
- charter get/set conversation goal and role spec (agent CLI surface)
236
- group create/list/delete groups, manage charters/members (agent CLI surface)
237
- dashboard set/get conversation dashboards (agent CLI surface)
238
- briefing publish/get owner briefings (agent CLI surface)
239
- agent list/create/delete owned agent slots (agent CLI surface)
240
- service publish/list/call shared services (agent CLI surface)
241
- credential request owner-filled credentials (agent CLI surface)
242
- reminder schedule/list/snooze/cancel reminders (agent CLI surface)
243
- attachment view private chat assets (agent CLI surface)
211
+ group list members of a group conversation (agent CLI surface)
244
212
  server server-info introspection (agent CLI surface)
245
213
  install-daemon install or refresh the background daemon
246
214
  update update the npm package and refresh the daemon
@@ -259,7 +227,6 @@ Config examples:
259
227
 
260
228
  Examples:
261
229
  ticlawk connect
262
- ticlawk auth --code <6-digit-code>
263
230
  ```
264
231
  <!-- usage:end -->
265
232
 
@@ -268,7 +235,7 @@ Examples:
268
235
  ## Security model
269
236
 
270
237
  - **Agents can run code on your machine.** Whatever Claude Code / Codex /
271
- OpenClaw / opencode / pi can do in the bound workdir, the Ticlawk app can
238
+ OpenClaw / opencode / pi can do on the connected host, the Ticlawk app can
272
239
  ask it to do. Treat the chat as you'd treat a shell.
273
240
  - **Single user.** The connector binds to one Ticlawk account. Don't share
274
241
  your connector API key.
package/bin/ticlawk.mjs CHANGED
@@ -18,7 +18,6 @@ import {
18
18
  getActiveProfile,
19
19
  listProfiles,
20
20
  } from '../src/core/profiles.mjs';
21
- import { runAdapterAuth } from '../src/core/adapter-registry.mjs';
22
21
  import { runTiclawkConnect } from '../src/core/ticlawk-control.mjs';
23
22
  import {
24
23
  RUNTIME_DEFINITIONS,
@@ -32,36 +31,12 @@ import {
32
31
  AGENT_COMMAND_HELP,
33
32
  runAttachmentViewCommand,
34
33
  runGroupCreateCommand,
35
- runWorkstreamCharterGetCommand,
36
- runWorkstreamCharterSetCommand,
37
- runWorkstreamCreateCommand,
38
- runWorkstreamDeleteCommand,
39
- runWorkstreamListCommand,
40
- runAgentListCommand,
41
- runAgentCreateCommand,
42
- runAgentDeleteCommand,
43
- runDashboardSetCommand,
44
- runDashboardGetCommand,
45
- runCredentialRequestCommand,
46
- runBriefingPublishCommand,
47
- runBriefingGetCommand,
48
- runServiceCreateCommand,
49
- runServiceUpdateCommand,
50
- runServiceDeleteCommand,
51
- runServiceListCommand,
52
- runServiceInfoCommand,
53
- runServiceCallCommand,
54
34
  runGroupMembersAddCommand,
55
35
  runGroupMembersCommand,
56
36
  runGroupMembersRemoveCommand,
57
37
  runMessageCheckCommand,
58
38
  runMessageReactCommand,
59
39
  runMessageReadCommand,
60
- runGoalChangedCommand,
61
- runGoalReportCommand,
62
- runApprovalRequestCommand,
63
- runApprovalResolveCommand,
64
- runApprovalListCommand,
65
40
  runMessageSearchCommand,
66
41
  runMessageSendCommand,
67
42
  runProfileShowCommand,
@@ -105,7 +80,6 @@ Usage:
105
80
  ticlawk config
106
81
  ticlawk config get <${configKeys}>
107
82
  ticlawk config set <${configKeys}> <value>
108
- ticlawk auth --code <6-digit-code> [--api-url <url>]
109
83
  ticlawk connect
110
84
  ticlawk profile list
111
85
  ticlawk profile current
@@ -116,35 +90,20 @@ Usage:
116
90
  ticlawk version
117
91
 
118
92
  Agent CLI (run inside an agent runtime; requires TICLAWK_RUNTIME_AGENT_ID):
119
- ticlawk message send --target <t> --phase progress|final # body on stdin
93
+ ticlawk message send --target <t> # body on stdin
120
94
  ticlawk message read --target <t> [opts]
121
95
  ticlawk task claim --message-id <id>
122
96
  ticlawk task update --task-id <id> --status <s>
123
- ticlawk task list [--target <t>] # group admins see the full task board
124
- ticlawk charter get --target <t>
97
+ ticlawk task list [--target <t>]
125
98
  ticlawk group members --target <t>
126
- ticlawk group list
127
- ticlawk agent list
128
- ticlawk dashboard get --conversation-id <id>
129
99
  ticlawk server info [--refresh]
130
100
 
131
101
  Commands:
132
- auth store the ticlawk app pairing code locally
133
- connect connect ticlawk to a local runtime
102
+ connect connect this host to Ticlawk
134
103
  profile list or switch saved local identities
135
104
  message send/read chat messages (agent CLI surface)
136
105
  task claim/update/list tasks (agent CLI surface)
137
- goal report FSM transitions / signal goal changes (agent CLI surface)
138
- approval canonical goal-loop approval request/resolve (agent CLI surface)
139
- charter get/set conversation goal and role spec (agent CLI surface)
140
- group create/list/delete groups, manage charters/members (agent CLI surface)
141
- dashboard set/get conversation dashboards (agent CLI surface)
142
- briefing publish/get owner briefings (agent CLI surface)
143
- agent list/create/delete owned agent slots (agent CLI surface)
144
- service publish/list/call shared services (agent CLI surface)
145
- credential request owner-filled credentials (agent CLI surface)
146
- reminder schedule/list/snooze/cancel reminders (agent CLI surface)
147
- attachment view private chat assets (agent CLI surface)
106
+ group list members of a group conversation (agent CLI surface)
148
107
  server server-info introspection (agent CLI surface)
149
108
  install-daemon install or refresh the background daemon
150
109
  update update the npm package and refresh the daemon
@@ -160,30 +119,15 @@ ${getRuntimeConfigExamples()}
160
119
 
161
120
  Examples:
162
121
  ticlawk connect
163
- ticlawk auth --code <6-digit-code>
164
- `;
165
- }
166
-
167
- function getAuthHelp() {
168
- return `ticlawk auth --code <6-digit-code> [--api-url <url>]
169
-
170
- Store the ticlawk app pairing code locally. The daemon picks it up on the
171
- next start and exchanges it for an API key.
172
-
173
- Options:
174
- --code <code> 6-digit setup code from the ticlawk app
175
- --api-url <url> optional ticlawk API base URL override
176
122
  `;
177
123
  }
178
124
 
179
125
  function getConnectHelp() {
180
126
  return `ticlawk connect
181
127
 
182
- Use \`connect\` to connect the selected adapter to a local runtime.
183
- For ticlawk, connect starts the QR pairing flow when no local credential exists.
184
- Run \`ticlawk connect\` from a project directory to auto-detect
185
- Codex, Claude Code, opencode, and pi, then choose the runtime in ticlawk.
186
- No pairing QR code is shown when no local agent harness is detected.
128
+ Use \`connect\` to authorize this machine as a Ticlawk host.
129
+ After the host is connected, create agents from the app by choosing this host
130
+ and one of the detected local runtimes.
187
131
 
188
132
  Examples:
189
133
  ticlawk connect
@@ -200,10 +144,6 @@ function printHelp(helpPath, args = {}) {
200
144
  printUsage();
201
145
  return;
202
146
  }
203
- if (head === 'auth') {
204
- console.log(getAuthHelp());
205
- return;
206
- }
207
147
  if (head === 'connect') {
208
148
  console.log(getConnectHelp());
209
149
  return;
@@ -216,10 +156,6 @@ function printHelp(helpPath, args = {}) {
216
156
  console.log(getInstallDaemonHelp());
217
157
  return;
218
158
  }
219
- if (AGENT_COMMAND_HELP[head]) {
220
- console.log(AGENT_COMMAND_HELP[head]);
221
- return;
222
- }
223
159
  printUsage();
224
160
  }
225
161
 
@@ -284,7 +220,7 @@ function formatSecretConfigValue(configKey, value) {
284
220
  }
285
221
 
286
222
  function buildConnectPayload(args) {
287
- const legacyArgs = [
223
+ const rejectedArgs = [
288
224
  'adapter',
289
225
  'type',
290
226
  'session-id',
@@ -294,21 +230,19 @@ function buildConnectPayload(args) {
294
230
  'agent-id',
295
231
  'runtime-path',
296
232
  'code',
233
+ 'name',
234
+ 'switch-user',
297
235
  ].filter((key) => args[key] !== undefined);
298
236
  const positionalRuntime = args._?.[1];
299
- if (positionalRuntime || legacyArgs.length > 0) {
237
+ if (positionalRuntime || rejectedArgs.length > 0) {
300
238
  const suffix = positionalRuntime ? ` ${positionalRuntime}` : '';
301
239
  console.error(`ticlawk connect${suffix} no longer accepts explicit runtime, adapter, session, or workdir arguments.`);
302
- console.error('Run `ticlawk connect` from the directory you want to offer to local agent harnesses.');
303
- console.error('Ticlawk will detect Codex, Claude Code, opencode, and pi locally, then let you choose in the app.');
240
+ console.error('Run `ticlawk connect` with no runtime arguments to authorize this host.');
241
+ console.error('Create agents from the app after the host is connected.');
304
242
  process.exit(1);
305
243
  }
306
244
  return {
307
245
  adapter: 'ticlawk',
308
- autoRuntime: true,
309
- switchUser: Boolean(args['switch-user']),
310
- workdir: process.cwd(),
311
- ...(args.name ? { name: args.name } : {}),
312
246
  };
313
247
  }
314
248
 
@@ -399,6 +333,24 @@ async function main() {
399
333
  process.exit(1);
400
334
  }
401
335
 
336
+ if (command === 'profile') {
337
+ const sub = args._[1];
338
+ if (args.help || args.h || !sub) {
339
+ console.log(AGENT_COMMAND_HELP.profile);
340
+ return;
341
+ }
342
+ if (sub === 'show') {
343
+ process.exitCode = await runProfileShowCommand(args);
344
+ return;
345
+ }
346
+ if (sub === 'update') {
347
+ process.exitCode = await runProfileUpdateCommand(args);
348
+ return;
349
+ }
350
+ console.error(`unknown profile subcommand: ${sub}`);
351
+ process.exit(1);
352
+ }
353
+
402
354
  if (command === 'reminder') {
403
355
  const sub = args._[1];
404
356
  if (args.help || args.h || !sub) {
@@ -477,187 +429,6 @@ async function main() {
477
429
  process.exit(1);
478
430
  }
479
431
 
480
- if (command === 'goal') {
481
- const sub = args._[1];
482
- if (args.help || args.h || !sub) {
483
- console.log(AGENT_COMMAND_HELP.goal);
484
- return;
485
- }
486
- if (sub === 'report') {
487
- process.exitCode = await runGoalReportCommand(args);
488
- return;
489
- }
490
- if (sub === 'changed') {
491
- process.exitCode = await runGoalChangedCommand(args);
492
- return;
493
- }
494
- console.error(`unknown goal subcommand: ${sub}`);
495
- process.exit(1);
496
- }
497
-
498
- if (command === 'approval') {
499
- const sub = args._[1];
500
- if (args.help || args.h || !sub) {
501
- console.log(AGENT_COMMAND_HELP.approval);
502
- return;
503
- }
504
- if (sub === 'request') {
505
- process.exitCode = await runApprovalRequestCommand(args);
506
- return;
507
- }
508
- if (sub === 'resolve') {
509
- process.exitCode = await runApprovalResolveCommand(args);
510
- return;
511
- }
512
- if (sub === 'list') {
513
- process.exitCode = await runApprovalListCommand(args);
514
- return;
515
- }
516
- console.error(`unknown approval subcommand: ${sub}`);
517
- process.exit(1);
518
- }
519
-
520
- if (command === 'workstream') {
521
- const sub = args._[1];
522
- if (args.help || args.h || !sub) {
523
- console.log(AGENT_COMMAND_HELP.workstream);
524
- return;
525
- }
526
- if (sub === 'create') {
527
- process.exitCode = await runWorkstreamCreateCommand(args);
528
- return;
529
- }
530
- if (sub === 'delete') {
531
- process.exitCode = await runWorkstreamDeleteCommand(args);
532
- return;
533
- }
534
- if (sub === 'list') {
535
- process.exitCode = await runWorkstreamListCommand(args);
536
- return;
537
- }
538
- if (sub === 'charter') {
539
- const op = args._[2];
540
- if (op === 'get') {
541
- process.exitCode = await runWorkstreamCharterGetCommand(args);
542
- return;
543
- }
544
- if (op === 'set') {
545
- process.exitCode = await runWorkstreamCharterSetCommand(args);
546
- return;
547
- }
548
- console.error(`unknown workstream charter op: ${op}`);
549
- process.exit(1);
550
- }
551
- console.error(`unknown workstream subcommand: ${sub}`);
552
- process.exit(1);
553
- }
554
-
555
- if (command === 'agent') {
556
- const sub = args._[1];
557
- if (args.help || args.h || !sub) {
558
- console.log(AGENT_COMMAND_HELP.agent);
559
- return;
560
- }
561
- if (sub === 'list') {
562
- process.exitCode = await runAgentListCommand(args);
563
- return;
564
- }
565
- if (sub === 'create') {
566
- process.exitCode = await runAgentCreateCommand(args);
567
- return;
568
- }
569
- if (sub === 'delete') {
570
- process.exitCode = await runAgentDeleteCommand(args);
571
- return;
572
- }
573
- console.error(`unknown agent subcommand: ${sub}`);
574
- process.exit(1);
575
- }
576
-
577
- if (command === 'service') {
578
- const sub = args._[1];
579
- if (args.help || args.h || !sub) {
580
- console.log(AGENT_COMMAND_HELP.service);
581
- return;
582
- }
583
- if (sub === 'create') { process.exitCode = await runServiceCreateCommand(args); return; }
584
- if (sub === 'update') { process.exitCode = await runServiceUpdateCommand(args); return; }
585
- if (sub === 'delete') { process.exitCode = await runServiceDeleteCommand(args); return; }
586
- if (sub === 'list') { process.exitCode = await runServiceListCommand(args); return; }
587
- if (sub === 'info') { process.exitCode = await runServiceInfoCommand(args); return; }
588
- if (sub === 'call') { process.exitCode = await runServiceCallCommand(args); return; }
589
- console.error(`unknown service subcommand: ${sub}`);
590
- process.exit(1);
591
- }
592
-
593
- if (command === 'briefing') {
594
- const sub = args._[1];
595
- if (args.help || args.h || !sub) {
596
- console.log(AGENT_COMMAND_HELP.briefing);
597
- return;
598
- }
599
- if (sub === 'publish') {
600
- process.exitCode = await runBriefingPublishCommand(args);
601
- return;
602
- }
603
- if (sub === 'get') {
604
- process.exitCode = await runBriefingGetCommand(args);
605
- return;
606
- }
607
- console.error(`unknown briefing subcommand: ${sub}`);
608
- process.exit(1);
609
- }
610
-
611
- if (command === 'credential') {
612
- const sub = args._[1];
613
- if (args.help || args.h || !sub) {
614
- console.log(AGENT_COMMAND_HELP.credential);
615
- return;
616
- }
617
- if (sub === 'request') {
618
- process.exitCode = await runCredentialRequestCommand(args);
619
- return;
620
- }
621
- console.error(`unknown credential subcommand: ${sub}`);
622
- process.exit(1);
623
- }
624
-
625
- if (command === 'dashboard') {
626
- const sub = args._[1];
627
- if (args.help || args.h || !sub) {
628
- console.log(AGENT_COMMAND_HELP.dashboard);
629
- return;
630
- }
631
- if (sub === 'set') {
632
- process.exitCode = await runDashboardSetCommand(args);
633
- return;
634
- }
635
- if (sub === 'get') {
636
- process.exitCode = await runDashboardGetCommand(args);
637
- return;
638
- }
639
- console.error(`unknown dashboard subcommand: ${sub}`);
640
- process.exit(1);
641
- }
642
-
643
- if (command === 'charter') {
644
- const sub = args._[1];
645
- if (args.help || args.h || !sub) {
646
- console.log(AGENT_COMMAND_HELP.charter);
647
- return;
648
- }
649
- if (sub === 'get') {
650
- process.exitCode = await runWorkstreamCharterGetCommand(args);
651
- return;
652
- }
653
- if (sub === 'set') {
654
- process.exitCode = await runWorkstreamCharterSetCommand(args);
655
- return;
656
- }
657
- console.error(`unknown charter subcommand: ${sub}`);
658
- process.exit(1);
659
- }
660
-
661
432
  if (command === 'group') {
662
433
  const sub = args._[1];
663
434
  if (args.help || args.h || !sub) {
@@ -668,27 +439,6 @@ async function main() {
668
439
  process.exitCode = await runGroupCreateCommand(args);
669
440
  return;
670
441
  }
671
- if (sub === 'list') {
672
- process.exitCode = await runWorkstreamListCommand(args);
673
- return;
674
- }
675
- if (sub === 'delete') {
676
- process.exitCode = await runWorkstreamDeleteCommand(args);
677
- return;
678
- }
679
- if (sub === 'charter') {
680
- const op = args._[2];
681
- if (op === 'get') {
682
- process.exitCode = await runWorkstreamCharterGetCommand(args);
683
- return;
684
- }
685
- if (op === 'set') {
686
- process.exitCode = await runWorkstreamCharterSetCommand(args);
687
- return;
688
- }
689
- console.error(`unknown group charter op: ${op}`);
690
- process.exit(1);
691
- }
692
442
  if (sub === 'members') {
693
443
  // Same subcommand handles list / add / remove based on flags.
694
444
  if (args.add) {
@@ -831,14 +581,6 @@ async function main() {
831
581
  console.log('Restart ticlawk for the daemon to use the selected profile.');
832
582
  return;
833
583
  }
834
- if (subcommand === 'show') {
835
- process.exitCode = await runProfileShowCommand(args);
836
- return;
837
- }
838
- if (subcommand === 'update') {
839
- process.exitCode = await runProfileUpdateCommand(args);
840
- return;
841
- }
842
584
  console.error(`unknown profile subcommand: ${subcommand}`);
843
585
  process.exit(1);
844
586
  }
@@ -871,18 +613,6 @@ async function main() {
871
613
  return;
872
614
  }
873
615
 
874
- if (command === 'auth') {
875
- if (args.help || args.h) {
876
- printHelp(['auth'], args);
877
- return;
878
- }
879
- const adapterArgv = rawArgv.slice(1);
880
- const res = await runAdapterAuth('ticlawk', adapterArgv);
881
- printCommandResult(res);
882
- process.exitCode = res.statusCode >= 400 ? 1 : 0;
883
- return;
884
- }
885
-
886
616
  if (command === 'connect') {
887
617
  if (args.help || args.h) {
888
618
  console.log(getConnectHelp());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ticlawk",
3
- "version": "0.1.17-dev.2",
3
+ "version": "0.1.17-dev.20",
4
4
  "description": "Local connector that links agent harnesses (Claude Code, Codex, OpenClaw, opencode, Pi) to the Ticlawk mobile app.",
5
5
  "type": "module",
6
6
  "main": "ticlawk.mjs",
@@ -15,6 +15,7 @@
15
15
  "assets/",
16
16
  "bin/",
17
17
  "scripts/postinstall.mjs",
18
+ "scripts/publish-dev.sh",
18
19
  "src/",
19
20
  "cc-watcher.mjs",
20
21
  "ticlawk.mjs",
@@ -33,7 +34,8 @@
33
34
  "health": "node ./bin/ticlawk.mjs health",
34
35
  "dev": "echo 'Configure ~/.ticlawk/.config, then: npm run start'",
35
36
  "generate:usage-docs": "node scripts/generate-usage-docs.mjs",
36
- "verify:public-package": "bash scripts/verify-ticlawk-public.sh"
37
+ "verify:public-package": "bash scripts/verify-ticlawk-public.sh",
38
+ "publish:dev": "bash scripts/publish-dev.sh"
37
39
  },
38
40
  "repository": {
39
41
  "type": "git",