@simpleapps-com/augur-skills 2026.4.2 → 2026.4.4

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": "2026.04.2",
3
+ "version": "2026.04.4",
4
4
  "description": "Install curated Claude Code skills",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,128 +29,7 @@ This opens the browser for OAuth, user clicks "Allow", credentials are saved aut
29
29
 
30
30
  The `basecamp` MCP server is bundled with this plugin and starts automatically. API reference: https://github.com/basecamp/bcx-api
31
31
 
32
- ### Projects
33
- | Tool | Description |
34
- |------|-------------|
35
- | `list_projects` | List projects. status: 'active', 'drafts', or 'archived' |
36
- | `get_project` | Get project details by project_id |
37
- | `create_project` | Create a new project (name, description) |
38
- | `update_project` | Update project name/description |
39
- | `archive_project` | Archive or unarchive a project (archive=False to reactivate) |
40
- | `delete_project` | Delete a project permanently |
41
-
42
- ### People
43
- | Tool | Description |
44
- |------|-------------|
45
- | `list_people` | List all people on the account |
46
- | `get_person` | Get person details by person_id |
47
- | `get_me` | Get the authenticated user's profile |
48
- | `list_person_projects` | List projects accessible to a person |
49
- | `delete_person` | Remove a person from the account (admin only) |
50
-
51
- ### Todos
52
- | Tool | Description |
53
- |------|-------------|
54
- | `get_todo` | Get a single todo with comments and attachments (project_id, todo_id) |
55
- | `list_todos` | List todos in a project. status: 'remaining', 'completed', or 'all' |
56
- | `list_todos_due_since` | List todos due after a date (YYYY-MM-DD) |
57
- | `list_my_todos` | List all open todos assigned to the current user (paginated) |
58
- | `list_assigned_todos` | List open todos assigned to any person_id |
59
- | `create_todo` | Create a todo in a todo list (project_id, todolist_id, content, assignee_id, due_date) |
60
- | `update_todo` | Update a todo's content, due date, or assignee |
61
- | `assign_todo` | Reassign a todo to a different person_id |
62
- | `close_todo` | Mark a todo as completed/closed |
63
- | `reopen_todo` | Reopen a completed todo |
64
- | `delete_todo` | Delete a todo permanently |
65
-
66
- ### Comments
67
- | Tool | Description |
68
- |------|-------------|
69
- | `create_comment` | Add a comment to a todo (plain text) |
70
- | `delete_comment` | Delete a comment permanently |
71
-
72
- ### Todo Lists
73
- | Tool | Description |
74
- |------|-------------|
75
- | `list_todolists` | List active todo lists in a project |
76
- | `list_all_todolists` | List todo lists across all projects. status: 'active', 'completed', or 'trashed' |
77
- | `get_todolist` | Get all todos in a specific todo list |
78
- | `create_todolist` | Create a new todo list (project_id, name, description) |
79
- | `update_todolist` | Update a todo list's name, description, or position |
80
- | `delete_todolist` | Delete a todo list permanently |
81
-
82
- ### Messages
83
- | Tool | Description |
84
- |------|-------------|
85
- | `list_messages` | List messages/discussions in a project (via topics) |
86
- | `get_message` | Get a message with comments and attachments |
87
- | `create_message` | Create a new discussion (project_id, subject, content) |
88
- | `update_message` | Update a message's subject/content |
89
- | `delete_message` | Delete a message permanently |
90
-
91
- Note: Messages may not be available on all Basecamp plans.
92
-
93
- ### Documents
94
- | Tool | Description |
95
- |------|-------------|
96
- | `list_documents` | List documents. project_id=0 for all projects |
97
- | `get_document` | Get a single document (e.g., site-info) |
98
- | `create_document` | Create a new document (title, content) |
99
- | `update_document` | Update a document's title/content |
100
- | `delete_document` | Delete a document permanently |
101
-
102
- ### Calendar Events
103
- | Tool | Description |
104
- |------|-------------|
105
- | `list_calendars` | List all calendars |
106
- | `list_calendar_events` | List events. Filter by project_id, start_date, end_date, past |
107
- | `get_calendar_event` | Get a specific calendar event |
108
- | `create_calendar_event` | Create an event (summary, starts_at, description, all_day, ends_at, remind_at) |
109
- | `update_calendar_event` | Update an event's fields |
110
- | `delete_calendar_event` | Delete a calendar event |
111
-
112
- ### Topics
113
- | Tool | Description |
114
- |------|-------------|
115
- | `list_topics` | List topics. project_id=0 for all. archived=True for archived |
116
- | `archive_topic` | Archive a topic |
117
- | `activate_topic` | Reactivate an archived topic |
118
-
119
- ### Attachments & Uploads
120
- | Tool | Description |
121
- |------|-------------|
122
- | `list_attachments` | List attachments. project_id=0 for all (paginated) |
123
- | `get_attachment` | Get attachment metadata and download URL (project_id, attachment_id) |
124
- | `download_attachment` | Download attachment to local file (project_id, attachment_id) |
125
- | `get_upload` | Get an upload with comments |
126
- | `create_upload` | Upload a local file to a project's Files section |
127
- | `delete_upload` | Delete an upload (move to trash) |
128
-
129
- ### Activity
130
- | Tool | Description |
131
- |------|-------------|
132
- | `list_events` | Activity log since a datetime. Filter by project_id or person_id |
133
-
134
- ### Access Management
135
- | Tool | Description |
136
- |------|-------------|
137
- | `list_accesses` | List people with access to a project |
138
- | `grant_access` | Grant team access (comma-separated ids and/or email_addresses) |
139
- | `grant_client_access` | Grant client-level access (comma-separated ids and/or email_addresses) |
140
- | `revoke_access` | Revoke a person's project access |
141
-
142
- ### Stars
143
- | Tool | Description |
144
- |------|-------------|
145
- | `list_stars` | List starred/favorite projects |
146
- | `star_project` | Star (bookmark) a project |
147
- | `unstar_project` | Remove star from a project |
148
-
149
- ### Forwards
150
- | Tool | Description |
151
- |------|-------------|
152
- | `list_forwards` | List email forwards. project_id=0 for all |
153
- | `get_forward` | Get a specific email forward with comments |
32
+ All tools are available as `mcp__plugin_simpleapps_basecamp__*`. The tool names and parameters are self-documenting via the MCP schema — do not hardcode tool signatures. Key tool groups: projects, people, todos, comments, todo lists, messages, documents, calendar events, topics, attachments/uploads, activity, access management, stars, forwards.
154
33
 
155
34
  **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.
156
35
 
@@ -1,215 +1,28 @@
1
1
  ---
2
2
  name: fyxer
3
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
- allowed-tools:
5
- - Read
6
- - Write
7
- - Glob
8
- - Bash
9
- - mcp__plugin_simpleapps_basecamp__*
10
- - mcp__claude-in-chrome__*
11
4
  ---
12
5
 
13
6
  # Fyxer
14
7
 
15
- Fyxer AI records and summarizes meetings. This skill covers extracting data from Fyxer, posting to Basecamp, and managing the Fyxer Index.
8
+ Fyxer AI records and summarizes meetings. Use the `/fyxer` command to process recordings end-to-end.
16
9
 
17
- ## Fyxer URLs
10
+ ## Key Conventions
18
11
 
19
- Recording page: `https://app.fyxer.com/call-recordings/<meeting-uuid>:<calendar-event-id>`
12
+ - **Recording URL**: `https://app.fyxer.com/call-recordings/<meeting-uuid>:<calendar-event-id>`
13
+ - **Cache location**: `~/.simpleapps/fyxer/<meeting-uuid>/` — contains `summary.txt`, `transcript.txt`, `message.txt`
14
+ - **Use only the meeting UUID** (before the colon) for cache folders, duplicate checks, and frontmatter
15
+ - **Fyxer Index**: a `Fyxer Index` document in each Basecamp project for duplicate detection. One line per posted meeting, newest first: `<meeting-uuid> | <date> | <message-id> | <subject>`
16
+ - **Post format**: plain text with YAML frontmatter (meeting, date, time, participants, topics, fyxer-id) followed by the full transcript
17
+ - **Subject format**: `Fyxer: YYYY-MM-DD`
20
18
 
21
- The URL path after `/call-recordings/` contains two parts separated by a colon:
22
- - **Meeting UUID** (before colon): `52f0cf2b-fdb8-4e95-8b01-2afb6d367c69`
23
- - **Calendar event ID** (after colon): `2fg5k3v3hffl91dnuqauc15suk_20260119T190000Z`
24
-
25
- Use only the **meeting UUID** for cache folders, duplicate checks, and frontmatter.
26
-
27
- Each recording has two tabs:
28
- - **Summary** — AI-generated summary with section headings, participants, action items. Has "Copy summary" and "Download PDF" buttons.
29
- - **Transcript** — Speaker-attributed, timestamped full transcript. Has "Copy transcript" and "Download transcript" buttons.
30
-
31
- ## Local Cache
32
-
33
- All extracted data is cached at `~/.simpleapps/fyxer/<meeting-uuid>/`:
34
-
35
- ```
36
- summary.txt - raw Fyxer summary (from Summary tab)
37
- transcript.txt - raw Fyxer transcript (from Transcript tab)
38
- message.txt - assembled output (generated by posting process)
39
- ```
40
-
41
- Cache is populated via Chrome extraction (see below) and reused across processes.
42
-
43
- ## Chrome Extraction
44
-
45
- Only needed when local cache files are missing.
46
-
47
- ### Extract transcript
48
-
49
- Click the **Transcript** tab. Extraction methods (in order of preference):
50
-
51
- 1. **"Download transcript" button** (BEST) — Downloads a `.txt` file to `~/Downloads/`. Complete content, no truncation. Copy to cache dir, then delete the download.
52
- 2. **"Copy transcript" button** + `pbpaste` — Copies to system clipboard. Write to disk: `pbpaste > transcript.txt`. Reliable but requires clipboard access.
53
- 3. **`get_page_text`** — UNRELIABLE. Only captures visible/partial content. Missed most of a 30-minute transcript in testing. DO NOT USE for transcripts.
54
-
55
- Save to `~/.simpleapps/fyxer/<meeting-uuid>/transcript.txt`.
56
-
57
- ### Extract summary
58
-
59
- The Summary tab is the default view. Extraction methods (in order of preference):
60
-
61
- 1. **"Copy summary" button** + `pbpaste` (BEST) — Copies markdown to clipboard. Write to disk: `pbpaste > summary.txt`. Summaries are short (~1,700 chars) so this works well.
62
- 2. **`get_page_text`** — Works for short summaries but mixes in page chrome. Not recommended.
63
-
64
- Save to `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt`.
65
-
66
- ### Extract participants
67
-
68
- Click the **participant count dropdown** (e.g. "3 participants") in the page header to reveal attendee names and emails. Take a screenshot to read them.
69
-
70
- ### Clipboard verification
71
-
72
- To verify clipboard content is complete before writing to disk:
73
-
74
- ```javascript
75
- (async () => {
76
- const text = await navigator.clipboard.readText();
77
- window.__temp = text;
78
- return JSON.stringify({
79
- length: text.length,
80
- first50: text.substring(0, 50),
81
- last100: text.substring(text.length - 100)
82
- });
83
- })()
84
- ```
85
-
86
- Then write and verify: `pbpaste > target.txt && wc -c target.txt`
87
-
88
- **Note**: Do NOT try to read full clipboard content via JS — Chrome MCP truncates JS output at ~1,000 characters. Always use `pbpaste` to write to disk.
89
-
90
- ### Download cleanup
91
-
92
- 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.
93
-
94
- ## Posting to Basecamp
95
-
96
- Post Fyxer meeting recordings as searchable Discussions in Basecamp projects.
97
-
98
- **Inputs**: Fyxer recording URL + Basecamp project ID.
99
-
100
- ### 1. Check for duplicate
101
-
102
- 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.
103
-
104
- If no Fyxer Index document exists, there are no tracked meetings. Proceed with posting.
105
-
106
- ### 2. Check local cache
107
-
108
- If `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt` and `transcript.txt` both exist, skip to step 3. Otherwise, follow the Chrome extraction steps above.
109
-
110
- ### 3. Build message.txt
111
-
112
- Parse `summary.txt` for frontmatter fields, extract participants, and combine with the full transcript:
113
-
114
- ```
115
- ---
116
- meeting: SA/ClientName
117
- date: YYYY-MM-DD
118
- time: HH:MM-HH:MM
119
- participants: Person A, Person B, Person C
120
- topics: Topic One, Topic Two, Topic Three
121
- fyxer-id: <meeting-uuid>
122
- ---
123
-
124
- [contents of transcript.txt]
125
- ```
126
-
127
- | Field | Source |
128
- |-------|--------|
129
- | meeting | Meeting title from the page header |
130
- | date | Recording date |
131
- | time | Recording time range |
132
- | participants | Participant dropdown (click to reveal names) |
133
- | topics | Section headings from the Summary |
134
- | fyxer-id | Meeting UUID from the URL (before the colon) |
135
-
136
- Save as `~/.simpleapps/fyxer/<meeting-uuid>/message.txt`.
137
-
138
- ### 4. Post to Basecamp
139
-
140
- Use `create_message(project_id, subject, content)`:
141
-
142
- - **Subject**: `Fyxer: YYYY-MM-DD`
143
- - **Content**: contents of `message.txt`
144
-
145
- Capture the **message_id** from the response.
146
-
147
- ### 5. Update Fyxer Index
148
-
149
- After a successful post, update the Fyxer Index document:
150
-
151
- 1. If no Fyxer Index document exists, create one: `create_document(project_id, "Fyxer Index", "")`
152
- 2. Read current content: `get_document(project_id, document_id)`
153
- 3. Prepend a new line (newest first): `<meeting-uuid> | <date> | <message-id> | <subject>`
154
- 4. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
155
-
156
- If the index update fails after a successful post, warn the user. The message is posted but the index is stale. Run reconciliation later.
157
-
158
- ### Format rules
159
-
160
- - **Plain text only** — Basecamp prefers plain text over HTML
161
- - **YAML frontmatter** — machine-parseable so other Claude Code instances can search and parse meeting context
162
- - **Transcript only in body** — summary and action items belong on relevant Basecamp todos, not in this message
163
- - **Consistent title** — `Fyxer: YYYY-MM-DD` keeps messages uniform and sortable
164
-
165
- ## Fyxer Index
166
-
167
- Each Basecamp project that receives Fyxer meeting transcripts MUST have a **Fyxer Index** document for duplicate detection and meeting history.
168
-
169
- ### Index format
170
-
171
- - **Title**: `Fyxer Index`
172
- - **Location**: Documents section of each Basecamp project
173
- - **Content**: One line per posted meeting, newest first
174
-
175
- ```
176
- <meeting-uuid> | <date> | <message-id> | <subject>
177
- ```
178
-
179
- Example:
19
+ ## Dependencies
180
20
 
181
- ```
182
- 52f0cf2b-fdb8-4e95-8b01-2afb6d367c69 | 2026-01-19 | 514789012 | Fyxer: 2026-01-19
183
- a1b2c3d4-e5f6-7890-abcd-ef1234567890 | 2026-02-10 | 514801234 | Fyxer: 2026-02-10
184
- ```
21
+ - `simpleapps:basecamp` skill — MCP tools for posting and index management
22
+ - Chrome browser automation for extraction when cache is empty
185
23
 
186
- ### Finding posted transcripts
24
+ ## Finding Posted Transcripts
187
25
 
188
- - Check the index: `list_documents(project_id)` find `Fyxer Index` `get_document`
26
+ - Check the index: `list_documents(project_id)` then find `Fyxer Index` then `get_document`
189
27
  - View a specific transcript: `get_message(project_id, message_id)` using the message_id from the index
190
28
  - Browse all messages: `list_messages(project_id)` — Fyxer posts use the title format `Fyxer: YYYY-MM-DD`
191
-
192
- ### Reconciliation — missing entries
193
-
194
- The index MAY fall out of sync. To reconcile:
195
-
196
- 1. `list_messages(project_id)` → filter for `Fyxer:` titles
197
- 2. For each, `get_message` and extract `fyxer-id` from YAML frontmatter
198
- 3. Compare against the index — add any missing entries
199
- 4. Update the index document
200
-
201
- Run reconciliation when the index is first created in a project with existing Fyxer messages, or when the user suspects the index is incomplete.
202
-
203
- ### Reconciliation — orphaned entries
204
-
205
- If an index entry references a deleted message:
206
-
207
- 1. `get_message(project_id, message_id)` → if 404, remove entry from index
208
- 2. Update the index document
209
-
210
- Only run orphan cleanup when explicitly requested by the user.
211
-
212
- ## Dependencies
213
-
214
- - `simpleapps:basecamp` skill — MCP tools for posting and index management
215
- - Chrome browser automation (for extraction when cache is empty)
@@ -55,23 +55,9 @@ Do not install or configure tools without the user's approval. Flag what's missi
55
55
  - **No tests for changed code** — suggest vitest
56
56
  - **No pre-commit hooks** — suggest lefthook
57
57
 
58
- ## Own every issue
58
+ ## Fix everything, hide nothing
59
59
 
60
- Fix every issue the checks find, regardless of which file it is in or who introduced it. There is no such thing as a "pre-existing issue" context compaction erases your memory of earlier changes, so what looks pre-existing may be something you introduced. Even if you truly did not cause it, the goal is zero issues, not blame assignment. Fix it anyway.
61
-
62
- ## Resolve, never hide
63
-
64
- When a check fails, the solution is ALWAYS to fix the underlying code. NEVER:
65
-
66
- - Disable or weaken a lint rule (`eslint-disable`, rule removal, config changes)
67
- - Skip or delete a failing test (`.skip`, `.only`, deleting the test)
68
- - Silence type errors (`@ts-ignore`, `@ts-expect-error`, `type: any`)
69
- - Suppress warnings, lower coverage thresholds, or modify quality configs
70
- - Add `--no-verify`, `--force`, or flags that bypass checks
71
-
72
- These actions hide problems — they do not fix them. A suppressed error is worse than a visible one because it will be forgotten and compound.
73
-
74
- If a rule or test seems wrong, investigate why it exists before concluding it should change. Rules exist for reasons. If after investigation it genuinely does not apply, explain the reasoning to the user and let them decide — do not unilaterally disable it.
60
+ See work-habits: "Leave it better than you found it" and "Resolve, never hide." Both apply fully to quality checks. Fix every issue regardless of who introduced it. NEVER suppress checks fix the code.
75
61
 
76
62
  When reviewing code, scan for existing suppressions (`eslint-disable`, `@ts-ignore`, `.skip`, `noqa`, `phpcs:ignore`, etc.) and flag every instance to the user. These are hidden technical debt.
77
63
 
@@ -81,12 +67,6 @@ In pnpm workspace projects, the root `pnpm-lock.yaml` and site-level lockfiles M
81
67
 
82
68
  After ANY `pnpm install`, `pnpm update`, or `pnpm add` in a workspace, run `pnpm install` at the repo root to regenerate the root lockfile. Commit both lockfiles together. If you forget, the next deploy will fail.
83
69
 
84
- ## Browser Error Overlays
85
-
86
- When debugging in the browser (Chrome automation), Next.js and other frameworks show a **red error overlay** at the bottom of the page when there are runtime errors. This overlay contains the actual error message, stack trace, and usually the exact file and line number causing the problem.
87
-
88
- MUST click on the error overlay and read the full error before attempting any fix. 95% of the time the answer is right there. Do not ignore it, do not guess at the problem, do not look elsewhere first — read the error overlay. If using Chrome automation tools, click the overlay element to expand it and read the details.
89
-
90
70
  ## Running quality checks
91
71
 
92
72
  Use the `/quality` command to discover and run all configured checks. It handles the full cycle: discover, run, fix, repeat until clean.
@@ -46,9 +46,23 @@ Code that compiles is not code that works. After making changes, verify they act
46
46
 
47
47
  YOU MUST NOT mark work complete without verification. Suggesting `/submit` or `/quality` before verifying the code works is backwards — broken code that passes lint is still broken code. Verify first, then let the user decide next steps.
48
48
 
49
- ## Own every issue you find
49
+ ## Leave it better than you found it
50
50
 
51
- If a check fails or a bug surfaces, fix it. Do not classify issues as "pre-existing" to justify skipping them context compaction erases your memory of changes made earlier in the session, so what looks pre-existing is often something you introduced. Even if you truly did not cause it, the goal is zero issues, not blame assignment. Fix it anyway.
51
+ Every agent interaction should leave the codebase in a better state. If you encounter a broken test, a console error, an error overlay, a lint warning, or any other issue while working fix it. This applies whether or not you caused it and whether or not it is related to your current task.
52
+
53
+ Do not classify issues as "pre-existing" to justify skipping them — context compaction erases your memory of changes made earlier in the session, so what looks pre-existing is often something you introduced. Even if you truly did not cause it, the goal is zero issues, not blame assignment. Fix it anyway. Do not argue with the user about whether an issue is yours to fix. It is.
54
+
55
+ ## Resolve, never hide
56
+
57
+ When a check fails, the solution is ALWAYS to fix the underlying code. NEVER:
58
+
59
+ - Disable or weaken a lint rule (`eslint-disable`, rule removal, config changes)
60
+ - Skip or delete a failing test (`.skip`, `.only`, deleting the test)
61
+ - Silence type errors (`@ts-ignore`, `@ts-expect-error`, `type: any`)
62
+ - Suppress warnings, lower coverage thresholds, or modify quality configs
63
+ - Add `--no-verify`, `--force`, or flags that bypass checks
64
+
65
+ These actions hide problems — they do not fix them. If a rule or test seems wrong, investigate why it exists before concluding it should change. Rules exist for reasons. If after investigation it genuinely does not apply, explain the reasoning to the user and let them decide — do not unilaterally disable it.
52
66
 
53
67
  ## Track progress
54
68