@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.
Files changed (70) hide show
  1. package/CHANGELOG.md +343 -0
  2. package/LICENSE +661 -0
  3. package/NOTICE +16 -0
  4. package/README.md +462 -2
  5. package/SECURITY.md +64 -0
  6. package/package.json +71 -4
  7. package/prompts/teamwork-pulse.md +12 -0
  8. package/prompts/teamwork-review.md +16 -0
  9. package/skills/teamwork/AGENTS.md +462 -0
  10. package/skills/teamwork/SKILL.md +795 -0
  11. package/skills/teamwork/references/Adapters.md +112 -0
  12. package/skills/teamwork/references/Audit.md +120 -0
  13. package/skills/teamwork/references/Concurrency.md +160 -0
  14. package/skills/teamwork/references/Dissent.md +85 -0
  15. package/skills/teamwork/references/Docs.md +74 -0
  16. package/skills/teamwork/references/Engineering.md +410 -0
  17. package/skills/teamwork/references/Evidence.md +140 -0
  18. package/skills/teamwork/references/Remotes.md +144 -0
  19. package/skills/teamwork/references/Roles.md +201 -0
  20. package/skills/teamwork/references/State.md +64 -0
  21. package/skills/teamwork/references/Testing.md +144 -0
  22. package/skills/teamwork/roles/architect.md +153 -0
  23. package/skills/teamwork/roles/ceo.md +218 -0
  24. package/skills/teamwork/roles/cfo.md +150 -0
  25. package/skills/teamwork/roles/coo.md +147 -0
  26. package/skills/teamwork/roles/cto.md +162 -0
  27. package/skills/teamwork/roles/data-engineer.md +120 -0
  28. package/skills/teamwork/roles/designer.md +349 -0
  29. package/skills/teamwork/roles/developer.md +166 -0
  30. package/skills/teamwork/roles/product-manager.md +151 -0
  31. package/skills/teamwork/roles/project-manager.md +159 -0
  32. package/skills/teamwork/roles/release-engineer.md +245 -0
  33. package/skills/teamwork/roles/reviewer.md +254 -0
  34. package/skills/teamwork/roles/security-auditor.md +157 -0
  35. package/skills/teamwork/roles/technical-writer.md +121 -0
  36. package/skills/teamwork/roles/tester.md +180 -0
  37. package/skills/teamwork/scripts/build_pi_package.py +200 -0
  38. package/skills/teamwork/scripts/privacy_scan.py +1185 -0
  39. package/skills/teamwork/scripts/sync_skill.py +108 -0
  40. package/skills/teamwork/scripts/teamwork.py +28 -0
  41. package/skills/teamwork/scripts/verify_release.py +502 -0
  42. package/skills/teamwork/src/teamwork/__init__.py +18 -0
  43. package/skills/teamwork/src/teamwork/__main__.py +10 -0
  44. package/skills/teamwork/src/teamwork/bundle.py +157 -0
  45. package/skills/teamwork/src/teamwork/cli.py +16 -0
  46. package/skills/teamwork/src/teamwork/config.py +396 -0
  47. package/skills/teamwork/src/teamwork/engine.py +10119 -0
  48. package/skills/teamwork/src/teamwork/gitutil.py +172 -0
  49. package/skills/teamwork/src/teamwork/imaging.py +124 -0
  50. package/skills/teamwork/src/teamwork/io.py +144 -0
  51. package/skills/teamwork/src/teamwork/layout.py +253 -0
  52. package/skills/teamwork/src/teamwork/names.py +191 -0
  53. package/skills/teamwork/src/teamwork/portable.py +79 -0
  54. package/skills/teamwork/src/teamwork/records.py +1220 -0
  55. package/skills/teamwork/src/teamwork/resources.py +120 -0
  56. package/skills/teamwork/src/teamwork/version.py +13 -0
  57. package/skills/teamwork/templates/AGENTS.md +460 -0
  58. package/skills/teamwork/templates/Docs/Architecture.md +40 -0
  59. package/skills/teamwork/templates/Docs/Archive.md +8 -0
  60. package/skills/teamwork/templates/Docs/Board.md +28 -0
  61. package/skills/teamwork/templates/Docs/Costs.md +30 -0
  62. package/skills/teamwork/templates/Docs/Decisions.md +26 -0
  63. package/skills/teamwork/templates/Docs/Design.md +106 -0
  64. package/skills/teamwork/templates/Docs/Plan.md +24 -0
  65. package/skills/teamwork/templates/Docs/Project.md +40 -0
  66. package/skills/teamwork/templates/Docs/Release.md +43 -0
  67. package/skills/teamwork/templates/Docs/Research.md +36 -0
  68. package/skills/teamwork/templates/Docs/Risks.md +18 -0
  69. package/skills/teamwork/templates/TeamMap.md +100 -0
  70. 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.