@simpleapps-com/augur-skills 0.0.20 → 0.0.21

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": "@simpleapps-com/augur-skills",
3
- "version": "0.0.20",
3
+ "version": "0.0.21",
4
4
  "description": "Install curated Claude Code skills",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,6 +1,11 @@
1
- # Basecamp 2 Reference
1
+ ---
2
+ name: basecamp
3
+ description: Basecamp 2 integration via MCP. Covers MCP tool reference, URL parsing, authentication, Chrome fallback, attachments, and site-info documents. Use when reading or writing Basecamp data.
4
+ ---
2
5
 
3
- IMPORTANT: YOU MUST NOT create, edit, or delete anything in Basecamp without user permission.
6
+ # Basecamp 2
7
+
8
+ IMPORTANT: MUST NOT create, edit, or delete anything in Basecamp without user permission.
4
9
 
5
10
  **Content format**: All write tools SHOULD use plain text with line breaks, NOT HTML. Basecamp returns HTML in responses but prefers plain text for creation.
6
11
 
@@ -14,7 +19,7 @@ uv run basecamp-auth
14
19
 
15
20
  This opens the browser for OAuth, user clicks "Allow", credentials are saved automatically.
16
21
 
17
- ## MCP Tools (Preferred)
22
+ ## MCP Tools
18
23
 
19
24
  The `basecamp` MCP server is bundled with this plugin and starts automatically. API reference: https://github.com/basecamp/bcx-api
20
25
 
@@ -143,7 +148,11 @@ Note: Messages may not be available on all Basecamp plans.
143
148
 
144
149
  **Note**: The BCX API does not have a search endpoint. To find content, use `list_topics(project_id)` to browse, or `list_messages(project_id)` for messages. For cross-project browsing, use `list_topics()` (no project_id) to get recent topics across all projects.
145
150
 
146
- **Extracting IDs from Basecamp URLs**: A URL like `https://basecamp.com/2805226/projects/18932786/todos/514631271` gives you project_id=`18932786` and todo_id=`514631271`.
151
+ ## URL Parsing
152
+
153
+ A URL like `https://basecamp.com/2805226/projects/18932786/todos/514631271` gives you project_id=`18932786` and todo_id=`514631271`.
154
+
155
+ **Base URL**: `https://basecamp.com/2805226`
147
156
 
148
157
  ## Downloading Attachments
149
158
 
@@ -156,6 +165,10 @@ Attachments can be on todos, comments, messages, or uploads. To retrieve them:
156
165
 
157
166
  To browse all attachments in a project, use `list_attachments(project_id)`.
158
167
 
168
+ ## Site Info Documents
169
+
170
+ Each Basecamp project SHOULD have a **site-info** text document in its Documents section. It contains site-specific details like siteId and domain name needed for GitHub issues and development work. Use `list_documents` + `get_document` to find it. If no site-info document exists, ask the user to create one.
171
+
159
172
  ## Chrome Fallback
160
173
 
161
174
  If the MCP server is unavailable (credentials expired, server not running), use Chrome:
@@ -165,8 +178,6 @@ If the MCP server is unavailable (credentials expired, server not running), use
165
178
  3. Navigate to the Basecamp page
166
179
  4. Use `get_page_text` to extract content
167
180
 
168
- **Base URL**: `https://basecamp.com/2805226`
169
-
170
181
  **Top nav**: Projects | Calendar | Everything | Progress | Everyone | **Me**
171
182
 
172
183
  | Page | Path |
@@ -182,14 +193,6 @@ If the MCP server is unavailable (credentials expired, server not running), use
182
193
 
183
194
  **JSON API via Chrome**: Navigate to `/api/v1/projects/<project_id>/todos/<todo_id>.json` then use `get_page_text`. WebFetch will NOT work — Chrome carries session cookies.
184
195
 
185
- ## Fyxer Meeting Transcripts
186
-
187
- To post Fyxer meeting recordings as Basecamp Discussions, see the `simpleapps:fyxer` skill. It handles extraction, local caching, duplicate detection, and posting via `create_message`.
188
-
189
- ## Site Info Documents
190
-
191
- Each Basecamp project SHOULD have a **site-info** text document in its Documents section. It contains site-specific details like siteId and domain name needed for GitHub issues and development work. Use `list_documents` + `get_document` to find it. If no site-info document exists, ask the user to create one.
192
-
193
196
  ## Tips
194
197
 
195
198
  - Cache the user's `person_id` on first visit for the session
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: fyxer
3
- description: Fyxer AI meeting recording integration. Covers extraction, local caching, and posting to downstream services. Use when processing Fyxer recordings or meeting transcripts.
3
+ description: Fyxer AI meeting recording integration. Covers extraction, local caching, posting to Basecamp, and Fyxer Index management. Use when processing Fyxer recordings or meeting transcripts.
4
4
  ---
5
5
 
6
6
  # Fyxer
7
7
 
8
- Fyxer AI records and summarizes meetings. This skill covers extracting data from Fyxer and routing it to other services.
8
+ Fyxer AI records and summarizes meetings. This skill covers extracting data from Fyxer, posting to Basecamp, and managing the Fyxer Index.
9
9
 
10
10
  ## Fyxer URLs
11
11
 
@@ -28,7 +28,7 @@ All extracted data is cached at `~/.simpleapps/fyxer/<meeting-uuid>/`:
28
28
  ```
29
29
  summary.txt - raw Fyxer summary (from Summary tab)
30
30
  transcript.txt - raw Fyxer transcript (from Transcript tab)
31
- message.txt - assembled output (generated by downstream processes, e.g. basecamp.md)
31
+ message.txt - assembled output (generated by posting process)
32
32
  ```
33
33
 
34
34
  Cache is populated via Chrome extraction (see below) and reused across processes.
@@ -84,11 +84,125 @@ Then write and verify: `pbpaste > target.txt && wc -c target.txt`
84
84
 
85
85
  MUST clean up `~/Downloads/` after copying downloaded files to the cache directory. Fyxer names downloads like `transcript-SA_USCCO.txt`. Repeated downloads append `(1)`, `(2)`, etc.
86
86
 
87
- ## Processes
87
+ ## Posting to Basecamp
88
88
 
89
- - See `basecamp.md` for posting meeting transcripts as Basecamp Discussions
90
- - See `basecamp-index.md` for the Fyxer Index document (duplicate detection, reconciliation)
89
+ Post Fyxer meeting recordings as searchable Discussions in Basecamp projects.
90
+
91
+ **Inputs**: Fyxer recording URL + Basecamp project ID.
92
+
93
+ ### 1. Check for duplicate
94
+
95
+ Extract the meeting UUID from the Fyxer URL. Find the **Fyxer Index** document in the project: `list_documents(project_id)` → scan for title `Fyxer Index`. If found, `get_document(project_id, document_id)` and search content for the meeting UUID. If found, the meeting has already been posted — inform the user and stop.
96
+
97
+ If no Fyxer Index document exists, there are no tracked meetings. Proceed with posting.
98
+
99
+ ### 2. Check local cache
100
+
101
+ If `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt` and `transcript.txt` both exist, skip to step 3. Otherwise, follow the Chrome extraction steps above.
102
+
103
+ ### 3. Build message.txt
104
+
105
+ Parse `summary.txt` for frontmatter fields, extract participants, and combine with the full transcript:
106
+
107
+ ```
108
+ ---
109
+ meeting: SA/ClientName
110
+ date: YYYY-MM-DD
111
+ time: HH:MM-HH:MM
112
+ participants: Person A, Person B, Person C
113
+ topics: Topic One, Topic Two, Topic Three
114
+ fyxer-id: <meeting-uuid>
115
+ ---
116
+
117
+ [contents of transcript.txt]
118
+ ```
119
+
120
+ | Field | Source |
121
+ |-------|--------|
122
+ | meeting | Meeting title from the page header |
123
+ | date | Recording date |
124
+ | time | Recording time range |
125
+ | participants | Participant dropdown (click to reveal names) |
126
+ | topics | Section headings from the Summary |
127
+ | fyxer-id | Meeting UUID from the URL (before the colon) |
128
+
129
+ Save as `~/.simpleapps/fyxer/<meeting-uuid>/message.txt`.
130
+
131
+ ### 4. Post to Basecamp
132
+
133
+ Use `create_message(project_id, subject, content)`:
134
+
135
+ - **Subject**: `Fyxer: YYYY-MM-DD`
136
+ - **Content**: contents of `message.txt`
137
+
138
+ Capture the **message_id** from the response.
139
+
140
+ ### 5. Update Fyxer Index
141
+
142
+ After a successful post, update the Fyxer Index document:
143
+
144
+ 1. If no Fyxer Index document exists, create one: `create_document(project_id, "Fyxer Index", "")`
145
+ 2. Read current content: `get_document(project_id, document_id)`
146
+ 3. Prepend a new line (newest first): `<meeting-uuid> | <date> | <message-id> | <subject>`
147
+ 4. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
148
+
149
+ If the index update fails after a successful post, warn the user. The message is posted but the index is stale. Run reconciliation later.
150
+
151
+ ### Format rules
152
+
153
+ - **Plain text only** — Basecamp prefers plain text over HTML
154
+ - **YAML frontmatter** — machine-parseable so other Claude Code instances can search and parse meeting context
155
+ - **Transcript only in body** — summary and action items belong on relevant Basecamp todos, not in this message
156
+ - **Consistent title** — `Fyxer: YYYY-MM-DD` keeps messages uniform and sortable
157
+
158
+ ## Fyxer Index
159
+
160
+ Each Basecamp project that receives Fyxer meeting transcripts MUST have a **Fyxer Index** document for duplicate detection and meeting history.
161
+
162
+ ### Index format
163
+
164
+ - **Title**: `Fyxer Index`
165
+ - **Location**: Documents section of each Basecamp project
166
+ - **Content**: One line per posted meeting, newest first
167
+
168
+ ```
169
+ <meeting-uuid> | <date> | <message-id> | <subject>
170
+ ```
171
+
172
+ Example:
173
+
174
+ ```
175
+ 52f0cf2b-fdb8-4e95-8b01-2afb6d367c69 | 2026-01-19 | 514789012 | Fyxer: 2026-01-19
176
+ a1b2c3d4-e5f6-7890-abcd-ef1234567890 | 2026-02-10 | 514801234 | Fyxer: 2026-02-10
177
+ ```
178
+
179
+ ### Finding posted transcripts
180
+
181
+ - Check the index: `list_documents(project_id)` → find `Fyxer Index` → `get_document`
182
+ - View a specific transcript: `get_message(project_id, message_id)` using the message_id from the index
183
+ - Browse all messages: `list_messages(project_id)` — Fyxer posts use the title format `Fyxer: YYYY-MM-DD`
184
+
185
+ ### Reconciliation — missing entries
186
+
187
+ The index MAY fall out of sync. To reconcile:
188
+
189
+ 1. `list_messages(project_id)` → filter for `Fyxer:` titles
190
+ 2. For each, `get_message` and extract `fyxer-id` from YAML frontmatter
191
+ 3. Compare against the index — add any missing entries
192
+ 4. Update the index document
193
+
194
+ Run reconciliation when the index is first created in a project with existing Fyxer messages, or when the user suspects the index is incomplete.
195
+
196
+ ### Reconciliation — orphaned entries
197
+
198
+ If an index entry references a deleted message:
199
+
200
+ 1. `get_message(project_id, message_id)` → if 404, remove entry from index
201
+ 2. Update the index document
202
+
203
+ Only run orphan cleanup when explicitly requested by the user.
91
204
 
92
205
  ## Dependencies
93
206
 
207
+ - `simpleapps:basecamp` skill — MCP tools for posting and index management
94
208
  - Chrome browser automation (for extraction when cache is empty)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: workflow
3
- description: How we track and deliver work. Covers the Basecamp-to-GitHub flow for client requests, task tracking, and cross-linking. Use when working on client tasks, creating issues, or checking assignments.
3
+ description: How we track and deliver work. Covers the Basecamp-to-GitHub flow for client requests, task tracking, cross-linking, and issue templates. Use when working on client tasks, creating issues, or checking assignments.
4
4
  ---
5
5
 
6
6
  # Workflow
@@ -27,13 +27,41 @@ Basecamp todos and GitHub issues SHOULD cross-link (many-to-many — one todo MA
27
27
 
28
28
  ## Tooling
29
29
 
30
- The `basecamp` MCP server (bundled with this plugin) provides direct API access to Basecamp 2. Use MCP tools (`get_todo`, `list_my_todos`, `list_documents`, etc.) as the primary method. Chrome browser automation is the fallback if MCP is unavailable.
30
+ Load `simpleapps:basecamp` for Basecamp MCP tools and Chrome fallback. Load `simpleapps:github` for `gh` CLI usage and org conventions.
31
31
 
32
- **First-time setup**: User MUST run `uv run basecamp-auth` once to authorize. Credentials are saved to `~/.simpleapps/basecamp.json`.
32
+ ## Creating Issues from Basecamp Todos
33
+
34
+ Before creating an issue, gather context from Basecamp (see `simpleapps:basecamp` skill for full MCP tool reference):
35
+ 1. Use `get_todo` to read the Basecamp todo and summarize the client request
36
+ 2. Use `list_documents` + `get_document` to find the project's **site-info** document for siteId and domain name. If no site-info document exists, ask the user to create one in Basecamp.
37
+
38
+ See the `simpleapps:github` skill for `gh` CLI usage and org conventions.
39
+
40
+ Issue template for Basecamp-linked issues:
41
+
42
+ ```bash
43
+ gh issue create --repo simpleapps-com/<repo> \
44
+ --title "<brief technical title>" \
45
+ --body "## Basecamp
46
+ <basecamp_todo_url>
47
+
48
+ ## Client
49
+ <client/project name> — <domain> (siteId: <siteId>)
50
+
51
+ ## Summary
52
+ <technical summary of what needs to be done>
53
+
54
+ ## Acceptance Criteria
55
+ - [ ] <criteria from the Basecamp request>"
56
+ ```
57
+
58
+ ## Cross-Linking
59
+
60
+ - Include the Basecamp todo URL in the GitHub issue body (under a `## Basecamp` heading)
61
+ - After creating the issue, provide the GitHub issue URL to the user so they can add it to the Basecamp todo comments
33
62
 
34
63
  ## References
35
64
 
36
- - See `basecamp.md` for MCP tools, Chrome fallback, and Basecamp navigation
37
- - See `github.md` for Basecamp-to-GitHub cross-linking
65
+ - See `simpleapps:basecamp` skill for MCP tools, Chrome fallback, and Basecamp navigation
38
66
  - See `simpleapps:github` skill for GitHub org conventions and `gh` CLI usage
39
67
  - See `simpleapps:fyxer` skill for Fyxer meeting transcript processing and Basecamp posting
File without changes
@@ -1,110 +0,0 @@
1
- # Fyxer Index — Basecamp Document
2
-
3
- Each Basecamp project that receives Fyxer meeting transcripts MUST have a **Fyxer Index** document. This document serves as a fast lookup for duplicate detection and meeting history, accessible to all team members.
4
-
5
- ## Document Format
6
-
7
- - **Title**: `Fyxer Index`
8
- - **Location**: Documents section of each Basecamp project
9
- - **Content**: One line per posted meeting, newest first
10
-
11
- Each line follows this format:
12
-
13
- ```
14
- <meeting-uuid> | <date> | <message-id> | <subject>
15
- ```
16
-
17
- Example:
18
-
19
- ```
20
- 52f0cf2b-fdb8-4e95-8b01-2afb6d367c69 | 2026-01-19 | 514789012 | Fyxer: 2026-01-19
21
- a1b2c3d4-e5f6-7890-abcd-ef1234567890 | 2026-02-10 | 514801234 | Fyxer: 2026-02-10
22
- d9e8f7a6-b5c4-3210-fedc-ba0987654321 | 2026-02-15 | 514823456 | Fyxer: 2026-02-15
23
- ```
24
-
25
- Fields:
26
-
27
- | Field | Source |
28
- |-------|--------|
29
- | meeting-uuid | UUID from Fyxer URL (before the colon) |
30
- | date | Meeting date (YYYY-MM-DD) |
31
- | message-id | Basecamp message ID returned by `create_message` |
32
- | subject | Message subject as posted (e.g., `Fyxer: 2026-02-15`) |
33
-
34
- ## Finding the Index
35
-
36
- ```
37
- list_documents(project_id)
38
- ```
39
-
40
- Scan for a document titled `Fyxer Index`. Use `get_document(project_id, document_id)` to read its contents.
41
-
42
- ## Creating the Index
43
-
44
- If no `Fyxer Index` document exists in the project, create one before posting the first meeting:
45
-
46
- ```
47
- create_document(project_id, "Fyxer Index", "")
48
- ```
49
-
50
- This creates an empty document. The first meeting entry will be appended after posting.
51
-
52
- ## Updating the Index
53
-
54
- After successfully posting a meeting transcript via `create_message`, append a new line to the index:
55
-
56
- 1. Read the current index: `get_document(project_id, document_id)`
57
- 2. Append the new entry to the content (newest first — add to the top)
58
- 3. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
59
-
60
- The `create_message` response includes the message ID needed for the index entry.
61
-
62
- ## Duplicate Check
63
-
64
- Before posting a meeting transcript, check the index:
65
-
66
- 1. Find the Fyxer Index document: `list_documents(project_id)` → scan for `Fyxer Index`
67
- 2. Read it: `get_document(project_id, document_id)`
68
- 3. Search the content for the meeting UUID
69
- 4. If found → the meeting has already been posted. Inform the user and stop.
70
- 5. If not found → safe to proceed with posting.
71
-
72
- If no Fyxer Index document exists, there are no posted meetings in this project. Proceed with posting and create the index.
73
-
74
- ## Reconciliation — Missing Entries
75
-
76
- The index MAY fall out of sync if a meeting was posted without updating the index (e.g., manual posting, index creation after existing meetings). To reconcile:
77
-
78
- 1. List all messages: `list_messages(project_id)`
79
- 2. Filter for messages with `Fyxer:` in the title
80
- 3. For each Fyxer message, call `get_message(project_id, message_id)` and extract the `fyxer-id` from the YAML frontmatter
81
- 4. Compare against the index — add any missing entries
82
- 5. Update the index document with the complete list
83
-
84
- Run reconciliation when:
85
- - The Fyxer Index document is first created in a project that already has Fyxer messages
86
- - The user suspects the index is incomplete
87
- - A duplicate check finds nothing but the user believes a meeting was already posted
88
-
89
- ## Reconciliation — Orphaned Entries
90
-
91
- If an index entry references a message that no longer exists (deleted in Basecamp):
92
-
93
- 1. Attempt `get_message(project_id, message_id)` for the entry
94
- 2. If 404 → the message was deleted. Remove the entry from the index.
95
- 3. Update the index document
96
-
97
- Only run orphan cleanup when explicitly requested by the user. Do not automatically delete index entries.
98
-
99
- ## Updated Posting Process
100
-
101
- The full Fyxer → Basecamp posting process (see `basecamp.md`) now includes index management:
102
-
103
- 1. **Check index** — find Fyxer Index doc, read it, search for meeting UUID
104
- 2. **Check local cache** — if summary.txt and transcript.txt exist, skip extraction
105
- 3. **Extract from Chrome** — if cache is missing (see `SKILL.md`)
106
- 4. **Build message.txt** — frontmatter + transcript
107
- 5. **Post to Basecamp** — `create_message` → capture message_id from response
108
- 6. **Update index** — append new entry to Fyxer Index document (create doc if needed)
109
-
110
- Step 6 is new. If the index update fails after a successful post, warn the user — the message is posted but the index is stale. The user can run reconciliation later to fix it.
@@ -1,91 +0,0 @@
1
- # Fyxer → Basecamp
2
-
3
- Post Fyxer meeting recordings as searchable Discussions in Basecamp projects.
4
-
5
- ## Inputs
6
-
7
- - **Fyxer recording URL**: `https://app.fyxer.com/call-recordings/<meeting-uuid>:<calendar-event-id>`
8
- - **Basecamp project ID**: Target project for the Discussion
9
-
10
- ## Process
11
-
12
- ### 1. Check for duplicate
13
-
14
- Extract the meeting UUID from the Fyxer URL (the part before the colon).
15
-
16
- Find the **Fyxer Index** document in the project: `list_documents(project_id)` → scan for title `Fyxer Index`. If found, `get_document(project_id, document_id)` and search the content for the meeting UUID. If the UUID appears, the meeting has already been posted — inform the user and stop.
17
-
18
- If no Fyxer Index document exists, there are no tracked meetings in this project. Proceed with posting.
19
-
20
- See `basecamp-index.md` for full index format and reconciliation.
21
-
22
- ### 2. Check local cache
23
-
24
- If `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt` and `transcript.txt` both exist, skip to step 3. Otherwise, follow the Chrome extraction steps in `SKILL.md`.
25
-
26
- ### 3. Build message.txt
27
-
28
- Parse `summary.txt` for frontmatter fields, extract participants (see `SKILL.md` participant extraction), and combine with the full transcript from `transcript.txt`:
29
-
30
- ```
31
- ---
32
- meeting: SA/ClientName
33
- date: YYYY-MM-DD
34
- time: HH:MM-HH:MM
35
- participants: Person A, Person B, Person C
36
- topics: Topic One, Topic Two, Topic Three
37
- fyxer-id: <meeting-uuid>
38
- ---
39
-
40
- [contents of transcript.txt]
41
- ```
42
-
43
- Frontmatter field sources:
44
-
45
- | Field | Source |
46
- |-------|--------|
47
- | meeting | Meeting title from the page header |
48
- | date | Recording date |
49
- | time | Recording time range |
50
- | participants | Participant dropdown (click to reveal names) |
51
- | topics | Section headings from the Summary |
52
- | fyxer-id | Meeting UUID from the URL (before the colon) |
53
-
54
- Save as `~/.simpleapps/fyxer/<meeting-uuid>/message.txt`.
55
-
56
- ### 4. Post to Basecamp
57
-
58
- Use `create_message(project_id, subject, content)`:
59
-
60
- - **Subject**: `Fyxer: YYYY-MM-DD`
61
- - **Content**: contents of `message.txt`
62
-
63
- Capture the **message_id** from the response.
64
-
65
- ### 5. Update Fyxer Index
66
-
67
- After a successful post, update the Fyxer Index document:
68
-
69
- 1. If no Fyxer Index document exists, create one: `create_document(project_id, "Fyxer Index", "")`
70
- 2. Read current content: `get_document(project_id, document_id)`
71
- 3. Prepend a new line (newest first): `<meeting-uuid> | <date> | <message-id> | <subject>`
72
- 4. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
73
-
74
- If the index update fails after a successful post, warn the user. The message is posted but the index is stale. Run reconciliation later (see `basecamp-index.md`).
75
-
76
- ## Format Rules
77
-
78
- - **Plain text only** — Basecamp prefers plain text over HTML
79
- - **YAML frontmatter** — machine-parseable so other Claude Code instances can search and parse meeting context
80
- - **Transcript only in body** — summary and action items belong on relevant Basecamp todos, not in this message
81
- - **Consistent title** — `Fyxer: YYYY-MM-DD` keeps messages uniform and sortable
82
-
83
- ## Finding Posted Transcripts
84
-
85
- Check the index: `list_documents(project_id)` → find `Fyxer Index` → `get_document`
86
- View a specific transcript: `get_message(project_id, message_id)` using the message_id from the index
87
- Browse all messages: `list_messages(project_id)` — Fyxer posts use the title format `Fyxer: YYYY-MM-DD`
88
-
89
- ## Dependencies
90
-
91
- - Basecamp MCP (`create_message`, `create_document`, `update_document`, `list_documents`, `get_document` tools) — see `simpleapps:workflow` skill (`basecamp.md`) for full MCP tool reference
@@ -1,34 +0,0 @@
1
- # Basecamp → GitHub Cross-Linking
2
-
3
- When a client request in Basecamp needs development work, create a GitHub issue and cross-link them.
4
-
5
- ## Creating Issues from Basecamp Todos
6
-
7
- Before creating an issue, gather context from Basecamp (see `basecamp.md` for full MCP tool reference):
8
- 1. Use `get_todo` to read the Basecamp todo and summarize the client request
9
- 2. Use `list_documents` + `get_document` to find the project's **site-info** document for siteId and domain name. If no site-info document exists, ask the user to create one in Basecamp.
10
-
11
- See the `simpleapps:github` skill for `gh` CLI usage and org conventions.
12
-
13
- Issue template for Basecamp-linked issues:
14
-
15
- ```bash
16
- gh issue create --repo simpleapps-com/<repo> \
17
- --title "<brief technical title>" \
18
- --body "## Basecamp
19
- <basecamp_todo_url>
20
-
21
- ## Client
22
- <client/project name> — <domain> (siteId: <siteId>)
23
-
24
- ## Summary
25
- <technical summary of what needs to be done>
26
-
27
- ## Acceptance Criteria
28
- - [ ] <criteria from the Basecamp request>"
29
- ```
30
-
31
- ## Cross-Linking
32
-
33
- - Include the Basecamp todo URL in the GitHub issue body (under a `## Basecamp` heading)
34
- - After creating the issue, provide the GitHub issue URL to the user so they can add it to the Basecamp todo comments