Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions .github/releases/v1.0.37.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,49 @@
## opencode {VERSION}

{Prerelease/Stable} release from `{branch}` branch. DAG replan topology refresh: equal-count replans now surface a `graphRev` revision that makes the TUI re-fetch superseded node graphs exactly once instead of rendering stale topology.
{Prerelease/Stable} release from `{branch}` branch. Three user-facing features land in this train: DAG replan topology refresh (`graphRev`), project-level `/dag` inspector discovery, and a warn-only shell silence guard, alongside the SpecGit harness refresh and a wave of SDK/core stability fixes.

---

### 🎯 Features

- **DAG replan topology refresh, #469**: an equal-count replan (node count and status distribution unchanged) previously never triggered a TUI node re-fetch, so the inspector and an expanded sidebar kept rendering superseded topology until the next unrelated state change. The existing `workflow.graph_rev` counter is now exposed end to end as `graphRev` (core summary, schema contract, HttpAPI response, regenerated SDK types) and folded into the inspector and sidebar refresh signatures, so a revision-only change triggers exactly one authoritative node re-fetch while no-op summaries stay refetch-free and no polling is added.
- **Project-level discovery fallback for the /dag inspector, #435**: the workflow list depended entirely on the route's sessionID chain, so any missing link produced a zero-request silent empty state. On mount the inspector now discovers via the project-level `GET /dag`, groups rows by owning session for the session-scoped summary endpoint, and the routed sessionID demotes to a live-data preference instead of a hard gate, so running workflows stay listed without session context.
- **Warn-only shell silence guard, #433**: long-running shell commands now surface a single inactivity warning per silent stretch instead of silently looking hung. The new `OPENCODE_EXPERIMENTAL_BASH_SILENCE_WARN_MS` runtime flag (default 5 minutes) sets the threshold, the `expectedSilent` shell parameter opts out per invocation, command output resets the silence window, and the race/kill path is untouched, so abort and timeout semantics are unchanged.

---

### ⚙️ CI / Engineering

- `spec_git/policy.yaml` required checks realigned, 29e876ac2c: SpecGit acceptance for dev deliveries now requires the `Typecheck` and `Unit Tests (linux)` checks instead of the `unit-tests`/`e2e-tests` ids, matching the dev gates where E2E does not block.
- JS SDK regenerated: the generated `DagWorkflowSummary` types carry the new `graphRev` field, and the CI `Check generated SDK` freshness gate passes.
- SpecGit harness refreshed for the 1.10.1 CLI, #488: policy, managed blocks, and hooks regenerated byte-identically; the opencode command surface updated; the repository-specialized `specgit-accept.yml` deviations preserved.
- JS SDK: the generated `DagWorkflowSummary` types carry the new `graphRev` field, and the generated spec and codegen output got per-run ownership to stop concurrent generation races, #475.
- Core hardening: dirty worktree removal is classified via porcelain state, #474; the httpapi exerciser teardown is bounded and force-exits, #472; `.git/HEAD` watcher events are normalized on macOS in tests.
- Docs: legacy Claude and OpenSpec repository artifacts removed, #477.

---

### 🧪 Test Summary

- New `packages/tui/test/feature-plugins/dag-panel.test.tsx` regression suite: equal-count replan bumps `graphRev` alone and refetches exactly once; a no-op summary replacement with the same `graphRev` and counts does not refetch.
- Companion coverage: inspector refetch-once (`dag-inspector.test.tsx`), equal-count replan summary emission (`dag-summary-publisher-behavior.test.ts`), core summary store revision (`dag-store-summaries.test.ts`), and the HttpAPI contract exercise asserting `summary.graphRev`.
- Shell silence guard delivery: `shell.test.ts` 28 pass (warning, exemption, output reset, abort/timeout non-regression) and `runtime-flags.test.ts` 42 pass on the delivery branch.

```
typecheck: root 29/29 tasks green
test:dag-core: pass
test:httpapi:ci: 230 pass / 0 fail
focused suites: inspector 29 pass, sidebar/sync 7 pass
CI @ 29e876ac2c: Typecheck / Unit Tests (linux) / E2E linux+windows / CodeQL all pass
lint: 4836 warnings (ratchet 4850)
CI @ 818f47db1 (PR #492, full gates)
typecheck: pass
unit tests (linux): pass
e2e tests: linux pass / windows pass
specgit acceptance: accepted (exit 0)
codeql: pass
focused suites: shell 28 pass, runtime-flags 42 pass, dag-panel refetch-once pass
```

---

### 🔍 Verification

- DAG development workflow `dag_fe5fa90eeff6BrTFcV9rWDOSyK`: final review ACCEPT after R1 fixes, and `specgit finish --json` exited 0 with the PR #469 checklist complete.
- All 8 GitHub checks on PR #469 green at 29e876ac2c, including E2E on linux (2m38s) and windows (7m19s).
- Scope honesty: the only feature surface in this range is the DAG summary and TUI refresh signature; no upstream sync content, no dependency changes, and no standalone architecture or refactor entries.
- Prerelease acceptance on `graphagent-v1.0.37-dev.3` (release run 33568595659): the fail-closed `Package Reference Templates` validation against config repo HEAD passed, the shipped `dag-templates.tar.gz` SHA256SUMS verified, and the corrected `release-route.yaml` (`worker_type: general`) preflighted valid with every worker resolved.
- The config-repo repair (#22/#23 in opencode-dag-config, `worker_type` `verify` to `general`) shipped in dev.3 after the dev.2 full acceptance returned REVISE with that `worker.unknown` start failure as the sole P1.
- Scope honesty: the feature surfaces in this range are the three items above; everything else is fixes, tests, docs, and engineering.

---

Expand Down
8 changes: 4 additions & 4 deletions .specgit.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
version: 1
delivery: shell-silence-guard
delivery: sync-main-to
context:
kind: branch
branch: feat/433-shell-silence-guard
branch: chore/496-sync-main-to
issues:
- 433
pr: 491
- 496
pr: 497
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ feat/**, fix/** ──PR(Typecheck + Unit Tests 门禁)──▶ dev ──push
**CI 配置**:
- `ci-typecheck.yml`:push 到 `main`/`dev` + PR → `main`/`dev` 时触发;除 lint + typecheck 外还跑 `test:dag-core` DAG 核心行为/覆盖率门禁(10min 超时)
- `ci-test.yml`:push 到 `main`/`dev` + PR → `main`/`dev` 时触发全量测试(`cancel-in-progress: false` 保证跑完);Linux unit-tests job 额外校验生成物新鲜度(`packages/client` 与 `packages/sdk/js` 的 `check:generated`)并跑 HttpAPI 契约门禁(`test:httpapi:ci`)
- `specgit-accept.yml`:仅 PR → `main` 时触发;安装 pinned `specgit@1.0.1`,等 `spec_git/policy.yaml` `required_checks` 全部到终态后运行 `specgit finish --json` 产出 SpecGit Acceptance 裁决
- `specgit-accept.yml`:仅 PR → `main` 时触发;全局安装 `specgit@^0.5.0`(`npm install -g`;workspace 内安装会因 bun `catalog:` 协议失败),等 `spec_git/policy.yaml` `required_checks` 全部到终态后运行 `specgit finish --json` 产出 SpecGit Acceptance 裁决
- `release-fork.yml`:手动 `workflow_dispatch` 是唯一真实构建路径(push 到 `main`/`dev` 仅注册不构建);从 `dev` 发布自动产出 `X.Y.Z-dev.N` prerelease,从 `main` 发布 `X.Y.Z` 并标 Latest

## Standard Delivery Workflow (标准交付流程)
Expand Down
Loading