@simpleapps-com/augur-skills 0.0.18 → 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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: workflow
3
- description: How we track and deliver work. Covers the Basecamp-to-GitHub flow for client requests, task tracking, and cross-linking. Use when working on client tasks, creating issues, or checking assignments.
3
+ description: How we track and deliver work. Covers the Basecamp-to-GitHub flow for client requests, task tracking, cross-linking, and issue templates. Use when working on client tasks, creating issues, or checking assignments.
4
4
  ---
5
5
 
6
6
  # Workflow
@@ -27,13 +27,41 @@ Basecamp todos and GitHub issues SHOULD cross-link (many-to-many — one todo MA
27
27
 
28
28
  ## Tooling
29
29
 
30
- The `basecamp` MCP server (bundled with this plugin) provides direct API access to Basecamp 2. Use MCP tools (`get_todo`, `list_my_todos`, `list_documents`, etc.) as the primary method. Chrome browser automation is the fallback if MCP is unavailable.
30
+ Load `simpleapps:basecamp` for Basecamp MCP tools and Chrome fallback. Load `simpleapps:github` for `gh` CLI usage and org conventions.
31
31
 
32
- **First-time setup**: User MUST run `uv run basecamp-auth` once to authorize. Credentials are saved to `~/.simpleapps/basecamp.json`.
32
+ ## Creating Issues from Basecamp Todos
33
+
34
+ Before creating an issue, gather context from Basecamp (see `simpleapps:basecamp` skill for full MCP tool reference):
35
+ 1. Use `get_todo` to read the Basecamp todo and summarize the client request
36
+ 2. Use `list_documents` + `get_document` to find the project's **site-info** document for siteId and domain name. If no site-info document exists, ask the user to create one in Basecamp.
37
+
38
+ See the `simpleapps:github` skill for `gh` CLI usage and org conventions.
39
+
40
+ Issue template for Basecamp-linked issues:
41
+
42
+ ```bash
43
+ gh issue create --repo simpleapps-com/<repo> \
44
+ --title "<brief technical title>" \
45
+ --body "## Basecamp
46
+ <basecamp_todo_url>
47
+
48
+ ## Client
49
+ <client/project name> — <domain> (siteId: <siteId>)
50
+
51
+ ## Summary
52
+ <technical summary of what needs to be done>
53
+
54
+ ## Acceptance Criteria
55
+ - [ ] <criteria from the Basecamp request>"
56
+ ```
57
+
58
+ ## Cross-Linking
59
+
60
+ - Include the Basecamp todo URL in the GitHub issue body (under a `## Basecamp` heading)
61
+ - After creating the issue, provide the GitHub issue URL to the user so they can add it to the Basecamp todo comments
33
62
 
34
63
  ## References
35
64
 
36
- - See `basecamp.md` for MCP tools, Chrome fallback, and Basecamp navigation
37
- - See `github.md` for Basecamp-to-GitHub cross-linking
65
+ - See `simpleapps:basecamp` skill for MCP tools, Chrome fallback, and Basecamp navigation
38
66
  - See `simpleapps:github` skill for GitHub org conventions and `gh` CLI usage
39
67
  - See `simpleapps:fyxer` skill for Fyxer meeting transcript processing and Basecamp posting
File without changes
@@ -1,110 +0,0 @@
1
- # Fyxer Index — Basecamp Document
2
-
3
- Each Basecamp project that receives Fyxer meeting transcripts MUST have a **Fyxer Index** document. This document serves as a fast lookup for duplicate detection and meeting history, accessible to all team members.
4
-
5
- ## Document Format
6
-
7
- - **Title**: `Fyxer Index`
8
- - **Location**: Documents section of each Basecamp project
9
- - **Content**: One line per posted meeting, newest first
10
-
11
- Each line follows this format:
12
-
13
- ```
14
- <meeting-uuid> | <date> | <message-id> | <subject>
15
- ```
16
-
17
- Example:
18
-
19
- ```
20
- 52f0cf2b-fdb8-4e95-8b01-2afb6d367c69 | 2026-01-19 | 514789012 | Fyxer: 2026-01-19
21
- a1b2c3d4-e5f6-7890-abcd-ef1234567890 | 2026-02-10 | 514801234 | Fyxer: 2026-02-10
22
- d9e8f7a6-b5c4-3210-fedc-ba0987654321 | 2026-02-15 | 514823456 | Fyxer: 2026-02-15
23
- ```
24
-
25
- Fields:
26
-
27
- | Field | Source |
28
- |-------|--------|
29
- | meeting-uuid | UUID from Fyxer URL (before the colon) |
30
- | date | Meeting date (YYYY-MM-DD) |
31
- | message-id | Basecamp message ID returned by `create_message` |
32
- | subject | Message subject as posted (e.g., `Fyxer: 2026-02-15`) |
33
-
34
- ## Finding the Index
35
-
36
- ```
37
- list_documents(project_id)
38
- ```
39
-
40
- Scan for a document titled `Fyxer Index`. Use `get_document(project_id, document_id)` to read its contents.
41
-
42
- ## Creating the Index
43
-
44
- If no `Fyxer Index` document exists in the project, create one before posting the first meeting:
45
-
46
- ```
47
- create_document(project_id, "Fyxer Index", "")
48
- ```
49
-
50
- This creates an empty document. The first meeting entry will be appended after posting.
51
-
52
- ## Updating the Index
53
-
54
- After successfully posting a meeting transcript via `create_message`, append a new line to the index:
55
-
56
- 1. Read the current index: `get_document(project_id, document_id)`
57
- 2. Append the new entry to the content (newest first — add to the top)
58
- 3. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
59
-
60
- The `create_message` response includes the message ID needed for the index entry.
61
-
62
- ## Duplicate Check
63
-
64
- Before posting a meeting transcript, check the index:
65
-
66
- 1. Find the Fyxer Index document: `list_documents(project_id)` → scan for `Fyxer Index`
67
- 2. Read it: `get_document(project_id, document_id)`
68
- 3. Search the content for the meeting UUID
69
- 4. If found → the meeting has already been posted. Inform the user and stop.
70
- 5. If not found → safe to proceed with posting.
71
-
72
- If no Fyxer Index document exists, there are no posted meetings in this project. Proceed with posting and create the index.
73
-
74
- ## Reconciliation — Missing Entries
75
-
76
- The index MAY fall out of sync if a meeting was posted without updating the index (e.g., manual posting, index creation after existing meetings). To reconcile:
77
-
78
- 1. List all messages: `list_messages(project_id)`
79
- 2. Filter for messages with `Fyxer:` in the title
80
- 3. For each Fyxer message, call `get_message(project_id, message_id)` and extract the `fyxer-id` from the YAML frontmatter
81
- 4. Compare against the index — add any missing entries
82
- 5. Update the index document with the complete list
83
-
84
- Run reconciliation when:
85
- - The Fyxer Index document is first created in a project that already has Fyxer messages
86
- - The user suspects the index is incomplete
87
- - A duplicate check finds nothing but the user believes a meeting was already posted
88
-
89
- ## Reconciliation — Orphaned Entries
90
-
91
- If an index entry references a message that no longer exists (deleted in Basecamp):
92
-
93
- 1. Attempt `get_message(project_id, message_id)` for the entry
94
- 2. If 404 → the message was deleted. Remove the entry from the index.
95
- 3. Update the index document
96
-
97
- Only run orphan cleanup when explicitly requested by the user. Do not automatically delete index entries.
98
-
99
- ## Updated Posting Process
100
-
101
- The full Fyxer → Basecamp posting process (see `basecamp.md`) now includes index management:
102
-
103
- 1. **Check index** — find Fyxer Index doc, read it, search for meeting UUID
104
- 2. **Check local cache** — if summary.txt and transcript.txt exist, skip extraction
105
- 3. **Extract from Chrome** — if cache is missing (see `SKILL.md`)
106
- 4. **Build message.txt** — frontmatter + transcript
107
- 5. **Post to Basecamp** — `create_message` → capture message_id from response
108
- 6. **Update index** — append new entry to Fyxer Index document (create doc if needed)
109
-
110
- Step 6 is new. If the index update fails after a successful post, warn the user — the message is posted but the index is stale. The user can run reconciliation later to fix it.
@@ -1,91 +0,0 @@
1
- # Fyxer → Basecamp
2
-
3
- Post Fyxer meeting recordings as searchable Discussions in Basecamp projects.
4
-
5
- ## Inputs
6
-
7
- - **Fyxer recording URL**: `https://app.fyxer.com/call-recordings/<meeting-uuid>:<calendar-event-id>`
8
- - **Basecamp project ID**: Target project for the Discussion
9
-
10
- ## Process
11
-
12
- ### 1. Check for duplicate
13
-
14
- Extract the meeting UUID from the Fyxer URL (the part before the colon).
15
-
16
- Find the **Fyxer Index** document in the project: `list_documents(project_id)` → scan for title `Fyxer Index`. If found, `get_document(project_id, document_id)` and search the content for the meeting UUID. If the UUID appears, the meeting has already been posted — inform the user and stop.
17
-
18
- If no Fyxer Index document exists, there are no tracked meetings in this project. Proceed with posting.
19
-
20
- See `basecamp-index.md` for full index format and reconciliation.
21
-
22
- ### 2. Check local cache
23
-
24
- If `~/.simpleapps/fyxer/<meeting-uuid>/summary.txt` and `transcript.txt` both exist, skip to step 3. Otherwise, follow the Chrome extraction steps in `SKILL.md`.
25
-
26
- ### 3. Build message.txt
27
-
28
- Parse `summary.txt` for frontmatter fields, extract participants (see `SKILL.md` participant extraction), and combine with the full transcript from `transcript.txt`:
29
-
30
- ```
31
- ---
32
- meeting: SA/ClientName
33
- date: YYYY-MM-DD
34
- time: HH:MM-HH:MM
35
- participants: Person A, Person B, Person C
36
- topics: Topic One, Topic Two, Topic Three
37
- fyxer-id: <meeting-uuid>
38
- ---
39
-
40
- [contents of transcript.txt]
41
- ```
42
-
43
- Frontmatter field sources:
44
-
45
- | Field | Source |
46
- |-------|--------|
47
- | meeting | Meeting title from the page header |
48
- | date | Recording date |
49
- | time | Recording time range |
50
- | participants | Participant dropdown (click to reveal names) |
51
- | topics | Section headings from the Summary |
52
- | fyxer-id | Meeting UUID from the URL (before the colon) |
53
-
54
- Save as `~/.simpleapps/fyxer/<meeting-uuid>/message.txt`.
55
-
56
- ### 4. Post to Basecamp
57
-
58
- Use `create_message(project_id, subject, content)`:
59
-
60
- - **Subject**: `Fyxer: YYYY-MM-DD`
61
- - **Content**: contents of `message.txt`
62
-
63
- Capture the **message_id** from the response.
64
-
65
- ### 5. Update Fyxer Index
66
-
67
- After a successful post, update the Fyxer Index document:
68
-
69
- 1. If no Fyxer Index document exists, create one: `create_document(project_id, "Fyxer Index", "")`
70
- 2. Read current content: `get_document(project_id, document_id)`
71
- 3. Prepend a new line (newest first): `<meeting-uuid> | <date> | <message-id> | <subject>`
72
- 4. Update: `update_document(project_id, document_id, title="Fyxer Index", content=updated_content)`
73
-
74
- If the index update fails after a successful post, warn the user. The message is posted but the index is stale. Run reconciliation later (see `basecamp-index.md`).
75
-
76
- ## Format Rules
77
-
78
- - **Plain text only** — Basecamp prefers plain text over HTML
79
- - **YAML frontmatter** — machine-parseable so other Claude Code instances can search and parse meeting context
80
- - **Transcript only in body** — summary and action items belong on relevant Basecamp todos, not in this message
81
- - **Consistent title** — `Fyxer: YYYY-MM-DD` keeps messages uniform and sortable
82
-
83
- ## Finding Posted Transcripts
84
-
85
- Check the index: `list_documents(project_id)` → find `Fyxer Index` → `get_document`
86
- View a specific transcript: `get_message(project_id, message_id)` using the message_id from the index
87
- Browse all messages: `list_messages(project_id)` — Fyxer posts use the title format `Fyxer: YYYY-MM-DD`
88
-
89
- ## Dependencies
90
-
91
- - Basecamp MCP (`create_message`, `create_document`, `update_document`, `list_documents`, `get_document` tools) — see `simpleapps:workflow` skill (`basecamp.md`) for full MCP tool reference
@@ -1,89 +0,0 @@
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.
@@ -1,146 +0,0 @@
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
- ├── wip/ # Work-in-progress files for active tasks (not in git)
12
- └── .simpleapps/ # Project-level secrets and credentials (not in git)
13
- ```
14
-
15
- The parent `{project}/` directory is NOT a git repo — it's a local wrapper that keeps the code repo and wiki side-by-side. The `wip/` and `.simpleapps/` directories sit outside both git trees so their contents can never be accidentally committed.
16
-
17
- ## Why This Pattern
18
-
19
- - GitHub wikis are separate git repos. Cloning them alongside the code keeps everything local and searchable.
20
- - AI agents (Claude Code) can `Read` wiki files from disk instantly instead of fetching URLs.
21
- - The wiki becomes the **source of truth for dev docs**. The repo stays focused on product code.
22
-
23
- ## Setting Up a New Project
24
-
25
- ```bash
26
- mkdir {project}
27
- cd {project}
28
- git clone https://github.com/simpleapps-com/<name>.git repo
29
- git clone https://github.com/simpleapps-com/<name>.wiki.git wiki
30
- ```
31
-
32
- If the wiki repo doesn't exist yet, create it by adding any page via the GitHub wiki UI first, then clone.
33
-
34
- ## What Goes Where
35
-
36
- | Content | Location | Examples |
37
- |---------|----------|---------|
38
- | Product code | `repo/` | Source, tests, configs, SKILL.md files |
39
- | Dev documentation | `wiki/` | Architecture, guides, specs, conventions |
40
- | Repo README | `repo/README.md` | Minimal — quick start + link to wiki |
41
- | Repo `.claude/rules/` | `repo/` | Minimal summaries referencing wiki pages |
42
- | Repo `.claude/CLAUDE.md` | `repo/` | Quick reference + wiki links |
43
- | Active task context | `wip/` | WIP files for Basecamp todos or GitHub issues |
44
- | Project secrets | `{project}/.simpleapps/` | Site-specific credentials, `{siteId}.json` |
45
- | Global secrets | `~/.simpleapps/` | Shared credentials across all projects |
46
-
47
- Rule of thumb: if a `.md` file isn't built into the end product, it belongs in the wiki. If it contains secrets or ephemeral task state, it belongs outside both git trees.
48
-
49
- ## WIP Directory
50
-
51
- The `wip/` directory holds work-in-progress files that AI agents create when picking up tasks from Basecamp or GitHub issues. Each file tracks research, plans, and progress for an active task.
52
-
53
- ### Naming Convention
54
-
55
- `{issue-number}-{short-description}.md` — e.g., `14-basecamp-mcp-auto-refresh-oauth.md`
56
-
57
- ### Lifecycle
58
-
59
- 1. Agent picks up a Basecamp todo or GitHub issue
60
- 2. Creates a WIP file with research findings and implementation plan
61
- 3. Updates the file as work progresses
62
- 4. File remains after completion as a record of decisions made
63
-
64
- ### What belongs in WIP
65
-
66
- - Research findings and code analysis
67
- - Detailed implementation plans
68
- - Decision rationale
69
- - Test results and verification notes
70
-
71
- ### What does NOT belong in WIP
72
-
73
- - Secrets, credentials, or tokens (use `.simpleapps/`)
74
- - Final documentation (use `wiki/`)
75
- - Code (use `repo/`)
76
-
77
- ## Credentials (`.simpleapps/`)
78
-
79
- Secrets and credentials live in `.simpleapps/` directories at two levels:
80
-
81
- - **`~/.simpleapps/`** (user-level) — shared credentials across all projects (e.g., `augur-api.json`, `basecamp.json`)
82
- - **`{project}/.simpleapps/`** (project-level) — credentials specific to that project (e.g., `{siteId}.json` with test user creds)
83
-
84
- Project-level credentials override user-level ones when both exist. Both directories sit outside git trees so nothing can be accidentally committed.
85
-
86
- MUST NOT be committed to any git repository. MUST NOT be copied into `repo/` or `wiki/`.
87
-
88
- ## Referencing Wiki from Repo
89
-
90
- Repo files SHOULD use **relative filesystem paths** to reference wiki content:
91
-
92
- ```markdown
93
- Full docs: ../../../wiki/Versioning.md
94
- ```
95
-
96
- Relative paths work for Claude Code (local file reads). GitHub URLs require network access and are slower.
97
-
98
- ## Wiki Conventions
99
-
100
- ### Page Naming
101
-
102
- - Use **PascalCase** with hyphens: `Getting-Started.md`, `Plugin-Structure.md`
103
- - Match the pattern used in GitHub wiki URLs: `wiki/Page-Name`
104
-
105
- ### _Sidebar.md
106
-
107
- Every wiki MUST have a `_Sidebar.md` for navigation. Group pages by topic:
108
-
109
- ```markdown
110
- **[[Home]]**
111
-
112
- **Getting Started**
113
- - [[Getting-Started]]
114
-
115
- **Architecture**
116
- - [[Architecture]]
117
- - [[Plugin-Structure]]
118
-
119
- **Development**
120
- - [[Development]]
121
- - [[Versioning]]
122
- ```
123
-
124
- ### Linking
125
-
126
- - Use `[[Page-Name]]` wiki links for internal links (renders on GitHub wiki)
127
- - Use `[[Display Text|Page-Name]]` for custom link text
128
-
129
- ### Content Guidelines
130
-
131
- - Wiki pages are the **full, detailed** version of documentation
132
- - Each page SHOULD be self-contained — don't assume the reader has seen other pages
133
- - Include examples, code blocks, and tables where they help
134
- - Use RFC 2119 keywords (MUST/SHOULD/MAY) for requirements
135
-
136
- ### Committing Wiki Changes
137
-
138
- The wiki is a regular git repo. Commit and push like any other:
139
-
140
- ```bash
141
- cd {project}/wiki
142
- git add -A && git commit -m "docs: add architecture page"
143
- git push origin master
144
- ```
145
-
146
- Note: GitHub wikis typically use `master` as the default branch, not `main`.
@@ -1,161 +0,0 @@
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
- ### Keep It Lean
114
-
115
- Wikis SHOULD be as small as possible while remaining complete. The goal: an AI agent can load the **entire wiki** into context at session start and keep it there throughout.
116
-
117
- Guidelines:
118
- - Tighten language — cut filler, use tables over prose
119
- - Merge overlapping pages
120
- - Document patterns and principles, not exhaustive implementation details (see `wiki-maintenance.md`)
121
- - Archive obsolete pages (delete, don't hoard)
122
- - Move implementation specifics back to code comments where they belong
123
-
124
- To check wiki size:
125
- ```bash
126
- wc -c {project}/wiki/*.md
127
- ```
128
-
129
- Rough conversion: 1 token ≈ 3 bytes of markdown.
130
-
131
- ### Right-Size Each Page
132
-
133
- - Too short = missing context, agent has to search elsewhere
134
- - Too long = wasted tokens, buried signal
135
- - Target: enough to act on without reading anything else
136
-
137
- ## The Feedback Loop
138
-
139
- ```
140
- Wiki defines → Code implements → Learnings update wiki → Repeat
141
- ```
142
-
143
- When code reveals that the wiki is wrong or incomplete, update the wiki immediately. The wiki MUST reflect reality, not aspirations.
144
-
145
- ## When to Update the Wiki
146
-
147
- - **New feature** — Write the wiki page first (spec), then implement
148
- - **Bug fix** — If the fix reveals a gap in documentation, update the wiki
149
- - **Architecture change** — Update Architecture page before or during the change
150
- - **New convention** — Add to the relevant wiki page so the team adopts it
151
- - **Onboarding friction** — If someone asks "where is X?", the answer should be a wiki link. If it's not, create the page.
152
-
153
- ## Anti-Patterns
154
-
155
- | Don't | Do |
156
- |-------|-----|
157
- | Write long README.md files in the repo | Minimal README + wiki link |
158
- | Duplicate wiki content in `.claude/rules/` | Thin rules that reference wiki |
159
- | Leave wiki pages stale after code changes | Update wiki in the same session |
160
- | Use the wiki as a dumping ground for notes | Structure pages with clear purpose |
161
- | Write wiki pages only humans can understand | Write for both humans and AI agents |