ticlawk 0.1.16-dev.16 → 0.1.16-dev.17

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ticlawk",
3
- "version": "0.1.16-dev.16",
3
+ "version": "0.1.16-dev.17",
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",
@@ -1242,9 +1242,10 @@ export const AGENT_COMMAND_HELP = {
1242
1242
  unless --allow-cross-target is passed deliberately.
1243
1243
  --kind <kind> tags this message via metadata.kind.
1244
1244
  Targets:
1245
- dm:@<user> private message
1246
- #<group> group conversation
1247
- #<group>:<msgid> replies under a top-level message in that group
1245
+ dm:<conversation-id> private message by conversation id
1246
+ dm:@<user> private message by user/agent handle
1247
+ #<group> group conversation by name or id
1248
+ #<group>:<msgid> replies under a top-level message in that group
1248
1249
  --attach <file> uploads a local file and attaches it to the message
1249
1250
  (repeatable; max 10 attachments per message).
1250
1251
  ticlawk message read --target "<target>" [--around <msg-id>] [--before-seq N] [--limit N]
@@ -7,7 +7,8 @@
7
7
  * and forwards to the ticlawk backend using the connector API key.
8
8
  *
9
9
  * Targets are parsed in the daemon (not on the wire to backend) so the
10
- * CLI can speak `#<group>` / `dm:@<user>` / `#<group>:<short-msg-id>`
10
+ * CLI can speak `#<group>` / `dm:<conversation-id>` / `dm:@<user>` /
11
+ * `#<group>:<short-msg-id>`
11
12
  * while backend keeps a flat conversation_id contract.
12
13
  */
13
14
 
@@ -71,18 +71,32 @@ Core concepts:
71
71
  - Quote: context showing which message, briefing, or dashboard the user is responding to.
72
72
  - Task board: the persistent group task list managed through \`ticlawk task list/create/claim/unclaim/update\`.
73
73
  - Claimable task: a task assigned to you or an unclaimed task you are about to execute.
74
- - Dashboard: an owner-facing HTML report for the conversation goal. It is the visual presentation of the key information associated with the level of achievement of the goal, like a report sent to a CEO for review.
75
- - Briefing: an active notification to the owner. It tells the owner what happened, why it matters to the goal, and what owner action is needed, if any.
74
+ - Dashboard: an owner-facing HTML report for the conversation goal. It is the visual presentation of the key information associated with the level of achievement of the goal, like a report sent to a CEO for review. It is published or updated with \`ticlawk dashboard set\` as an \`html_template\` plus optional structured \`data_json\`.
75
+ - Briefing: an active notification to the owner. It tells the owner what happened, why it matters to the goal, and what owner action is needed, if any. It is published with \`ticlawk briefing publish --text "..."\`, optionally with one image, video, or HTML attachment when visual context matters.
76
76
  `);
77
77
  }
78
78
 
79
79
  function buildStateSurfaceRules() {
80
80
  return promptBlock(`
81
81
  Dashboard and briefing rules:
82
- - Dashboard is a visual report for the level of achievement of the conversation goal.
83
- - Briefing is normally a short owner-facing text update of 140 characters or fewer.
84
- - A briefing may include one image, video, or HTML attachment only when visual context is important to understand the update or make a decision.
85
- - For pretty HTML artifacts, it is recommended to use /vibeshare to generate them. If /vibeshare is not available, install it into your skill directory using the setup instructions at https://vibeshare.page/skill. For ${BRAND_NAME} dashboards and briefing HTML attachments, generate the HTML locally, then publish it through ${BRAND_NAME} dashboard or briefing commands instead of /vibeshare publish.
82
+ - Create the initial dashboard during goal setup, publish it, and explicitly ask the owner whether the dashboard layout, basic style, and decision view are satisfactory.
83
+ - After the owner accepts the initial dashboard direction, treat its layout and basic style as stable. Routine dashboard updates should update content/data inside that design, not redesign the page.
84
+ - Redesign the dashboard layout or basic style only when the goal, success metrics, or main owner focus changes materially; summarize the change and confirm it before replacing the dashboard design.
85
+ - Keep briefings for active owner notifications: milestone reached, important change, blocker, request for owner input/resources/permission/confirmation/decision, or final result.
86
+ - When creating or materially updating a polished HTML artifact for any ${BRAND_NAME} surface, use \`/vibeshare generate\`. If \`/vibeshare\` is not installed or available in your skills, install it first using the setup instructions at https://vibeshare.page/skill.
87
+ - For ${BRAND_NAME} dashboards and briefing HTML attachments, \`/vibeshare\` is the HTML generation path only. Publish the generated dashboard HTML with \`ticlawk dashboard set\`, and publish briefing text/attachments with \`ticlawk briefing publish\`; do not use \`/vibeshare publish\` for these ${BRAND_NAME} surfaces.
88
+ `);
89
+ }
90
+
91
+ function buildGoalSetupRules() {
92
+ return promptBlock(`
93
+ Goal setup when no chartered goal exists:
94
+ - Do not turn every one-off request into a durable goal. Answer direct asks normally unless the owner expresses a lasting aspiration, ongoing objective, tracking need, reminder cadence, multi-step roadmap, or resource/coordinator need.
95
+ - When durable intent is visible and no suitable chartered goal exists, propose making it a conversation goal. Clarify whether it belongs in the current DM, an existing group/workstream, or a new workstream before writing state.
96
+ - Clarify only the details needed to proceed: goal definition, success/completion criteria, time range, constraints/boundaries, rough approach or roadmap, the agent's deliverables, owner responsibilities, required files/repos/accounts/credentials/budget/resources, dashboard decision view and metrics, and briefing triggers/cadence.
97
+ - Before setting a charter, summarize the proposed short charter and ask for confirmation. Keep charters to the local goal, roles, success criteria, and boundaries; do not put shared workflow law, dashboard state, task status, or long playbooks in the charter.
98
+ - After confirmation, write the charter if you have scope authority. Then create and publish the initial dashboard as part of goal setup, push it to the owner for review, and ask whether the layout/style/decision view are satisfactory. Create reminders/resources only when useful, and seed group tasks only in group/workstream scope. Then enter the normal goal loop.
99
+ - Treat goal setup as revisable. If the owner changes the goal, metrics, cadence, scope, or boundaries later, summarize the change, confirm if it materially changes the agreement, then update the charter and related surfaces.
86
100
  `);
87
101
  }
88
102
 
@@ -91,6 +105,7 @@ function buildGoalLoopOverlay() {
91
105
  Goal authority overlay: responsible for this conversation's goal and tasks
92
106
  - You are responsible for driving the conversation toward its goal, not only replying to isolated messages.
93
107
  - Maintain or infer the current goal from the direct ask, charter, dashboard/briefing quote, task board, and conversation context.
108
+ ${buildGoalSetupRules()}
94
109
  - Run the goal loop:
95
110
  1. Evaluate current facts against the goal.
96
111
  2. Identify the concrete gap, if any.
@@ -37,7 +37,7 @@ private activity text; it is not sent to users or groups.
37
37
  ## Per-Turn Routine
38
38
 
39
39
  1. Read \`MEMORY.md\` in your cwd, then only the files/context needed for
40
- the current turn.
40
+ the current turn. Follow linked notes only when they are relevant.
41
41
  2. If there is no concrete inbound message or reminder to handle, stop.
42
42
  3. If the message includes \`[charter]\`, treat it as the local
43
43
  conversation goal and role spec.
@@ -56,6 +56,12 @@ private activity text; it is not sent to users or groups.
56
56
  - \`ticlawk charter get/set\`: inspect or update the current conversation's
57
57
  goal and role spec. DM agents may write their DM charter; group charter
58
58
  writes require admin/owner role.
59
+ - \`ticlawk dashboard set/get\`: publish or read owner-facing HTML
60
+ dashboards. \`set\` reads JSON from stdin: \`{ html_template, data_json }\`.
61
+ Allowed from DMs, or from groups where this agent is admin/owner.
62
+ - \`ticlawk briefing publish/get\`: publish or read owner-facing briefings.
63
+ Use \`publish --text "..."\` with an optional \`--attach <image|video|html>\`.
64
+ Allowed from DMs, or from groups where this agent is admin/owner.
59
65
  - \`ticlawk task list/create/claim/unclaim/update\`: use only as allowed by
60
66
  the goal/task protocol and backend errors.
61
67
  - \`ticlawk reminder schedule/snooze/update/cancel\`: use for future
@@ -105,7 +111,8 @@ private activity text; it is not sent to users or groups.
105
111
 
106
112
  If a new message arrives while you are busy, finish the current step before
107
113
  pivoting unless the new message clearly supersedes the current work. The
108
- daemon will wake or notify you again; you do not need to poll for messages.`;
114
+ daemon wakes agents for new messages and reminders; you do not need to poll.
115
+ When future self-resume is needed, schedule a reminder.`;
109
116
 
110
117
  export function buildStandingPrompt(_ctx = {}) {
111
118
  return promptBlock(`
@@ -105,7 +105,7 @@ ${charter}
105
105
  // `messages.metadata.quote = { kind, ref, snippet }`. We render a
106
106
  // short, prefix-cache-friendly block and tell the agent how to fetch
107
107
  // the full content if needed.
108
- export function buildQuoteBlock(msg) {
108
+ export function buildQuoteBlock(msg, target = '') {
109
109
  const meta = msg.message_metadata || msg.metadata || null;
110
110
  const quote = meta && typeof meta === 'object' ? meta.quote : null;
111
111
  if (!quote || typeof quote !== 'object') return '';
@@ -116,9 +116,9 @@ export function buildQuoteBlock(msg) {
116
116
  const fetchHint = kind === 'briefing'
117
117
  ? `ticlawk briefing get ${ref}`
118
118
  : kind === 'dashboard'
119
- ? `ticlawk dashboard get --target "#${ref}"`
119
+ ? `ticlawk dashboard get --conversation-id ${ref}`
120
120
  : kind === 'message'
121
- ? `ticlawk message read --around ${ref}`
121
+ ? `ticlawk message read --target ${JSON.stringify(target)} --around ${ref}`
122
122
  : '';
123
123
  const snippetLine = snippet ? `\n "${snippet.replace(/"/g, '\\"')}"` : '';
124
124
  const fetchLine = fetchHint ? `\n fetch: ${fetchHint}` : '';
@@ -160,7 +160,7 @@ export function buildInboundWakePrompt(msg) {
160
160
  const target = buildEnvelopeTarget(msg);
161
161
  const groupContext = buildGroupContextBlock(msg);
162
162
  const charterBlock = buildCharterBlock(msg);
163
- const quoteBlock = buildQuoteBlock(msg);
163
+ const quoteBlock = buildQuoteBlock(msg, target);
164
164
  const text = header
165
165
  ? buildWakePromptText({ envelopeHeader: header, target, rawText, groupContext, charterBlock, quoteBlock })
166
166
  : rawText;