@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 +1 -1
- package/skills/simpleapps/{workflow/basecamp.md → basecamp/SKILL.md} +17 -14
- package/skills/simpleapps/fyxer/SKILL.md +120 -6
- package/skills/simpleapps/workflow/SKILL.md +33 -5
- package/skills/simpleapps/.gitkeep +0 -0
- package/skills/simpleapps/fyxer/basecamp-index.md +0 -110
- package/skills/simpleapps/fyxer/basecamp.md +0 -91
- package/skills/simpleapps/workflow/github.md +0 -34
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
##
|
|
87
|
+
## Posting to Basecamp
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
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,
|
|
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
|
-
|
|
30
|
+
Load `simpleapps:basecamp` for Basecamp MCP tools and Chrome fallback. Load `simpleapps:github` for `gh` CLI usage and org conventions.
|
|
31
31
|
|
|
32
|
-
|
|
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
|
|
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
|