@nidvue/teamwork 0.0.0-stage → 1.1.1
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.
- package/CHANGELOG.md +343 -0
- package/LICENSE +661 -0
- package/NOTICE +16 -0
- package/README.md +462 -2
- package/SECURITY.md +64 -0
- package/package.json +71 -4
- package/prompts/teamwork-pulse.md +12 -0
- package/prompts/teamwork-review.md +16 -0
- package/skills/teamwork/AGENTS.md +462 -0
- package/skills/teamwork/SKILL.md +795 -0
- package/skills/teamwork/references/Adapters.md +112 -0
- package/skills/teamwork/references/Audit.md +120 -0
- package/skills/teamwork/references/Concurrency.md +160 -0
- package/skills/teamwork/references/Dissent.md +85 -0
- package/skills/teamwork/references/Docs.md +74 -0
- package/skills/teamwork/references/Engineering.md +410 -0
- package/skills/teamwork/references/Evidence.md +140 -0
- package/skills/teamwork/references/Remotes.md +144 -0
- package/skills/teamwork/references/Roles.md +201 -0
- package/skills/teamwork/references/State.md +64 -0
- package/skills/teamwork/references/Testing.md +144 -0
- package/skills/teamwork/roles/architect.md +153 -0
- package/skills/teamwork/roles/ceo.md +218 -0
- package/skills/teamwork/roles/cfo.md +150 -0
- package/skills/teamwork/roles/coo.md +147 -0
- package/skills/teamwork/roles/cto.md +162 -0
- package/skills/teamwork/roles/data-engineer.md +120 -0
- package/skills/teamwork/roles/designer.md +349 -0
- package/skills/teamwork/roles/developer.md +166 -0
- package/skills/teamwork/roles/product-manager.md +151 -0
- package/skills/teamwork/roles/project-manager.md +159 -0
- package/skills/teamwork/roles/release-engineer.md +245 -0
- package/skills/teamwork/roles/reviewer.md +254 -0
- package/skills/teamwork/roles/security-auditor.md +157 -0
- package/skills/teamwork/roles/technical-writer.md +121 -0
- package/skills/teamwork/roles/tester.md +180 -0
- package/skills/teamwork/scripts/build_pi_package.py +200 -0
- package/skills/teamwork/scripts/privacy_scan.py +1185 -0
- package/skills/teamwork/scripts/sync_skill.py +108 -0
- package/skills/teamwork/scripts/teamwork.py +28 -0
- package/skills/teamwork/scripts/verify_release.py +502 -0
- package/skills/teamwork/src/teamwork/__init__.py +18 -0
- package/skills/teamwork/src/teamwork/__main__.py +10 -0
- package/skills/teamwork/src/teamwork/bundle.py +157 -0
- package/skills/teamwork/src/teamwork/cli.py +16 -0
- package/skills/teamwork/src/teamwork/config.py +396 -0
- package/skills/teamwork/src/teamwork/engine.py +10119 -0
- package/skills/teamwork/src/teamwork/gitutil.py +172 -0
- package/skills/teamwork/src/teamwork/imaging.py +124 -0
- package/skills/teamwork/src/teamwork/io.py +144 -0
- package/skills/teamwork/src/teamwork/layout.py +253 -0
- package/skills/teamwork/src/teamwork/names.py +191 -0
- package/skills/teamwork/src/teamwork/portable.py +79 -0
- package/skills/teamwork/src/teamwork/records.py +1220 -0
- package/skills/teamwork/src/teamwork/resources.py +120 -0
- package/skills/teamwork/src/teamwork/version.py +13 -0
- package/skills/teamwork/templates/AGENTS.md +460 -0
- package/skills/teamwork/templates/Docs/Architecture.md +40 -0
- package/skills/teamwork/templates/Docs/Archive.md +8 -0
- package/skills/teamwork/templates/Docs/Board.md +28 -0
- package/skills/teamwork/templates/Docs/Costs.md +30 -0
- package/skills/teamwork/templates/Docs/Decisions.md +26 -0
- package/skills/teamwork/templates/Docs/Design.md +106 -0
- package/skills/teamwork/templates/Docs/Plan.md +24 -0
- package/skills/teamwork/templates/Docs/Project.md +40 -0
- package/skills/teamwork/templates/Docs/Release.md +43 -0
- package/skills/teamwork/templates/Docs/Research.md +36 -0
- package/skills/teamwork/templates/Docs/Risks.md +18 -0
- package/skills/teamwork/templates/TeamMap.md +100 -0
- package/skills/teamwork-pi/SKILL.md +77 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Owner: Technical Writer.
|
|
4
|
+
|
|
5
|
+
Related: [Contributing](CONTRIBUTING.md) · [Security policy](SECURITY.md) · [Project](docs/Team/Project.md)
|
|
6
|
+
|
|
7
|
+
All notable changes to this project are documented in this file.
|
|
8
|
+
|
|
9
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
10
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
11
|
+
|
|
12
|
+
## [Unreleased](https://github.com/Nidvue/Teamwork/compare/v1.1.1...HEAD)
|
|
13
|
+
|
|
14
|
+
## [1.1.1](https://github.com/Nidvue/Teamwork/compare/v1.1.0...v1.1.1) - 2026-10-20
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **npm package republished as 1.1.1**: the first `npm publish` of
|
|
19
|
+
`@nidvue/teamwork@1.1.0` exited 0 but only *staged* the version on the registry
|
|
20
|
+
(`dist-tags.latest` stayed at the `0.0.0-stage` placeholder, the packument never
|
|
21
|
+
appeared, and `npm stage list` returned no stage-id to reject). A second publish
|
|
22
|
+
of that version is refused with `E409 Cannot publish over previously staged
|
|
23
|
+
version`. This is the phantom-staged-publish registry bug tracked as
|
|
24
|
+
[npm/cli#9889](https://github.com/npm/cli/issues/9889); the version number cannot
|
|
25
|
+
be reused, so the package ships as 1.1.1. No code, skill or protocol change -
|
|
26
|
+
the tarball is byte-identical to the 1.1.0 build apart from the version field.
|
|
27
|
+
|
|
28
|
+
## [1.1.0](https://github.com/Nidvue/Teamwork/releases/tag/v1.1.0) - 2026-10-20
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- **Roster tiers, and a slim roster by default**: `init --roster slim|standard|full`
|
|
33
|
+
replaces a 15-role hand-written list with a recipe, and `slim` (ceo, architect,
|
|
34
|
+
developer, tester, reviewer-1, reviewer-2) is now the default - 213 kB of startup
|
|
35
|
+
charters summed over the instances, against 552 kB at `full`. A trimmed role leaves a lane, not a gate:
|
|
36
|
+
`tests plan` only requires layers of staffed roles, and `required_tribunal` never
|
|
37
|
+
falls below two signers, with the Reviewer as the neutral seat. Two holes this
|
|
38
|
+
exposed are closed: a tribunal of one used to let the CEO sign and resolve their
|
|
39
|
+
own dispute, and `init` now prints the folded lanes and warns when a
|
|
40
|
+
gate-critical role is missing.
|
|
41
|
+
|
|
42
|
+
- **`@nidvue/teamwork` package**: the skill ships as a pi package under the
|
|
43
|
+
Nidvue npm scope (`pi.skills` + `pi.prompts`, host packages as
|
|
44
|
+
`peerDependencies` only). A pi session installs it
|
|
45
|
+
with `pi install npm:@nidvue/teamwork` and gets two skills: `/skill:teamwork` (the
|
|
46
|
+
protocol) and `/skill:teamwork-pi` (the pi tool mapping: `subagent` fan-out,
|
|
47
|
+
`schedule.create` pulse, `subagent_supervisor` replies, `subagent stop`), plus
|
|
48
|
+
the `teamwork-pulse` and `teamwork-review` prompt templates. The tarball is
|
|
49
|
+
assembled by `make package` from one source tree, so the pip package and the npm
|
|
50
|
+
package never drift.
|
|
51
|
+
|
|
52
|
+
- **Per-queue PR resolution**: `pr open` used to match a task id across the whole
|
|
53
|
+
`Reviews.md`, so a second role owning the same id reopened and rewrote the first
|
|
54
|
+
role's PR (measured: the security lane's `T-0001` re-opened the merged developer
|
|
55
|
+
`P-0020`). `find_pr`/`find_pr_exact` now accept the task's branch and a task-id
|
|
56
|
+
match only resolves inside that branch.
|
|
57
|
+
|
|
58
|
+
- **Parallel review lanes**: `pulse` hands each unclaimed deliverable awaiting review
|
|
59
|
+
to a different idle Reviewer lane, and `review --claim` / `--release` record the
|
|
60
|
+
holder on the task with a lease, a takeover after it lapses, and a verdict that
|
|
61
|
+
clears it.
|
|
62
|
+
|
|
63
|
+
- **Evidence packets**: `tests run`, `selfcheck` and `review` accept
|
|
64
|
+
`--baseline`, `--artifact` (repeatable) and `--replay`, so the author and the
|
|
65
|
+
Reviewer record the same five-part packet. Artifacts must exist in
|
|
66
|
+
the repository, are hashed (`path:sha256:bytes`) and the digest is appended to
|
|
67
|
+
the hash-chained ledger, so evidence is a replayable packet instead of a
|
|
68
|
+
sentence.
|
|
69
|
+
- **Verifiable closing manifest**: `ledger export` stops pinning the append-only
|
|
70
|
+
`docs/Team/Archive.md` (its entry lands at review time, so a committed digest was
|
|
71
|
+
stale by construction) and says why in `how_to_verify`; the other artifacts and
|
|
72
|
+
the ledger head still verify with `sha256sum -c`.
|
|
73
|
+
- **Repro-first gate**: `tests repro <T-id> --pre-rev ... --post-rev ...` records
|
|
74
|
+
a fail -> pass transition on the defect task and refuses a single revision, a
|
|
75
|
+
pre-run that does not read as failing, or a pre-revision that is not an
|
|
76
|
+
ancestor of the post-revision.
|
|
77
|
+
`task add --bug` marks a defect fix, whose self-check is refused until that
|
|
78
|
+
record exists; `audit` reports a closed bug task without one.
|
|
79
|
+
- **README "For agents"**: host detection, the clone, `selftest` verification, the
|
|
80
|
+
startup routine and the hard rules, written for the agent that installs and
|
|
81
|
+
drives the skill itself.
|
|
82
|
+
- **README "Common ways to use it"**: eight trimmed real transcripts - new project,
|
|
83
|
+
feature in an existing repository, red CI, manual steering, pulse/parallel,
|
|
84
|
+
resume, ledger proof, model routing.
|
|
85
|
+
- Tests assert the skill-first surfaces, the demo's line order and the new
|
|
86
|
+
namespace, so the framing and the URLs cannot silently regress.
|
|
87
|
+
- **Commit identity audit**: `teamwork identity --audit --range <base>..HEAD`
|
|
88
|
+
fails when a commit was not authored and committed by the acting role, and CI
|
|
89
|
+
runs it on every pull request and push. The engineering policy now states that
|
|
90
|
+
the role that does the work commits it, that the CEO commits only CEO-owned
|
|
91
|
+
documents and the bootstrap, and that the product identity is never valid.
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
|
|
95
|
+
- **A passing review merges the PR at once**: `review --result pass` is now the
|
|
96
|
+
merge trigger. The Reviewer that verified the revision lands it on the base
|
|
97
|
+
branch and deletes the branch in the same command, so an approved deliverable
|
|
98
|
+
never waits in a second queue for a different lane to merge it. Independence is
|
|
99
|
+
enforced against the **author** - nobody reviews or merges their own work - not
|
|
100
|
+
against a second Reviewer; `--keep-branch` keeps the branch and `--no-merge`
|
|
101
|
+
separates the landing step again. A pass that cannot land (a conflict, a dirty
|
|
102
|
+
tree) keeps the recorded verdict and prints the exact `pr merge` to finish,
|
|
103
|
+
saying plainly that the work is not in the base yet.
|
|
104
|
+
- **GitHub Actions bumps**: `anchore/sbom-action` 0.24.3,
|
|
105
|
+
`actions/attest-build-provenance` `4d101475`, and
|
|
106
|
+
`softprops/action-gh-release` `efb35369` landed as one reviewed commit; every
|
|
107
|
+
action stays pinned to a full commit SHA, never a moving tag.
|
|
108
|
+
- **Repository moved to `Nidvue/Teamwork`**: badges, clone commands, `pyproject`
|
|
109
|
+
URLs, `mkdocs.yml`, `CITATION.cff` and every documentation link now use the new
|
|
110
|
+
namespace. Only the historical audit records keep the former handle, because
|
|
111
|
+
rewriting a quoted command would falsify evidence.
|
|
112
|
+
- **Teamwork is presented as a skill, not a standalone app**: the README, docs
|
|
113
|
+
home, install guide, quickstart and the animated demo all start from one clone
|
|
114
|
+
into the agent host and a request that names the skill; the Python package is
|
|
115
|
+
documented as an optional engine over the same code.
|
|
116
|
+
|
|
117
|
+
- **One generic protocol, no host-specific instructions**: the README, docs home,
|
|
118
|
+
install guide, quickstart, CLI reference and the animated demo install the skill
|
|
119
|
+
into the project or user skills directory and start it by naming the skill.
|
|
120
|
+
On the adoption surfaces, concrete host tools live only in
|
|
121
|
+
`references/Adapters.md`, the optional adapter
|
|
122
|
+
reference, so the same text serves every agent.
|
|
123
|
+
|
|
124
|
+
### Security
|
|
125
|
+
|
|
126
|
+
- **The privacy scan now covers local and agent-host leakage**: tracked paths that
|
|
127
|
+
are private host state (`.pi/agent/` auth, settings, sessions, model stores),
|
|
128
|
+
credential files (`auth.json`, `.env`, `.netrc`, `.npmrc`, `.pypirc`, SSH keys,
|
|
129
|
+
`.aws/credentials`, `.kube/config`, `.docker/config.json`), key material and
|
|
130
|
+
local working state (`.pi/`, virtualenvs, build output, caches, `Scratch/`) fail
|
|
131
|
+
the gate; so do JSON config objects with a live credential, provider tokens
|
|
132
|
+
(`gsk_`, `xai-`, `pplx-`, `glpat-`, `npm_`, `hf_`, `sk_live_`, SendGrid) and
|
|
133
|
+
WSL/mounted home paths. Quoting `.pi/Teamwork/...` in a document is not host
|
|
134
|
+
configuration, but a **tracked** file under the workspace fails; legitimate
|
|
135
|
+
project paths (`.agents/skills/`, `.claude/skills/`, `.env.example`, `auth.py`)
|
|
136
|
+
stay clean.
|
|
137
|
+
|
|
138
|
+
- **`.gitignore` completed**: Python, packaging, test, doc-build, editor and OS
|
|
139
|
+
noise are ignored; credentials are denied by name (`auth.json`, `.env*`,
|
|
140
|
+
`*.pem`, SSH keys, `.netrc`, `.npmrc`, `.pypirc`); local agent-host state
|
|
141
|
+
(a host's `settings.local.json`, session/transcript directories, aider history)
|
|
142
|
+
is ignored while a committed skill bundle under `.agents/skills/` or
|
|
143
|
+
`.claude/skills/` stays tracked. A `.gitignore` deny entry is not treated as a
|
|
144
|
+
leak by the privacy scan.
|
|
145
|
+
|
|
146
|
+
- **Packaging metadata**: the `pyproject` keyword `pi` became `agent-skills`, so the
|
|
147
|
+
package is not advertised as one host's add-on.
|
|
148
|
+
|
|
149
|
+
- **Forge merge refs**: the synthetic `Merge <sha> into <sha>` commit a forge
|
|
150
|
+
creates for a pull request carries the PR author's account identity. The history
|
|
151
|
+
scan skips that identity (message and blobs are still scanned) so a clean branch
|
|
152
|
+
is not failed by the forge account; squash-only merges keep such a commit out of
|
|
153
|
+
`main`.
|
|
154
|
+
|
|
155
|
+
### Fixed
|
|
156
|
+
|
|
157
|
+
- **`pr merge` built the merge commit but never advanced the base branch**: a PR
|
|
158
|
+
record whose `base` held a revision instead of a branch name (as P-0022 did)
|
|
159
|
+
made `git checkout <base>` detach HEAD, so the merge commit was created
|
|
160
|
+
off-branch: the merge was reported as done and recorded everywhere, while
|
|
161
|
+
`main` still pointed at the pre-merge tip and the merge commit was reachable
|
|
162
|
+
only by fast-forwarding the base by hand. The base is now resolved to the
|
|
163
|
+
local branch pointing at the recorded revision (preferring `main`, accepting a
|
|
164
|
+
unique match) and a revision no branch points at is refused with exit `2`
|
|
165
|
+
before anything is merged; the merge also runs in the work tree that has the
|
|
166
|
+
base checked out, so starting it from an instance worktree no longer fails on
|
|
167
|
+
`git checkout` or advances the wrong checkout
|
|
168
|
+
(`tests/unit/test_pr_merge_base_advance.py`).
|
|
169
|
+
- **the archive entry never reached the base branch**: the entry is written by
|
|
170
|
+
the review pass, in whichever work tree that pass ran in - in the per-instance
|
|
171
|
+
layout a lane work tree - so after the merge the base had no archived record of
|
|
172
|
+
the shipped work. Entries are now written where the task's base branch is
|
|
173
|
+
checked out, and `pr merge` appends a missing entry on the base before it
|
|
174
|
+
commits the records, so the entry rides along in the same `chore(records)`
|
|
175
|
+
commit and is repointed at the merge revision in that same commit.
|
|
176
|
+
- **`pr merge` left the archive rewrite uncommitted**: the `branch / merge`
|
|
177
|
+
field of `docs/Team/Archive.md` was rewritten in the work tree after the merge
|
|
178
|
+
commit, so the base branch kept `pending`, the tree stayed dirty, and the next
|
|
179
|
+
merge in the same repository died on `git checkout` ("your local changes would
|
|
180
|
+
be overwritten"). The rewrite now lands as its own `chore(records)` commit on
|
|
181
|
+
the base branch (Reviewer identity, one `pr.merge.archive` ledger record), so
|
|
182
|
+
the committed archive names the real merge revision
|
|
183
|
+
(`tests/unit/test_context_economy.py`).
|
|
184
|
+
- **archive rewrite could erase an earlier merge**: a task reworked after a
|
|
185
|
+
merge reuses its branch name, so `docs/Team/Archive.md` held two entries naming
|
|
186
|
+
the same branch. The rewrite repointed every match, overwriting the first merge
|
|
187
|
+
revision with the second. Only the newest entry still saying `pending` is
|
|
188
|
+
repointed now, and a branch with nothing pending is reported as unchanged.
|
|
189
|
+
- **`pr merge --pr <task>` could select an already-merged PR**: a task reworked
|
|
190
|
+
after a merge keeps the old PR record, so matching on the task id alone could
|
|
191
|
+
return the branch already in the base. `find_pr` and `find_pr_exact` take an
|
|
192
|
+
optional branch and every PR lookup in the merge path passes the task's current
|
|
193
|
+
branch, so the live record is the one that merges.
|
|
194
|
+
- **`ensure_gitignore` bootstrap**: a repository whose `.gitignore` already
|
|
195
|
+
covered a rule with a glob (`.env.*` covers `.env.local`) gained a dangling
|
|
196
|
+
section header and redundant lines on every `init`/`repo`. Coverage is now
|
|
197
|
+
pattern-aware, a header is only appended together with a missing entry it
|
|
198
|
+
introduces, and an empty file no longer starts with a blank line
|
|
199
|
+
(`tests/unit/test_gitignore_bootstrap.py`).
|
|
200
|
+
- **Gate-forging metadata injection**: a task/memory body line that looked like
|
|
201
|
+
`- review_status: passed`, or a newline in `--evidence`/`--note`/`--text`, could
|
|
202
|
+
forge lifecycle state. Metadata parsing now stops at the body boundary, scalar
|
|
203
|
+
values are collapsed to one line, and record headers inside a body are escaped.
|
|
204
|
+
- **`ledger repair` self-deadlock**: the repair path held `ledger.lock` and then
|
|
205
|
+
called `ledger_append`, which took the same non-reentrant lock. Repair now uses
|
|
206
|
+
a reentrant-safe append and a torn tail is trimmed before the next record.
|
|
207
|
+
- **Path traversal**: agent, role and provider names became raw path components;
|
|
208
|
+
`init --agents ../../x` and `slot --provider ../../x` could write outside the
|
|
209
|
+
workspace. Every path component now goes through `safe_component()`.
|
|
210
|
+
- **Cross-role work**: a task could be claimed by another role, and a self-check
|
|
211
|
+
by a foreign role could claim unclaimed work. Claims and self-checks now stay
|
|
212
|
+
on the owning role's queue.
|
|
213
|
+
- **Review/PR races**: `pr open`/`pr merge` wrote `TaskQueue.md` and `Reviews.md`
|
|
214
|
+
outside the role/reviews locks, and could lose a concurrent verdict or claim.
|
|
215
|
+
The write order is now merge -> role -> reviews, with a re-read before writing.
|
|
216
|
+
- **Stale claims**: a midnight-based age was compared to a 90-minute TTL, so a
|
|
217
|
+
task claimed earlier the same day looked abandoned. Staleness now uses whole
|
|
218
|
+
days and ignores a live slot lease.
|
|
219
|
+
- **Decision ids**: two decisions by the same role on the same day shared one id;
|
|
220
|
+
a `-2`, `-3` suffix now keeps them distinct.
|
|
221
|
+
- **Model routing**: `model set product-manager` was stored as an agent override
|
|
222
|
+
because the name contains a hyphen; the target is now resolved against the
|
|
223
|
+
actual instances first.
|
|
224
|
+
- **Audit manifest anchor**: a re-created workspace was reported as a truncated
|
|
225
|
+
ledger because the committed manifest came from the previous tree. The manifest
|
|
226
|
+
is now scoped by a per-workspace `TeamId`.
|
|
227
|
+
- **Privacy report context**: the masked report could republish a neighbouring
|
|
228
|
+
secret from the same line; `context` is no longer emitted. History scanning also
|
|
229
|
+
follows reflogs, UTF-16 text is decoded, URLs/paths/digits are not credentials,
|
|
230
|
+
and non-blob git objects no longer desynchronise the batch reader.
|
|
231
|
+
- **Repo-local role identity**: `init`/`repo` now writes the CEO role mailbox to
|
|
232
|
+
the repository's local `user.name`/`user.email` when no local email exists, so
|
|
233
|
+
a plain `git commit` cannot inherit the operator's personal identity. An
|
|
234
|
+
existing local identity is never overwritten.
|
|
235
|
+
- **CLI exit-code contract**: the reference and architecture now state the codes
|
|
236
|
+
the binary actually returns - `2` for usage and the gates that opt into it,
|
|
237
|
+
`1` for a generic error / role refusal / `loop` CONTINUE, `3` for nothing to
|
|
238
|
+
dispatch, `4` for a lock timeout.
|
|
239
|
+
- **Modular engine**: the 9.6k-line `engine.py` is now a thin command layer over
|
|
240
|
+
typed `config`, `io`, `names`, `layout`, `records`, `gitutil` and `imaging`
|
|
241
|
+
modules. Behaviour is unchanged; the suite and coverage floor guard the split.
|
|
242
|
+
- **Release verification**: `verify_release.py` now checks the artefact version,
|
|
243
|
+
inspects the sdist, drops every ambient `TEAMWORK_*` variable in the smoke test,
|
|
244
|
+
and writes `SHA256SUMS` only after every check passes.
|
|
245
|
+
- **CI integrity**: actions are pinned to full commit SHAs, the identity audit
|
|
246
|
+
covers the pushed range and skips external contributors by default, the release
|
|
247
|
+
workflow tests and verifies the tagged revision, SBOMs describe `dist/`, and the
|
|
248
|
+
docs site excludes the internal `docs/Team/` working documents.
|
|
249
|
+
|
|
250
|
+
## [1.0.2](https://github.com/Nidvue/Teamwork/releases/tag/v1.0.2) - 2026-10-17
|
|
251
|
+
|
|
252
|
+
### Added
|
|
253
|
+
|
|
254
|
+
- **Automatic model routing** from the runtime environment: `teamwork model auto`
|
|
255
|
+
detects the agent host (pi, claude, opencode, codex, cursor, gemini), routes the
|
|
256
|
+
strongest available model to the decision lanes and the economy model to the
|
|
257
|
+
mechanical lanes, and never invents a model id (`--apply`, `--json`).
|
|
258
|
+
- `TEAMWORK_AGENT_HOST` to pin host detection deterministically.
|
|
259
|
+
- The site is served from the custom domain **teamwork.nidvue.com**.
|
|
260
|
+
|
|
261
|
+
### Changed
|
|
262
|
+
|
|
263
|
+
- Positioning: Nidvue Teamwork is published as a **skill for any coding agent**;
|
|
264
|
+
the stdlib-only engine is the tool the skill calls and the package is optional.
|
|
265
|
+
- Branding: the master brand **Nidvue** precedes the product name in the README,
|
|
266
|
+
the site, the docs, the package metadata and the file headers; the Nidvue mark
|
|
267
|
+
from nidvue.com is bundled and used in the README and the site (with a trademark
|
|
268
|
+
note in NOTICE).
|
|
269
|
+
|
|
270
|
+
### Fixed
|
|
271
|
+
|
|
272
|
+
- The release workflow fails when the tag and the package version disagree.
|
|
273
|
+
|
|
274
|
+
## [1.0.1](https://github.com/Nidvue/Teamwork/releases/tag/v1.0.1) - 2026-10-17
|
|
275
|
+
|
|
276
|
+
### Added
|
|
277
|
+
|
|
278
|
+
- Run on **any agent host**: `references/Adapters.md` maps the six host operations
|
|
279
|
+
to Pi, Claude Code, opencode, Codex, Cursor and a generic shell, with installation
|
|
280
|
+
paths and degraded modes.
|
|
281
|
+
- Run against **any git host**: `references/Remotes.md` states the repository and CI
|
|
282
|
+
integrity policy (protected default branch, no force-push, required checks on the
|
|
283
|
+
exact revision, non-author approval, squash-only merges, protected `v*` tags,
|
|
284
|
+
least-privilege CI, drift checks) and maps it to GitHub, GitLab, Bitbucket,
|
|
285
|
+
Gitea/Forgejo and Azure DevOps.
|
|
286
|
+
- A canonical **lint / format / type toolchain per language**, enforced in CI.
|
|
287
|
+
- **Warnings are errors**: `pytest filterwarnings = ["error"]`, and every workflow
|
|
288
|
+
action moved off the Node-20-deprecated majors.
|
|
289
|
+
- A **naming policy** (PascalCase team directories, ecosystem-correct file names)
|
|
290
|
+
and **commit rebase/squash hygiene** (one commit per task).
|
|
291
|
+
- Several **Reviewers run in parallel** from one shared queue.
|
|
292
|
+
- Imaging is owned by the Designer, raster and vector, with a
|
|
293
|
+
generate-review-improve loop.
|
|
294
|
+
|
|
295
|
+
### Fixed
|
|
296
|
+
|
|
297
|
+
- The privacy scan allows GitHub service mailboxes (`support@github.com`), and no
|
|
298
|
+
longer reads a dotted identifier as a credential.
|
|
299
|
+
- `ledger export` writes `AuditManifest.md` instead of overwriting the Security
|
|
300
|
+
Auditor's `AuditReport.md`, and never embeds the absolute checkout path.
|
|
301
|
+
- The engine pins `newline="\n"` on every text write without using the Python
|
|
302
|
+
3.10-only `write_text(newline=...)`, so 3.9 stays supported.
|
|
303
|
+
|
|
304
|
+
### Security
|
|
305
|
+
|
|
306
|
+
- The initial commit's personal author identity was purged; the repository was
|
|
307
|
+
recreated so no unreachable object or pull ref carries it.
|
|
308
|
+
- The team mailbox domain is `agents.nidvue.com`; every commit uses a role mailbox.
|
|
309
|
+
|
|
310
|
+
## [1.0.0](https://github.com/Nidvue/Teamwork/releases/tag/v1.0.0) - 2026-10-17
|
|
311
|
+
|
|
312
|
+
### Added
|
|
313
|
+
|
|
314
|
+
- Installable `teamwork-agents` package exposing the `teamwork` console script
|
|
315
|
+
and `python -m teamwork`.
|
|
316
|
+
- The skill bundle (`SKILL.md`, `roles/`, `references/`, `templates/`) is
|
|
317
|
+
force-included into the wheel at `teamwork/data/`.
|
|
318
|
+
- Documentation site (MkDocs Material) with installation, quickstart, CLI
|
|
319
|
+
reference, architecture and CI guides.
|
|
320
|
+
- Community files: `CONTRIBUTING.md`, `SECURITY.md`, `CODE_OF_CONDUCT.md`,
|
|
321
|
+
`CITATION.cff` and this changelog.
|
|
322
|
+
- Offline `teamwork selftest` smoke check and `--version` reporting.
|
|
323
|
+
- Hash-chained ledger with `ledger verify`, `ledger export` and `trace`.
|
|
324
|
+
- CI pipeline: lint, type-check, the test matrix on Linux/macOS/Windows and
|
|
325
|
+
Python 3.9/3.11/3.13, build + wheel verification, privacy scan and strict docs
|
|
326
|
+
build.
|
|
327
|
+
|
|
328
|
+
### Changed
|
|
329
|
+
|
|
330
|
+
- Extracted the 7,416-line `teamwork.py` monolith into `src/teamwork/`, keeping
|
|
331
|
+
`scripts/teamwork.py` as a thin compatibility shim.
|
|
332
|
+
- Resource discovery now resolves the skill bundle from a checkout and from an
|
|
333
|
+
installed wheel.
|
|
334
|
+
- The runtime has no third-party dependencies; file output is UTF-8 with `\n`
|
|
335
|
+
newlines for byte-identical results across platforms.
|
|
336
|
+
|
|
337
|
+
### Security
|
|
338
|
+
|
|
339
|
+
- Added a privacy scanner that runs over the working tree and the full git
|
|
340
|
+
history; no personal data, credentials or keys are published.
|
|
341
|
+
- Commit identity defaults to the configurable `agents.nidvue.com` domain.
|
|
342
|
+
- Private vulnerability disclosure is handled exclusively through GitHub Security
|
|
343
|
+
Advisories.
|