@hegemonart/get-design-done 1.35.2 → 1.35.3

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.
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "metadata": {
7
7
  "description": "Get Design Done — 5-stage agent-orchestrated design pipeline with 9 connections, handoff-first workflow, bidirectional Figma write-back, 22+ specialized agents, queryable knowledge layer (intel store, dependency analysis, learnings extraction), and a self-improvement loop (reflector, frontmatter + budget feedback, global-skills layer). v1.20.0 ships the SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream, and resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) for rate-limit + 429 + context-overflow recovery. Full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows) and release automation (auto-tag + GitHub Release + release-time smoke test).",
8
- "version": "1.35.2"
8
+ "version": "1.35.3"
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "get-design-done",
13
13
  "source": "./",
14
14
  "description": "Agent-orchestrated 5-stage design pipeline: Brief → Explore → Plan → Design → Verify. 22+ specialized agents, 9 connections (Figma, Refero, Preview, Storybook, Chromatic, Figma Writer, Graphify, Pinterest, Claude Design), Claude Design handoff, bidirectional Figma write-back, and a queryable intel store (.design/intel/) for dependency and learnings queries. Standalone commands: style, darkmode, compare, figma-write, graphify, handoff, analyze-dependencies, skill-manifest, extract-learnings. Embeds NNG heuristics, WCAG thresholds, typographic systems, motion framework, and anti-pattern catalog. Ships with a full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows) and release automation. Optimization layer (v1.0.4.1, retroactive): gdd-router + gdd-cache-manager skills, PreToolUse budget-enforcer hook, tier-aware agent frontmatter, lazy checker gates, streaming synthesizer, /gdd:warm-cache + /gdd:optimize commands, and cost telemetry at .design/telemetry/costs.jsonl — targeting 50-70% per-task token-cost reduction with no quality-floor regression. v1.20.0 SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream at .design/telemetry/events.jsonl, resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) with rate-limit + 429 + context-overflow recovery, and TypeScript toolchain.",
15
- "version": "1.35.2",
15
+ "version": "1.35.3",
16
16
  "author": {
17
17
  "name": "hegemonart"
18
18
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "get-design-done",
3
3
  "short_name": "gdd",
4
- "version": "1.35.2",
4
+ "version": "1.35.3",
5
5
  "description": "Agent-orchestrated 5-stage design pipeline: Brief → Explore → Plan → Design → Verify. 22+ specialized agents, 9 connections (Figma, Refero, Preview, Storybook, Chromatic, Figma Writer, Graphify, Pinterest, Claude Design), handoff-first workflow via Claude Design bundles, bidirectional Figma write-back (annotations, Code Connect), queryable intel store (`.design/intel/`) for O(1) design surface lookups, and self-improvement loop (reflector agent, frontmatter + budget feedback, global-skills layer at `~/.claude/gdd/global-skills/`). Standalone commands: style, darkmode, compare, figma-write, graphify, handoff, analyze-dependencies, skill-manifest, extract-learnings, reflect, apply-reflections. Embeds NNG heuristics, WCAG thresholds, typographic systems, motion framework, and anti-pattern catalog. Ships with a full CI/CD pipeline (Node 22/24 × Linux/macOS/Windows, lint + schema + frontmatter + stale-ref + shellcheck + gitleaks + injection-scan + blocking size-budget) and release automation (auto-tag + GitHub Release + release-time smoke test). Optimization layer (v1.0.4.1, retroactive): gdd-router + gdd-cache-manager skills, PreToolUse budget-enforcer hook, tier-aware agent frontmatter, lazy checker gates, streaming synthesizer, /gdd:warm-cache + /gdd:optimize commands, and cost telemetry at .design/telemetry/costs.jsonl — targeting 50-70% per-task token-cost reduction with no quality-floor regression. v1.20.0 SDK foundation: gdd-state MCP server (11 typed tools), lockfile-safe STATE.md mutations, event stream at .design/telemetry/events.jsonl, resilience primitives (jittered-backoff, rate-guard, error-classifier, iteration-budget) with rate-limit + 429 + context-overflow recovery, and TypeScript toolchain. v1.27.7 ships gdd-mcp (Phase 27.7): 12 read-only MCP tools for sub-3s priming. v1.28.0 (Phase 28): Foundational References Tier 2 — 5 new reference files (color-theory, composition, proportion-systems, i18n, contrast-advanced), 2 verifier i18n probes + 1 explore i18n-readiness probe, 12 additive cross-link insertions across 10 existing references, 2 orthogonal audit-scoring lens-tags (composition_alignment + i18n_readiness).",
6
6
  "author": {
7
7
  "name": "hegemonart",
package/CHANGELOG.md CHANGED
@@ -4,6 +4,28 @@ All notable changes to get-design-done are documented here. Versions follow [sem
4
4
 
5
5
  ---
6
6
 
7
+ ## [1.35.3] - 2026-06-01
8
+
9
+ ### Phase 35.3 — Team Surfaces: Ticket Sync (Linear + Jira) — completes Phase 35
10
+
11
+ Third and **FINAL** sub-phase of the split **Phase 35 (Team Surfaces Layer)** — completing it marks the **parent Phase 35 COMPLETE** (PR-inline 35.1 + Notification 35.2 + Ticket-sync 35.3 all shipped). Wires GDD ↔ Linear/Jira bidirectionally: it reads a linked ticket's comments as cycle context (via the decision-injector) and, on cycle completion, transitions the ticket + posts a redacted summary. **MCP-based** (`mcp__linear__*` / `mcp__atlassian__*`) — no bundled SDK, no new outbound egress. Every outbound body is redacted; per-system kill-switches + degrade-to-noop guarantee ticket-sync never gates the cycle.
12
+
13
+ ### Added
14
+
15
+ - **`connections/linear.md` + `connections/jira.md`** — MCP-based bidirectional ticket-sync connections (Linear MCP / Atlassian MCP; ToolSearch probe, redact + kill-switch + degrade-to-noop). Onboarded 16 → 18.
16
+ - **`agents/ticket-sync-agent.md`** — reads linked-ticket comments on `.design/**.md` open (decision-injector), maintains the STATE `<ticket_links>` block, and on cycle completion transitions the ticket + posts a **redacted** summary via the MCP tools. `size_budget: M`, `## Record`; tracker-wins conflict resolution.
17
+ - **`reference/ticket-sync.md`** — the `<ticket_links>` schema + read/write flow + the default status-transition map + redact + kill-switch contract; registered in `reference/registry.json`.
18
+ - **`connections/connections.md`** — a **ticket-sync** capability-matrix column + Linear/Jira rows + ToolSearch probes.
19
+
20
+ ### Notes
21
+
22
+ - **No new runtime dependency** (MCP tools, no Linear/Jira SDK) and **no new egress** (`scan:outbound` unchanged — GDD calls MCP tools, not raw HTTP). Per-system kill-switch `GDD_DISABLE_LINEAR` / `GDD_DISABLE_JIRA`.
23
+ - 6-manifest lockstep at **v1.35.3** + `OFF_CADENCE_VERSIONS.add('1.35.3')` + the 21 live-pinned `manifests-version.txt` baselines forward-propagated 1.35.2 → 1.35.3.
24
+ - The 31.5 tarball golden was regenerated as a reviewed delta: **+4** (`connections/linear.md`, `connections/jira.md`, `agents/ticket-sync-agent.md`, `reference/ticket-sync.md`), zero removals.
25
+ - **This completes the parent Phase 35 (Team Surfaces Layer) — PR inline + notifications + ticket sync.**
26
+
27
+ ---
28
+
7
29
  ## [1.35.2] - 2026-06-01
8
30
 
9
31
  ### Phase 35.2 — Team Surfaces: Notification Backplane (Slack + Discord)
package/README.md CHANGED
@@ -142,6 +142,10 @@ After `/gdd:ship` opens the PR, the [`pr-commenter`](agents/pr-commenter.md) age
142
142
 
143
143
  Routes pipeline events (verify-fail / audit-pass / ship) to **Slack** + **Discord** via incoming webhooks ([`connections/slack.md`](connections/slack.md) / [`connections/discord.md`](connections/discord.md)). The dispatcher ([`scripts/lib/notify/dispatch.cjs`](scripts/lib/notify/dispatch.cjs)) redacts every body at a single chokepoint, honors per-channel kill-switches (`GDD_DISABLE_SLACK` / `GDD_DISABLE_DISCORD`), and degrades to a noop when a webhook URL is unset — notification never blocks the pipeline. **No new runtime dependency** (injectable `fetch`, no Slack/Discord SDK). Routing: [`reference/notification-routing.md`](reference/notification-routing.md).
144
144
 
145
+ ### Team surfaces — Ticket sync (v1.35.3)
146
+
147
+ Links a design cycle to a **Linear** or **Jira** ticket and keeps them in sync ([`connections/linear.md`](connections/linear.md) / [`connections/jira.md`](connections/jira.md), MCP-based). [`agents/ticket-sync-agent.md`](agents/ticket-sync-agent.md) surfaces the linked ticket's comments as context when a design file opens (via the decision-injector) and, on `/gdd:complete-cycle`, transitions the ticket + posts a **redacted** summary. Per-system kill-switches (`GDD_DISABLE_LINEAR` / `GDD_DISABLE_JIRA`); degrade-to-noop (never gates the cycle). **No new runtime dependency, no new egress** (MCP tools only). Contract: [`reference/ticket-sync.md`](reference/ticket-sync.md). **Completes the Team Surfaces layer** (PR inline + notifications + ticket sync).
148
+
145
149
  ### Previous releases
146
150
 
147
151
  - **v1.26.0** — Headless Model Resolver (per-runtime tier→model map, `resolved_models` router field, per-runtime price tables, `reasoning-class` runtime-neutral alias).
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: ticket-sync-agent
3
+ description: Bidirectional Linear/Jira ticket sync (Team Surfaces). Reads a linked ticket's comments as cycle context when a .design/**.md opens (via the decision-injector), and on cycle completion transitions the linked ticket + posts a redacted summary. MCP-based (mcp__linear__* / mcp__atlassian__*); outbound bodies redacted; degrades to a noop when the MCP is absent or disabled.
4
+ tools: Read, Bash, Grep, Glob, ToolSearch
5
+ color: green
6
+ default-tier: sonnet
7
+ tier-rationale: "Mechanical sync of an already-linked ticket via MCP tools; no design judgment — sonnet-tier, not an Opus plan."
8
+ size_budget: M
9
+ size_budget_rationale: "Honest tier sized to the ~150-line body (M cap 300). The agent states the read/write/STATE contract — surface ticket comments, maintain <ticket_links>, transition + summarize on completion, redact, kill-switch, degrade-to-noop — and DELEGATES the <ticket_links> schema + per-system MCP-tool detail to reference/ticket-sync.md + connections/{linear,jira}.md (the email-executor→email-design.md precedent)."
10
+ parallel-safe: false
11
+ typical-duration-seconds: 45
12
+ reads-only: false
13
+ writes:
14
+ - ".design/STATE.md"
15
+ - ".design/intel/insights.jsonl"
16
+ ---
17
+
18
+ @reference/shared-preamble.md
19
+
20
+ # ticket-sync-agent
21
+
22
+ ## Role
23
+
24
+ You keep a GDD design cycle and its linked **Linear/Jira ticket** in sync — the team's tracker reflects design progress without anyone re-typing it. You run on two triggers: (1) **read** — when a `.design/**.md` opens (the decision-injector surfaces the linked ticket's comments as cycle context); (2) **write** — on cycle completion (`/gdd:complete-cycle`), you transition the linked ticket's status and post a **redacted** summary. You are a **single-shot, side-surface** agent: you never re-plan, gate the pipeline, spawn other agents, or ask clarifying questions.
25
+
26
+ You are an **agent-prompt**, not a service: you reach Linear via `mcp__linear__*` and Jira via the Atlassian MCP (`mcp__atlassian__*`) — **ToolSearch-resolved**, no `@linear/sdk`/jira SDK, no raw HTTP from GDD scripts (D-02). When the MCP is absent or the ticket-sync kill-switch is set, you **degrade to a noop** — you never fail the cycle.
27
+
28
+ ---
29
+
30
+ ## Required Reading
31
+
32
+ - `.design/STATE.md` — the `<connections>` block (`linear`/`jira` status) + the `<ticket_links>` block (cycle → ticket map).
33
+ - `.design/DESIGN-VERIFICATION.md` + `.design/DESIGN-AUDIT.md` (write path) — the summary source.
34
+ - **`reference/ticket-sync.md`** — the authoritative `<ticket_links>` STATE schema + the read/write flow + the redact + kill-switch contract. You sync against this; you do not re-derive it.
35
+ - `connections/linear.md` / `connections/jira.md` — the per-system probe + MCP-tool detail.
36
+
37
+ ---
38
+
39
+ ## Kill-switch + degrade (check FIRST)
40
+
41
+ 1. **Kill-switch.** `GDD_DISABLE_LINEAR=1` / `GDD_DISABLE_JIRA=1` (env) OR `.design/config.json` `ticket_sync.<service>.enabled === false` → that system is a noop.
42
+ 2. **Availability.** `ToolSearch({ query: "linear" })` / `ToolSearch({ query: "atlassian jira" })` — empty → `not_configured` → noop for that system. Resolve the exact tool names from the result before any call.
43
+ 3. **Link present.** No `<ticket_links>` entry for this cycle → nothing to sync (read path: nothing to surface; write path: noop). Never error.
44
+
45
+ ---
46
+
47
+ ## Read path (decision-injector — `.design/**.md` open)
48
+
49
+ If the cycle has a `<ticket_links>` entry and the system is `available`: fetch the linked ticket's recent comments (via the resolved MCP tool), and surface them as cycle context (a short, **redacted** digest the decision-injector injects). Do not write anything on the read path.
50
+
51
+ ## Write path (cycle completion)
52
+
53
+ On `/gdd:complete-cycle`, for each linked + available system: transition the ticket status per `reference/ticket-sync.md` (e.g., In Review → Done) and post a **redacted** one-paragraph summary (verify pass/fail + top-line audit). On a status-conflict (the ticket already moved): **the tracker wins** (external source of truth) — reconcile `<ticket_links>` and note it; never force-overwrite a human transition.
54
+
55
+ ## Redaction (mandatory, D-04)
56
+
57
+ Every body written to a ticket (status comment, summary) passes through `scripts/lib/redact.cjs`. No raw artifact excerpt reaches Linear/Jira un-redacted.
58
+
59
+ ---
60
+
61
+ ## Execution Principles
62
+
63
+ 1. **Side surface, not a gate.** Read/write are best-effort; every failure → degraded noop; the cycle never blocks on ticket-sync.
64
+ 2. **Redact everything outbound (D-04).** Single chokepoint.
65
+ 3. **Observable outcomes only.** Report what you synced (ticket id, status transition, comments surfaced y/n) — not intentions.
66
+ 4. **`reference/ticket-sync.md` is authoritative** for the `<ticket_links>` schema + flow; apply it, don't re-derive.
67
+ 5. **Decision authority:** in-context → proceed; out-of-context (architectural, contradicts a locked D-XX, a new external API) → Rule 4: STOP, note it, emit the marker.
68
+ 6. **Single scope.** Touch only `.design/STATE.md` `<ticket_links>` + the record line; no repo files.
69
+
70
+ ---
71
+
72
+ ## Deviation Rules
73
+
74
+ - **Rule 1 — Bug:** a wrong ticket id, an un-redacted body, a malformed `<ticket_links>` write → fix inline.
75
+ - **Rule 2 — Missing Critical:** a linked ticket not transitioned on completion, redact not applied, the comment-surface skipped → add it.
76
+ - **Rule 3 — Blocking:** MCP absent / unauth, no link, kill-switch on → **degrade to noop** (not an error); note it.
77
+ - **Rule 4 — Architectural:** switching off MCP to a bundled SDK, adding a network dependency, auto-creating tickets → STOP, note it, emit the marker.
78
+
79
+ **Fix attempt limit:** 3 attempts per MCP call; then degrade + continue.
80
+
81
+ ---
82
+
83
+ ## Output
84
+
85
+ State: the system(s) synced, the ticket id(s), the status transition (write) or comments surfaced (read), and any degraded-noop reason. Do not modify repo files. Terminate with exactly:
86
+
87
+ ```
88
+ ## EXECUTION COMPLETE
89
+ ```
90
+
91
+ ---
92
+
93
+ ## Constraints
94
+
95
+ This agent MUST NOT:
96
+
97
+ - Run `git clean` (any flags).
98
+ - Fail the cycle — every failure degrades to a noop.
99
+ - Add a Linear/Jira SDK or any network dependency — MCP tools only (D-02).
100
+ - Post any body to a ticket without `scripts/lib/redact.cjs` (D-04).
101
+ - Create or triage tickets (sync an already-linked ticket only — issue creation is Phase 30).
102
+ - Force-overwrite a human status transition (the tracker wins on conflict).
103
+ - Modify the plan/context/connection index or any repo file; re-plan; spawn other agents; ask clarifying questions; or `git add .`/`-A`.
104
+
105
+ ---
106
+
107
+ ## Record
108
+
109
+ At run-end, append one JSONL line to `.design/intel/insights.jsonl`:
110
+
111
+ ```json
112
+ {"ts":"<ISO-8601>","agent":"ticket-sync-agent","cycle":"<cycle from STATE.md>","stage":"<stage from STATE.md>","one_line_insight":"<system(s) synced + ticket id(s) + transition/comments-surfaced + any degraded reason>","artifacts_written":[".design/STATE.md"]}
113
+ ```
114
+
115
+ Schema: `reference/schemas/insight-line.schema.json`.
116
+
117
+ ## EXECUTION COMPLETE
@@ -2,7 +2,7 @@
2
2
 
3
3
  This directory contains connection specifications for external tools and MCPs that the get-design-done pipeline integrates with. Each connection has its own spec file. This file is the index.
4
4
 
5
- **Getting started:** run `/gdd:connections` for the interactive onboarding wizard — it probes all 16 connections, recommends setup based on your project type, and walks you through installing each one (auto-run for reversible MCP adds, copy-command for everything else). You can also run `/gdd:connections list` for a read-only status check or `/gdd:connections <name>` to jump to a single connection's setup.
5
+ **Getting started:** run `/gdd:connections` for the interactive onboarding wizard — it probes all 18 connections, recommends setup based on your project type, and walks you through installing each one (auto-run for reversible MCP adds, copy-command for everything else). You can also run `/gdd:connections list` for a read-only status check or `/gdd:connections <name>` to jump to a single connection's setup.
6
6
 
7
7
  ---
8
8
 
@@ -32,6 +32,8 @@ This directory contains connection specifications for external tools and MCPs th
32
32
  | Mobbin | Active | [`connections/mobbin.md`](connections/mobbin.md) | **Paid** HTTP MCP `claude mcp add mobbin --transport http https://api.mobbin.com/mcp` (ToolSearch-only probe; auto-run-safe, OAuth); discover **Tier 2** — mobile/flow-level (D-01) |
33
33
  | Slack | Active | [`connections/slack.md`](connections/slack.md) | **Notify** (Team Surfaces) — `SLACK_WEBHOOK_URL` incoming webhook; routed+redacted pipeline events; `GDD_DISABLE_SLACK` kill-switch; degrade-to-noop |
34
34
  | Discord | Active | [`connections/discord.md`](connections/discord.md) | **Notify** (Team Surfaces) — `DISCORD_WEBHOOK_URL` channel webhook; parity with Slack; `GDD_DISABLE_DISCORD` kill-switch; degrade-to-noop |
35
+ | Linear | Active | [`connections/linear.md`](connections/linear.md) | **Ticket-sync** (Team Surfaces) — `mcp__linear__*` (ToolSearch probe); bidirectional cycle↔issue; redact + `GDD_DISABLE_LINEAR` kill-switch; degrade-to-noop |
36
+ | Jira | Active | [`connections/jira.md`](connections/jira.md) | **Ticket-sync** (Team Surfaces) — Atlassian MCP `mcp__atlassian__*` (ToolSearch probe); parity with Linear; `GDD_DISABLE_JIRA` kill-switch; degrade-to-noop |
35
37
 
36
38
  ---
37
39
 
@@ -39,30 +41,32 @@ This directory contains connection specifications for external tools and MCPs th
39
41
 
40
42
  Each cell describes what the connection contributes at that pipeline stage, or `—` if it is not used.
41
43
 
42
- | Connection | scan | discover | plan | design | verify | canvas | generator | notify |
43
- |-----------|------|----------|------|--------|--------|--------|-----------|--------|
44
- | gdd-state | STATE mutation (init position, probe_connections, add_decision) | STATE mutation (add_decision, add_must_have, transition gate) | STATE mutation (locked decisions, must_haves, transition gate) | STATE mutation (update_progress, resolve_blocker, transition gate) | STATE mutation (must_have pass/fail, add_blocker, set_status) | — | — | — |
45
- | Figma | token augmentation via `get_variable_defs` (CONN-03) | decisions pre-populate via `get_variable_defs` (CONN-04) | — | write tokens/annotations/Code Connect via `use_figma` (FWR-01..04) | — | — | — | — |
46
- | Refero | — | reference search via `mcp__refero__search`; fallback → awesome-design-md (CONN-05) | — | — | — | — | — | — |
47
- | Preview | — | — | — | — | screenshots for `? VISUAL` checks (VIS-02) | — | — | — |
48
- | Storybook | — | component inventory (STB-01) | change-risk via story count (STB-02) | `.stories.tsx` stub (STB-03) | a11y per story (STB-02) | — | — | — |
49
- | Chromatic | — | — | change-risk scoping (CHR-02) | — | visual delta narration (CHR-01) | — | — | — |
50
- | Graphify | — | — | dependency scoping (GRF-03) | — | orphan detection (GRF-04) | — | — | — |
51
- | Pinterest | probe only | visual reference search via `pinterest_search`; fallback → Refero → awesome-design-md | — | — | — | — | — | — |
52
- | Claude Design | bundle probe → `claude_design: available` | synthesizer handoff mode — parses bundle → D-XX decisions; discussant `--from-handoff` confirms | — (skipped in handoff) | — (skipped in handoff) | Handoff Faithfulness section; bidirectional write-back via figma-writer `implementation-status` mode | — | — | — |
53
- | paper.design | — | canvas read: `get_selection`, `get_jsx`, `get_computed_styles` | — | paper-writer: annotate/tokenize/roundtrip | `get_screenshot` for `? VISUAL` | ✓ | — | — |
54
- | pencil.dev | `.pen` discovery | `.pen` as canonical design source | — | pencil-writer: annotate/roundtrip | spec-vs-impl diff | ✓ | — | — |
55
- | 21st.dev | — | prior-art gate: marketplace search before greenfield build | — | component-generator (21st impl) | — | — | ✓ | — |
56
- | Magic Patterns | — | — | — | component-generator (magic-patterns impl) | preview_url → `? VISUAL` check | — | ✓ | — |
57
- | OpenRouter | — | — | — | — | — | — | ✓ (model-router: tier→model resolution, all stages) | — |
58
- | Xcode Simulator | — | — | — | native iOS code-gen target (swift-executor / emitSwift) | rendered SwiftUI snapshot when simulator available, else degrade to code-only structural audit (D-03) | — | — | — |
59
- | Android Emulator | — | — | — | native Android code-gen target (compose-executor / emitCompose) | rendered Compose screenshot when emulator available, else degrade to code-only structural audit (D-03) | — | — | — |
60
- | Litmus | — | — | — | email render-test target (email-executor) | cross-client rendered evidence when Litmus available, else degrade to the static email-HTML validator / code-only (D-03) | — | — | — |
61
- | Print-Renderer | — | — | — | print render-test target (pdf-executor) | rendered PDF/page evidence when the print-render is available, else degrade to the static print-CSS validator / code-only (D-03) | — | — | — |
62
- | Lazyweb | — | reference search via `lazyweb_search` (**Tier 1 — free, tried first**; D-01); complements refero/pinterest | — | — | — | — | — | — |
63
- | Mobbin | — | reference search via mobbin tools (**Tier 2 — paid, mobile/flow-level**; D-01); complements refero/lazyweb | — | — | — | — | — | — |
64
- | Slack | — | — | — | — | — | — | — | verify-fail/audit-pass/ship → Slack webhook (routed, redacted, degrade-to-noop; D-04/D-05) |
65
- | Discord | — | — | — | — | — | — | — | parity with Slack — events → Discord webhook (routed, redacted, degrade-to-noop) |
44
+ | Connection | scan | discover | plan | design | verify | canvas | generator | notify | ticket-sync |
45
+ |-----------|------|----------|------|--------|--------|--------|-----------|--------|------------|
46
+ | gdd-state | STATE mutation (init position, probe_connections, add_decision) | STATE mutation (add_decision, add_must_have, transition gate) | STATE mutation (locked decisions, must_haves, transition gate) | STATE mutation (update_progress, resolve_blocker, transition gate) | STATE mutation (must_have pass/fail, add_blocker, set_status) | — | — | — | — |
47
+ | Figma | token augmentation via `get_variable_defs` (CONN-03) | decisions pre-populate via `get_variable_defs` (CONN-04) | — | write tokens/annotations/Code Connect via `use_figma` (FWR-01..04) | — | — | — | — | — |
48
+ | Refero | — | reference search via `mcp__refero__search`; fallback → awesome-design-md (CONN-05) | — | — | — | — | — | — | — |
49
+ | Preview | — | — | — | — | screenshots for `? VISUAL` checks (VIS-02) | — | — | — | — |
50
+ | Storybook | — | component inventory (STB-01) | change-risk via story count (STB-02) | `.stories.tsx` stub (STB-03) | a11y per story (STB-02) | — | — | — | — |
51
+ | Chromatic | — | — | change-risk scoping (CHR-02) | — | visual delta narration (CHR-01) | — | — | — | — |
52
+ | Graphify | — | — | dependency scoping (GRF-03) | — | orphan detection (GRF-04) | — | — | — | — |
53
+ | Pinterest | probe only | visual reference search via `pinterest_search`; fallback → Refero → awesome-design-md | — | — | — | — | — | — | — |
54
+ | Claude Design | bundle probe → `claude_design: available` | synthesizer handoff mode — parses bundle → D-XX decisions; discussant `--from-handoff` confirms | — (skipped in handoff) | — (skipped in handoff) | Handoff Faithfulness section; bidirectional write-back via figma-writer `implementation-status` mode | — | — | — | — |
55
+ | paper.design | — | canvas read: `get_selection`, `get_jsx`, `get_computed_styles` | — | paper-writer: annotate/tokenize/roundtrip | `get_screenshot` for `? VISUAL` | ✓ | — | — | — |
56
+ | pencil.dev | `.pen` discovery | `.pen` as canonical design source | — | pencil-writer: annotate/roundtrip | spec-vs-impl diff | ✓ | — | — | — |
57
+ | 21st.dev | — | prior-art gate: marketplace search before greenfield build | — | component-generator (21st impl) | — | — | ✓ | — | — |
58
+ | Magic Patterns | — | — | — | component-generator (magic-patterns impl) | preview_url → `? VISUAL` check | — | ✓ | — | — |
59
+ | OpenRouter | — | — | — | — | — | — | ✓ (model-router: tier→model resolution, all stages) | — | — |
60
+ | Xcode Simulator | — | — | — | native iOS code-gen target (swift-executor / emitSwift) | rendered SwiftUI snapshot when simulator available, else degrade to code-only structural audit (D-03) | — | — | — | — |
61
+ | Android Emulator | — | — | — | native Android code-gen target (compose-executor / emitCompose) | rendered Compose screenshot when emulator available, else degrade to code-only structural audit (D-03) | — | — | — | — |
62
+ | Litmus | — | — | — | email render-test target (email-executor) | cross-client rendered evidence when Litmus available, else degrade to the static email-HTML validator / code-only (D-03) | — | — | — | — |
63
+ | Print-Renderer | — | — | — | print render-test target (pdf-executor) | rendered PDF/page evidence when the print-render is available, else degrade to the static print-CSS validator / code-only (D-03) | — | — | — | — |
64
+ | Lazyweb | — | reference search via `lazyweb_search` (**Tier 1 — free, tried first**; D-01); complements refero/pinterest | — | — | — | — | — | — | — |
65
+ | Mobbin | — | reference search via mobbin tools (**Tier 2 — paid, mobile/flow-level**; D-01); complements refero/lazyweb | — | — | — | — | — | — | — |
66
+ | Slack | — | — | — | — | — | — | — | verify-fail/audit-pass/ship → Slack webhook (routed, redacted, degrade-to-noop; D-04/D-05) | — |
67
+ | Discord | — | — | — | — | — | — | — | parity with Slack — events → Discord webhook (routed, redacted, degrade-to-noop) | — |
68
+ | Linear | — | — | — | — | — | — | — | — | bidirectional cycle↔issue: read comments (decision-injector) + transition + redacted summary on completion (D-03) |
69
+ | Jira | — | — | — | — | — | — | — | — | parity with Linear — Atlassian MCP; transition + redacted summary on completion |
66
70
 
67
71
  **Column definitions:**
68
72
 
@@ -168,6 +172,22 @@ Step E1 — ToolSearch check:
168
172
  Write mobbin status to STATE.md <connections>.
169
173
  ```
170
174
 
175
+ **Linear probe (ToolSearch-only — ticket-sync):**
176
+
177
+ ```
178
+ Step H1 — ToolSearch({ query: "linear", max_results: 5 })
179
+ → Empty / GDD_DISABLE_LINEAR=1 → linear: not_configured
180
+ → Non-empty → linear: available
181
+ ```
182
+
183
+ **Jira probe (ToolSearch-only — ticket-sync, Atlassian MCP):**
184
+
185
+ ```
186
+ Step I1 — ToolSearch({ query: "atlassian jira", max_results: 5 })
187
+ → Empty / GDD_DISABLE_JIRA=1 → jira: not_configured
188
+ → Non-empty → jira: available
189
+ ```
190
+
171
191
  **Slack probe (env-based, no MCP):**
172
192
 
173
193
  ```
@@ -0,0 +1,62 @@
1
+ # Jira — Connection Specification
2
+
3
+ This file is the connection specification for Jira within the get-design-done pipeline — the parity of `connections/linear.md`. See `connections/connections.md` for the index + capability matrix (the jira row is added at the 35.3 closeout).
4
+
5
+ ---
6
+
7
+ Jira is a **bidirectional ticket-sync surface** (Team Surfaces layer) — identical contract to Linear, only the MCP server differs. GDD links a design cycle to a Jira issue, **reads** the issue's comments as context when a `.design/**.md` opens, and **writes** a redacted status transition + summary on cycle completion. MCP-based (the **Atlassian MCP**, `mcp__atlassian__*`) — GDD calls MCP tools, not raw HTTP; no new outbound egress.
8
+
9
+ ---
10
+
11
+ ## Setup
12
+
13
+ **Prerequisites:** the Atlassian MCP server connected to your Jira site (OAuth on first use). No GDD-held token.
14
+
15
+ ```
16
+ # register the Atlassian MCP per Atlassian's MCP docs, then restart the session
17
+ ```
18
+
19
+ (Alternative for non-MCP runtimes: `JIRA_BASE_URL` + `JIRA_API_TOKEN` env — documented for parity; GDD ships MCP-based.)
20
+
21
+ **Verification:**
22
+
23
+ ```
24
+ ToolSearch({ query: "atlassian jira", max_results: 10 })
25
+ ```
26
+
27
+ Expect Atlassian/Jira issue/comment tools (`mcp__atlassian__*`). If empty → `jira: not_configured`. Verify exact tool names via ToolSearch; do not hardcode.
28
+
29
+ ---
30
+
31
+ ## What GDD does (bidirectional, via `agents/ticket-sync-agent.md`)
32
+
33
+ - **READ (decision-injector):** on `.design/**.md` open, the linked Jira issue's recent comments are surfaced as cycle context.
34
+ - **WRITE (cycle completion):** on `/gdd:complete-cycle`, the agent transitions the linked issue (e.g., In Review → Done) and posts a **redacted** summary. The link map lives in STATE `<ticket_links>` (`jira:PROJ-45`).
35
+
36
+ See `reference/ticket-sync.md` for the `<ticket_links>` schema + the read/write contract.
37
+
38
+ ## Redaction + kill-switch + degrade
39
+
40
+ - Every body written to Jira passes through `scripts/lib/redact.cjs`.
41
+ - Kill-switch: `GDD_DISABLE_JIRA=1` (env) or `.design/config.json` `"ticket_sync": { "jira": { "enabled": false } }`. `gsd-health` surfaces it.
42
+ - **Degrade-to-noop:** `jira: not_configured` / disabled / an MCP error → skip (no error); the pipeline never blocks (D-04).
43
+
44
+ ## STATE.md integration + probe
45
+
46
+ ```xml
47
+ <connections>
48
+ jira: not_configured
49
+ </connections>
50
+ ```
51
+
52
+ | Value | Meaning |
53
+ |---|---|
54
+ | `available` | ToolSearch returned `mcp__atlassian__*` tools AND not disabled |
55
+ | `unavailable` | tools present but a call errored |
56
+ | `not_configured` | ToolSearch empty — Atlassian MCP not registered |
57
+
58
+ **Probe (ToolSearch-only):** `ToolSearch({ query: "atlassian jira", max_results: 5 })` → empty → `not_configured`, non-empty → `available`.
59
+
60
+ ## Anti-pattern
61
+
62
+ Don't auto-transition to an undefined workflow state; don't post un-redacted excerpts; don't create/triage issues (Phase 30). Conflict resolution: when the Jira status and the GDD `<ticket_links>` state diverge, **Jira wins** (external source of truth) and GDD reconciles on next sync with an explicit notice (ROADMAP open-Q default). Linear is the sibling surface (`connections/linear.md`).
@@ -0,0 +1,62 @@
1
+ # Linear — Connection Specification
2
+
3
+ This file is the connection specification for Linear within the get-design-done pipeline. See `connections/connections.md` for the full index + capability matrix (the linear row is added at the 35.3 closeout).
4
+
5
+ ---
6
+
7
+ Linear is a **bidirectional ticket-sync surface** (Team Surfaces layer). GDD links a design cycle to a Linear issue, **reads** the issue's comments as context when a `.design/**.md` file opens, and **writes** a redacted status update + summary on cycle completion. MCP-based (`mcp__linear__*`) — GDD calls MCP tools, not raw HTTP, so there is no new outbound egress.
8
+
9
+ ---
10
+
11
+ ## Setup
12
+
13
+ **Prerequisites:** the Linear MCP server connected to your workspace (OAuth on first use). No GDD-held token.
14
+
15
+ ```
16
+ # register the Linear MCP per Linear's MCP docs, then restart the session
17
+ ```
18
+
19
+ (Alternative for non-MCP runtimes: a `LINEAR_API_KEY` env — documented for parity, but GDD ships MCP-based.)
20
+
21
+ **Verification:**
22
+
23
+ ```
24
+ ToolSearch({ query: "linear", max_results: 10 })
25
+ ```
26
+
27
+ Expect Linear issue/comment tools (`mcp__linear__*`). If empty → `linear: not_configured`. Verify exact tool names via ToolSearch before calling; do not hardcode.
28
+
29
+ ---
30
+
31
+ ## What GDD does (bidirectional, via `agents/ticket-sync-agent.md`)
32
+
33
+ - **READ (decision-injector):** when a `.design/**.md` opens, the linked Linear issue's recent comments are surfaced as cycle context (so a decision made in the ticket reaches the pipeline).
34
+ - **WRITE (cycle completion):** on `/gdd:complete-cycle`, the agent updates the linked issue's status (e.g., In Review → Done) and posts a **redacted** one-paragraph summary (verify result + top-line audit). The link map lives in STATE `<ticket_links>`.
35
+
36
+ See `reference/ticket-sync.md` for the `<ticket_links>` schema + the read/write contract.
37
+
38
+ ## Redaction + kill-switch + degrade
39
+
40
+ - Every body written to Linear passes through `scripts/lib/redact.cjs` (the single chokepoint).
41
+ - Kill-switch: `GDD_DISABLE_LINEAR=1` (env) or `.design/config.json` `"ticket_sync": { "linear": { "enabled": false } }`. `gsd-health` surfaces it.
42
+ - **Degrade-to-noop:** `linear: not_configured` / disabled / an MCP error → skip ticket-sync (no error); the pipeline never blocks on it (D-04).
43
+
44
+ ## STATE.md integration + probe
45
+
46
+ ```xml
47
+ <connections>
48
+ linear: not_configured
49
+ </connections>
50
+ ```
51
+
52
+ | Value | Meaning |
53
+ |---|---|
54
+ | `available` | ToolSearch returned `mcp__linear__*` tools AND not disabled |
55
+ | `unavailable` | tools present but a call errored (auth/rate) |
56
+ | `not_configured` | ToolSearch empty — Linear MCP not registered |
57
+
58
+ **Probe (ToolSearch-only — no token cost):** `ToolSearch({ query: "linear", max_results: 5 })` → empty → `not_configured`, non-empty → `available`. Which stages probe: cycle entry (decision-injector read) + complete-cycle (status write).
59
+
60
+ ## Anti-pattern
61
+
62
+ Don't auto-transition a ticket to a state the team didn't define; don't post raw artifact excerpts (always redacted); don't create/triage issues (Phase 30 territory — this is sync of an already-linked ticket). Jira is the parity surface (`connections/jira.md`); the contract is identical.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hegemonart/get-design-done",
3
- "version": "1.35.2",
3
+ "version": "1.35.3",
4
4
  "description": "A design-quality pipeline for AI coding agents: brief, plan, implement, and verify UI work against your design system.",
5
5
  "author": "Hegemon",
6
6
  "homepage": "https://github.com/hegemonart/get-design-done",
@@ -923,6 +923,13 @@
923
923
  "type": "heuristic",
924
924
  "phase": 35.2,
925
925
  "description": "Phase 35.2 notification-backplane routing contract — event→channel routing (verify_fail/audit_pass/ship → slack/discord, overridable via .design/config.json#notifications.routing), the mandatory scripts/lib/redact.cjs chokepoint on every outbound body, per-channel kill-switches (GDD_DISABLE_SLACK/GDD_DISABLE_DISCORD), and the injectable-fetchImpl + degrade-to-noop transport consumed by scripts/lib/notify/dispatch.cjs (allowlisted under the 33.5 outbound gate)."
926
+ },
927
+ {
928
+ "name": "ticket-sync",
929
+ "path": "reference/ticket-sync.md",
930
+ "type": "heuristic",
931
+ "phase": 35.3,
932
+ "description": "Phase 35.3 ticket-sync contract — the STATE <ticket_links> cycle→ticket map, the bidirectional read (decision-injector surfaces linked-ticket comments on .design open) + write (transition + redacted summary on cycle completion) flow via MCP tools (mcp__linear__* / mcp__atlassian__*; no SDK, no raw HTTP), the default status-transition map, tracker-wins conflict resolution, the mandatory scripts/lib/redact.cjs chokepoint, and the GDD_DISABLE_LINEAR/GDD_DISABLE_JIRA kill-switches. Consumed by agents/ticket-sync-agent.md."
926
933
  }
927
934
  ]
928
935
  }
@@ -0,0 +1,59 @@
1
+ # Ticket Sync — the `<ticket_links>` contract for `agents/ticket-sync-agent.md`
2
+
3
+ How GDD links a design cycle to a Linear/Jira ticket, reads its comments as context, and writes a redacted status update on completion — all via MCP tools (no raw HTTP, no bundled SDK). The per-system probe + tool detail live in `connections/linear.md` + `connections/jira.md`.
4
+
5
+ ---
6
+
7
+ ## The `<ticket_links>` STATE block
8
+
9
+ GDD records the cycle→ticket map in `.design/STATE.md`:
10
+
11
+ ```xml
12
+ <ticket_links>
13
+ cycle: <cycle-id>
14
+ linear: ABC-123
15
+ jira: PROJ-45
16
+ </ticket_links>
17
+ ```
18
+
19
+ - A cycle may link a Linear issue, a Jira issue, both, or neither.
20
+ - The link is set by the user (or a future `/gdd:link-ticket`); the agent **reads** it, never invents a link.
21
+ - No link for the current cycle → the agent is a noop on both paths.
22
+
23
+ ## Read path (decision-injector — `.design/**.md` open)
24
+
25
+ When a design artifact opens and the cycle has a link to an `available` system, the agent fetches the linked ticket's recent comments (via the resolved `mcp__linear__*` / `mcp__atlassian__*` tool) and surfaces a short **redacted** digest as cycle context — so a decision made in the ticket reaches the pipeline. Read-only; nothing is written on this path.
26
+
27
+ ## Write path (`/gdd:complete-cycle`)
28
+
29
+ On cycle completion, for each linked + available system:
30
+
31
+ 1. **Transition** the ticket status — the default map (overridable in `.design/config.json#ticket_sync.transitions`):
32
+
33
+ | Cycle outcome | Ticket transition |
34
+ |---|---|
35
+ | verify passed | → Done / Closed |
36
+ | verify failed | → In Progress (reopened) |
37
+ | shipped (PR open) | → In Review |
38
+
39
+ 2. **Post** a **redacted** one-paragraph summary (verify pass/fail + top-line audit + PR URL if present) via the ticket's comment tool.
40
+
41
+ ## Conflict resolution (tracker wins)
42
+
43
+ If the ticket's current status diverges from what `<ticket_links>` last recorded (a human moved it), **the tracker is the source of truth** — the agent reconciles `<ticket_links>` to the tracker's state and posts an explicit "GDD observed an external status change; reconciling" note, rather than force-overwriting the human transition. (ROADMAP Phase-35 open-Q default.)
44
+
45
+ ## Redaction (mandatory)
46
+
47
+ Every body written to a ticket — the status comment, the summary — passes through `scripts/lib/redact.cjs` (11 secret/token patterns) before the MCP call. The agent is the single egress chokepoint; no raw artifact excerpt reaches Linear/Jira.
48
+
49
+ ## Kill-switches (per system)
50
+
51
+ A system is a noop when **either** `GDD_DISABLE_LINEAR=1` / `GDD_DISABLE_JIRA=1` (env) **or** `.design/config.json` `ticket_sync.<service>.enabled === false`. `gsd-health` surfaces each system's state (mirrors Phase 30 / 35.1 / 35.2).
52
+
53
+ ## Degrade-to-noop (never blocks the cycle)
54
+
55
+ `not_configured` (MCP absent) / disabled / no link / an MCP error → the agent skips that system and **never throws** into the pipeline — ticket-sync is a best-effort side surface, never a cycle gate (D-04).
56
+
57
+ ## Out of scope (per Phase 35 split)
58
+
59
+ PR-inline (35.1); Slack/Discord notifications (35.2); issue **creation**/triage (Phase 30 territory — this is sync of an already-linked ticket); a bundled Linear/Jira SDK (MCP-based, D-02); `pseudonymize.cjs` (Phase 30 — redact for secrets is the must here); Microsoft Teams / Asana.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: gdd-connections
3
- description: "Interactive onboarding wizard for the 16 external integrations the pipeline supports — probes all (`figma`, `refero`, `preview`, `storybook`, `chromatic`, `graphify`, `pinterest`, `claude-design`, `paper-design`, `pencil-dev`, `21st-dev`, `magic-patterns`, `lazyweb`, `mobbin`, `slack`, `discord`), recommends based on project type, walks the user through setup (auto-run MCP install or copy-command fallback), writes results to `STATE.md <connections>`. Use after `/gdd:new-project` or whenever the user wants to add, inspect, or skip a connection. Re-runnable anytime."
3
+ description: "Interactive onboarding wizard for the 18 external integrations the pipeline supports — probes all (`figma`, `refero`, `preview`, `storybook`, `chromatic`, `graphify`, `pinterest`, `claude-design`, `paper-design`, `pencil-dev`, `21st-dev`, `magic-patterns`, `lazyweb`, `mobbin`, `slack`, `discord`, `linear`, `jira`), recommends based on project type, walks the user through setup (auto-run MCP install or copy-command fallback), writes results to `STATE.md <connections>`. Use after `/gdd:new-project` or whenever the user wants to add, inspect, or skip a connection. Re-runnable anytime."
4
4
  argument-hint: "[list | <connection-name> | --auto]"
5
5
  user-invocable: true
6
6
  tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, ToolSearch
@@ -8,11 +8,11 @@ tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, ToolSearch
8
8
 
9
9
  # /gdd:connections
10
10
 
11
- Interactive onboarding for the 16 external integrations the pipeline supports. Replaces "probe silently at scan entry and hope the user noticed" with an explicit "here is what can plug in, here is how."
11
+ Interactive onboarding for the 18 external integrations the pipeline supports. Replaces "probe silently at scan entry and hope the user noticed" with an explicit "here is what can plug in, here is how."
12
12
 
13
13
  Canonical per-connection specs live in `../../connections/<name>.md` (one file per integration). The capability matrix + probe-pattern spec live in `../../connections/connections.md`. This skill is the **user-facing front end** for those specs.
14
14
 
15
- For the 16 probe scripts (MCP + HTTP + CLI + file probes), bucket categorization, per-connection setup screen, auto-run eligibility matrix, value-prop one-liners, and STATE.md / config.json write contracts, see `./connections-onboarding.md`. For the cross-skill probe pattern + connection-handshake summary, see `../../reference/shared-preamble.md#connection-handshake-summary`. For the cross-skill output discipline, see `../../reference/shared-preamble.md#output-contract-reminders`.
15
+ For the 18 probe scripts (MCP + HTTP + CLI + file probes), bucket categorization, per-connection setup screen, auto-run eligibility matrix, value-prop one-liners, and STATE.md / config.json write contracts, see `./connections-onboarding.md`. For the cross-skill probe pattern + connection-handshake summary, see `../../reference/shared-preamble.md#connection-handshake-summary`. For the cross-skill output discipline, see `../../reference/shared-preamble.md#output-contract-reminders`.
16
16
 
17
17
  ---
18
18
 
@@ -38,7 +38,7 @@ For the 16 probe scripts (MCP + HTTP + CLI + file probes), bucket categorization
38
38
 
39
39
  ## Workflow
40
40
 
41
- 1. **Probe all 16 connections** — run every probe script per `./connections-onboarding.md#step-1--probe-all-16-connections`. MCP probes use `ToolSearch` first; HTTP / CLI / file probes follow non-MCP patterns. Merge results into `STATE.md <connections>` with the three-value schema (`available | unavailable | not_configured`) — never add new values.
41
+ 1. **Probe all 18 connections** — run every probe script per `./connections-onboarding.md#step-1--probe-all-18-connections`. MCP probes use `ToolSearch` first; HTTP / CLI / file probes follow non-MCP patterns. Merge results into `STATE.md <connections>` with the three-value schema (`available | unavailable | not_configured`) — never add new values.
42
42
  2. **Categorize + build summary** — bucket each probe result (available / recommended / optional / skipped / unavailable) using project-hint detection. Detail + recommendation mapping: `./connections-onboarding.md#step-2--bucket-categorization`.
43
43
  3. **Print summary table** — show buckets + value-prop one-liners (verbatim from `./connections-onboarding.md#step-3--summary-table`).
44
44
  4. **Route by mode** — `list` / `--auto` exits after summary; `<name>` jumps straight to Step 5; default mode opens an AskUserQuestion (configure recommended / pick one by one / configure all optional / re-check specific / exit). Routing detail: `./connections-onboarding.md#step-4--route-by-mode`.
@@ -9,7 +9,7 @@ last_updated: 2026-05-18
9
9
 
10
10
  Source: extracted from `skills/connections/SKILL.md` (Phase 28.5 rework — D-10 extract-then-link).
11
11
  The skill's load-bearing routing + invocation-mode dispatch stays in `../skills/connections/SKILL.md`;
12
- this file holds the 16 probe scripts, bucket categorization, per-connection setup screen,
12
+ this file holds the 18 probe scripts, bucket categorization, per-connection setup screen,
13
13
  auto-run eligibility matrix, value-prop one-liners, and STATE.md / config.json write contracts.
14
14
 
15
15
  # Connections Onboarding Procedure
@@ -27,7 +27,7 @@ this file does NOT duplicate them; it points at them by name.
27
27
 
28
28
  ---
29
29
 
30
- ## Step 1 — Probe all 16 connections
30
+ ## Step 1 — Probe all 18 connections
31
31
 
32
32
  Run every probe below in order. MCP probes call `ToolSearch` first (deferred tools fail silently without it). Write every result to `STATE.md <connections>` when done.
33
33
 
@@ -114,6 +114,20 @@ Bash: test -n "$DISCORD_WEBHOOK_URL" (and GDD_DISABLE_DISCORD != 1)
114
114
  → non-empty → discord: available
115
115
  ```
116
116
 
117
+ **linear:** (ticket-sync — MCP)
118
+ ```
119
+ ToolSearch({ query: "linear", max_results: 5 })
120
+ → Empty / GDD_DISABLE_LINEAR=1 → linear: not_configured
121
+ → Non-empty → linear: available
122
+ ```
123
+
124
+ **jira:** (ticket-sync — Atlassian MCP)
125
+ ```
126
+ ToolSearch({ query: "atlassian jira", max_results: 5 })
127
+ → Empty / GDD_DISABLE_JIRA=1 → jira: not_configured
128
+ → Non-empty → jira: available
129
+ ```
130
+
117
131
  ### Non-MCP probes
118
132
 
119
133
  **storybook** (HTTP):
@@ -159,7 +173,7 @@ Bash: ls .design/handoff/ 2>/dev/null || find . -maxdepth 3 \
159
173
  → Non-empty → claude_design: available
160
174
  ```
161
175
 
162
- After all 16 probes complete, merge results into `STATE.md <connections>`. Preserve the three-value schema verbatim (`available | unavailable | not_configured`). Do not add new values.
176
+ After all 18 probes complete, merge results into `STATE.md <connections>`. Preserve the three-value schema verbatim (`available | unavailable | not_configured`). Do not add new values.
163
177
 
164
178
  ---
165
179
 
@@ -244,6 +258,8 @@ One-line value props (use verbatim):
244
258
  | mobbin | curated mobile + flow-level references (paid) — discover Tier 2 |
245
259
  | slack | notify — route verify-fail/audit-pass/ship to a Slack channel (redacted) |
246
260
  | discord | notify — route pipeline events to a Discord channel (redacted) |
261
+ | linear | ticket-sync — link a cycle to a Linear issue; read comments + transition on completion |
262
+ | jira | ticket-sync — parity with Linear via the Atlassian MCP |
247
263
 
248
264
  ---
249
265
 
@@ -271,7 +287,7 @@ options:
271
287
  - "Exit" → emit ## CONNECTIONS COMPLETE, exit
272
288
  ```
273
289
 
274
- If recommended bucket is empty, swap that option for "Show all 16 and pick."
290
+ If recommended bucket is empty, swap that option for "Show all 18 and pick."
275
291
 
276
292
  ---
277
293
 
@@ -332,6 +348,8 @@ options:
332
348
  | lazyweb | `claude plugin install lazyweb@lazyweb` (after token write to `~/.lazyweb/`) | ✗ no | Writes a bearer token to disk — force manual (user-consent step) |
333
349
  | slack | set `SLACK_WEBHOOK_URL` env (Slack Incoming Webhook URL) | ✗ no | Env credential — user sets it; no install command (degrade-to-noop when unset) |
334
350
  | discord | set `DISCORD_WEBHOOK_URL` env (Discord channel Webhook URL) | ✗ no | Env credential — user sets it; no install command (degrade-to-noop when unset) |
351
+ | linear | `claude mcp add linear ...` (Linear MCP) | ✓ yes | Reversible MCP add; OAuth on first call, no credential filesystem-write |
352
+ | jira | `claude mcp add atlassian ...` (Atlassian MCP) | ✓ yes | Reversible MCP add; OAuth on first call |
335
353
 
336
354
  For non-auto-run connections, hide the "Run install command now" option entirely in 5.3.
337
355