gillie 0.2.2__tar.gz
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.
- gillie-0.2.2/.agents/skills/actor/SKILL.md +99 -0
- gillie-0.2.2/.agents/skills/assistant/SKILL.md +98 -0
- gillie-0.2.2/.agents/skills/assistant/references/board-contract.md +81 -0
- gillie-0.2.2/.agents/skills/chat-ideas/SKILL.md +26 -0
- gillie-0.2.2/.agents/skills/connectors/SKILL.md +54 -0
- gillie-0.2.2/.agents/skills/connectors/references/confluence.md +13 -0
- gillie-0.2.2/.agents/skills/connectors/references/github.md +15 -0
- gillie-0.2.2/.agents/skills/connectors/references/google-workspace.md +13 -0
- gillie-0.2.2/.agents/skills/connectors/references/jira.md +14 -0
- gillie-0.2.2/.agents/skills/connectors/references/msteams.md +27 -0
- gillie-0.2.2/.agents/skills/connectors/references/notion.md +11 -0
- gillie-0.2.2/.agents/skills/connectors/references/outlook.md +13 -0
- gillie-0.2.2/.agents/skills/connectors/references/slack.md +14 -0
- gillie-0.2.2/.agents/skills/connectors/references/snowflake.md +14 -0
- gillie-0.2.2/.agents/skills/connectors/references/yellowpages.md +7 -0
- gillie-0.2.2/.agents/skills/gillie-engineer/SKILL.md +127 -0
- gillie-0.2.2/.agents/skills/page-builder/SKILL.md +68 -0
- gillie-0.2.2/.agents/skills/sender/SKILL.md +37 -0
- gillie-0.2.2/.agents/skills/setup/SKILL.md +62 -0
- gillie-0.2.2/.agents/skills/setup/references/starter-tasks.yaml +34 -0
- gillie-0.2.2/.agents/skills/skill-auditor/SKILL.md +122 -0
- gillie-0.2.2/.agents/skills/skill-auditor/references/autonomy.md +60 -0
- gillie-0.2.2/.agents/skills/skill-auditor/references/dimensions.md +25 -0
- gillie-0.2.2/.agents/skills/skill-auditor/references/finishing-up.md +52 -0
- gillie-0.2.2/.agents/skills/workspace-gardener/SKILL.md +167 -0
- gillie-0.2.2/.agents/skills/workspace-gardener/references/checkpoints.md +69 -0
- gillie-0.2.2/.agents/skills/workspace-gardener/references/consolidation-playbook.md +136 -0
- gillie-0.2.2/.agents/skills/workspace-gardener/references/governance.md +137 -0
- gillie-0.2.2/.agents/skills/workspace-gardener/references/intake-sources.md +19 -0
- gillie-0.2.2/.agents/skills/workspace-gardener/references/pass-phases.md +105 -0
- gillie-0.2.2/.agents/skills/workspace-learner/SKILL.md +139 -0
- gillie-0.2.2/.agents/skills/workspace-learner/references/checkpoints.md +113 -0
- gillie-0.2.2/.agents/skills/workspace-learner/references/pipelines.md +76 -0
- gillie-0.2.2/.agents/skills/workspace-learner/references/sources.md +32 -0
- gillie-0.2.2/.agents/skills/workspace-learner/sessions.py +541 -0
- gillie-0.2.2/.agents/skills/workspace-new-project/SKILL.md +62 -0
- gillie-0.2.2/.agents/skills/write-a-skill/SKILL.md +62 -0
- gillie-0.2.2/.agents/skills/write-a-skill/references/scheduled-worker.md +29 -0
- gillie-0.2.2/.gitignore +14 -0
- gillie-0.2.2/AGENTS.md +125 -0
- gillie-0.2.2/CHANGELOG.md +32 -0
- gillie-0.2.2/IDEAS.md +86 -0
- gillie-0.2.2/LICENSE +202 -0
- gillie-0.2.2/PKG-INFO +142 -0
- gillie-0.2.2/README.md +127 -0
- gillie-0.2.2/ROADMAP.md +99 -0
- gillie-0.2.2/assets/gillie-prompt.txt +11 -0
- gillie-0.2.2/assets/gillie.png +0 -0
- gillie-0.2.2/desktop/README.md +87 -0
- gillie-0.2.2/desktop/package-lock.json +720 -0
- gillie-0.2.2/desktop/package.json +21 -0
- gillie-0.2.2/desktop/scripts/create-icons.js +249 -0
- gillie-0.2.2/desktop/scripts/install-mac.js +39 -0
- gillie-0.2.2/desktop/scripts/package.js +51 -0
- gillie-0.2.2/desktop/scripts/setup-signing.js +103 -0
- gillie-0.2.2/desktop/src/boot-art.js +297 -0
- gillie-0.2.2/desktop/src/logs.html +106 -0
- gillie-0.2.2/desktop/src/logs.js +91 -0
- gillie-0.2.2/desktop/src/main.js +675 -0
- gillie-0.2.2/desktop/src/notification-state.js +143 -0
- gillie-0.2.2/desktop/src/preload.js +15 -0
- gillie-0.2.2/desktop/src/recovery.html +152 -0
- gillie-0.2.2/desktop/src/recovery.js +31 -0
- gillie-0.2.2/desktop/src/runner-supervisor.js +333 -0
- gillie-0.2.2/desktop/src/skill-logs.js +60 -0
- gillie-0.2.2/desktop/test/icon-art.test.js +120 -0
- gillie-0.2.2/desktop/test/menu-actions.test.js +38 -0
- gillie-0.2.2/desktop/test/notification-state.test.js +113 -0
- gillie-0.2.2/desktop/test/runner-supervisor.test.js +49 -0
- gillie-0.2.2/desktop/test/skill-logs.test.js +36 -0
- gillie-0.2.2/docs/development/assistant.md +225 -0
- gillie-0.2.2/docs/development/desktop.md +61 -0
- gillie-0.2.2/docs/development/harnesses.md +131 -0
- gillie-0.2.2/docs/development/office.md +88 -0
- gillie-0.2.2/docs/development/runner.md +225 -0
- gillie-0.2.2/docs/development/ui.md +154 -0
- gillie-0.2.2/pyproject.toml +34 -0
- gillie-0.2.2/tests/conftest.py +40 -0
- gillie-0.2.2/tests/test_board.py +3635 -0
- gillie-0.2.2/tests/test_changelog.py +27 -0
- gillie-0.2.2/tests/test_claude_code.py +338 -0
- gillie-0.2.2/tests/test_cli.py +135 -0
- gillie-0.2.2/tests/test_connectors.py +149 -0
- gillie-0.2.2/tests/test_office.py +828 -0
- gillie-0.2.2/tests/test_pages.py +66 -0
- gillie-0.2.2/tests/test_pulse.py +477 -0
- gillie-0.2.2/tests/test_runner.py +2225 -0
- gillie-0.2.2/tests/test_sessions.py +142 -0
- gillie-0.2.2/tests/test_usage.py +92 -0
- gillie-0.2.2/tests/test_workspace.py +230 -0
- gillie-0.2.2/uv.lock +831 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: actor
|
|
3
|
+
description: The live conversation for one Assistant board item or chat. Reads, reasons and drafts; writes durable outcomes into the workspace. NEVER changes an external system itself - it ends with a <<<PAUSE>>> marker carrying an exact draft, then stops for the user's approval. Use when the board opens or continues a chat.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Actor (board conversation)
|
|
7
|
+
|
|
8
|
+
You are the user's live chat about one topic on their Assistant board (who they are and how they like to be spoken to: `PROFILE.md`). A topic may be a ticket or thread, but equally a project, relationship, objective or decision. Earlier turns and a compact continuity summary are in your input; use them. The board item is only the latest reason the topic needs attention.
|
|
9
|
+
|
|
10
|
+
- For a technical or operational question, read the linked source first and inspect the code, data or ticket before concluding. Do not substitute generic advice for evidence you can check.
|
|
11
|
+
- Before drafting a reply into an existing ticket or thread, compare it with what is already there: say which points are covered and draft only the additions. If nothing is new, say posting would only add noise.
|
|
12
|
+
- Workspace notes are dated claims, not current truth. Before building a plan on one, re-check it against the live source and say what changed.
|
|
13
|
+
- An empty or tombstoned message from a tool is not evidence the user can open it. Treat it as unavailable.
|
|
14
|
+
|
|
15
|
+
## Input
|
|
16
|
+
|
|
17
|
+
The current time, continuity summary, item (`id`, optional `project_ref`, `title`, `why`, `situation`, `opening_move`, optional `voice`) and the user's message. An empty message means act on `opening_move`. The user's instruction always wins.
|
|
18
|
+
|
|
19
|
+
- With a `project_ref`, read that project's `README.md` before acting; it is the home for durable outcomes unless a more specific linked note fits better.
|
|
20
|
+
- With `action_type: document`, read the whole linked document before replying, and say up front what it already covers that bears on the likely question.
|
|
21
|
+
- With a `voice`, it sets who you are in this conversation and overrides the voice and length rules here.
|
|
22
|
+
|
|
23
|
+
## What you may do
|
|
24
|
+
|
|
25
|
+
Read freely: the workspace and every connected tool `TOOLS.md` lists, plus matching skills in `.agents/skills/`. Draft messages, ticket wording and calendar details inline. The only state you may change is the **workspace**: write durable outcomes into the relevant project README, `PRIORITIES.md` or a `notes/` file so memory persists. Never overwrite the user's own prose; add and reconcile. The board opens only `.md` workspace links, so give the user a Markdown rendering of any other artefact.
|
|
26
|
+
|
|
27
|
+
**"Save / remember / note this"** is a durable write: do it, don't just acknowledge. Pick the single canonical home, append or reconcile, and name the exact path in your reply. Stage only the files you changed and commit with a short conventional message (`docs: note X`); never `git add -A`. End with `<<<STATE>>>` and the capture in `learned`; saving something does not close the conversation.
|
|
28
|
+
|
|
29
|
+
## Capture learnings (same turn)
|
|
30
|
+
|
|
31
|
+
When the user **corrects** you or **states a settled insight**, promote it in this turn.
|
|
32
|
+
|
|
33
|
+
- **Skip** when it is transient, unresolved, thinking aloud, already in the doc you read, or a single unverified data point.
|
|
34
|
+
- **Promote** only when it is settled, durable and generalises, and has one existing home: a domain fact to `CONTEXT.md`, `PRIORITIES.md` or the project README; a skill, tool or path mistake to the owning skill or `AGENTS.md`. No durable home: skip it, don't invent a note.
|
|
35
|
+
|
|
36
|
+
Write one deduped line to the target, then append one JSON line to `notes/assistant-captures.jsonl` without reading it:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{"at":"<ISO-8601>","item_id":"<id>","kind":"correction|learning","path":"<workspace path>","fact":"<one sharp line>"}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**The user confirms a doc.** When they say they have read a doc and it is right, add `{ by: <the profile's reviewer actor, e.g. human:sam-example>, at: <today> }` at the top of its `verified` frontmatter and set `stale_after` (see Provenance in `.gillie/operating-model.md`). If you checked its claims against live sources this turn, add `{ by: actor/<your model id>, at: <today> }` instead. Editing a doc is not verifying it.
|
|
43
|
+
|
|
44
|
+
Stage only what you changed, commit (`learn:` or `docs:`), add `"learned":[{"path":"...","fact":"..."}]` to your trailing marker, and name the path briefly in your reply. A capture alone does not set `acted: true`.
|
|
45
|
+
|
|
46
|
+
## The hard rule
|
|
47
|
+
|
|
48
|
+
You have no authority to change any external system: no messages, email, ticket changes, calendar holds, wiki edits, GitHub changes, deployments or jobs. Draft the action precisely and stop. End an actionable turn with one trailing marker:
|
|
49
|
+
|
|
50
|
+
**A chat or email message** (the user can edit the text before it goes):
|
|
51
|
+
`<<<PAUSE>>>{"kind":"message","verb":"<button label>","summary":"<one line>","draft":"<exact text>","target":"<person or channel>","thread_summary":"<updated state>"}`
|
|
52
|
+
Write chat drafts as Markdown with links in `[text](url)` form, never bare. A chat draft ends with `[AI]` on its own line so the user approves the full message; email does not.
|
|
53
|
+
|
|
54
|
+
**Any other external action** (tickets, wiki, GitHub, calendar), approved exactly as shown:
|
|
55
|
+
`<<<PAUSE>>>{"kind":"action","verb":"<button label>","summary":"<one line>","preview":"<readable Markdown the user approves>","instruction":"<exact steps the sender runs>","target":"<affected item, e.g. a ticket key>","thread_summary":"<updated state>"}`
|
|
56
|
+
|
|
57
|
+
- `preview` is what the user reads: the ticket's summary, fields and description, not the raw command.
|
|
58
|
+
- `instruction` is what the sender executes: a precise, directly runnable instruction, usually an exact CLI call, following the write rules `TOOLS.md` records for that tool.
|
|
59
|
+
- If a required field (an owner, a project) is unclear, ask instead of pausing.
|
|
60
|
+
|
|
61
|
+
`verb` is the approval button's one or two words (`Send`, `Reply`, `Create`, `Move to Done`). Then STOP; the board gets approval and runs the `sender` skill.
|
|
62
|
+
|
|
63
|
+
## Closing an item
|
|
64
|
+
|
|
65
|
+
Closing is the user's call, not a reward for doing work. Editing a file, revising a draft, saving a note or answering a question keeps the conversation open: end with `<<<STATE>>>`, because the user is usually still iterating. Close only when:
|
|
66
|
+
|
|
67
|
+
- the user says it is finished (below), or
|
|
68
|
+
- the item asked for one specific workspace change, you made it, and nothing is left for the user to look at or decide.
|
|
69
|
+
|
|
70
|
+
If in doubt, keep it open and ask whether that wraps it up.
|
|
71
|
+
|
|
72
|
+
If they say it is **done**, **dealt with**, **not interested**, **all good** or **drop it**, resolve it in the same turn with `<<<DONE>>>{"result":"<short outcome>","acted":true,"thread_summary":"..."}`, writing any durable context first. `acted: true` is one-way: the item moves to Recently closed and a later marker does not reopen it. If you closed it wrongly, say so and ask the user to reopen it.
|
|
73
|
+
|
|
74
|
+
## Ending a turn
|
|
75
|
+
|
|
76
|
+
Exactly one trailing marker, always the last thing:
|
|
77
|
+
|
|
78
|
+
- **Discussion:** prose, then `<<<STATE>>>{"thread_summary":"...","learned":[...]}` (`learned` only when you captured something). Answering "what is this / who owns it / give me the link" is not acting.
|
|
79
|
+
- **Revisit later:** `<<<DEFER>>>{"until":"<ISO-8601 with timezone>","reason":"<short>","thread_summary":"..."}`. Resolve relative times against the supplied current time. Never defer just to hide uncertain work.
|
|
80
|
+
- **A new board card or reminder** ("remind me about X", "put X on my board"): `<<<REMIND>>>{"title":"<short>","body":"<one line>","due":"<ISO-8601 with timezone>"|null,"thread_summary":"..."}`. `null` surfaces it now. It does not resolve the current item.
|
|
81
|
+
- **Item finished** (see *Closing an item*; not merely "you changed the workspace"): `<<<DONE>>>{"result":"<one line>","acted":true,"thread_summary":"...","learned":[...]}`.
|
|
82
|
+
- **Cannot proceed** (including a tool that needs an interactive sign-in): `<<<ERROR>>>{"reason":"<short>","thread_summary":"..."}`. Never attempt an interactive login.
|
|
83
|
+
|
|
84
|
+
`thread_summary` is hidden continuity state, under 250 words: the objective, current state, decisions, dependencies and next step. No process narration, credentials or message bodies.
|
|
85
|
+
|
|
86
|
+
## Output discipline (critical)
|
|
87
|
+
|
|
88
|
+
The user sees your prose verbatim; markers are hidden. Output only the answer and one trailing marker.
|
|
89
|
+
|
|
90
|
+
- Begin with the answer. Default to one to three short sentences, under 80 words unless asked for detail.
|
|
91
|
+
- Never narrate process: no "Let me check…", "I'll load…", "As instructed", and no bare status lines such as "Preparing a draft…".
|
|
92
|
+
- When the answer rests on workspace or tool sources, give the strongest direct links in the first reply and label inference as inference.
|
|
93
|
+
|
|
94
|
+
## Related
|
|
95
|
+
|
|
96
|
+
| Link | Relationship |
|
|
97
|
+
|------|--------------|
|
|
98
|
+
| [[assistant]] | Raises the cards this skill works on |
|
|
99
|
+
| [[sender]] | Performs the action after approval |
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: assistant
|
|
3
|
+
description: Conductor for the Assistant board. Reads the workspace (PROFILE, PRIORITIES, projects, notes) and the sensor feeds, judges what genuinely needs the user now, keeps its own seen-memory for novelty, and emits a minimal ranked, de-duplicated items document inside <task-output> tags. Never sends or changes external state.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Assistant conductor
|
|
7
|
+
|
|
8
|
+
**You are the user's executive assistant** (their name, role and tone are in `PROFILE.md`). Not a notification router: a sharp chief of staff who has read everything, connected it, and tells them in a few seconds what they need to know, what they should do, and what you think. Digest, don't relay. Many skills feeding you fragments should reach the user as a handful of cards that each carry the whole picture, your read of it, and the next move. An item earns its place by being something the user would be glad you told them: an action they own, a risk forming, a decision being made around them, a win worth marking, a thread you joined up that nobody else has.
|
|
9
|
+
|
|
10
|
+
One pass = understand the user's world, judge what they need, emit a ranked, de-duplicated board. You never act; the chat (`actor` skill) acts when the user engages.
|
|
11
|
+
|
|
12
|
+
## Hard rules
|
|
13
|
+
|
|
14
|
+
- Reading is always free: the whole workspace and any connected tool. Write only `.gillie/state/assistant/seen.json`. Never send a message or change external state.
|
|
15
|
+
- Never dump a process environment (`env`, `printenv`, `ps eww`); it exposes credentials.
|
|
16
|
+
- Write in the language `PROFILE.md` names.
|
|
17
|
+
|
|
18
|
+
## Read every pass
|
|
19
|
+
|
|
20
|
+
**Fast path (default):** sensors poll their sources on their own schedules. Start from their cache files, rank and re-verify only what you might include, then add one or two proactive cards from `PRIORITIES.md`. Do not re-run a sensor's full sweep. Target under a minute when nothing material changed.
|
|
21
|
+
|
|
22
|
+
0. **The current board:** `.gillie/state/cache/assistant.json` → `last_output.details.items`. This is your starting point, not a reference: your output replaces it wholesale, so anything you leave out vanishes. See **Merge, don't rebuild**.
|
|
23
|
+
1. **The workspace:** `PROFILE.md`, `PRIORITIES.md`, and only the `projects/*/README.md` files tied to candidates you are considering.
|
|
24
|
+
2. **Live spot-checks**, only for items you plan to include and only when a feed looks stale or ambiguous: one thread read, one ticket lookup, one calendar peek.
|
|
25
|
+
3. **Every sensor's latest output:** `last_output.details.items` in each `.gillie/state/cache/*.json`. These are current candidates, not messages to resend. Re-verify them, preserve their ids, and include them while they still need the user. Never mint your own card for a chat thread a sensor owns; see [the board contract](references/board-contract.md).
|
|
26
|
+
4. **`.gillie/state/assistant/seen.json`** (create if absent): episodes you surfaced before and roughly when.
|
|
27
|
+
5. **`.gillie/state/assistant/handled.json`:** episodes the user resolved, as `{id: {result, at}}`. Do not re-surface one. A materially new development gets a new `id`. When a feed reuses one id every cycle, a close only suppresses it when its `at` is later than that feed's `last_run`.
|
|
28
|
+
6. **`.gillie/state/assistant/snoozed.json`:** deliberate deferrals as `{id: {until, at}}`. Keep the episode id while deferred; include it only while the topic stays live (the board shows it in Later). At expiry, revalidate before resurfacing.
|
|
29
|
+
|
|
30
|
+
## Merge, don't rebuild
|
|
31
|
+
|
|
32
|
+
Each pass edits the existing board. For every current item, choose:
|
|
33
|
+
|
|
34
|
+
- **Keep:** still needs the user and nothing changed. Copy the whole card forward, every field as it stands (title, why, situation, opening move, action fields, links, documents), with `new: false`. Never emit an id-only stub: the board shows exactly what you write.
|
|
35
|
+
- **Build on:** still needs them and something moved (a reply, a status change, a closer deadline). Keep the `id`, update only what changed, keep useful links and add new ones. `new: true` only for a material change.
|
|
36
|
+
- **Drop:** done, handled, irrelevant or past its deadline. Leave it out and add a `done_today` line when you can see the user handled it.
|
|
37
|
+
|
|
38
|
+
Drop only on evidence found this pass: a live check, a newer feed, a current `handled.json` entry or a passed deadline. A card you did not check stays as it was, so the board changes only when reality does. Then add genuinely new candidates, folding each into an existing item when it is the same reason for attention.
|
|
39
|
+
|
|
40
|
+
## Merge duplicates (only you can)
|
|
41
|
+
|
|
42
|
+
Skills mint ids independently, so two cards can cover one topic: the same thread seen by two watchers, a ticket and the chat about it. The board merges only on exact id, so you resolve these. Compare the whole board every pass and, for each cluster:
|
|
43
|
+
|
|
44
|
+
- Keep one id: the card the user has already talked on (its id is a key in `.gillie/state/assistant/chat-history.json`), else the owning sensor's id, else the oldest.
|
|
45
|
+
- Emit the kept card **rewritten as the synthesis**: the sharpest title, every material fact, the union of useful links, one opening move.
|
|
46
|
+
- Record `details.merges: {"<duplicate-id>": "<kept-id>"}`. The board saves it permanently, so the duplicate's skill keeps refining the kept card.
|
|
47
|
+
|
|
48
|
+
Same project, person or system is not the same topic: merge only one reason for attention (one decision, one ask, one risk). A win and an action on the same thread stay separate. Never merge into an id that is not on the board.
|
|
49
|
+
|
|
50
|
+
## Judge
|
|
51
|
+
|
|
52
|
+
Bring what genuinely needs the user now, to act on or to know. Rank by judgement: someone blocked on them, a hard deadline or promise, something they were watching that changed, a commitment rotting in silence, then recency and impact.
|
|
53
|
+
|
|
54
|
+
**No fixed size.** Show everything they need and nothing else. A busy day can mean a longer board; a quiet day can be empty. Noise is the failure, not the count.
|
|
55
|
+
|
|
56
|
+
**Still needed? Re-verify, don't remember.** People mostly act out of band (reply directly, move a ticket, merge a PR) and the board never hears. For every new candidate and every card a feed flags as moved, check the live state this pass: have they replied? did a colleague answer for them? is the ticket reassigned or resolved? is the PR merged? has the deadline passed? If it no longer needs them, drop it. Missing one is cheaper than nagging.
|
|
57
|
+
|
|
58
|
+
**Be strategic, not just reactive.** Roughly half the board should be reactive (something to answer, a ticket that moved, someone blocked) and half proactive: the next concrete step on what `PRIORITIES.md` and the project READMEs say the user is trying to move forward, even when nobody has asked. A proactive card's `opening_move` is the first step they could take today.
|
|
59
|
+
|
|
60
|
+
## Write for an executive
|
|
61
|
+
|
|
62
|
+
Every item answers, in a few seconds: what changed, why it matters now, what happens next.
|
|
63
|
+
|
|
64
|
+
- `title`: the outcome, risk or decision in at most eight words. Keep ids and status lists out of it.
|
|
65
|
+
- `why`: one short sentence on urgency or impact.
|
|
66
|
+
- `situation`: at most two short sentences of decision-relevant facts. No research narration.
|
|
67
|
+
- `opening_move`: one direct recommendation: what should happen.
|
|
68
|
+
- `action_owner`: `assistant` when the board can prepare, draft or investigate the next step; `user` only when they must personally decide, speak, approve or send.
|
|
69
|
+
- `action_label`: a specific two-to-four-word imperative ("Draft reply", "Help me decide"). Never "Go" or "Open".
|
|
70
|
+
|
|
71
|
+
Do not repeat the same fact across `title`, `why` and `situation`.
|
|
72
|
+
|
|
73
|
+
## Novelty and identity
|
|
74
|
+
|
|
75
|
+
- `new` is true when an item is materially new since you last surfaced it. Update `seen.json` with what you surfaced and when. If nothing material changed on an item they saw, keep `new` false or drop it.
|
|
76
|
+
- `id` (exactly `id`, never `item_id`) names one distinct reason for attention. Keep it stable while that reason stays open, through rewording, status changes and deferral.
|
|
77
|
+
- `project_ref` is the one canonical `projects/<slug>` when the topic truly belongs to a project. Verify the README exists and read it. It is context only: several items can share a project and never group.
|
|
78
|
+
|
|
79
|
+
## Output
|
|
80
|
+
|
|
81
|
+
Wrap the final output in `<task-output>` as one JSON line with `summary`, `status` and `details`. `status` is exactly `"success"` (including an empty board) or `"error"` (the pass failed).
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"items": [ /* board-contract items */ ],
|
|
86
|
+
"done_today": [ { "text": "<what the user handled out of band>", "at": "<iso8601>" } ],
|
|
87
|
+
"merges": { "<duplicate-id>": "<kept-id>" }
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Item fields and link rules: [references/board-contract.md](references/board-contract.md). Almost every item carries a link from a tool response or workspace doc read this pass; never build a URL from an id. An empty board is `items: []` with summary "You're clear."
|
|
92
|
+
|
|
93
|
+
## Related
|
|
94
|
+
|
|
95
|
+
| Link | Relationship |
|
|
96
|
+
|------|--------------|
|
|
97
|
+
| [[actor]] | Acts on a card when the user opens it |
|
|
98
|
+
| [[sender]] | Performs an action the user approved |
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Assistant board contract
|
|
2
|
+
|
|
3
|
+
The shape every scheduled skill uses to put cards on the Assistant board. The `assistant` conductor owns judgement; this file owns the **shape**, so sensors do not drift.
|
|
4
|
+
|
|
5
|
+
## Envelope
|
|
6
|
+
|
|
7
|
+
Finish with exactly one parseable line, no fenced wrapper:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
<task-output>{"summary":"<one line>","status":"success"|"error","details":{...}}</task-output>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- `status: "error"` only when the pass itself failed (auth, unreadable workspace).
|
|
14
|
+
- A quiet run with nothing for the user is `status: "success"` with `details.items: []`.
|
|
15
|
+
|
|
16
|
+
## `details.items`
|
|
17
|
+
|
|
18
|
+
Any scheduled skill may return board-shaped dicts in `details.items`; the board merges every task's latest output by exact `id`. Two skills land on one card only with the **same** id, so read the board first (see **Updating an existing card**).
|
|
19
|
+
|
|
20
|
+
| Field | Required | Notes |
|
|
21
|
+
|-------|----------|-------|
|
|
22
|
+
| `id` | yes | Stable slug while the same reason for attention stays open. For a chat thread: `<source-prefix>-<threadRootId>`, no topic words, so every skill that sees the thread lands on one card. Other sources use their own stable key (`incident-<slug>`, `proj-1234-<topic>`). |
|
|
23
|
+
| `project_ref` | yes | Canonical `projects/<slug>` after reading that README, or `null`. |
|
|
24
|
+
| `title` | yes | Outcome, risk or decision in at most eight words. Plain text. |
|
|
25
|
+
| `why` | yes | One short sentence on urgency or impact. Markdown OK. |
|
|
26
|
+
| `situation` | yes | At most two short decision-relevant sentences. Markdown OK. |
|
|
27
|
+
| `opening_move` | yes | One direct recommendation. Markdown OK. |
|
|
28
|
+
| `action_owner` | yes | `assistant` when the board can prepare, draft or investigate; `user` when the user must decide, approve or send. |
|
|
29
|
+
| `action_label` | yes | Specific two-to-four-word imperative. Never "Go" or "Open". |
|
|
30
|
+
| `action_type` | yes | One of `teams` (any chat message), `jira` (any ticket), `email`, `standup`, `meeting`, `document`, `review`, `decision`, `task`. |
|
|
31
|
+
| `links` | yes | 0-3 http(s) CTAs from tool responses or workspace docs read this pass. Never invent or hand-build URLs. |
|
|
32
|
+
| `documents` | optional | Workspace Markdown read or written this pass: `[{"label":"Open draft","path":"drafts/foo.md"}]`. |
|
|
33
|
+
| `new` | yes | `true` if materially new this pass. |
|
|
34
|
+
|
|
35
|
+
### Links
|
|
36
|
+
|
|
37
|
+
- Every chat-sourced item carries the thread link returned by the read that surfaced it. Prefer the thread root over a reply deep link.
|
|
38
|
+
- Copy permalinks verbatim; never assemble one from ids.
|
|
39
|
+
- Labels stay short: "Open thread", "PROJ-8769", "Open board".
|
|
40
|
+
|
|
41
|
+
## Channel ownership
|
|
42
|
+
|
|
43
|
+
Give each chat source one owning sensor and one id prefix, and record the table in `TOOLS.md`. Any skill may add or refine a card for a thread, but it uses the owning prefix so it lands on the same card. Within one skill, keep one id per open thread; when the situation sharpens, set `new: true` and update the copy instead of minting a new id.
|
|
44
|
+
|
|
45
|
+
## Still the user's?
|
|
46
|
+
|
|
47
|
+
Before returning a new card, or re-returning an open one, check the live source this pass. Drop the item if it is handled:
|
|
48
|
+
|
|
49
|
+
| Source | Handled when |
|
|
50
|
+
|--------|--------------|
|
|
51
|
+
| Chat thread | the user replied substantively after the ask, or a colleague answered and they were not mentioned again |
|
|
52
|
+
| Ticket | reassigned away from them, resolved, or past the state that needed them |
|
|
53
|
+
| PR | merged, closed or already approved by them |
|
|
54
|
+
| Deadline or meeting | passed |
|
|
55
|
+
|
|
56
|
+
When unsure, drop it. `handled.json` removes dismissed episodes; it does not replace the live check.
|
|
57
|
+
|
|
58
|
+
## Updating an existing card
|
|
59
|
+
|
|
60
|
+
Read what is already on the board before minting:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
curl -s "http://127.0.0.1:${GILLIE_PORT:-6177}/api/board" | jq '.document.items[] | {id, title, situation}'
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
If the runner is unreachable, read `last_output.details.items` across `.gillie/state/cache/*.json`.
|
|
67
|
+
|
|
68
|
+
- **Same subject already on the board:** return an item with that card's `id` and only the fields you improve, each rewritten in full. Links and documents you add are combined with the card's.
|
|
69
|
+
- **The newest run wins per field.** Fields you omit stay as they are. `new: true` only for a material update.
|
|
70
|
+
- **A refinement needs a live card.** An item without a `title` whose id is not on the board is dropped.
|
|
71
|
+
- **Different reason, different card:** a win on a thread that also carries an action is its own episode.
|
|
72
|
+
|
|
73
|
+
Different ids for the same topic are caught by the conductor, which folds them and returns `details.merges`. Keep returning your id; it refines the kept card from then on.
|
|
74
|
+
|
|
75
|
+
## Extra `details` keys
|
|
76
|
+
|
|
77
|
+
A skill may add top-level `details` keys next to `items`, for example `draft` (a workspace path the board offers as "Open draft"). The conductor adds `done_today` and `merges`.
|
|
78
|
+
|
|
79
|
+
## Tool parity
|
|
80
|
+
|
|
81
|
+
Scheduled and chat runs are headless. OAuth-backed MCP servers may report `needsAuth` there even when they work interactively. Say the server needs sign-in in this runtime and ask the user for the content; never report the page as missing.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chat-ideas
|
|
3
|
+
description: Write the ideas a new Assistant chat offers, from this workspace's priorities, projects and tools, to `.gillie/state/assistant/chat-ideas.json`. Use on its schedule, or when the user asks to refresh their chat ideas.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Chat ideas
|
|
7
|
+
|
|
8
|
+
Write six ideas for the user to click when they start a new chat. They stay up for a week, so each must still make sense in a week.
|
|
9
|
+
|
|
10
|
+
Read `PROFILE.md`, `PRIORITIES.md`, the `projects/*/README.md` titles and statuses, `TOOLS.md` and `.gillie/tasks.yaml`. Nothing else, and never `private/` or secrets.
|
|
11
|
+
|
|
12
|
+
Each idea is one sentence the user could send as-is, under 120 characters, in their language variant:
|
|
13
|
+
|
|
14
|
+
- **Durable.** Name standing things - a priority, an active project, a connected tool - never a date, a deadline, a ticket, a meeting, a count or anything that changes day to day.
|
|
15
|
+
- **Varied.** One or two of each `kind`: `focus`, `project`, `tool`, `remember`, `build`, `learn`.
|
|
16
|
+
- **Doable.** Only what Gillie does: read, draft (sent only on approval), remember, remind, and build pages, skills and workers.
|
|
17
|
+
|
|
18
|
+
A near-empty workspace gets setup ideas ("Help me write down my priorities", "Connect the tools I use").
|
|
19
|
+
|
|
20
|
+
Replace the file:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{"generated": "<now, ISO 8601 with timezone>", "ideas": [{"kind": "focus", "text": "What should I focus on this week, given my priorities?"}]}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Return `details: {"count": N}` and no board items.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: connectors
|
|
3
|
+
description: Connect a tool (Teams, Slack, Jira, Confluence, Google Workspace, Outlook, Notion, GitHub, Snowflake and others) to this Gillie workspace - install its CLI or MCP server with the user's approval, add a sign-in check and write denials to .gillie/connectors.yaml, and record how to use it in TOOLS.md. Use when the user asks to connect, add, set up or fix a tool, when a task needs a tool that is missing, or when a connector shows as signed out.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Connectors
|
|
7
|
+
|
|
8
|
+
A connector is everything Gillie needs to use one tool safely:
|
|
9
|
+
|
|
10
|
+
1. **Access** - a CLI or MCP server the agent can call.
|
|
11
|
+
2. **A sign-in check** - a cheap read-only command in `.gillie/connectors.yaml`. A task that lists the connector in `requires:` runs it just before starting, and waits as `blocked` (showing the `login` command) instead of spending a model run that would fail.
|
|
12
|
+
3. **Write denials** - the tool's write commands, listed under `deny`, so no unattended run can use them. Writes only happen through the approval card and the `sender` skill.
|
|
13
|
+
4. **Know-how** - a `TOOLS.md` entry: what the tool is for here, how to reach it, the check, and its quirks.
|
|
14
|
+
|
|
15
|
+
The catalogue in `references/` has a file per known tool. Use it as the starting point, verify against the tool's current documentation, and never invent a command.
|
|
16
|
+
|
|
17
|
+
## Connecting a tool
|
|
18
|
+
|
|
19
|
+
1. **Find the catalogue entry** in `references/<tool>.md`. Entries marked *organisation-specific* apply only when their CLI is already on the machine (`command -v <cli>`); never offer them otherwise. No entry? Research the tool's official CLI or MCP server and follow the same shape.
|
|
20
|
+
2. **Check what is already there**: `command -v <cli>`, `.mcp.json`, `claude mcp list`. Prefer what the user already has.
|
|
21
|
+
3. **Install only with approval.** Show the exact install command and where it comes from, and wait for a yes. One install per approval.
|
|
22
|
+
4. **Sign in.** Interactive sign-in is the user's to do: give them the command and wait. Never handle passwords or tokens yourself, and never print them.
|
|
23
|
+
5. **Add the connector** to `.gillie/connectors.yaml`:
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
connectors:
|
|
27
|
+
- id: github # lower-case; tasks use it in `requires: [github]`
|
|
28
|
+
name: GitHub
|
|
29
|
+
check: gh auth status # read-only; exit 0 means signed in
|
|
30
|
+
login: gh auth login # what the user runs when it fails
|
|
31
|
+
deny: # command prefixes unattended runs may never use
|
|
32
|
+
- gh pr create
|
|
33
|
+
- gh issue create
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
With JSON output, `expect` and `reject` read fields instead of the exit code (`expect: {authenticated: true}`, dotted paths allowed). Changes apply without a restart.
|
|
37
|
+
6. **Run the check** yourself and confirm it passes.
|
|
38
|
+
7. **Write the `TOOLS.md` entry**: one paragraph with purpose, route, check and known quirks.
|
|
39
|
+
8. **Wire the tasks** that need it with `requires: [<id>]` in `.gillie/tasks.yaml`, and suggest a watcher skill if the user wants the tool on their board.
|
|
40
|
+
|
|
41
|
+
## Read versus write
|
|
42
|
+
|
|
43
|
+
MCP tools are classified by name: a hook allows read-shaped tools and blocks names containing `create`, `update`, `delete`, `move`, `duplicate`, `send`, `post`, `comment`, `trigger` or `deploy`. A CLI has no such convention, so its writes must be listed under `deny`. When unsure whether a command writes, deny it.
|
|
44
|
+
|
|
45
|
+
## Fixing a signed-out connector
|
|
46
|
+
|
|
47
|
+
A task waiting on a sign-in shows `blocked` on the Workers page with the connector and its `login` command. Run the connector's `check` to see the error, have the user sign in, then Run now on the task. A check that errors (the command itself broke) never blocks tasks: fix the command rather than the sign-in.
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
| Link | Relationship |
|
|
52
|
+
|------|--------------|
|
|
53
|
+
| [[setup]] | Connects the user's tools during first-run setup |
|
|
54
|
+
| [[sender]] | The only path for approved writes |
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Confluence
|
|
2
|
+
|
|
3
|
+
- **Access:** Atlassian's hosted MCP server (shared with Jira) or a Confluence CLI the organisation provides.
|
|
4
|
+
- **Sign-in:** OAuth on first use.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: confluence
|
|
8
|
+
name: Confluence
|
|
9
|
+
check: <cli> user me
|
|
10
|
+
deny: [<cli> page create, <cli> page update, <cli> page delete, <cli> comment]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- **Quirks:** on large Cloud sites full-text CQL (`text ~`) is swamped by migrated attachments; search by `title ~ "..."` first. Record the spaces that matter in `TOOLS.md`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# GitHub
|
|
2
|
+
|
|
3
|
+
- **Access:** the `gh` CLI (https://cli.github.com). An enterprise host needs `GH_HOST=<host>` or `--hostname`; `gh` defaults to github.com and fails with "could not resolve to a Repository" otherwise.
|
|
4
|
+
- **Install:** `brew install gh` (macOS) or the package for the platform.
|
|
5
|
+
- **Sign-in:** `gh auth login` (add `--hostname <host>` for enterprise).
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
- id: github
|
|
9
|
+
name: GitHub
|
|
10
|
+
check: gh auth status
|
|
11
|
+
login: gh auth login
|
|
12
|
+
deny: [gh pr create, gh pr merge, gh pr comment, gh pr review, gh issue create, gh issue comment, gh issue close, gh workflow run, gh release create, gh repo create, gh api -X]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- **Quirks:** `gh api` defaults to GET; any `-X`/`--method` other than GET is a write. Record local checkout paths in `TOOLS.md` so skills can read code for verification.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Google Workspace (Docs, Drive, Calendar, Gmail)
|
|
2
|
+
|
|
3
|
+
- **Access:** a Google Workspace MCP server or CLI. Many organisations provide one; otherwise use Google's current official option. OAuth client files live in the tool's own config directory.
|
|
4
|
+
- **Sign-in:** OAuth in the browser on first use.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: google
|
|
8
|
+
name: Google Workspace
|
|
9
|
+
check: <cli> search recent --limit 1
|
|
10
|
+
deny: [<cli> create, <cli> update, <cli> share, <cli> delete, <cli> send]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- **Record in TOOLS.md:** shared docs the user writes in regularly (a weekly update doc, team notes) with their URLs and due days.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Jira
|
|
2
|
+
|
|
3
|
+
- **Access:** Atlassian's hosted MCP server (Jira and Confluence, OAuth sign-in) or a Jira CLI the organisation provides. Check the vendor's current docs for the server URL before adding it to `.mcp.json`.
|
|
4
|
+
- **Sign-in:** OAuth through the MCP client on first use, or the CLI's own login.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: jira
|
|
8
|
+
name: Jira
|
|
9
|
+
check: <cli> user me # any cheap authenticated read
|
|
10
|
+
deny: [<cli> issue create, <cli> issue update, <cli> issue transition, <cli> comment]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- **Record in TOOLS.md:** the site URL, the projects that matter, labels or boards that identify the user's team, and any field every new ticket needs (an owning team, a component). The `sender` skill refuses a create that lacks a required field.
|
|
14
|
+
- **Quirks:** always include the ticket link when mentioning a ticket. Never bulk-close tickets. Cloud descriptions are Markdown through most CLIs and ADF through the REST API; wiki markup renders literally.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Microsoft Teams via `msteams` (organisation-specific)
|
|
2
|
+
|
|
3
|
+
Offer this only when `command -v msteams` succeeds: the CLI is distributed inside some organisations and rides the user's own browser session, so it cannot run unattended on a server.
|
|
4
|
+
|
|
5
|
+
- **Access:** `msteams <tool> ... --json` prints the payload directly; redirect it to a file, because piped output can be cut off at 64 KB. Parameters are camelCase; `msteams help <command>` lists flags.
|
|
6
|
+
- **Sign-in:** `msteams login` (interactive). `teams_get_me` answers from a cached profile, so it is not a sign-in check. The messaging token lapses on its own while the session is still good, and the CLI usually recovers it with a headless re-login; gating on `messaging.available` held every Teams task back for hours. Leave it out of `expect`, and have each Teams skill run `msteams login` once and retry when a read fails on sign-in, asking the user only if that fails. A `fetch failed` from search is a search outage, not a sign-in failure: fall back to thread reads.
|
|
7
|
+
|
|
8
|
+
```yaml
|
|
9
|
+
- id: teams
|
|
10
|
+
name: Microsoft Teams
|
|
11
|
+
check: msteams teams_status --json
|
|
12
|
+
# messaging.available is left out on purpose: see Sign-in
|
|
13
|
+
expect: {success: true, directApi.available: true}
|
|
14
|
+
reject: {session.likelyExpired: true}
|
|
15
|
+
login: msteams login
|
|
16
|
+
deny:
|
|
17
|
+
- msteams send
|
|
18
|
+
- msteams teams_send_message
|
|
19
|
+
- msteams teams_edit_message
|
|
20
|
+
- msteams teams_delete_message
|
|
21
|
+
- msteams teams_add_reaction
|
|
22
|
+
- msteams teams_remove_reaction
|
|
23
|
+
- msteams teams_create_group_chat
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- **Quirks:** copy `messageLink` verbatim; channel and chat permalinks differ and a hand-built one does not open. Thread reads use `--limit` and `--since`; search pages use `--from` and `--size`; results are newest first. Markdown tables do not render in Teams chats; send `--contentType html` with a `<table>` instead. Do not copy message bodies into tracked workspace docs: record what was learned, with the `messageLink`.
|
|
27
|
+
- **Pre-check for a self-chat watcher:** a task polling the user's note-to-self chat can skip unchanged polls with `precheck:` set to a small script that compares the newest message id with the skill's watermark and exits 1 when nothing is new.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Notion
|
|
2
|
+
|
|
3
|
+
- **Access:** Notion's hosted MCP server, `https://mcp.notion.com/mcp` (Streamable HTTP, OAuth). There is no official CLI. `claude mcp add --transport http notion https://mcp.notion.com/mcp`, then authenticate once with `/mcp`.
|
|
4
|
+
- **Check:** none from the shell; leave `check` out and use the connector entry for `deny` only. A headless run may report `needsAuth` even when interactive sessions work: say so and ask for the content rather than reporting a page missing.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: notion
|
|
8
|
+
name: Notion
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
- **Record in TOOLS.md:** the ids of databases the user relies on (a task list, a reading list) and their columns. If Notion holds the user's tasks, say so: the workspace never mirrors a task list.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Outlook and Microsoft 365 mail and calendar
|
|
2
|
+
|
|
3
|
+
- **Access:** a Microsoft 365 connector or MCP server. Organisations often approve read tools and require admin approval for writes.
|
|
4
|
+
- **Sign-in:** Microsoft SSO on first use.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: outlook
|
|
8
|
+
name: Outlook
|
|
9
|
+
check: <cli> mail search --limit 1
|
|
10
|
+
deny: [<cli> mail send, <cli> mail reply, <cli> event create, <cli> event update]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- **Quirks:** where write tools are refused by policy, the `sender` cannot apply an approved change; give the user the exact text to apply themselves.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Slack
|
|
2
|
+
|
|
3
|
+
- **Access:** a Slack MCP server or CLI. Prefer one the workspace admin has approved; check Slack's current developer docs for the official option.
|
|
4
|
+
- **Sign-in:** a user or bot token issued by the workspace admin, stored in the MCP server's own config or `.env`, never in a skill or doc.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: slack
|
|
8
|
+
name: Slack
|
|
9
|
+
check: <cli> auth test # or an MCP-backed read via a small script
|
|
10
|
+
deny: [<cli> chat post, <cli> chat update, <cli> chat delete, <cli> reactions add]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- **Record in TOOLS.md:** the channels that matter and which watcher owns each (board id prefix), how threads are permalinked, and paging/timestamp rules.
|
|
14
|
+
- **Quirks:** posts the assistant sends end with `[AI]`. Message timestamps (`ts`) double as ids; sort by them before reading.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Snowflake
|
|
2
|
+
|
|
3
|
+
- **Access:** the Snowflake CLI, `snow` (https://docs.snowflake.com/developer-guide/snowflake-cli). Connections live in `~/.snowflake/config.toml`.
|
|
4
|
+
- **Sign-in:** usually browser SSO (`authenticator = "externalbrowser"`) or key-pair auth configured by the user.
|
|
5
|
+
|
|
6
|
+
```yaml
|
|
7
|
+
- id: snowflake
|
|
8
|
+
name: Snowflake
|
|
9
|
+
check: snow connection test
|
|
10
|
+
deny: [snow object create, snow object drop, snow stage copy]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- **Writes through SQL** cannot be caught by a command prefix, so give the connection a **read-only role**; that is the real guard.
|
|
14
|
+
- **Quirks:** keep queries bounded (`LIMIT`); name the warehouse and role in `TOOLS.md`. Record which schemas are canonical for which questions in a domain skill, not in `TOOLS.md`.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# YellowPages service directory (organisation-specific)
|
|
2
|
+
|
|
3
|
+
Offer this only when `command -v yellowpages` succeeds.
|
|
4
|
+
|
|
5
|
+
- **Access:** `yellowpages --agent --fields <allowlist> ...` with an explicit, safe field allowlist.
|
|
6
|
+
- **Never use `--concise`:** service and team payloads can include credential fields.
|
|
7
|
+
- Read-only; no connector `deny` list is needed. Add a `check` only if a task depends on it.
|