@simpleapps-com/augur-skills 0.0.1 → 0.0.12
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/LICENSE +21 -0
- package/package.json +9 -9
- package/skills/simpleapps/.gitkeep +0 -0
- package/skills/simpleapps/claude-code-docs/SKILL.md +13 -0
- package/skills/simpleapps/conventional-commits/SKILL.md +34 -0
- package/skills/simpleapps/fyxer/SKILL.md +94 -0
- package/skills/simpleapps/fyxer/basecamp-index.md +110 -0
- package/skills/simpleapps/fyxer/basecamp.md +91 -0
- package/skills/simpleapps/github/SKILL.md +45 -0
- package/skills/simpleapps/github/issues-prs.md +89 -0
- package/skills/simpleapps/github/project-structure.md +102 -0
- package/skills/simpleapps/github/wiki-as-context.md +162 -0
- package/skills/simpleapps/work-habits/SKILL.md +45 -0
- package/skills/simpleapps/workflow/SKILL.md +39 -0
- package/skills/simpleapps/workflow/basecamp.md +199 -0
- package/skills/simpleapps/workflow/github.md +34 -0
- package/skills/simpleapps/writing-style/SKILL.md +65 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SimpleApps
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simpleapps-com/augur-skills",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"description": "Install curated Claude Code skills",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -11,13 +11,6 @@
|
|
|
11
11
|
"dist",
|
|
12
12
|
"skills"
|
|
13
13
|
],
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsup",
|
|
16
|
-
"typecheck": "tsc --noEmit",
|
|
17
|
-
"lint": "tsc --noEmit",
|
|
18
|
-
"test": "vitest run",
|
|
19
|
-
"test:coverage": "vitest run --coverage"
|
|
20
|
-
},
|
|
21
14
|
"dependencies": {
|
|
22
15
|
"chalk": "^5.3.0",
|
|
23
16
|
"commander": "^12.0.0",
|
|
@@ -33,5 +26,12 @@
|
|
|
33
26
|
},
|
|
34
27
|
"engines": {
|
|
35
28
|
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"lint": "tsc --noEmit",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:coverage": "vitest run --coverage"
|
|
36
36
|
}
|
|
37
|
-
}
|
|
37
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claude-code-docs
|
|
3
|
+
description: Claude Code documentation reference and discovery. Use when looking up Claude Code features, configuration, plugins, skills, hooks, or troubleshooting.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Claude Code Documentation
|
|
7
|
+
|
|
8
|
+
## Entry Points
|
|
9
|
+
|
|
10
|
+
- **Doc index**: https://code.claude.com/docs/llms.txt — fetch first, find relevant page URL, then fetch that page
|
|
11
|
+
- **Full content**: https://code.claude.com/docs/llms-full.txt — large, use when broad context is needed
|
|
12
|
+
|
|
13
|
+
IMPORTANT: YOU MUST start from `llms.txt` for current URLs. Doc pages are renamed and reorganized with each release — never rely on memorized URLs.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conventional-commits
|
|
3
|
+
description: Format all commit messages per the Conventional Commits v1.0.0 spec. Use when creating commits, reviewing commit messages, or discussing git workflow.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Conventional Commits
|
|
7
|
+
|
|
8
|
+
Spec: https://www.conventionalcommits.org/en/v1.0.0/
|
|
9
|
+
|
|
10
|
+
## Format
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
<type>[optional scope]: <description>
|
|
14
|
+
|
|
15
|
+
[optional body]
|
|
16
|
+
|
|
17
|
+
[optional footer(s)]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Types
|
|
21
|
+
|
|
22
|
+
- `feat` — new feature (SemVer MINOR)
|
|
23
|
+
- `fix` — bug fix (SemVer PATCH)
|
|
24
|
+
- Also permitted: `build`, `chore`, `ci`, `docs`, `style`, `refactor`, `perf`, `test`
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
|
|
28
|
+
- Scope is optional, in parentheses: `feat(parser):`
|
|
29
|
+
- Description MUST immediately follow the colon and space
|
|
30
|
+
- Body is optional, separated by one blank line from description
|
|
31
|
+
- Footers are optional, separated by one blank line from body
|
|
32
|
+
- Breaking changes: add `!` before colon OR use `BREAKING CHANGE:` footer (SemVer MAJOR)
|
|
33
|
+
- `BREAKING CHANGE` MUST be uppercase
|
|
34
|
+
- Footer tokens use hyphens for spaces (e.g., `Acked-by`)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Fyxer
|
|
7
|
+
|
|
8
|
+
Fyxer AI records and summarizes meetings. This skill covers extracting data from Fyxer and routing it to other services.
|
|
9
|
+
|
|
10
|
+
## Fyxer URLs
|
|
11
|
+
|
|
12
|
+
Recording page: `https://app.fyxer.com/call-recordings/<meeting-uuid>:<calendar-event-id>`
|
|
13
|
+
|
|
14
|
+
The URL path after `/call-recordings/` contains two parts separated by a colon:
|
|
15
|
+
- **Meeting UUID** (before colon): `52f0cf2b-fdb8-4e95-8b01-2afb6d367c69`
|
|
16
|
+
- **Calendar event ID** (after colon): `2fg5k3v3hffl91dnuqauc15suk_20260119T190000Z`
|
|
17
|
+
|
|
18
|
+
Use only the **meeting UUID** for cache folders, duplicate checks, and frontmatter.
|
|
19
|
+
|
|
20
|
+
Each recording has two tabs:
|
|
21
|
+
- **Summary** — AI-generated summary with section headings, participants, action items. Has "Copy summary" and "Download PDF" buttons.
|
|
22
|
+
- **Transcript** — Speaker-attributed, timestamped full transcript. Has "Copy transcript" and "Download transcript" buttons.
|
|
23
|
+
|
|
24
|
+
## Local Cache
|
|
25
|
+
|
|
26
|
+
All extracted data is cached at `~/.simpleapps/fyxer/<meeting-uuid>/`:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
summary.txt - raw Fyxer summary (from Summary tab)
|
|
30
|
+
transcript.txt - raw Fyxer transcript (from Transcript tab)
|
|
31
|
+
message.txt - assembled output (generated by downstream processes, e.g. basecamp.md)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Cache is populated via Chrome extraction (see below) and reused across processes.
|
|
35
|
+
|
|
36
|
+
## Chrome Extraction
|
|
37
|
+
|
|
38
|
+
Only needed when local cache files are missing.
|
|
39
|
+
|
|
40
|
+
### Extract transcript
|
|
41
|
+
|
|
42
|
+
Click the **Transcript** tab. Extraction methods (in order of preference):
|
|
43
|
+
|
|
44
|
+
1. **"Download transcript" button** (BEST) — Downloads a `.txt` file to `~/Downloads/`. Complete content, no truncation. Copy to cache dir, then delete the download.
|
|
45
|
+
2. **"Copy transcript" button** + `pbpaste` — Copies to system clipboard. Write to disk: `pbpaste > transcript.txt`. Reliable but requires clipboard access.
|
|
46
|
+
3. **`get_page_text`** — UNRELIABLE. Only captures visible/partial content. Missed most of a 30-minute transcript in testing. DO NOT USE for transcripts.
|
|
47
|
+
|
|
48
|
+
Save to `~/.simpleapps/fyxer/<meeting-uuid>/transcript.txt`.
|
|
49
|
+
|
|
50
|
+
### Extract summary
|
|
51
|
+
|
|
52
|
+
The Summary tab is the default view. Extraction methods (in order of preference):
|
|
53
|
+
|
|
54
|
+
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.
|
|
55
|
+
2. **`get_page_text`** — Works for short summaries but mixes in page chrome. Not recommended.
|
|
56
|
+
|
|
57
|
+
Save to `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt`.
|
|
58
|
+
|
|
59
|
+
### Extract participants
|
|
60
|
+
|
|
61
|
+
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.
|
|
62
|
+
|
|
63
|
+
### Clipboard verification
|
|
64
|
+
|
|
65
|
+
To verify clipboard content is complete before writing to disk:
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
(async () => {
|
|
69
|
+
const text = await navigator.clipboard.readText();
|
|
70
|
+
window.__temp = text;
|
|
71
|
+
return JSON.stringify({
|
|
72
|
+
length: text.length,
|
|
73
|
+
first50: text.substring(0, 50),
|
|
74
|
+
last100: text.substring(text.length - 100)
|
|
75
|
+
});
|
|
76
|
+
})()
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Then write and verify: `pbpaste > target.txt && wc -c target.txt`
|
|
80
|
+
|
|
81
|
+
**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.
|
|
82
|
+
|
|
83
|
+
### Download cleanup
|
|
84
|
+
|
|
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
|
+
|
|
87
|
+
## Processes
|
|
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)
|
|
91
|
+
|
|
92
|
+
## Dependencies
|
|
93
|
+
|
|
94
|
+
- Chrome browser automation (for extraction when cache is empty)
|
|
@@ -0,0 +1,110 @@
|
|
|
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.
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: github
|
|
3
|
+
description: GitHub conventions for SimpleApps. Covers org structure, local project layout, wiki-as-docs workflow, issue creation, PR workflows, and gh CLI usage. Use when creating issues, PRs, setting up repos, or working with GitHub wikis.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GitHub
|
|
7
|
+
|
|
8
|
+
## Organization
|
|
9
|
+
|
|
10
|
+
All SimpleApps repos live under the **`simpleapps-com`** GitHub org.
|
|
11
|
+
|
|
12
|
+
Repository pattern: `simpleapps-com/<repo-name>`
|
|
13
|
+
|
|
14
|
+
## Authentication
|
|
15
|
+
|
|
16
|
+
Use the `gh` CLI for all GitHub operations:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
gh auth status # Check auth status
|
|
20
|
+
gh auth setup-git # Configure gh as git credential helper
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
If `git push` fails with 401/403, run `gh auth setup-git` to fix credentials.
|
|
24
|
+
|
|
25
|
+
## Key Topics
|
|
26
|
+
|
|
27
|
+
- **Wiki as context** — See `wiki-as-context.md` for why the wiki is the source of truth and how to write for both humans and AI agents.
|
|
28
|
+
- **Project structure** — See `project-structure.md` for the `{project}/[repo|wiki]` layout, what goes where, and wiki conventions.
|
|
29
|
+
- **Issues & pull requests** — See `issues-prs.md` for issue templates, PR commands, and cross-linking with Basecamp.
|
|
30
|
+
|
|
31
|
+
## Quick Reference
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Pushing
|
|
35
|
+
gh auth setup-git && git push origin <branch>
|
|
36
|
+
git push origin <tag>
|
|
37
|
+
|
|
38
|
+
# Issues
|
|
39
|
+
gh issue create --repo simpleapps-com/<repo> --title "type: desc" --body "..."
|
|
40
|
+
gh issue list --repo simpleapps-com/<repo>
|
|
41
|
+
|
|
42
|
+
# PRs
|
|
43
|
+
gh pr create --repo simpleapps-com/<repo> --title "title" --body "..."
|
|
44
|
+
gh pr list --repo simpleapps-com/<repo>
|
|
45
|
+
```
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Issues & Pull Requests
|
|
2
|
+
|
|
3
|
+
## Issues
|
|
4
|
+
|
|
5
|
+
### Creating Issues
|
|
6
|
+
|
|
7
|
+
MUST always use `--repo simpleapps-com/<repo>` to target the correct org. MUST ask the user which repo to create the issue in — never assume.
|
|
8
|
+
|
|
9
|
+
### Issue Title
|
|
10
|
+
|
|
11
|
+
- Use conventional commit style: `fix: description`, `feat: description`, `chore: description`
|
|
12
|
+
- SHOULD be a technical description, not the client's words
|
|
13
|
+
- Keep under 70 characters
|
|
14
|
+
|
|
15
|
+
### Issue Body
|
|
16
|
+
|
|
17
|
+
Every issue MUST include these sections:
|
|
18
|
+
|
|
19
|
+
```markdown
|
|
20
|
+
## Problem
|
|
21
|
+
What is broken, missing, or needed? Include error messages, URLs, or screenshots if relevant.
|
|
22
|
+
|
|
23
|
+
## Expected Behavior
|
|
24
|
+
What SHOULD happen instead? Be specific.
|
|
25
|
+
|
|
26
|
+
## Acceptance Criteria
|
|
27
|
+
- [ ] Concrete, testable criteria
|
|
28
|
+
- [ ] Each item is independently verifiable
|
|
29
|
+
|
|
30
|
+
## Context
|
|
31
|
+
Any additional info: related issues, affected files, workarounds, reproduction steps.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
For bug reports, also include:
|
|
35
|
+
- **Steps to Reproduce** — numbered steps to trigger the bug
|
|
36
|
+
- **Current Behavior** — what actually happens (with error messages)
|
|
37
|
+
|
|
38
|
+
### Labels
|
|
39
|
+
|
|
40
|
+
Use labels to categorize: `bug`, `feature`, `enhancement`
|
|
41
|
+
|
|
42
|
+
### Example
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
gh issue create --repo simpleapps-com/<repo> \
|
|
46
|
+
--title "fix: search endpoint returns 404" \
|
|
47
|
+
--body "$(cat <<'ISSUE'
|
|
48
|
+
## Problem
|
|
49
|
+
The `search` MCP tool returns HTTP 404 on every query. This prevents finding content across projects.
|
|
50
|
+
|
|
51
|
+
## Expected Behavior
|
|
52
|
+
Search SHOULD return matching results, consistent with the Basecamp web UI.
|
|
53
|
+
|
|
54
|
+
## Acceptance Criteria
|
|
55
|
+
- [ ] Search returns results for known content
|
|
56
|
+
- [ ] Error handling for empty results
|
|
57
|
+
|
|
58
|
+
## Context
|
|
59
|
+
BCX API may not expose a search endpoint. Web UI search at `/search?q=...` works.
|
|
60
|
+
ISSUE
|
|
61
|
+
)"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Managing Issues
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
gh issue list --repo simpleapps-com/<repo> # List open issues
|
|
68
|
+
gh issue list --repo simpleapps-com/<repo> --state all # Include closed
|
|
69
|
+
gh issue view <number> --repo simpleapps-com/<repo> # View issue details
|
|
70
|
+
gh issue close <number> --repo simpleapps-com/<repo> # Close issue
|
|
71
|
+
gh issue close <number> --repo simpleapps-com/<repo> --comment "message" # Close with comment
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Closing via Commit
|
|
75
|
+
|
|
76
|
+
Include `Closes #N` in the commit message body to auto-close issues when pushed.
|
|
77
|
+
|
|
78
|
+
## Pull Requests
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
gh pr create --repo simpleapps-com/<repo> --title "title" --body "description"
|
|
82
|
+
gh pr list --repo simpleapps-com/<repo>
|
|
83
|
+
gh pr view <number> --repo simpleapps-com/<repo>
|
|
84
|
+
gh pr merge <number> --repo simpleapps-com/<repo>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Cross-Linking with Basecamp
|
|
88
|
+
|
|
89
|
+
When working on client tasks that originate in Basecamp, see the `simpleapps:workflow` skill for the full Basecamp-to-GitHub cross-linking process.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Project Structure & Wiki Workflow
|
|
2
|
+
|
|
3
|
+
## Local Layout
|
|
4
|
+
|
|
5
|
+
Every project MUST use this layout:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
{project}/
|
|
9
|
+
├── repo/ # Main git repo (simpleapps-com/<name>.git)
|
|
10
|
+
└── wiki/ # GitHub wiki repo (simpleapps-com/<name>.wiki.git)
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The parent `{project}/` directory is NOT a git repo — it's a local wrapper that keeps the code repo and wiki side-by-side.
|
|
14
|
+
|
|
15
|
+
## Why This Pattern
|
|
16
|
+
|
|
17
|
+
- GitHub wikis are separate git repos. Cloning them alongside the code keeps everything local and searchable.
|
|
18
|
+
- AI agents (Claude Code) can `Read` wiki files from disk instantly instead of fetching URLs.
|
|
19
|
+
- The wiki becomes the **source of truth for dev docs**. The repo stays focused on product code.
|
|
20
|
+
|
|
21
|
+
## Setting Up a New Project
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
mkdir {project}
|
|
25
|
+
cd {project}
|
|
26
|
+
git clone https://github.com/simpleapps-com/<name>.git repo
|
|
27
|
+
git clone https://github.com/simpleapps-com/<name>.wiki.git wiki
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If the wiki repo doesn't exist yet, create it by adding any page via the GitHub wiki UI first, then clone.
|
|
31
|
+
|
|
32
|
+
## What Goes Where
|
|
33
|
+
|
|
34
|
+
| Content | Location | Examples |
|
|
35
|
+
|---------|----------|---------|
|
|
36
|
+
| Product code | `repo/` | Source, tests, configs, SKILL.md files |
|
|
37
|
+
| Dev documentation | `wiki/` | Architecture, guides, specs, conventions |
|
|
38
|
+
| Repo README | `repo/README.md` | Minimal — quick start + link to wiki |
|
|
39
|
+
| Repo `.claude/rules/` | `repo/` | Minimal summaries referencing wiki pages |
|
|
40
|
+
| Repo `.claude/CLAUDE.md` | `repo/` | Quick reference + wiki links |
|
|
41
|
+
|
|
42
|
+
Rule of thumb: if a `.md` file isn't built into the end product, it belongs in the wiki.
|
|
43
|
+
|
|
44
|
+
## Referencing Wiki from Repo
|
|
45
|
+
|
|
46
|
+
Repo files SHOULD use **relative filesystem paths** to reference wiki content:
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
Full docs: ../../../wiki/Versioning.md
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Relative paths work for Claude Code (local file reads). GitHub URLs require network access and are slower.
|
|
53
|
+
|
|
54
|
+
## Wiki Conventions
|
|
55
|
+
|
|
56
|
+
### Page Naming
|
|
57
|
+
|
|
58
|
+
- Use **PascalCase** with hyphens: `Getting-Started.md`, `Plugin-Structure.md`
|
|
59
|
+
- Match the pattern used in GitHub wiki URLs: `wiki/Page-Name`
|
|
60
|
+
|
|
61
|
+
### _Sidebar.md
|
|
62
|
+
|
|
63
|
+
Every wiki MUST have a `_Sidebar.md` for navigation. Group pages by topic:
|
|
64
|
+
|
|
65
|
+
```markdown
|
|
66
|
+
**[[Home]]**
|
|
67
|
+
|
|
68
|
+
**Getting Started**
|
|
69
|
+
- [[Getting-Started]]
|
|
70
|
+
|
|
71
|
+
**Architecture**
|
|
72
|
+
- [[Architecture]]
|
|
73
|
+
- [[Plugin-Structure]]
|
|
74
|
+
|
|
75
|
+
**Development**
|
|
76
|
+
- [[Development]]
|
|
77
|
+
- [[Versioning]]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Linking
|
|
81
|
+
|
|
82
|
+
- Use `[[Page-Name]]` wiki links for internal links (renders on GitHub wiki)
|
|
83
|
+
- Use `[[Display Text|Page-Name]]` for custom link text
|
|
84
|
+
|
|
85
|
+
### Content Guidelines
|
|
86
|
+
|
|
87
|
+
- Wiki pages are the **full, detailed** version of documentation
|
|
88
|
+
- Each page SHOULD be self-contained — don't assume the reader has seen other pages
|
|
89
|
+
- Include examples, code blocks, and tables where they help
|
|
90
|
+
- Use RFC 2119 keywords (MUST/SHOULD/MAY) for requirements
|
|
91
|
+
|
|
92
|
+
### Committing Wiki Changes
|
|
93
|
+
|
|
94
|
+
The wiki is a regular git repo. Commit and push like any other:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
cd {project}/wiki
|
|
98
|
+
git add -A && git commit -m "docs: add architecture page"
|
|
99
|
+
git push origin master
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Note: GitHub wikis typically use `master` as the default branch, not `main`.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Wiki as Context
|
|
2
|
+
|
|
3
|
+
The GitHub wiki is the **single source of truth** for how a project works. It is not an afterthought or a place to dump notes — it is the primary context that drives development.
|
|
4
|
+
|
|
5
|
+
## The Problem
|
|
6
|
+
|
|
7
|
+
Documentation scattered across a codebase creates friction:
|
|
8
|
+
|
|
9
|
+
- `.claude/rules/` files, README.md, inline comments, and docs/ folders all compete as sources of truth
|
|
10
|
+
- AI agents waste tokens reading large files to find relevant context
|
|
11
|
+
- New team members don't know where to look
|
|
12
|
+
- Docs rot because they live next to code and get forgotten
|
|
13
|
+
|
|
14
|
+
## The Solution
|
|
15
|
+
|
|
16
|
+
The wiki is the **spec**. The repo is the **implementation**.
|
|
17
|
+
|
|
18
|
+
| Wiki | Repo |
|
|
19
|
+
|------|------|
|
|
20
|
+
| Architecture decisions | Code that implements them |
|
|
21
|
+
| API specs | API code |
|
|
22
|
+
| Conventions and standards | Code that follows them |
|
|
23
|
+
| Onboarding guides | Nothing — wiki is self-contained |
|
|
24
|
+
| Release processes | Automation scripts |
|
|
25
|
+
| Full explanations | Minimal pointers back to wiki |
|
|
26
|
+
|
|
27
|
+
## How It Works
|
|
28
|
+
|
|
29
|
+
### 1. Wiki First
|
|
30
|
+
|
|
31
|
+
When starting new work, check the wiki first. If the wiki doesn't cover it, write the wiki page before writing code. The wiki defines *what* and *why*. The code implements *how*.
|
|
32
|
+
|
|
33
|
+
### 2. Repo References Wiki
|
|
34
|
+
|
|
35
|
+
Repo files (`.claude/CLAUDE.md`, `.claude/rules/`, `README.md`) SHOULD be **minimal** — just enough to orient, then point to the wiki for details.
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
# Versioning
|
|
39
|
+
|
|
40
|
+
Full docs: ../../../wiki/Versioning.md
|
|
41
|
+
|
|
42
|
+
`VERSION` file = source of truth. All version fields MUST match.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 3. AI Agents Read Wiki Locally
|
|
46
|
+
|
|
47
|
+
Because the wiki is cloned alongside the repo (see `project-structure.md`), AI agents read wiki pages as local files. No network requests, no URL fetching — just `Read ../../../wiki/Architecture.md`.
|
|
48
|
+
|
|
49
|
+
This means wiki pages are both human documentation AND machine context.
|
|
50
|
+
|
|
51
|
+
### 4. Wiki Evolves with the Project
|
|
52
|
+
|
|
53
|
+
The wiki is not write-once. As the codebase changes:
|
|
54
|
+
|
|
55
|
+
- Update affected wiki pages in the same work session
|
|
56
|
+
- Add new pages when new patterns emerge
|
|
57
|
+
- Remove pages when features are deprecated
|
|
58
|
+
- Keep the `_Sidebar.md` current
|
|
59
|
+
|
|
60
|
+
## Three Audiences
|
|
61
|
+
|
|
62
|
+
Every wiki page serves three audiences simultaneously:
|
|
63
|
+
|
|
64
|
+
| Audience | What they need | How they read |
|
|
65
|
+
|----------|---------------|---------------|
|
|
66
|
+
| **Junior devs** | Explanations of *why*, step-by-step instructions, examples they can copy | Top to bottom, following links for context |
|
|
67
|
+
| **Senior devs** | Quick reference, architecture decisions, conventions to follow | Scan for the section they need, skip the rest |
|
|
68
|
+
| **AI agents** | Unambiguous specs, exact commands, clear requirements (MUST/SHOULD/MAY) | Load the full wiki into context, act on it |
|
|
69
|
+
|
|
70
|
+
### Writing for All Three
|
|
71
|
+
|
|
72
|
+
- **Lead with a summary** — seniors and agents get what they need fast, juniors get orientation
|
|
73
|
+
- **Explain the *why* before the *how*** — juniors learn the reasoning, seniors confirm their assumptions, agents get decision context
|
|
74
|
+
- **Use tables for reference data** — scannable for seniors, parseable for agents, structured for juniors
|
|
75
|
+
- **Use code blocks for anything copy-pasteable** — all three audiences benefit from exact commands
|
|
76
|
+
- **Use RFC 2119 keywords (MUST/SHOULD/MAY)** — removes ambiguity for everyone, especially agents
|
|
77
|
+
- **Include examples** — juniors learn by example, agents use them as patterns
|
|
78
|
+
|
|
79
|
+
### Keep Pages Self-Contained
|
|
80
|
+
|
|
81
|
+
Each page SHOULD make sense on its own. A junior dev landing on any page SHOULD be able to understand it without reading the rest of the wiki.
|
|
82
|
+
|
|
83
|
+
### Follow the Writing Style Skill
|
|
84
|
+
|
|
85
|
+
All wiki content MUST follow the `simpleapps:writing-style` skill:
|
|
86
|
+
|
|
87
|
+
- **RFC 2119 keywords** — MUST/SHOULD/MAY in ALL CAPS for requirements, lowercase for casual suggestions
|
|
88
|
+
- **Token efficiency** — action verbs first, no filler, specific over generic, Bottom Line Up Front
|
|
89
|
+
- **Developer-facing tone** — technical and concise, include file references and acceptance criteria
|
|
90
|
+
- **Expand for onboarding and architecture** — juniors and future devs need the "why"
|
|
91
|
+
- **Cut everywhere else** — two sentences that answer the question beat two pages that fill the context window
|
|
92
|
+
|
|
93
|
+
The wiki is developer-facing documentation. It is NOT client-facing. Write for devs and AI agents, not for non-technical readers.
|
|
94
|
+
|
|
95
|
+
### Link with Anchor Precision
|
|
96
|
+
|
|
97
|
+
When referencing other wiki pages, MUST link directly to the relevant section using `#` anchors — not just the page.
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
# Good — links to exact section
|
|
101
|
+
See [[Versioning#version-bump-procedure]] for the step-by-step process.
|
|
102
|
+
Check [[Architecture#three-layers]] for how marketplace, plugins, and CLI relate.
|
|
103
|
+
|
|
104
|
+
# Bad — links to top of page, reader has to hunt
|
|
105
|
+
See [[Versioning]] for details.
|
|
106
|
+
Check [[Architecture]] for more info.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
This matters for two reasons:
|
|
110
|
+
- **Devs** jump straight to the answer instead of scrolling through a page
|
|
111
|
+
- **AI agents** use anchor links as an attention signal — a `#section` reference tells the agent exactly which part of a page is relevant to the current task, reducing noise in a 20K token wiki
|
|
112
|
+
|
|
113
|
+
### The 20K Token Budget
|
|
114
|
+
|
|
115
|
+
The entire wiki MUST stay under **20K tokens** (~60KB of markdown). This is a hard constraint, not a guideline.
|
|
116
|
+
|
|
117
|
+
Why 20K: with a 200K token context window, the full wiki never exceeds 10% of available context. This means an AI agent can load the **entire wiki** into active context at the start of a session and keep it there throughout. No selective loading, no missed context, no stale references — the agent always has the complete picture.
|
|
118
|
+
|
|
119
|
+
If the wiki approaches the budget:
|
|
120
|
+
- Tighten language — cut filler, use tables over prose
|
|
121
|
+
- Merge overlapping pages
|
|
122
|
+
- Move implementation details back to code comments where they belong
|
|
123
|
+
- Archive obsolete pages (delete, don't hoard)
|
|
124
|
+
|
|
125
|
+
To check the current budget:
|
|
126
|
+
```bash
|
|
127
|
+
wc -c {project}/wiki/*.md
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Rough conversion: 1 token ≈ 3 bytes of markdown. So 20K tokens ≈ 60KB.
|
|
131
|
+
|
|
132
|
+
### Right-Size Each Page
|
|
133
|
+
|
|
134
|
+
- Too short = missing context, agent has to search elsewhere
|
|
135
|
+
- Too long = wasted tokens, buried signal
|
|
136
|
+
- Target: enough to act on without reading anything else
|
|
137
|
+
|
|
138
|
+
## The Feedback Loop
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Wiki defines → Code implements → Learnings update wiki → Repeat
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
When code reveals that the wiki is wrong or incomplete, update the wiki immediately. The wiki MUST reflect reality, not aspirations.
|
|
145
|
+
|
|
146
|
+
## When to Update the Wiki
|
|
147
|
+
|
|
148
|
+
- **New feature** — Write the wiki page first (spec), then implement
|
|
149
|
+
- **Bug fix** — If the fix reveals a gap in documentation, update the wiki
|
|
150
|
+
- **Architecture change** — Update Architecture page before or during the change
|
|
151
|
+
- **New convention** — Add to the relevant wiki page so the team adopts it
|
|
152
|
+
- **Onboarding friction** — If someone asks "where is X?", the answer should be a wiki link. If it's not, create the page.
|
|
153
|
+
|
|
154
|
+
## Anti-Patterns
|
|
155
|
+
|
|
156
|
+
| Don't | Do |
|
|
157
|
+
|-------|-----|
|
|
158
|
+
| Write long README.md files in the repo | Minimal README + wiki link |
|
|
159
|
+
| Duplicate wiki content in `.claude/rules/` | Thin rules that reference wiki |
|
|
160
|
+
| Leave wiki pages stale after code changes | Update wiki in the same session |
|
|
161
|
+
| Use the wiki as a dumping ground for notes | Structure pages with clear purpose |
|
|
162
|
+
| Write wiki pages only humans can understand | Write for both humans and AI agents |
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: work-habits
|
|
3
|
+
description: How to work autonomously on extended tasks. Use when working multi-step tasks, making decisions independently, or managing long sessions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Work Habits
|
|
7
|
+
|
|
8
|
+
## Do exactly what was asked
|
|
9
|
+
|
|
10
|
+
Do not add features, refactor surrounding code, or "improve" beyond the request. One task asked = one task delivered. Ask before expanding scope.
|
|
11
|
+
|
|
12
|
+
## Use the right tool
|
|
13
|
+
|
|
14
|
+
Prefer dedicated tools over Bash equivalents — they are faster, need no permissions, and produce cleaner output:
|
|
15
|
+
- Read not `cat`/`head`/`tail`
|
|
16
|
+
- Grep not `grep`/`rg`
|
|
17
|
+
- Glob not `find`/`ls`
|
|
18
|
+
- Edit not `sed`/`awk`
|
|
19
|
+
|
|
20
|
+
Reserve Bash for commands that have no dedicated tool equivalent.
|
|
21
|
+
|
|
22
|
+
## Protect the context window
|
|
23
|
+
|
|
24
|
+
- Prefer targeted searches over broad exploration
|
|
25
|
+
- Use subagents for verbose operations (test runs, log analysis, large file reads)
|
|
26
|
+
- `/clear` between unrelated tasks
|
|
27
|
+
- Two sentences that answer the question beat two pages that fill the context window
|
|
28
|
+
|
|
29
|
+
## Verify your own work
|
|
30
|
+
|
|
31
|
+
Run tests, check output, compare results. YOU MUST NOT mark work complete without verification. If you can't verify, say so.
|
|
32
|
+
|
|
33
|
+
## Track progress
|
|
34
|
+
|
|
35
|
+
Use TodoRead/TodoWrite on multi-step tasks. Mark items in-progress before starting, completed after verifying.
|
|
36
|
+
|
|
37
|
+
## Know when to stop and ask
|
|
38
|
+
|
|
39
|
+
**Ask** when: requirements are ambiguous, multiple valid approaches exist, an action is destructive or irreversible, you've failed the same approach twice.
|
|
40
|
+
|
|
41
|
+
**Decide** when: the choice is implementation detail, the pattern is established elsewhere in the codebase, the task is clear and scoped.
|
|
42
|
+
|
|
43
|
+
## Recover from mistakes
|
|
44
|
+
|
|
45
|
+
Wrong approach? Stop, revert, try differently. Do not keep layering fixes on a broken foundation. Two failed attempts at the same approach = change strategy.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
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.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Workflow
|
|
7
|
+
|
|
8
|
+
## How Work Flows
|
|
9
|
+
|
|
10
|
+
1. **Client request** arrives in Basecamp (todo, message, or comment)
|
|
11
|
+
2. **Read and summarize** the Basecamp todo to understand the request
|
|
12
|
+
3. **Create a GitHub issue** with technical details for implementation
|
|
13
|
+
4. **Cross-link** — Basecamp todo URL in the GitHub issue body, GitHub issue URL in Basecamp todo comments
|
|
14
|
+
5. **Do the work** in code, referencing the GitHub issue
|
|
15
|
+
6. **Report back** through Basecamp for the client; keep implementation details in GitHub
|
|
16
|
+
|
|
17
|
+
## Tool Boundaries
|
|
18
|
+
|
|
19
|
+
| Tool | Audience | Purpose |
|
|
20
|
+
|------|----------|---------|
|
|
21
|
+
| **Basecamp** | Client-facing | Task requests, status updates, client communication |
|
|
22
|
+
| **GitHub Issues** | Developer-facing | Technical details, implementation, internal findings |
|
|
23
|
+
|
|
24
|
+
Basecamp todos and GitHub issues SHOULD cross-link (many-to-many — one todo MAY relate to multiple issues and vice versa).
|
|
25
|
+
|
|
26
|
+
**Note**: GitHub access is granted on request. If the user does not have repo access, skip steps 3-5 above and use Basecamp only. Do not assume access — check with `gh` or ask the user.
|
|
27
|
+
|
|
28
|
+
## Tooling
|
|
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.
|
|
31
|
+
|
|
32
|
+
**First-time setup**: User MUST run `uv run basecamp-auth` once to authorize. Credentials are saved to `~/.simpleapps/basecamp.json`.
|
|
33
|
+
|
|
34
|
+
## References
|
|
35
|
+
|
|
36
|
+
- See `basecamp.md` for MCP tools, Chrome fallback, and Basecamp navigation
|
|
37
|
+
- See `github.md` for Basecamp-to-GitHub cross-linking
|
|
38
|
+
- See `simpleapps:github` skill for GitHub org conventions and `gh` CLI usage
|
|
39
|
+
- See `simpleapps:fyxer` skill for Fyxer meeting transcript processing and Basecamp posting
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# Basecamp 2 Reference
|
|
2
|
+
|
|
3
|
+
IMPORTANT: YOU MUST NOT create, edit, or delete anything in Basecamp without user permission.
|
|
4
|
+
|
|
5
|
+
**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
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
Credentials stored at `~/.simpleapps/basecamp.json`. If missing, ask the user to run:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv run basecamp-auth
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This opens the browser for OAuth, user clicks "Allow", credentials are saved automatically.
|
|
16
|
+
|
|
17
|
+
## MCP Tools (Preferred)
|
|
18
|
+
|
|
19
|
+
The `basecamp` MCP server is bundled with this plugin and starts automatically. API reference: https://github.com/basecamp/bcx-api
|
|
20
|
+
|
|
21
|
+
### Projects
|
|
22
|
+
| Tool | Description |
|
|
23
|
+
|------|-------------|
|
|
24
|
+
| `list_projects` | List projects. status: 'active', 'drafts', or 'archived' |
|
|
25
|
+
| `get_project` | Get project details by project_id |
|
|
26
|
+
| `create_project` | Create a new project (name, description) |
|
|
27
|
+
| `update_project` | Update project name/description |
|
|
28
|
+
| `archive_project` | Archive or unarchive a project (archive=False to reactivate) |
|
|
29
|
+
| `delete_project` | Delete a project permanently |
|
|
30
|
+
|
|
31
|
+
### People
|
|
32
|
+
| Tool | Description |
|
|
33
|
+
|------|-------------|
|
|
34
|
+
| `list_people` | List all people on the account |
|
|
35
|
+
| `get_person` | Get person details by person_id |
|
|
36
|
+
| `get_me` | Get the authenticated user's profile |
|
|
37
|
+
| `list_person_projects` | List projects accessible to a person |
|
|
38
|
+
| `delete_person` | Remove a person from the account (admin only) |
|
|
39
|
+
|
|
40
|
+
### Todos
|
|
41
|
+
| Tool | Description |
|
|
42
|
+
|------|-------------|
|
|
43
|
+
| `get_todo` | Get a single todo with comments and attachments (project_id, todo_id) |
|
|
44
|
+
| `list_todos` | List todos in a project. status: 'remaining', 'completed', or 'all' |
|
|
45
|
+
| `list_todos_due_since` | List todos due after a date (YYYY-MM-DD) |
|
|
46
|
+
| `list_my_todos` | List all open todos assigned to the current user (paginated) |
|
|
47
|
+
| `list_assigned_todos` | List open todos assigned to any person_id |
|
|
48
|
+
| `create_todo` | Create a todo in a todo list (project_id, todolist_id, content, assignee_id, due_date) |
|
|
49
|
+
| `update_todo` | Update a todo's content, due date, or assignee |
|
|
50
|
+
| `assign_todo` | Reassign a todo to a different person_id |
|
|
51
|
+
| `close_todo` | Mark a todo as completed/closed |
|
|
52
|
+
| `reopen_todo` | Reopen a completed todo |
|
|
53
|
+
| `delete_todo` | Delete a todo permanently |
|
|
54
|
+
|
|
55
|
+
### Comments
|
|
56
|
+
| Tool | Description |
|
|
57
|
+
|------|-------------|
|
|
58
|
+
| `create_comment` | Add a comment to a todo (plain text) |
|
|
59
|
+
| `delete_comment` | Delete a comment permanently |
|
|
60
|
+
|
|
61
|
+
### Todo Lists
|
|
62
|
+
| Tool | Description |
|
|
63
|
+
|------|-------------|
|
|
64
|
+
| `list_todolists` | List active todo lists in a project |
|
|
65
|
+
| `list_all_todolists` | List todo lists across all projects. status: 'active', 'completed', or 'trashed' |
|
|
66
|
+
| `get_todolist` | Get all todos in a specific todo list |
|
|
67
|
+
| `create_todolist` | Create a new todo list (project_id, name, description) |
|
|
68
|
+
| `update_todolist` | Update a todo list's name, description, or position |
|
|
69
|
+
| `delete_todolist` | Delete a todo list permanently |
|
|
70
|
+
|
|
71
|
+
### Messages
|
|
72
|
+
| Tool | Description |
|
|
73
|
+
|------|-------------|
|
|
74
|
+
| `list_messages` | List messages/discussions in a project (via topics) |
|
|
75
|
+
| `get_message` | Get a message with comments and attachments |
|
|
76
|
+
| `create_message` | Create a new discussion (project_id, subject, content) |
|
|
77
|
+
| `update_message` | Update a message's subject/content |
|
|
78
|
+
| `delete_message` | Delete a message permanently |
|
|
79
|
+
|
|
80
|
+
Note: Messages may not be available on all Basecamp plans.
|
|
81
|
+
|
|
82
|
+
### Documents
|
|
83
|
+
| Tool | Description |
|
|
84
|
+
|------|-------------|
|
|
85
|
+
| `list_documents` | List documents. project_id=0 for all projects |
|
|
86
|
+
| `get_document` | Get a single document (e.g., site-info) |
|
|
87
|
+
| `create_document` | Create a new document (title, content) |
|
|
88
|
+
| `update_document` | Update a document's title/content |
|
|
89
|
+
| `delete_document` | Delete a document permanently |
|
|
90
|
+
|
|
91
|
+
### Calendar Events
|
|
92
|
+
| Tool | Description |
|
|
93
|
+
|------|-------------|
|
|
94
|
+
| `list_calendars` | List all calendars |
|
|
95
|
+
| `list_calendar_events` | List events. Filter by project_id, start_date, end_date, past |
|
|
96
|
+
| `get_calendar_event` | Get a specific calendar event |
|
|
97
|
+
| `create_calendar_event` | Create an event (summary, starts_at, description, all_day, ends_at, remind_at) |
|
|
98
|
+
| `update_calendar_event` | Update an event's fields |
|
|
99
|
+
| `delete_calendar_event` | Delete a calendar event |
|
|
100
|
+
|
|
101
|
+
### Topics
|
|
102
|
+
| Tool | Description |
|
|
103
|
+
|------|-------------|
|
|
104
|
+
| `list_topics` | List topics. project_id=0 for all. archived=True for archived |
|
|
105
|
+
| `archive_topic` | Archive a topic |
|
|
106
|
+
| `activate_topic` | Reactivate an archived topic |
|
|
107
|
+
|
|
108
|
+
### Attachments & Uploads
|
|
109
|
+
| Tool | Description |
|
|
110
|
+
|------|-------------|
|
|
111
|
+
| `list_attachments` | List attachments. project_id=0 for all (paginated) |
|
|
112
|
+
| `get_attachment` | Get attachment metadata and download URL (project_id, attachment_id) |
|
|
113
|
+
| `download_attachment` | Download attachment to local file (project_id, attachment_id) |
|
|
114
|
+
| `get_upload` | Get an upload with comments |
|
|
115
|
+
| `create_upload` | Upload a local file to a project's Files section |
|
|
116
|
+
| `delete_upload` | Delete an upload (move to trash) |
|
|
117
|
+
|
|
118
|
+
### Activity
|
|
119
|
+
| Tool | Description |
|
|
120
|
+
|------|-------------|
|
|
121
|
+
| `list_events` | Activity log since a datetime. Filter by project_id or person_id |
|
|
122
|
+
|
|
123
|
+
### Access Management
|
|
124
|
+
| Tool | Description |
|
|
125
|
+
|------|-------------|
|
|
126
|
+
| `list_accesses` | List people with access to a project |
|
|
127
|
+
| `grant_access` | Grant team access (comma-separated ids and/or email_addresses) |
|
|
128
|
+
| `grant_client_access` | Grant client-level access (comma-separated ids and/or email_addresses) |
|
|
129
|
+
| `revoke_access` | Revoke a person's project access |
|
|
130
|
+
|
|
131
|
+
### Stars
|
|
132
|
+
| Tool | Description |
|
|
133
|
+
|------|-------------|
|
|
134
|
+
| `list_stars` | List starred/favorite projects |
|
|
135
|
+
| `star_project` | Star (bookmark) a project |
|
|
136
|
+
| `unstar_project` | Remove star from a project |
|
|
137
|
+
|
|
138
|
+
### Forwards
|
|
139
|
+
| Tool | Description |
|
|
140
|
+
|------|-------------|
|
|
141
|
+
| `list_forwards` | List email forwards. project_id=0 for all |
|
|
142
|
+
| `get_forward` | Get a specific email forward with comments |
|
|
143
|
+
|
|
144
|
+
**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
|
+
|
|
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`.
|
|
147
|
+
|
|
148
|
+
## Downloading Attachments
|
|
149
|
+
|
|
150
|
+
Attachments can be on todos, comments, messages, or uploads. To retrieve them:
|
|
151
|
+
|
|
152
|
+
1. **Discover**: Call `get_todo` or `get_message` — attachments appear with IDs in both the top-level section and within individual comments
|
|
153
|
+
2. **Inspect** (optional): Call `get_attachment(project_id, attachment_id)` to see metadata, size, content type, and download URL
|
|
154
|
+
3. **Download**: Call `download_attachment(project_id, attachment_id)` — saves to `~/.simpleapps/downloads/{project_id}/`
|
|
155
|
+
4. **Read**: Use the `Read` tool on the local file path to view content (works for images, PDFs, Excel, text)
|
|
156
|
+
|
|
157
|
+
To browse all attachments in a project, use `list_attachments(project_id)`.
|
|
158
|
+
|
|
159
|
+
## Chrome Fallback
|
|
160
|
+
|
|
161
|
+
If the MCP server is unavailable (credentials expired, server not running), use Chrome:
|
|
162
|
+
|
|
163
|
+
1. Use `tabs_context_mcp` to get current tabs
|
|
164
|
+
2. Create a new tab or use an existing Basecamp tab
|
|
165
|
+
3. Navigate to the Basecamp page
|
|
166
|
+
4. Use `get_page_text` to extract content
|
|
167
|
+
|
|
168
|
+
**Base URL**: `https://basecamp.com/2805226`
|
|
169
|
+
|
|
170
|
+
**Top nav**: Projects | Calendar | Everything | Progress | Everyone | **Me**
|
|
171
|
+
|
|
172
|
+
| Page | Path |
|
|
173
|
+
|------|------|
|
|
174
|
+
| Dashboard | `/` |
|
|
175
|
+
| All projects | `/projects` |
|
|
176
|
+
| My assignments | click "Me" in top nav |
|
|
177
|
+
| Project overview | `/projects/<project_id>` |
|
|
178
|
+
| Todo lists | `/projects/<project_id>/todolists` |
|
|
179
|
+
| Documents | `/projects/<project_id>/documents` |
|
|
180
|
+
|
|
181
|
+
**Me** page (`/people/<person_id>`) — open to-dos (~45+ shows a "See all X open to-dos" link, YOU MUST click it). The full list is at `/people/<person_id>/outstanding_todos`.
|
|
182
|
+
|
|
183
|
+
**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
|
+
|
|
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
|
+
## Tips
|
|
194
|
+
|
|
195
|
+
- Cache the user's `person_id` on first visit for the session
|
|
196
|
+
- Start from `list_my_todos` for "what do I need to work on?"
|
|
197
|
+
- Use `list_people` to find person_id before calling `assign_todo`
|
|
198
|
+
- If you get a 401 or auth error, ask the user to re-run `basecamp-auth`
|
|
199
|
+
- If an endpoint returns 404, the feature may not be available on this Basecamp plan
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writing-style
|
|
3
|
+
description: Writing standards for code comments, documentation, specs, PRDs, and team communication. Applies RFC 2119 requirement language and token-efficient writing.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Writing Style
|
|
7
|
+
|
|
8
|
+
Apply these standards to all written output: code comments, docs, specs, PRDs, wiki pages, commit messages, and team communication.
|
|
9
|
+
|
|
10
|
+
## RFC 2119 Requirement Language
|
|
11
|
+
|
|
12
|
+
Spec: https://www.rfc-editor.org/rfc/rfc2119
|
|
13
|
+
|
|
14
|
+
Use ALL CAPS when invoking requirement levels:
|
|
15
|
+
|
|
16
|
+
- **MUST / REQUIRED / SHALL** — absolute requirement, no exceptions
|
|
17
|
+
- **MUST NOT / SHALL NOT** — absolute prohibition
|
|
18
|
+
- **SHOULD / RECOMMENDED** — strong recommendation, exceptions need justification
|
|
19
|
+
- **SHOULD NOT / NOT RECOMMENDED** — discouraged, acceptable with careful reasoning
|
|
20
|
+
- **MAY / OPTIONAL** — truly optional, implementer's choice
|
|
21
|
+
|
|
22
|
+
Use lowercase for casual suggestions: "you should consider..." vs "you SHOULD implement..."
|
|
23
|
+
|
|
24
|
+
Decision framework: Does the system break without it? → MUST. Degrades? → SHOULD. No impact? → MAY.
|
|
25
|
+
|
|
26
|
+
In CLAUDE.md and skill instructions, use "YOU MUST" or "IMPORTANT" as emphasis markers to improve adherence to critical rules.
|
|
27
|
+
|
|
28
|
+
## Token Efficiency
|
|
29
|
+
|
|
30
|
+
Every token costs time, money, and cognitive load. Be concise without losing clarity.
|
|
31
|
+
|
|
32
|
+
**Rules:**
|
|
33
|
+
1. Start with action verbs: fix, add, update, remove
|
|
34
|
+
2. Use file:line references: `auth.ts:45` not "authentication file line 45"
|
|
35
|
+
3. Eliminate filler: actually, basically, in order to, it's worth noting
|
|
36
|
+
4. Choose specific over generic: "Redis cache" not "caching solution"
|
|
37
|
+
5. Bottom Line Up Front — lead with the answer, then context
|
|
38
|
+
|
|
39
|
+
**By audience:**
|
|
40
|
+
- **Client-facing (Basecamp)**: Plain language, no jargon, explain impact not implementation. The reader is non-technical — write for clarity over brevity.
|
|
41
|
+
- **Developer-facing (GitHub issues, PRs, wiki)**: Technical and concise. Convey context for developers and AI agents — include file references, reproduction steps, and acceptance criteria.
|
|
42
|
+
- **Internal (code comments, commits)**: Minimal. Reader has full codebase context.
|
|
43
|
+
|
|
44
|
+
**By format:**
|
|
45
|
+
- **PRDs**: Bullet points, not paragraphs
|
|
46
|
+
- **Specs**: Lead with requirements (MUST/SHOULD/MAY)
|
|
47
|
+
- **Tasks**: Action verb + target
|
|
48
|
+
- **Code comments**: Only where logic isn't self-evident
|
|
49
|
+
- **Reviews**: What changed, not why
|
|
50
|
+
|
|
51
|
+
**When to expand:**
|
|
52
|
+
- User stories, onboarding docs, error messages — reader has no prior context
|
|
53
|
+
- Architecture decisions — future developers need the "why"
|
|
54
|
+
- External-facing docs — audience can't ask follow-up questions
|
|
55
|
+
|
|
56
|
+
**When to cut:**
|
|
57
|
+
- Internal specs, tasks, code comments — reader has shared context
|
|
58
|
+
- Commit messages, PR titles — scanning speed matters
|
|
59
|
+
- Anything repeating what the code already says
|
|
60
|
+
|
|
61
|
+
Default to brief. Expand only when the reader cannot infer meaning from context. Two sentences that answer the question beat two pages that fill the context window.
|
|
62
|
+
|
|
63
|
+
## Claude Code Keywords
|
|
64
|
+
|
|
65
|
+
Thinking trigger words (`think`, `think hard`, `ultrathink`) are deprecated. Extended thinking is on by default. Use `/effort` (low/medium/high/max) for control.
|