tododdle-mcp 3.2.2 → 3.2.3
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/.codex-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/compatibility.d.ts +2 -2
- package/dist/compatibility.js +1 -1
- package/package.json +1 -1
- package/skills/tododdle-workflow/SKILL.md +38 -86
- package/skills/tododdle-workflow/references/files.md +31 -0
- package/skills/tododdle-workflow/references/project-work.md +27 -0
- package/skills/tododdle-workflow/references/time-tracking.md +10 -0
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ For every client, `npx` downloads the package to npm's cache. Cloning ToDoddle o
|
|
|
75
75
|
|
|
76
76
|
## Codex Workflow Guidance
|
|
77
77
|
|
|
78
|
-
The MCP server provides capabilities; the optional `tododdle-workflow` skill provides a disciplined operating process for choosing and using them.
|
|
78
|
+
The MCP server provides capabilities; the optional `tododdle-workflow` skill provides a disciplined operating process for choosing and using them. Its small entry file contains the common routing and safety rules. Direct reference links load file handling, project execution, time tracking, and scheduled workflow details only when needed. This keeps the normal prompt smaller without hiding required rules.
|
|
79
79
|
|
|
80
80
|
The npm package includes a Codex plugin containing this skill. Configure the MCP server first using the Codex instructions above, then add the ToDoddle plugin marketplace:
|
|
81
81
|
|
package/dist/compatibility.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export declare const MCP_PACKAGE_VERSION = "3.2.
|
|
1
|
+
export declare const MCP_PACKAGE_VERSION = "3.2.3";
|
|
2
2
|
export declare const MCP_COMPATIBILITY_LEVEL = 3;
|
|
3
3
|
export declare const MCP_VERSION_HEADER = "x-tododdle-mcp-version";
|
|
4
4
|
export declare const MCP_COMPATIBILITY_HEADER = "x-tododdle-mcp-compatibility";
|
|
5
5
|
export declare const MCP_REQUEST_HEADERS: {
|
|
6
|
-
readonly "x-tododdle-mcp-version": "3.2.
|
|
6
|
+
readonly "x-tododdle-mcp-version": "3.2.3";
|
|
7
7
|
readonly "x-tododdle-mcp-compatibility": string;
|
|
8
8
|
};
|
|
9
9
|
export declare function formatMcpUpdateRequiredMessage(message: string, details: unknown): string;
|
package/dist/compatibility.js
CHANGED
package/package.json
CHANGED
|
@@ -5,106 +5,58 @@ description: Use ToDoddle as the work ledger for project boards, lanes, tickets,
|
|
|
5
5
|
|
|
6
6
|
# ToDoddle Workflow
|
|
7
7
|
|
|
8
|
-
Use the `tododdle` MCP tools for live project state. Make the fewest calls needed
|
|
8
|
+
Use the `tododdle` MCP tools for live project state. Make the fewest calls needed.
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Route the Request
|
|
11
11
|
|
|
12
|
-
Reuse
|
|
12
|
+
Reuse verified IDs from the current conversation or its compaction summary. The API keeps `planId`, `sectionId`, and `taskId` for board, lane, and ticket IDs. Never invent or rediscover a stable ID.
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
- **Unknown project:** Call `list_projects` once. Skip it when the project is clear.
|
|
15
|
+
- **Simple lookup:** Use the narrowest read tool. Prefer compact, bounded lists. Use `get_ticket` for one ticket and `get_tickets` for 1–20 known tickets. Do not request full list detail unless it is necessary.
|
|
16
|
+
- **Batch read:** Select tickets from a bounded list, then call `get_tickets`. Keep `commentMode: none` unless comments matter. Use `latest_update` for a handoff. Use `all` only for full history.
|
|
17
|
+
- **Substantial work:** Read `get_project_brief` and `get_project_context` once for the workstream. Find the existing ticket and relevant artifacts. Reuse this context until it can be stale.
|
|
18
|
+
- **Known mutation:** Refresh only the affected item when current state or `updatedAt` matters. Do not reload unrelated hierarchy.
|
|
19
|
+
- **Continuation:** Reuse stable context. Refresh only volatile status, comments, blockers, claims, and concurrency fields.
|
|
15
20
|
|
|
16
|
-
|
|
17
|
-
- **Simple lookup:** Use the narrowest read tool. Prefer `list_tickets` with its default compact response and known project, board, or lane filters; use `get_ticket` for one ticket, `get_tickets` for 1–20 known ticket IDs, and the default compact `get_work_queue` response for operational, overdue, or unassigned work. Do not request `detail: full` for a list unless the complete list payload is necessary. Do not load the brief or full project context.
|
|
18
|
-
- **Batch ticket reads:** Use `get_tickets` after a bounded list when you need details for several selected tickets. Keep `commentMode` as `none` unless the task needs updates. Use `latest_update` for the latest handoff or status update. Use `all` only when full comment history is necessary. Do not hydrate every ticket from a broad list without a clear need.
|
|
19
|
-
- **Substantial planning or implementation:** Read `get_project_brief` and `get_project_context` once per continuous workstream, then find the existing ticket and supporting artifacts. Reuse that context until the project changes or relevant decisions may have changed.
|
|
20
|
-
- **Known-item mutation:** Refresh only the affected resource when current state or `updatedAt` is required, then perform the requested mutation. Do not reload unrelated hierarchy or project context.
|
|
21
|
-
- **Continuation:** Reuse verified IDs and stable context retained in the conversation or compaction summary. Refresh volatile fields such as status, comments, blockers, and `updatedAt` only when their current value matters.
|
|
21
|
+
Reuse an existing ticket when it covers the request. Create one only for untracked work. Keep list calls bounded and paginate only as far as needed. Do not fan out across all statuses or endpoints unless the user asks for a complete audit.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Before choosing new work or answering an operational “what’s next,” call `get_agent_inbox`. Handle replies, mentions, assignments, and handoffs before unrelated work. Acknowledge an item only after handling it.
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
## Execute Work
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
- Read before creating project structure. Do not duplicate boards or lanes. Use `list_project_members` for assignees; never guess a user ID.
|
|
28
|
+
- Transition the ticket to the active status when substantial work begins.
|
|
29
|
+
- For a known ticket, call `claim_ticket` with a unique run ID. Renew before expiry. Use `WAITING` only for a short pause. Release the claim when work stops, completes, or hands off. Do not claim for simple reads or planning.
|
|
30
|
+
- Respect another active claim. Report its Agent Connection label and wait for release or expiry.
|
|
31
|
+
- Keep ticket kind, parent, lane, assignee, due date, priority, and blockers accurate.
|
|
32
|
+
- Read typed attributes before changes. Use them for durable integration facts, never secrets.
|
|
33
|
+
- Use `preview_ticket_move` before moving between boards. Resolve reported parent, child, and automation effects.
|
|
34
|
+
- Add comments only for decisions, useful progress, verification, blockers, or handoff evidence.
|
|
35
|
+
- Use optimistic concurrency for project, board, lane, Note, and other supported updates. Reload after a conflict.
|
|
36
|
+
- Archive only with explicit approval. Do not use archive as a substitute for completion.
|
|
28
37
|
|
|
29
|
-
|
|
30
|
-
- Create boards for distinct workstreams and lanes for workflow stages. Configure lane entry actions only when the requested workflow is explicit.
|
|
31
|
-
- Use `list_project_members` to select assignees and artifact owners; never guess a user ID.
|
|
32
|
-
- Use `list_project_documents`, Note tools, revisions, and artifact relationships when the work depends on existing supporting context.
|
|
33
|
-
- Use optimistic concurrency for project, board, lane, and Note updates or ordering. Reload after a conflict.
|
|
34
|
-
- Archive projects, boards, lanes, or Notes only with explicit approval. Permanent deletion is unavailable.
|
|
35
|
-
|
|
36
|
-
## Manage Execution
|
|
37
|
-
|
|
38
|
-
- Transition the relevant ticket to the active status when substantive work begins.
|
|
39
|
-
- When choosing from a shared project queue, use `list_available_work` for a human-readable preview or `claim_next_ticket` for atomic selection. When beginning substantive execution on a known ticket, use `claim_ticket` with a stable opaque run ID for the current agent run. Use a unique run ID per claim-next operation, call `renew_ticket_claim` before its lease expires, use `WAITING` while paused for a short dependency or reply, and call `release_ticket` when execution stops, completes, or hands off. Claims identify the authenticated Agent Connection by its configured label and never replace the human assignee. Do not claim tickets for simple reads or planning-only discussion.
|
|
40
|
-
- Treat a conflicting active claim as useful coordination state. Do not take it over until it expires or the owning Agent Connection releases it; report the connection label without assuming which agent vendor or model is behind it.
|
|
41
|
-
- Keep ticket kind, parent, lane, assignee, due date, priority, and blocker relationships accurate when the work changes them.
|
|
42
|
-
- Use typed ticket attributes for durable integration and handoff facts such as `source.repository`, `source.branch`, or `delivery.environment`. Read existing attributes before updates. Do not store credentials, tokens, or other secrets in attributes.
|
|
43
|
-
- Add comments only for durable information: decisions, meaningful progress, validation results, blockers, or handoff context.
|
|
44
|
-
- Use `preview_ticket_move` before moving a ticket between boards. Clear parent or active-child links reported by the preview, and call out any destination automation that changes or archives the ticket.
|
|
45
|
-
- When blocked, set the blocker relationship when a concrete blocking ticket exists and explain the impact in one concise comment.
|
|
46
|
-
- Before selecting new work or answering an operational "what's next" request, read `get_agent_inbox`. Handle unread replies, mentions, assignments, and handoffs before unrelated queue work. Acknowledge an inbox item only after handling it.
|
|
47
|
-
|
|
48
|
-
Do not create bookkeeping churn for tiny exploratory actions. Prefer one useful checkpoint over a stream of narration.
|
|
49
|
-
|
|
50
|
-
## Schedule Recurring Checks
|
|
51
|
-
|
|
52
|
-
When a user asks to schedule ToDoddle work, read [scheduled-workflows.md](references/scheduled-workflows.md). Use its ready-to-create recipes and safety rules.
|
|
53
|
-
|
|
54
|
-
- Create a schedule only after the user chooses a recipe, cadence, timezone, project scope, and allowed mutation level. Installing the plugin must never create or enable a schedule.
|
|
55
|
-
- Test the complete prompt in a normal chat before scheduling it. Review the first runs and narrow the prompt if it reads or changes too much.
|
|
56
|
-
- Default to read and report. Permit comments, ticket creation, or status changes only when the user explicitly selects that mutation level.
|
|
57
|
-
- Keep destructive actions, access changes, billing changes, secrets, and completion without verification outside scheduled work.
|
|
58
|
-
- Do not use a user-side scheduled task for required server operations such as notification delivery, billing reconciliation, webhook retries, or backups. Use the application's durable queue or cron system for those jobs.
|
|
59
|
-
|
|
60
|
-
## Upload Files Safely
|
|
61
|
-
|
|
62
|
-
- Use `upload_project_document` or `attach_file_to_ticket` for approved files.
|
|
63
|
-
- For a remote hosted connection, use `begin_upload`, upload the bytes from the user's device directly to the returned signed URL with the returned headers, and then use `complete_upload`. Use a new idempotency key for each MCP call.
|
|
64
|
-
- Never print, log, or persist the signed upload URL. The hosted gateway must not receive or stage the file bytes.
|
|
65
|
-
- If the client cannot send the direct HTTPS upload, report that remote attachment upload is unavailable. Do not encode the file into MCP arguments.
|
|
66
|
-
- For a pasted or clipboard image, select a configured `TODODDLE_UPLOAD_ROOTS` directory and create a private temporary directory inside it with `mktemp -d`. Save or copy the image attachment into that directory, preserve a suitable image extension, and upload the temporary file path. Do not alter the original clipboard attachment.
|
|
67
|
-
- If a source file is outside `TODODDLE_UPLOAD_ROOTS`, copy it to a temporary staging file inside the dedicated ToDoddle upload directory. Do not move or alter the original.
|
|
68
|
-
- After the upload tool confirms success, delete only the temporary staging file that the agent created. Remove an empty staging directory when it was also created for that upload.
|
|
69
|
-
- Keep the staging file when the upload fails or the result is uncertain so it remains available for retry and diagnosis. Report the retained path without exposing private content.
|
|
70
|
-
- Never delete the user's original source file, a pre-existing file, or any file outside the managed staging location.
|
|
71
|
-
|
|
72
|
-
## Review Attachments Safely
|
|
73
|
-
|
|
74
|
-
- Request a fresh tokenized URL with `get_document_download_url` for each attachment review.
|
|
75
|
-
- Create a private temporary directory with `mktemp -d`, download the asset there without printing, logging, or persisting the URL, and inspect the local file with the appropriate image or document tool.
|
|
76
|
-
- Use a browser only when local download or rendering is unavailable.
|
|
77
|
-
- After successful inspection, delete only the temporary files and directory that the agent created. Never delete an original or pre-existing user file.
|
|
78
|
-
- Never persist an expiring download URL in comments, Context, logs, handoffs, or repository files.
|
|
38
|
+
For detailed project structure and execution rules, read [project-work.md](references/project-work.md).
|
|
79
39
|
|
|
80
40
|
## Finish Work
|
|
81
41
|
|
|
82
|
-
1. Run
|
|
83
|
-
2. Add
|
|
84
|
-
3.
|
|
85
|
-
4. Release the active
|
|
86
|
-
5.
|
|
87
|
-
|
|
88
|
-
When resuming prior work, read `get_agent_inbox`, handle the reply before acknowledging it, then reload the linked ticket or artifact so current status, comments, blockers, ACLs, and concurrency revision drive the next action. Use a new opaque run ID for a new execution attempt and reference the prior handoff rather than rewriting it.
|
|
89
|
-
|
|
90
|
-
Use `archive_ticket` only when the user requests archival and approves the destructive action. Do not substitute archival for completion.
|
|
91
|
-
|
|
92
|
-
## Track Time
|
|
42
|
+
1. Run appropriate verification.
|
|
43
|
+
2. Add one typed `HANDOFF` comment with `## Outcome`, `## Verification`, and `## Remaining` when useful. Include stable links and immutable commit, release, document, or artifact IDs. Never store expiring URLs.
|
|
44
|
+
3. Set the ticket to `COMPLETE` only when the requested result is achieved.
|
|
45
|
+
4. Release the active claim after the durable update.
|
|
46
|
+
5. Keep incomplete work active and state what remains.
|
|
93
47
|
|
|
94
|
-
|
|
48
|
+
When resuming, read the agent inbox, handle the reply, then reload the linked item. Use a new run ID and refer to the prior handoff.
|
|
95
49
|
|
|
96
|
-
|
|
97
|
-
- Use `start_ticket_timer` and `stop_ticket_timer` for live work.
|
|
98
|
-
- Use `log_ticket_time` for known historical intervals.
|
|
99
|
-
- Correct entries with optimistic concurrency.
|
|
100
|
-
- Archive a time entry only with explicit approval.
|
|
50
|
+
## Load Detailed Rules Only When Needed
|
|
101
51
|
|
|
102
|
-
|
|
52
|
+
- **Uploads or attachment review:** Read [files.md](references/files.md).
|
|
53
|
+
- **Time tracking:** Read [time-tracking.md](references/time-tracking.md).
|
|
54
|
+
- **Scheduled checks:** Read [scheduled-workflows.md](references/scheduled-workflows.md).
|
|
103
55
|
|
|
104
|
-
##
|
|
56
|
+
## Missing Access
|
|
105
57
|
|
|
106
|
-
If the MCP server
|
|
58
|
+
If the MCP server, scope, or project grant blocks an operation:
|
|
107
59
|
|
|
108
|
-
1.
|
|
109
|
-
2. Do not
|
|
110
|
-
3. Continue
|
|
60
|
+
1. State the exact missing server, scope, or grant.
|
|
61
|
+
2. Do not claim that the update succeeded.
|
|
62
|
+
3. Continue safe local work when reasonable and list the pending ToDoddle updates.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Files and Attachments
|
|
2
|
+
|
|
3
|
+
Read this file only when uploading or reviewing a ToDoddle file.
|
|
4
|
+
|
|
5
|
+
## Upload a Local File
|
|
6
|
+
|
|
7
|
+
- Use `upload_project_document` or `attach_file_to_ticket` for approved files.
|
|
8
|
+
- For a clipboard image, create a private directory with `mktemp -d` inside a configured `TODODDLE_UPLOAD_ROOTS` directory. Copy the image into it and keep a suitable extension. Do not alter the original.
|
|
9
|
+
- If a source is outside the allowed roots, copy it into the managed staging directory. Never move the original.
|
|
10
|
+
- After confirmed success, delete only the staging file and empty directory that the agent created.
|
|
11
|
+
- If upload fails or is uncertain, keep the staged file for retry and report its path.
|
|
12
|
+
- Never delete the user’s original, a pre-existing file, or a file outside managed staging.
|
|
13
|
+
|
|
14
|
+
## Upload Through Hosted MCP
|
|
15
|
+
|
|
16
|
+
1. Call `begin_upload` with a new idempotency key.
|
|
17
|
+
2. Upload bytes from the user’s device directly to the returned signed URL with its returned headers.
|
|
18
|
+
3. Call `complete_upload` with a new idempotency key.
|
|
19
|
+
|
|
20
|
+
Never print, log, or store the signed URL. The hosted gateway must not receive or stage file bytes. If the client cannot make the direct HTTPS upload, report that remote upload is unavailable. Do not put base64 file data in MCP arguments.
|
|
21
|
+
|
|
22
|
+
## Review an Attachment
|
|
23
|
+
|
|
24
|
+
1. Request a fresh URL with `get_document_download_url`.
|
|
25
|
+
2. Create a private temporary directory with `mktemp -d`.
|
|
26
|
+
3. Download without printing, logging, or storing the URL.
|
|
27
|
+
4. Inspect the local file with the appropriate image or document tool.
|
|
28
|
+
5. Use the browser only when local download or rendering is unavailable.
|
|
29
|
+
6. After successful inspection, delete only the temporary files and directory that the agent created.
|
|
30
|
+
|
|
31
|
+
Never store an expiring URL in comments, Context, logs, handoffs, or repository files. Never delete an original or pre-existing file.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Project Work Details
|
|
2
|
+
|
|
3
|
+
Read this file only when creating project structure or when execution needs these details.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
- Read project, board, and lane state before creating structure.
|
|
8
|
+
- Use boards for distinct workstreams and lanes for workflow stages.
|
|
9
|
+
- Configure lane entry actions only when the workflow is explicit.
|
|
10
|
+
- Use `list_project_members` to select assignees and artifact owners.
|
|
11
|
+
- Use project documents, Notes, revisions, and artifact links when existing context matters.
|
|
12
|
+
- Archive a project, board, lane, or Note only with explicit approval. Permanent deletion is unavailable.
|
|
13
|
+
|
|
14
|
+
## Claims and Coordination
|
|
15
|
+
|
|
16
|
+
- Use `list_available_work` for a readable queue preview or `claim_next_ticket` for atomic selection.
|
|
17
|
+
- Use a stable opaque run ID during one execution attempt. Use a new run ID for each claim-next operation and each later attempt.
|
|
18
|
+
- Claims identify the authenticated Agent Connection. They do not replace the human assignee.
|
|
19
|
+
- A conflicting claim is coordination state. Do not take it over before release or expiry.
|
|
20
|
+
|
|
21
|
+
## Durable State
|
|
22
|
+
|
|
23
|
+
- Keep the ticket’s kind, parent, lane, assignee, due date, priority, blockers, and active-child links accurate.
|
|
24
|
+
- Use typed attributes for facts such as `source.repository`, `source.branch`, and `delivery.environment`.
|
|
25
|
+
- Do not store credentials or tokens in attributes.
|
|
26
|
+
- Set a blocker relationship when a tracked ticket prevents progress. Add one concise comment that explains the effect.
|
|
27
|
+
- Prefer one useful checkpoint over a stream of narration.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Time Tracking
|
|
2
|
+
|
|
3
|
+
Read this file only when the user asks to track time or repository guidance requires it.
|
|
4
|
+
|
|
5
|
+
- Call `get_active_time_entries` before starting a timer when duplicate timing would be confusing.
|
|
6
|
+
- Use `start_ticket_timer` and `stop_ticket_timer` for live work.
|
|
7
|
+
- Use `log_ticket_time` for a known past interval.
|
|
8
|
+
- Update an entry with optimistic concurrency.
|
|
9
|
+
- Archive an entry only with explicit approval.
|
|
10
|
+
- Never invent elapsed time or record a silent estimate.
|