Skip to content

feat: JIRA integration, PM-agnostic CLI, Fly.io removal#294

Merged
zbigniewsobiecki merged 3 commits intodevfrom
feat/jira-pm-agnostic-migration
Feb 16, 2026
Merged

feat: JIRA integration, PM-agnostic CLI, Fly.io removal#294
zbigniewsobiecki merged 3 commits intodevfrom
feat/jira-pm-agnostic-migration

Conversation

@zbigniewsobiecki
Copy link
Copy Markdown
Member

Summary

  • JIRA Integration: Add full JIRA support via a PM-agnostic abstraction layer (src/pm/). CASCADE now works with both Trello and JIRA through a unified PMProvider interface using AsyncLocalStorage context. Includes JIRA client, ADF rendering, webhook handler, triggers (comment-mention, issue-transitioned), and dashboard UI for JIRA project integration config.

  • Fly.io Removal: Remove all Fly.io-specific lifecycle management (startFreshMachineTimer, cancelFreshMachineTimer, scheduleShutdownAfterJob, FLY_APP_NAME conditionals). Watchdog timer is now unconditional. Drops fresh_machine_timeout_ms and post_job_grace_period_ms DB columns via migration 0007.

  • PM-Agnostic CLI: Rename src/cli/trello/ to src/cli/pm/ with all 7 commands updated to use PM-agnostic gadgets (read-work-item, post-comment, update-work-item, create-work-item, list-work-items, add-checklist, update-checklist-item). Add JIRA credential scoping to CredentialScopedCommand.

Test plan

  • All 1149 tests pass (79 test files)
  • npx tsc --noEmit — zero type errors
  • Lint passes (zero errors, only pre-existing warnings)
  • cascade-tools pm read-work-item --help works after build
  • Grep verification: zero references to FLY_APP_NAME, freshMachineTimer, scheduleShutdown, cli/trello in src/

🤖 Generated with Claude Code

zbigniewsobiecki and others added 3 commits February 16, 2026 15:19
… Fly.io lifecycle

Introduce a provider-based PM abstraction (`src/pm/`) that allows CASCADE to work
with both Trello and JIRA through a unified interface. This includes:

- PM provider pattern using AsyncLocalStorage context (`withPMProvider`/`getPMProvider`)
- PMLifecycleManager for board lifecycle operations (labels, comments, card moves)
- JIRA client and adapter with ADF (Atlassian Document Format) rendering
- Trello adapter wrapping existing Trello gadgets behind the PM interface
- PM-agnostic gadgets (`src/gadgets/pm/`) replacing direct Trello gadget usage
- JIRA webhook handler and triggers (comment-mention, issue-transitioned)
- JIRA integration config in project schema and dashboard UI
- Webhook routing for JIRA events alongside existing Trello/GitHub webhooks
- Agent prompts and shared trigger utilities updated for PM-agnostic work items

Also removes all Fly.io-specific lifecycle management:

- Remove startFreshMachineTimer, cancelFreshMachineTimer, scheduleShutdownAfterJob
- Remove FLY_APP_NAME conditionals from all webhook handlers
- Make watchdog timer unconditional (useful for any deployment)
- Drop fresh_machine_timeout_ms and post_job_grace_period_ms DB columns
- Remove related config fields from schema, API, CLI, and dashboard UI
- Add DB migration 0007 to drop the Fly.io columns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename src/cli/trello/ to src/cli/pm/ and update all 7 CLI commands to use
PM-agnostic gadgets from src/gadgets/pm/core/ instead of Trello-specific ones:

- read-card → read-work-item (uses readWorkItem)
- post-comment → post-comment (uses postComment)
- update-card → update-work-item (uses updateWorkItem)
- create-card → create-work-item (uses createWorkItem)
- list-cards → list-work-items (uses listWorkItems)
- add-checklist → add-checklist (uses addChecklist)
- update-checklist-item → update-checklist-item (uses updateChecklistItem)

Also:
- Add JIRA credential scoping and PM provider context to CredentialScopedCommand
- Update Claude Code backend guidance text for PM-agnostic terminology
- Update adapter CLI command strings from cascade-tools trello to cascade-tools pm
- Update CLAUDE.md CLI binary documentation
- Update claude-code backend tests for new tool names

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update test mocks from direct Trello client calls to PM provider interface:
- prompts.test.ts: ReadTrelloCard/CreateTrelloCard → ReadWorkItem/CreateWorkItem
- fetchImplementationSteps.test.ts: mock getPMProvider instead of trelloClient
- progress.test.ts: mock getPMProviderOrNull instead of trelloClient.addComment
- budget.test.ts: mock getPMProvider.getCustomFieldNumber instead of trelloClient
- debug-runner.test.ts: mock getPMProvider.addComment instead of trelloClient

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zbigniewsobiecki zbigniewsobiecki merged commit 42e2fbe into dev Feb 16, 2026
4 checks passed
@zbigniewsobiecki zbigniewsobiecki deleted the feat/jira-pm-agnostic-migration branch February 16, 2026 15:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant