diff --git a/.changeset/brave-moons-delegate.md b/.changeset/brave-moons-delegate.md deleted file mode 100644 index d9a8bc99..00000000 --- a/.changeset/brave-moons-delegate.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@openspec-ui/core": minor -"openspec-ui-vscode": minor -"@openspec-ui/webui": minor ---- - -A task that needs a live check can name the agent that performs it. -`**Delegated to **` sits beside `**Human-only**`: the first -means another agent can make the check, the second that none can. The -inbox in both hosts now carries both kinds and says who each item waits -on, naming an agent id the registry does not carry rather than treating -it as assigned. diff --git a/.changeset/brown-pianos-refuse.md b/.changeset/brown-pianos-refuse.md deleted file mode 100644 index 74de8b8b..00000000 --- a/.changeset/brown-pianos-refuse.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -"@openspec-ui/core": minor -"@openspec-ui/server": minor -"@openspec-ui/webui": patch -"openspec-ui-vscode": patch ---- - -A name arriving from a request is checked before it is used. A change -name now passes the change-name rule before it is joined into a path, -in core beside the path it protects, so a message naming -`../../../../Users/me/.claude` no longer decides where a `harness.json` -is written — the bridge answers `ok: false` and the REST routes answer -400, both carrying the rule the name broke. A schedule entry is -validated on the way in by the same rule the reader applies on the way -out, so a stored row and the response that reported it can no longer -disagree, and a body asking for an addition and a removal at once is -refused rather than half-applied. A `customAgent` obeys the same shape -rule as a model id, for the same reason: both reach the CLI as the value -of a flag, and a value beginning with `-` may be read as a second one. A -custom-agent definition whose file name that rule refuses is reported as -found and not offered, rather than dropped in silence. diff --git a/.changeset/olive-rows-restore.md b/.changeset/olive-rows-restore.md deleted file mode 100644 index 2e8e8efe..00000000 --- a/.changeset/olive-rows-restore.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"openspec-ui-vscode": patch ---- - -A change row rebuilt to answer "what is this element's parent" now -carries the state the tree drew, instead of `draft` written in. VS Code -restores the tree's selection through that chain after a window reload -and draws what it returns, so a change with every task done could read -`draft` until the next refresh. diff --git a/.changeset/quality-names-the-checked-agent.md b/.changeset/quality-names-the-checked-agent.md deleted file mode 100644 index 5c5d45b6..00000000 --- a/.changeset/quality-names-the-checked-agent.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -"@openspec-ui/core": minor -"@openspec-ui/webui": minor ---- - -What a verifying stage's checks found is now charged to the agent whose -work they covered. The entry gains `checkedAgent`, taken from the chain's -resolved `apply` stage, and the quality readback groups by it — grouping -by the entry's `agent` could only ever produce one row, named -`verify-checks`, whatever had run the apply. An entry recorded before -that field existed is counted and reported as such rather than charged to -a group. - -A checks entry is also no longer counted as a run. It carries a terminal -outcome and no `started` partner, so the per-change cost report listed it -as a run refused before it started and one chain run of apply and verify -reported two previous runs; one predicate in core now says which entries -are runs, and both counters use it. A checks entry therefore no longer -appears as a row in the per-change cost report — what it found is read -back beside the run figures instead. - -A recommendation's gap says which nothing it is: nothing reported the -measure, something reported it but rests on too few runs, or one -candidate is eligible with nothing to compare against. Four runs that -each reported a cost previously read as "no agent has reported a cost -across 4 recorded run(s)". diff --git a/.changeset/quiet-schedules-keep-promises.md b/.changeset/quiet-schedules-keep-promises.md deleted file mode 100644 index 603209ff..00000000 --- a/.changeset/quiet-schedules-keep-promises.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -"@openspec-ui/core": minor -"@openspec-ui/webui": minor -"@openspec-ui/server": patch -"openspec-ui-vscode": minor ---- - -A scheduled run keeps the promise the dialog makes. Opening the -application is now enough: the workspace is read on open, so the -schedule is read too and a due run starts with nothing else done — it -used to wait for a click that a real reopen never makes. The run starts -on the path that was chosen when it was scheduled rather than reopening -the dialog for the same choice, and the entry leaves the file only once -the run has been opened, so a configuration that cannot be resolved -reports itself as a run that could not be opened instead of consuming -the schedule under the wrong message. A change archived after being -scheduled is dropped and says it was archived, and a run due behind it -starts on the same reading. Firing is decided once, in -`planScheduleFiring` in core, with each host performing only the -effects it is handed. The dialog is announced as a dialog and takes -focus when it opens by itself, and what the schedule did is readable -from any tab of the standalone shell. diff --git a/.changeset/stage-override-keeps-its-custom-agent.md b/.changeset/stage-override-keeps-its-custom-agent.md deleted file mode 100644 index 0ccaa07d..00000000 --- a/.changeset/stage-override-keeps-its-custom-agent.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -"@openspec-ui/core": patch -"@openspec-ui/webui": patch -"openspec-ui-vscode": patch ---- - -A stage override keeps its custom agent, and one function decides what -applying a named configuration writes. - -`mergeStepAgent` merged three named fields across a per-change override. -`customAgent` was the fourth field a stage entry may carry, so a change -naming the same agent plus a custom agent resolved without it and the -chain ran with no `--agent` flag, silently. The merge now iterates -`STEP_AGENT_KEYS` — the list the validator already reads — so the next -field added to an entry arrives already merged, and it agrees with -`templateConfigToWrite`, which kept the field by spread. - -Applying a named configuration to a change now goes through one core -function, `changeTemplateConfigToWrite`, from all three surfaces. The -run dialog resolved a configuration's effort against the change's -resolved configuration and the settings view against the change's own -override, where every stage the change does not name reads as -"inherit" — so the two wrote different files for the same change, and -the settings view's message said "None of the agents on screen takes an -effort setting" when that was not the reason. That message now names the -stages given an effort, the agents that take none, and the stages with -no agent chosen, each only where it is true. - -The balanced and careful configurations describe their effort by its -position in the agent's range ("a third of the way up", "two thirds") -rather than as "the middle", which the thirds mapping never produced: -for `copilot-cli` the medium level resolves to `low`, the third of -seven. `HARNESS.md` carries the resolved value per registered agent. diff --git a/package-lock.json b/package-lock.json index 440202ad..917fb27f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11957,7 +11957,7 @@ }, "packages/core": { "name": "@openspec-ui/core", - "version": "0.62.0", + "version": "0.63.0", "dependencies": { "@agentclientprotocol/sdk": "^1.4.0", "cross-spawn": "^7.0.6", @@ -11973,7 +11973,7 @@ }, "packages/extension": { "name": "openspec-ui-vscode", - "version": "0.46.1", + "version": "0.47.0", "license": "MIT", "dependencies": { "@openspec-ui/core": "*", @@ -12479,7 +12479,7 @@ }, "packages/server": { "name": "@openspec-ui/server", - "version": "1.17.0", + "version": "1.18.0", "dependencies": { "@openspec-ui/core": "*", "ws": "^8.21.0" @@ -12979,7 +12979,7 @@ }, "packages/webui": { "name": "@openspec-ui/webui", - "version": "1.33.0", + "version": "1.34.0", "dependencies": { "@openspec-ui/core": "*", "@tanstack/react-virtual": "^3.14.10", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b12d9d01..6edcc375 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,96 @@ # @openspec-ui/core +## 0.63.0 + +### Minor Changes + +- be28986: A task that needs a live check can name the agent that performs it. + `**Delegated to **` sits beside `**Human-only**`: the first + means another agent can make the check, the second that none can. The + inbox in both hosts now carries both kinds and says who each item waits + on, naming an agent id the registry does not carry rather than treating + it as assigned. +- 9dd0767: A name arriving from a request is checked before it is used. A change + name now passes the change-name rule before it is joined into a path, + in core beside the path it protects, so a message naming + `../../../../Users/me/.claude` no longer decides where a `harness.json` + is written — the bridge answers `ok: false` and the REST routes answer + 400, both carrying the rule the name broke. A schedule entry is + validated on the way in by the same rule the reader applies on the way + out, so a stored row and the response that reported it can no longer + disagree, and a body asking for an addition and a removal at once is + refused rather than half-applied. A `customAgent` obeys the same shape + rule as a model id, for the same reason: both reach the CLI as the value + of a flag, and a value beginning with `-` may be read as a second one. A + custom-agent definition whose file name that rule refuses is reported as + found and not offered, rather than dropped in silence. +- 1b67bee: What a verifying stage's checks found is now charged to the agent whose + work they covered. The entry gains `checkedAgent`, taken from the chain's + resolved `apply` stage, and the quality readback groups by it — grouping + by the entry's `agent` could only ever produce one row, named + `verify-checks`, whatever had run the apply. An entry recorded before + that field existed is counted and reported as such rather than charged to + a group. + + A checks entry is also no longer counted as a run. It carries a terminal + outcome and no `started` partner, so the per-change cost report listed it + as a run refused before it started and one chain run of apply and verify + reported two previous runs; one predicate in core now says which entries + are runs, and both counters use it. A checks entry therefore no longer + appears as a row in the per-change cost report — what it found is read + back beside the run figures instead. + + A recommendation's gap says which nothing it is: nothing reported the + measure, something reported it but rests on too few runs, or one + candidate is eligible with nothing to compare against. Four runs that + each reported a cost previously read as "no agent has reported a cost + across 4 recorded run(s)". +- c679bd4: A scheduled run keeps the promise the dialog makes. Opening the + application is now enough: the workspace is read on open, so the + schedule is read too and a due run starts with nothing else done — it + used to wait for a click that a real reopen never makes. The run starts + on the path that was chosen when it was scheduled rather than reopening + the dialog for the same choice, and the entry leaves the file only once + the run has been opened, so a configuration that cannot be resolved + reports itself as a run that could not be opened instead of consuming + the schedule under the wrong message. A change archived after being + scheduled is dropped and says it was archived, and a run due behind it + starts on the same reading. Firing is decided once, in + `planScheduleFiring` in core, with each host performing only the + effects it is handed. The dialog is announced as a dialog and takes + focus when it opens by itself, and what the schedule did is readable + from any tab of the standalone shell. + +### Patch Changes + +- ad1a8ae: A stage override keeps its custom agent, and one function decides what + applying a named configuration writes. + + `mergeStepAgent` merged three named fields across a per-change override. + `customAgent` was the fourth field a stage entry may carry, so a change + naming the same agent plus a custom agent resolved without it and the + chain ran with no `--agent` flag, silently. The merge now iterates + `STEP_AGENT_KEYS` — the list the validator already reads — so the next + field added to an entry arrives already merged, and it agrees with + `templateConfigToWrite`, which kept the field by spread. + + Applying a named configuration to a change now goes through one core + function, `changeTemplateConfigToWrite`, from all three surfaces. The + run dialog resolved a configuration's effort against the change's + resolved configuration and the settings view against the change's own + override, where every stage the change does not name reads as + "inherit" — so the two wrote different files for the same change, and + the settings view's message said "None of the agents on screen takes an + effort setting" when that was not the reason. That message now names the + stages given an effort, the agents that take none, and the stages with + no agent chosen, each only where it is true. + + The balanced and careful configurations describe their effort by its + position in the agent's range ("a third of the way up", "two thirds") + rather than as "the middle", which the thirds mapping never produced: + for `copilot-cli` the medium level resolves to `low`, the third of + seven. `HARNESS.md` carries the resolved value per registered agent. + ## 0.62.0 ### Minor Changes diff --git a/packages/core/package.json b/packages/core/package.json index 496a4836..45c56af3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@openspec-ui/core", "private": true, - "version": "0.62.0", + "version": "0.63.0", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/extension/CHANGELOG.md b/packages/extension/CHANGELOG.md index ffe966c3..8ee4b648 100644 --- a/packages/extension/CHANGELOG.md +++ b/packages/extension/CHANGELOG.md @@ -1,5 +1,88 @@ # Changelog +## 0.47.0 + +### Minor Changes + +- be28986: A task that needs a live check can name the agent that performs it. + `**Delegated to **` sits beside `**Human-only**`: the first + means another agent can make the check, the second that none can. The + inbox in both hosts now carries both kinds and says who each item waits + on, naming an agent id the registry does not carry rather than treating + it as assigned. +- c679bd4: A scheduled run keeps the promise the dialog makes. Opening the + application is now enough: the workspace is read on open, so the + schedule is read too and a due run starts with nothing else done — it + used to wait for a click that a real reopen never makes. The run starts + on the path that was chosen when it was scheduled rather than reopening + the dialog for the same choice, and the entry leaves the file only once + the run has been opened, so a configuration that cannot be resolved + reports itself as a run that could not be opened instead of consuming + the schedule under the wrong message. A change archived after being + scheduled is dropped and says it was archived, and a run due behind it + starts on the same reading. Firing is decided once, in + `planScheduleFiring` in core, with each host performing only the + effects it is handed. The dialog is announced as a dialog and takes + focus when it opens by itself, and what the schedule did is readable + from any tab of the standalone shell. + +### Patch Changes + +- 9dd0767: A name arriving from a request is checked before it is used. A change + name now passes the change-name rule before it is joined into a path, + in core beside the path it protects, so a message naming + `../../../../Users/me/.claude` no longer decides where a `harness.json` + is written — the bridge answers `ok: false` and the REST routes answer + 400, both carrying the rule the name broke. A schedule entry is + validated on the way in by the same rule the reader applies on the way + out, so a stored row and the response that reported it can no longer + disagree, and a body asking for an addition and a removal at once is + refused rather than half-applied. A `customAgent` obeys the same shape + rule as a model id, for the same reason: both reach the CLI as the value + of a flag, and a value beginning with `-` may be read as a second one. A + custom-agent definition whose file name that rule refuses is reported as + found and not offered, rather than dropped in silence. +- 683fef4: A change row rebuilt to answer "what is this element's parent" now + carries the state the tree drew, instead of `draft` written in. VS Code + restores the tree's selection through that chain after a window reload + and draws what it returns, so a change with every task done could read + `draft` until the next refresh. +- ad1a8ae: A stage override keeps its custom agent, and one function decides what + applying a named configuration writes. + + `mergeStepAgent` merged three named fields across a per-change override. + `customAgent` was the fourth field a stage entry may carry, so a change + naming the same agent plus a custom agent resolved without it and the + chain ran with no `--agent` flag, silently. The merge now iterates + `STEP_AGENT_KEYS` — the list the validator already reads — so the next + field added to an entry arrives already merged, and it agrees with + `templateConfigToWrite`, which kept the field by spread. + + Applying a named configuration to a change now goes through one core + function, `changeTemplateConfigToWrite`, from all three surfaces. The + run dialog resolved a configuration's effort against the change's + resolved configuration and the settings view against the change's own + override, where every stage the change does not name reads as + "inherit" — so the two wrote different files for the same change, and + the settings view's message said "None of the agents on screen takes an + effort setting" when that was not the reason. That message now names the + stages given an effort, the agents that take none, and the stages with + no agent chosen, each only where it is true. + + The balanced and careful configurations describe their effort by its + position in the agent's range ("a third of the way up", "two thirds") + rather than as "the middle", which the thirds mapping never produced: + for `copilot-cli` the medium level resolves to `low`, the third of + seven. `HARNESS.md` carries the resolved value per registered agent. +- Updated dependencies [be28986] +- Updated dependencies [9dd0767] +- Updated dependencies [1b67bee] +- Updated dependencies [c679bd4] +- Updated dependencies [ad1a8ae] + - @openspec-ui/core@0.63.0 + - @openspec-ui/webui@1.34.0 + - @openspec-ui/server@1.18.0 + ## 0.46.1 ### Patch Changes diff --git a/packages/extension/package.json b/packages/extension/package.json index 155a0eb0..e880c1da 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -4,7 +4,7 @@ "displayName": "OpenSpec Workbench", "description": "A dashboard + VS Code extension for OpenSpec, with Claude, Copilot, Codex, and Gemini agents built in.", "publisher": "openspec-ui", - "version": "0.46.1", + "version": "0.47.0", "icon": "media/icon.png", "license": "MIT", "repository": { diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index f524b14b..b1e6b579 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,48 @@ # @openspec-ui/server +## 1.18.0 + +### Minor Changes + +- 9dd0767: A name arriving from a request is checked before it is used. A change + name now passes the change-name rule before it is joined into a path, + in core beside the path it protects, so a message naming + `../../../../Users/me/.claude` no longer decides where a `harness.json` + is written — the bridge answers `ok: false` and the REST routes answer + 400, both carrying the rule the name broke. A schedule entry is + validated on the way in by the same rule the reader applies on the way + out, so a stored row and the response that reported it can no longer + disagree, and a body asking for an addition and a removal at once is + refused rather than half-applied. A `customAgent` obeys the same shape + rule as a model id, for the same reason: both reach the CLI as the value + of a flag, and a value beginning with `-` may be read as a second one. A + custom-agent definition whose file name that rule refuses is reported as + found and not offered, rather than dropped in silence. + +### Patch Changes + +- c679bd4: A scheduled run keeps the promise the dialog makes. Opening the + application is now enough: the workspace is read on open, so the + schedule is read too and a due run starts with nothing else done — it + used to wait for a click that a real reopen never makes. The run starts + on the path that was chosen when it was scheduled rather than reopening + the dialog for the same choice, and the entry leaves the file only once + the run has been opened, so a configuration that cannot be resolved + reports itself as a run that could not be opened instead of consuming + the schedule under the wrong message. A change archived after being + scheduled is dropped and says it was archived, and a run due behind it + starts on the same reading. Firing is decided once, in + `planScheduleFiring` in core, with each host performing only the + effects it is handed. The dialog is announced as a dialog and takes + focus when it opens by itself, and what the schedule did is readable + from any tab of the standalone shell. +- Updated dependencies [be28986] +- Updated dependencies [9dd0767] +- Updated dependencies [1b67bee] +- Updated dependencies [c679bd4] +- Updated dependencies [ad1a8ae] + - @openspec-ui/core@0.63.0 + ## 1.17.0 ### Minor Changes diff --git a/packages/server/package.json b/packages/server/package.json index 55055bd5..62434ab6 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@openspec-ui/server", "private": true, - "version": "1.17.0", + "version": "1.18.0", "type": "module", "main": "src/index.ts", "dependencies": { diff --git a/packages/webui/CHANGELOG.md b/packages/webui/CHANGELOG.md index 71531507..24bbcc5b 100644 --- a/packages/webui/CHANGELOG.md +++ b/packages/webui/CHANGELOG.md @@ -1,5 +1,102 @@ # @openspec-ui/webui +## 1.34.0 + +### Minor Changes + +- be28986: A task that needs a live check can name the agent that performs it. + `**Delegated to **` sits beside `**Human-only**`: the first + means another agent can make the check, the second that none can. The + inbox in both hosts now carries both kinds and says who each item waits + on, naming an agent id the registry does not carry rather than treating + it as assigned. +- 1b67bee: What a verifying stage's checks found is now charged to the agent whose + work they covered. The entry gains `checkedAgent`, taken from the chain's + resolved `apply` stage, and the quality readback groups by it — grouping + by the entry's `agent` could only ever produce one row, named + `verify-checks`, whatever had run the apply. An entry recorded before + that field existed is counted and reported as such rather than charged to + a group. + + A checks entry is also no longer counted as a run. It carries a terminal + outcome and no `started` partner, so the per-change cost report listed it + as a run refused before it started and one chain run of apply and verify + reported two previous runs; one predicate in core now says which entries + are runs, and both counters use it. A checks entry therefore no longer + appears as a row in the per-change cost report — what it found is read + back beside the run figures instead. + + A recommendation's gap says which nothing it is: nothing reported the + measure, something reported it but rests on too few runs, or one + candidate is eligible with nothing to compare against. Four runs that + each reported a cost previously read as "no agent has reported a cost + across 4 recorded run(s)". +- c679bd4: A scheduled run keeps the promise the dialog makes. Opening the + application is now enough: the workspace is read on open, so the + schedule is read too and a due run starts with nothing else done — it + used to wait for a click that a real reopen never makes. The run starts + on the path that was chosen when it was scheduled rather than reopening + the dialog for the same choice, and the entry leaves the file only once + the run has been opened, so a configuration that cannot be resolved + reports itself as a run that could not be opened instead of consuming + the schedule under the wrong message. A change archived after being + scheduled is dropped and says it was archived, and a run due behind it + starts on the same reading. Firing is decided once, in + `planScheduleFiring` in core, with each host performing only the + effects it is handed. The dialog is announced as a dialog and takes + focus when it opens by itself, and what the schedule did is readable + from any tab of the standalone shell. + +### Patch Changes + +- 9dd0767: A name arriving from a request is checked before it is used. A change + name now passes the change-name rule before it is joined into a path, + in core beside the path it protects, so a message naming + `../../../../Users/me/.claude` no longer decides where a `harness.json` + is written — the bridge answers `ok: false` and the REST routes answer + 400, both carrying the rule the name broke. A schedule entry is + validated on the way in by the same rule the reader applies on the way + out, so a stored row and the response that reported it can no longer + disagree, and a body asking for an addition and a removal at once is + refused rather than half-applied. A `customAgent` obeys the same shape + rule as a model id, for the same reason: both reach the CLI as the value + of a flag, and a value beginning with `-` may be read as a second one. A + custom-agent definition whose file name that rule refuses is reported as + found and not offered, rather than dropped in silence. +- ad1a8ae: A stage override keeps its custom agent, and one function decides what + applying a named configuration writes. + + `mergeStepAgent` merged three named fields across a per-change override. + `customAgent` was the fourth field a stage entry may carry, so a change + naming the same agent plus a custom agent resolved without it and the + chain ran with no `--agent` flag, silently. The merge now iterates + `STEP_AGENT_KEYS` — the list the validator already reads — so the next + field added to an entry arrives already merged, and it agrees with + `templateConfigToWrite`, which kept the field by spread. + + Applying a named configuration to a change now goes through one core + function, `changeTemplateConfigToWrite`, from all three surfaces. The + run dialog resolved a configuration's effort against the change's + resolved configuration and the settings view against the change's own + override, where every stage the change does not name reads as + "inherit" — so the two wrote different files for the same change, and + the settings view's message said "None of the agents on screen takes an + effort setting" when that was not the reason. That message now names the + stages given an effort, the agents that take none, and the stages with + no agent chosen, each only where it is true. + + The balanced and careful configurations describe their effort by its + position in the agent's range ("a third of the way up", "two thirds") + rather than as "the middle", which the thirds mapping never produced: + for `copilot-cli` the medium level resolves to `low`, the third of + seven. `HARNESS.md` carries the resolved value per registered agent. +- Updated dependencies [be28986] +- Updated dependencies [9dd0767] +- Updated dependencies [1b67bee] +- Updated dependencies [c679bd4] +- Updated dependencies [ad1a8ae] + - @openspec-ui/core@0.63.0 + ## 1.33.0 ### Minor Changes diff --git a/packages/webui/package.json b/packages/webui/package.json index 34ccaadd..dc701d44 100644 --- a/packages/webui/package.json +++ b/packages/webui/package.json @@ -1,7 +1,7 @@ { "name": "@openspec-ui/webui", "private": true, - "version": "1.33.0", + "version": "1.34.0", "type": "module", "main": "src/index.ts", "dependencies": {