@drawbridge/drawbridge-agents 0.1.35 → 0.1.37

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.
@@ -35,6 +35,24 @@
35
35
  "../drawbridge-website"
36
36
  ]
37
37
  },
38
+ "extraKnownMarketplaces": {
39
+ "ponytail": {
40
+ "source": {
41
+ "source": "github",
42
+ "repo": "DietrichGebert/ponytail"
43
+ }
44
+ },
45
+ "humanizer": {
46
+ "source": {
47
+ "source": "github",
48
+ "repo": "blader/humanizer"
49
+ }
50
+ }
51
+ },
52
+ "enabledPlugins": {
53
+ "ponytail@ponytail": true,
54
+ "humanizer@humanizer": true
55
+ },
38
56
  "hooks": {
39
57
  "PreToolUse": [
40
58
  {
@@ -40,14 +40,23 @@ need to retest. Use this right after merging the work to `develop` (which deploy
40
40
  **Open with an @-mention of the reassignee** — use `html_text` and start the body with
41
41
  `<a data-asana-gid="<their user gid>"/>` (Asana expands it into a proper mention). A
42
42
  comment without a mention may notify no one; reassignment alone is easy to miss.
43
- 4. **Confirm before writing.** This posts to an external system. Show the user the chosen
43
+ 4. **Run the draft through `humanizer`.** A real teammate reads this, and generated-sounding
44
+ prose reads as effort nobody spent. Invoke the `humanizer` skill on the drafted body: it
45
+ strips the AI tells — inflated claims, hedging, stock transitions, "it's worth noting",
46
+ restating the ask twice.
47
+
48
+ It pulls in the same direction as the word limit above, so apply it *before* the final
49
+ trim and re-check the result against both rules. Two things it must not touch: the
50
+ `<a data-asana-gid="..."/>` mention (leave the markup exactly as-is) and any concrete
51
+ detail from the Retest steps — if a pass makes the steps vaguer, keep the original wording.
52
+ 5. **Confirm before writing.** This posts to an external system. Show the user the chosen
44
53
  assignee and the drafted comment and get a go-ahead, unless they've told you to proceed
45
54
  without asking.
46
- 5. **Apply** (on approval):
55
+ 6. **Apply** (on approval):
47
56
  - `asana_update_task` — set `assignee` to the last commenter's gid and `due_at` to the
48
57
  current date/time (ISO 8601).
49
58
  - `asana_create_task_story` — post the comment.
50
- 6. **Report** the task URL, who it was assigned to, and confirm the due date was updated.
59
+ 7. **Report** the task URL, who it was assigned to, and confirm the due date was updated.
51
60
 
52
61
  ## Notes
53
62
 
@@ -14,13 +14,22 @@ knowledge graph, and the Asana handoff so nothing drifts at ship time.
14
14
  1. **Verify it works.** Run the project's verification (the `verify` skill / build / lint /
15
15
  manual smoke — there's no unit-test framework in api/sync/app-web). Confirm the behaviour
16
16
  end-to-end, not just that it compiles.
17
- 2. **Reconcile the spec.** Find the matching `drawbridge-docs` user story by its
17
+ 2. **Review the diff for over-engineering.** Invoke the `ponytail-review` skill on the change
18
+ before it merges. It reports one line per finding — reinvented stdlib, a dependency that
19
+ wasn't needed, a speculative abstraction, flexibility nothing calls. Act on what's real and
20
+ say why you're keeping anything you skip; a finding that survives review deliberately is
21
+ fine, one that survives because nobody looked is how the family accretes code. This is the
22
+ cheapest point to cut it — after merge it's someone else's inheritance.
23
+
24
+ Ponytail's baseline is already ambient (a SessionStart hook applies it at `full` intensity
25
+ family-wide), so this step is the explicit diff pass, not the switch that turns it on.
26
+ 3. **Reconcile the spec.** Find the matching `drawbridge-docs` user story by its
18
27
  `<domain>/<slug>` ID (or the relevant `reference/` doc). If behaviour changed, update the
19
28
  story in the same change (use `write-user-stories` for a new/edited story). If you can't,
20
29
  flag the drift explicitly. See `conventions/docs-linkage.md`.
21
- 3. **Confirm doc anchors resolve.** Run `npx drawbridge-agents-check-docs`; fix any unresolved
30
+ 4. **Confirm doc anchors resolve.** Run `npx drawbridge-agents-check-docs`; fix any unresolved
22
31
  `@story` / `@doc` tag. Add an anchor to newly-added feature code where it maps to a story.
23
- 4. **Refresh the knowledge graph — always, on every feature wrap** (not conditional on whether
32
+ 5. **Refresh the knowledge graph — always, on every feature wrap** (not conditional on whether
24
33
  structure "obviously" changed). The canonical graph is the committed snapshot in
25
34
  `drawbridge-docs`, shared by the whole team; skipping it lets the shared graph drift. From the
26
35
  `drawbridge-docs` repo: `npx drawbridge-agents-graph` (rebuilds `knowledge/graphs/global.json`
@@ -28,9 +37,9 @@ knowledge graph, and the Asana handoff so nothing drifts at ship time.
28
37
  knowledge graph (<feature>)" && git push origin main`. If it reports "graphify runtime not
29
38
  found", the `uv`/`graphify` binaries are in `~/.local/bin` — `export PATH="$HOME/.local/bin:$PATH"`
30
39
  and retry (do NOT run `graphify install`; it rewrites `CLAUDE.md`).
31
- 5. **Hand off the task.** Invoke `drawbridge-asana-ship-handoff` with the Asana task to reassign
40
+ 6. **Hand off the task.** Invoke `drawbridge-asana-ship-handoff` with the Asana task to reassign
32
41
  to the last commenter, post the change summary + retest steps, and set the due date.
33
- 6. **Clear the worktree.** If the feature was built in a git worktree (a sibling directory or a
42
+ 7. **Clear the worktree.** If the feature was built in a git worktree (a sibling directory or a
34
43
  `.worktrees/` folder), remove it now that the branch is merged: from the main checkout,
35
44
  `git worktree remove <path>` then `git worktree prune`. If the removal complains about
36
45
  uncommitted changes, inspect them first — add `--force` only once you've confirmed the dirt
@@ -39,6 +48,6 @@ knowledge graph, and the Asana handoff so nothing drifts at ship time.
39
48
 
40
49
  ## Notes
41
50
 
42
- - Steps 24 are what the drift-check Stop hook enforces; running them here means you won't get
51
+ - Steps 35 are what the drift-check Stop hook enforces; running them here means you won't get
43
52
  blocked at turn end.
44
53
  - "Shipped" in this family means merged to `develop` (that's the deployed dev environment).
package/README.md CHANGED
@@ -20,7 +20,8 @@ claude/
20
20
  CLAUDE.md ← aggregator — @-imports every conventions/*.md
21
21
 
22
22
  .claude-template/ ← the complete shared .claude/, mirrored into each consumer repo
23
- settings.json ← permissions, additionalDirectories, drift-check Stop hook
23
+ settings.json ← permissions, additionalDirectories, drift-check Stop hook,
24
+ family-wide plugin marketplaces + enabledPlugins
24
25
  skills/ ← shared skills (drawbridge-ship-feature, -asana-ship-handoff, ...)
25
26
  hooks/ agents/ commands/
26
27
 
@@ -48,6 +48,15 @@ skill) so it stops living only in tribal memory.
48
48
  `ads-republishing.<connectionId>`). Never unique-index `coalesce` (superseding requires the
49
49
  second insert to land), and writes that set `key` need the writer-side E11000 handler or a
50
50
  replayed event logs a false error.
51
+ - **Adding an email/SMS vendor is a two-repo change** (api ↔ sync). A connection is deliverable
52
+ only if sync implements a sender for its slug — `lib/email.js` (`{ mailchimp, sendgrid }`) and
53
+ `lib/sms.js` (`{ twilio }`), which `queue/notification.js` reads **directly** as its guard and
54
+ org-scoped lookup; never re-list the slugs as literals, or the guard drifts from the senders
55
+ that exist. Adding a vendor to drawbridge-api `lib/connections.js` with `group : 'email'`/`'sms'`
56
+ makes it selectable throughout api and app-web, but with no sync sender every send is
57
+ cancelled, not delivered — merchant sees a workflow that ran and no message. The miss is
58
+ detectable, not silent: `notification.reason = 'connection-slug-mismatch'` plus an
59
+ Error-instance `logger.error` (a string never reaches Sentry Issues — see `sentry-sdk.md`).
51
60
  - Schema-gated fields ship **api-first, booted**: a sibling writer setting a field new to a
52
61
  drawbridge-api `$jsonSchema` (validators are strict + `additionalProperties: false`) must not
53
62
  go live until the api has **booted** with the schema change on that environment — creating the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drawbridge/drawbridge-agents",
3
- "version": "0.1.35",
3
+ "version": "0.1.37",
4
4
  "description": "Shared agent-instruction content (rules, code style, conventions) for the drawbridge-* monorepo.",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {