What's Changed
- feat: pivot stack from TypeScript/Node to Python + uv by @rafeekpro in #2
- feat(ci): gate PRs with ruff + pytest by @rafeekpro in #4
- chore(ci): enforce "main merges only from develop" by @rafeekpro in #6
- chore: type cleanup + add mypy to CI by @rafeekpro in #8
- feat(cli): F1 — process management by @rafeekpro in #10
- feat(engine): F2 — REST CRUD for agents, pipelines, runs (read-only) by @rafeekpro in #12
- feat(prompt-dsl): F4 — Jinja2 → XML compiler + render-preview endpoint by @rafeekpro in #14
- feat(runtimes): F3 — api-call adapter (Anthropic SDK) by @rafeekpro in #16
- feat(engine): F5 — LangGraph pipeline execution + POST /runs by @rafeekpro in #18
- feat(dashboard): F6 — Dashboard MVP (Next.js 15 + React Flow) by @rafeekpro in #20
- feat(engine): DAG validation endpoint (POST /pipelines/validate) by @rafeekpro in #22
- feat(dashboard): F7 — Pipeline Designer (visual DAG editor) by @rafeekpro in #24
- feat(engine): background runs + abort + graceful shutdown by @rafeekpro in #26
- feat(engine): pause/resume runs via LangGraph SqliteSaver by @rafeekpro in #28
- feat(dashboard): pause/resume/abort buttons on run detail page by @rafeekpro in #30
- feat(dashboard): trigger runs from the dashboard by @rafeekpro in #39
- feat(runtimes): bash adapter — shell command execution by @rafeekpro in #40
- feat(engine): retry-node + skip-node endpoints by @rafeekpro in #41
- chore(dashboard): ESLint flat config + lint gate in CI by @rafeekpro in #42
- docs: README quickstart + architecture + runtimes guide by @rafeekpro in #43
- feat(engine): per-role output parsing for structured node results by @rafeekpro in #44
- feat(dashboard): F8 — agent detail / edit / archive + version history by @rafeekpro in #45
- fix: CORS for dashboard :3000 + designer surface server errors inline by @rafeekpro in #70
- feat(runtimes): api-call → multi-provider (Anthropic + OpenAI + OpenAI-compat + Gemini) by @rafeekpro in #71
- feat(dashboard): AgentForm — runtime-specific config fields by @rafeekpro in #72
- feat(runtimes): claude-code adapter — Anthropic CLI subprocess by @rafeekpro in #73
- feat(runtimes): gemini-cli adapter — Google CLI subprocess by @rafeekpro in #74
- feat(runtimes): http adapter — generic POST for Ollama, custom servers by @rafeekpro in #75
- feat(dashboard): /settings page — provider catalog + runtime healthchecks by @rafeekpro in #76
- docs: providers.md — recipes for each LLM through API + CLI by @rafeekpro in #77
- feat(runtimes): codex adapter — OpenAI Codex CLI subprocess (#53) by @rafeekpro in #78
- feat(engine): typed input/output schemas per agent (#58) by @rafeekpro in #79
- feat(prompt-dsl): scope Jinja to declared input_schema fields (#60) by @rafeekpro in #80
- feat(engine): pipeline cohesion validation against agent contracts (#59) by @rafeekpro in #81
- feat(dashboard): AgentForm — input/output field pickers (#61) by @rafeekpro in #82
- feat(dashboard): designer + run viewer — annotate edges with state field flow (#62) by @rafeekpro in #83
- feat(engine): Project model + CRUD endpoints (#63) by @rafeekpro in #84
- feat(engine): Run.project_id + project-scoped runs filter (#64) by @rafeekpro in #85
- feat(engine,runtimes): project context plumbing — working_directory + env overlay (#65) by @rafeekpro in #86
- feat(engine): POST /projects/{id}/run/{kind} convenience trigger (#66) by @rafeekpro in #87
- feat(dashboard): /projects CRUD pages + workflow trigger UI (#67) by @rafeekpro in #88
- feat(dashboard): sidebar project picker + scope list pages (#68) by @rafeekpro in #89
- docs: docs/projects.md — workspace layer + workflow recipes (#69) by @rafeekpro in #90
- chore(dashboard): inline configuration help on /settings by @rafeekpro in #91
- feat(dashboard): Clone agent button — pre-fill /agents/new from existing (#92) by @rafeekpro in #95
- feat(dashboard): built-in agent templates — quick-start library on /agents/new (#93) by @rafeekpro in #96
- chore(dashboard): always show install commands on Settings, including aider by @rafeekpro in #97
- feat(engine,dashboard): agent import/export JSON — agents-as-code workflow (#94) by @rafeekpro in #98
- fix(runtimes): probe claude-code/gemini-cli only by binary, not API key by @rafeekpro in #100
- fix(dashboard): hide INSTALL COMMAND for available runtimes by @rafeekpro in #102
- feat(engine): POST /agents/dry-run — execute one agent without persistence by @rafeekpro in #106
- feat(dashboard): Test panel on agent New/Edit pages — wires up POST /agents/dry-run by @rafeekpro in #107
- feat(dashboard): A/B compare in the agent Test panel — Variant B + Promote by @rafeekpro in #108
- feat(engine): in-code schema migrations — backfill runs.project_id by @rafeekpro in #110
- feat(dashboard): per-role hints + 'Use role defaults' on agent form schema pickers by @rafeekpro in #112
- fix(engine): auto-inject agent role into prompt render context by @rafeekpro in #114
- feat: register GLM as first-class provider + Quick setup docs + .env.example by @rafeekpro in #116
- feat(dashboard): Clone + Export JSON buttons on the agent Edit header by @rafeekpro in #118
- fix(dashboard): point developer-jr-glm template at the registered glm provider by @rafeekpro in #119
- fix(engine): enforce DAG validation on POST/PUT pipelines by @rafeekpro in #121
- feat(dashboard): clearer Inputs/Outputs picker — kill 'Final output' collision, add example values by @rafeekpro in #123
- feat: pipeline export / import / clone — JSON portability mirroring agent flow by @rafeekpro in #125
- feat: pipeline bundle export/import — pipeline + its agents in one envelope by @rafeekpro in #127
- feat(dashboard): pipeline templates — code-driven library + picker on /pipelines/new by @rafeekpro in #129
- feat: GitHub Issue Triage as importable example bundle by @rafeekpro in #131
- feat(dashboard): Designer Inspector — agent details + state view (#132) by @rafeekpro in #133
- chore: scripts/dev — one-shot launcher for engine + dashboard (#136) by @rafeekpro in #137
- feat: agent + pipeline lifecycle — usage count, archive guard, pipeline delete (#134) by @rafeekpro in #135
- chore: scripts/setup — first-run installer with version pre-flight (#138) by @rafeekpro in #139
- docs: rewrite README — install + first-pipeline + day-to-day use (#140) by @rafeekpro in #141
- feat: PipelineState.extensions — open dict for per-pipeline extra state (#144) by @Dixter999 in #147
- feat: extra_data column in node_execution_logs (#145) by @Dixter999 in #148
- feat: python-func runtime adapter (#143) by @Dixter999 in #149
- feat: PostgreSQL backend — dual-dialect engine via DAP_DATABASE_URL (#142) by @Dixter999 in #150
- fix: test_postgresql_tables_created_on_startup uses paginated response (#152) by @Dixter999 in #153
- feat: add description field to PipelineState for human-readable labels by @Dixter999 in #155
- feat: python-func __pause sentinel for engine-level pause (#161) by @Dixter999 in #163
- fix(#164): interrupt_before gate support + POST /runs/{id}/nodes/{id}/approve by @Dixter999 in #165
- refactor: revert __pause sentinel — superseded by interrupt_before (#161 followup) by @Dixter999 in #166
- feat(#167): Phase 2 smoke tests + dot-notation condition traversal by @Dixter999 in #176
- fix(#173): call checkpointer.setup() in lifespan + restore dot-notation conditions by @Dixter999 in #177
- test(#168): add Phase 3 smoke tests — tester/pr-creator/reviewer/gate/pr-merger by @Dixter999 in #179
- feat(#181): add GET /runs/{id}/summary endpoint stub by @Dixter999 in #182
- ci: Copilot Review Gate — required check_run for develop & main by @rafeekpro in #193
- chore(engine): drop unused asyncpg dependency (#189) by @rafeekpro in #194
- fix(engine): detect_dialect accepts postgres:// (heroku-style) URLs (#188) by @rafeekpro in #195
- fix(runtimes/python-func): ImportError returns _failed instead of raising (#191) by @rafeekpro in #196
- fix(runtimes/python-func): require explicit 'module:attr' separator (#192) by @rafeekpro in #197
- fix(engine): /approve validates node_id is an approval gate (#184, #190) by @rafeekpro in #198
- perf(engine): pool psycopg connections for AsyncPostgresSaver (#187) by @rafeekpro in #199
- fix(engine): atomic claim on /resume, /approve, /retry, /skip (#185) by @rafeekpro in #200
- test(engine): coverage suite for #165 family (#186) by @rafeekpro in #201
- docs(ci): note workflow_dispatch escape hatch for cron-lag by @rafeekpro in #202
- fix(engine/api): align archived-project status code to 422 (#205) by @rafeekpro in #206
- fix(engine/validator): skip unused-output warning for terminal nodes (#204) by @rafeekpro in #207
- chore: clean up 4 low-severity findings from retro-audit round 1 by @rafeekpro in #208
- docs(ci): clearer waiting-for-Copilot diagnostic message in gate workflow by @rafeekpro in #209
- fix(runtimes): aider stub + api_call broaden catch (#210, #211) by @rafeekpro in #215
- fix(runtimes): gemini extra_args + _first_int robust on varied shapes (#213, #214) by @rafeekpro in #216
- security(runtimes/http): redact header secrets from error preview (#212) by @rafeekpro in #217
- test: add smoke-run fixtures at repo root (#171, #174) by @rafeekpro in #218
- feat(#170): dap project run/approve/reject/state cortex by @rafeekpro in #221
- feat(#219): packages/cortex/ — migrate Cortex nodes to DAP monorepo by @rafeekpro in #220
- feat(#225,#227): dagre auto-layout + conditional edge colours in run graph by @rafeekpro in #230
- feat(#226,#228,#229): persist node positions + fix inspector for bundled agents by @rafeekpro in #231
- feat(#340): add --format json to
dap project state cortexby @rafeekpro in #232 - fix(#233): populate node_statuses from execution logs in GET /runs/{id} by @rafeekpro in #235
- fix(#222): tester port-parsing artifact + pr_merger infra-failure bypass by @rafeekpro in #236
- fix(#223): remove shell=/bin/bash from git-branch node bundles by @rafeekpro in #240
- fix(#224): correct workspace slug separator and refresh project on reuse by @rafeekpro in #244
- fix(#243): sync base branch before coder checkout to prevent stale-diff PRs by @rafeekpro in #245
- feat(#237): add tabbed NodeDetailPanel with state diff view by @rafeekpro in #242
- fix(#238): set max_idle=3600s and min_size=4 on checkpointer pool by @rafeekpro in #246
- fix(#241): sync workspace to default branch before starting a run by @rafeekpro in #247
- refactor(tests): extract _build_subprocess_mock to conftest (audit #7) by @rafeekpro in #248
- refactor(#249): bash adapter uses shared merge_subprocess_env (audit #2) by @rafeekpro in #261
- perf(#250): batch version lookups in list_agents/list_pipelines (audit #3) by @rafeekpro in #262
- perf(#251): index hot-path columns on runs and node_execution_logs (audit #4) by @rafeekpro in #263
- refactor(#252): extract cross-layer request contracts to dap_engine.contracts (audit #5) by @rafeekpro in #264
- refactor(#253): split repository.py per entity with shim (audit #6) by @rafeekpro in #265
- refactor(#254): lift run orchestration coroutines into execution/ (audit #7) by @rafeekpro in #266
- refactor(#255): extract _BaseCliAdapter for CLI runtime adapters (audit #8) by @rafeekpro in #267
- fix(#256): drop dead final_state arg from finalize_run (audit B1) by @rafeekpro in #268
- fix(#257): make finalize_run / pause_run idempotent (audit B2) by @rafeekpro in #269
- fix(#258): serialise RunRegistry mutations under threading.Lock (audit B3) by @rafeekpro in #270
- fix(#259): make CORS allow-list configurable (audit B4) by @rafeekpro in #271
- fix(#260): replace synthetic shutdown snapshot with runs.failure_reason column (audit B5) by @rafeekpro in #272
- chore(repo): ignore .claude/ local agent config dir by @rafeekpro in #278
- chore(#273): include tests/ in ruff lint + format scope by @rafeekpro in #279
- chore(#274): tighten mypy + pytest config; align requires-python with 3.13 by @rafeekpro in #280
- chore(#276): add pip-audit CVE scan + dependabot weekly bumps by @rafeekpro in #281
- chore(#277): repo hygiene — .editorconfig, stray files, version + readme by @rafeekpro in #282
- chore(#275): add pre-commit framework with ruff + mypy hooks by @rafeekpro in #296
- chore(ci): bump actions/github-script from 7 to 9 by @dependabot[bot] in #283
- chore(ci): bump actions/setup-node from 4 to 6 by @dependabot[bot] in #284
- chore(ci): bump pnpm/action-setup from 4 to 6 by @dependabot[bot] in #285
- chore(ci): bump actions/checkout from 4 to 6 by @dependabot[bot] in #286
- chore(ci): bump astral-sh/setup-uv from 3 to 7 by @dependabot[bot] in #287
- chore(deps)(deps): bump google-genai from 1.73.1 to 2.0.1 by @dependabot[bot] in #288
- chore(deps,dashboard): bump typescript from 5.7.3 to 5.9.3 in /apps/dashboard by @dependabot[bot] in #289
- chore(deps)(deps): bump pydantic-settings from 2.14.0 to 2.14.1 by @dependabot[bot] in #290
- chore(deps,dashboard): bump @radix-ui/react-dialog from 1.1.4 to 1.1.15 in /apps/dashboard by @dependabot[bot] in #291
- chore(deps)(deps): update psycopg[binary] requirement from >=3.2 to >=3.3.4 by @dependabot[bot] in #292
- chore(deps)(deps): bump openai from 2.32.0 to 2.36.0 by @dependabot[bot] in #293
- chore(deps,dashboard): bump @types/node from 22.10.5 to 25.6.2 in /apps/dashboard by @dependabot[bot] in #294
- chore(deps): bump pydantic from 2.13.3 to 2.13.4 by @dependabot[bot] in #295
- chore(ci): skip copilot-review gate for bot-authored PRs by @rafeekpro in #297
- feat(#299): wire fastapi-users password auth + users table by @rafeekpro in #304
- feat(#299): wire OAuth (GitHub + Google) — sub-A2 by @rafeekpro in #305
- feat(#299): add API tokens for CLI / scripts — sub-A3 by @rafeekpro in #306
- chore(repo): run pre-commit on every push by @rafeekpro in #307
- feat(#299): ownership schema + audit log table — sub-A4a by @rafeekpro in #308
- feat(#299): audit foundation + auth event entries — sub-A4b1 by @rafeekpro in #309
- feat(#299): enforce ownership on /agents — sub-A4b2a by @rafeekpro in #310
- feat(#299): enforce ownership on /pipelines — sub-A4b2b by @rafeekpro in #311
- feat(#299): enforce ownership on /projects — sub-A4b2c by @rafeekpro in #312
- feat(#299): enforce ownership on /runs — sub-A4b2d (closes Phase A) by @rafeekpro in #313
- feat(#300): dashboard auth skeleton — sub-B1 by @rafeekpro in #314
- chore(deps): bump typer from 0.24.2 to 0.25.1 by @dependabot[bot] in #315
- chore(dashboard): bump @tanstack/react-query from 5.62.11 to 5.100.9 in /apps/dashboard by @dependabot[bot] in #316
- chore(deps): update psycopg[binary] requirement from >=3.2 to >=3.3.4 by @dependabot[bot] in #317
- chore(dashboard): bump @hookform/resolvers from 3.10.0 to 4.1.3 in /apps/dashboard by @dependabot[bot] in #318
- chore(deps): bump langgraph from 1.1.9 to 1.1.10 by @dependabot[bot] in #319
- chore(deps): bump anthropic from 0.97.0 to 0.100.0 by @dependabot[bot] in #320
- chore(dashboard): bump @radix-ui/react-slot from 1.1.1 to 1.2.4 in /apps/dashboard by @dependabot[bot] in #321
- chore(deps): update uvicorn[standard] requirement from >=0.32.0 to >=0.46.0 by @dependabot[bot] in #322
- feat(#300): /login + /signup pages — sub-B2 by @rafeekpro in #323
- feat(#300): /forgot-password + /reset-password — sub-B3 by @rafeekpro in #324
- feat(#300): UserMenu in sidebar — sub-B4 by @rafeekpro in #325
- feat(#300): OAuth buttons (GitHub + Google) — sub-B5 (closes Phase B) by @rafeekpro in #326
- feat(#301): admin route foundation — sub-C1 by @rafeekpro in #327
- feat(#301): /admin/users page + admin GET /users endpoint — sub-C2 by @rafeekpro in #328
- feat(#301): /admin/audit-log + GET /audit/events — sub-C3 by @rafeekpro in #329
- feat(#301): /admin/api-tokens admin-wide view — sub-C4 by @rafeekpro in #330
- feat(#301): /admin/settings + GET /settings/admin — sub-C5 (closes Phase C) by @rafeekpro in #332
- feat(#302): multi-stage Dockerfile + compose example — sub-D1 (closes #333) by @rafeekpro in #338
- feat(#302): bundle dashboard into dap-cli wheel — sub-D2 (closes #334) by @rafeekpro in #339
- feat(#302): release pipeline (PyPI + GHCR on v*..) — sub-D3 (closes #335) by @rafeekpro in #340
- feat(#302): dap init admin bootstrap + status section — sub-D4 (closes #336) by @rafeekpro in #341
- docs(#302): self-hosting guide + .env.example rewrite — sub-D5 (closes #337, closes #302) by @rafeekpro in #342
- feat(#303): legacy-admin upgrade migration + smoke test — sub-E1 (closes #343) by @rafeekpro in #348
- docs(#303): auth setup guide (docs/auth.md) — sub-E2 (closes #344) by @rafeekpro in #349
- docs(#303): admin operator guide (docs/admin-guide.md) — sub-E3 (closes #345) by @rafeekpro in #352
- docs(#303): security posture + threat model (docs/security.md) — sub-E4 (closes #346) by @rafeekpro in #355
- release: v0.3.0 cutover — sub-E5 (closes #347, closes #303, closes #298) by @rafeekpro in #356
- chore: post-v0.3.0 docs cleanup by @rafeekpro in #358
- feat(#351): pipeline binding editor in project creation/edit forms by @Dixter999 in #354
- fix: rename cortex → dap-cortex, dap-types → dap-schemas on PyPI by @rafeekpro in #359
- fix: bootstrap PyPI publish via account API token for v0.3.0 by @rafeekpro in #360
New Contributors
- @Dixter999 made their first contribution in #147
- @dependabot[bot] made their first contribution in #283
Full Changelog: https://github.com/rafeekpro/dap/commits/v0.3.0