Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
0fbb6ac
docs(brainstorm): telemetry layer coherence for milestone 14
claude Aug 13, 2026
cfd119a
docs(brainstorm): back every per-tool claim with a read source
claude Aug 13, 2026
df1caa8
docs(brainstorm): close the Cursor and Codex verification gaps
blafourcade Aug 14, 2026
a02c5f1
docs(framework): design how a work item links intention, delivery and…
blafourcade Aug 14, 2026
eb996da
docs(framework): drop the fields the backlog already owns
blafourcade Aug 14, 2026
a20c41a
docs(framework): prove the id join on Codex and Copilot without spend…
blafourcade Aug 14, 2026
959d614
docs(framework): record Cursor as a scope question, not a pending check
blafourcade Aug 14, 2026
0a62f21
docs(framework): cursor honours hooks from the command line, measured
blafourcade Aug 14, 2026
78f464f
docs(framework): opencode bundles the otel api but exports nothing
blafourcade Aug 14, 2026
6ab01da
docs(framework): opencode does export, and the join works there
blafourcade Aug 14, 2026
27a76a9
docs(framework): plan a telemetry v1 that ships in a week
blafourcade Aug 14, 2026
bf04869
docs(framework): keeping a local and a remote backlog coherent means …
blafourcade Aug 14, 2026
cda2ccb
docs(framework): per-step cost cannot come from the metrics
blafourcade Aug 14, 2026
fe41cd2
docs(framework): the plan holds sequence, the issues hold content
aidd-bot[bot] Aug 15, 2026
eec6dd4
docs(framework): the join is an exact event correlation, and the sink…
aidd-bot[bot] Aug 15, 2026
a2d437c
docs(brainstorm): plan the run journal on two measured contracts
aidd-bot[bot] Aug 16, 2026
78d0570
docs(brainstorm): vendor_field names the export attribute, not the ho…
aidd-bot[bot] Aug 16, 2026
9448d46
docs(brainstorm): split the run journal into six buildable phases
aidd-bot[bot] Aug 17, 2026
4fed0ee
feat(framework): journal every session so work can be tied to its cost
Aug 18, 2026
8b38d51
fix(docs): the FAQ promised no telemetry while the framework ships it
Aug 18, 2026
d0b35bc
docs(cli): plan turning the provider export on
Aug 18, 2026
117eb92
docs(cli): replan telemetry activation around a switch AIDD owns
Aug 18, 2026
6e469b1
docs(cli): the telemetry switch belongs in .aidd/, not in aidd_docs/
Aug 18, 2026
4779ed1
docs(brainstorm): the end-to-end picture, and what a paid probe settled
Aug 18, 2026
ac70913
docs(brainstorm): nesting is a reporting question, not a recording one
Aug 18, 2026
9c2bfb9
docs(brainstorm): per-step measurement is portable, on five tools mea…
Aug 18, 2026
ced8b80
feat(cli): one AIDD switch the whole framework obeys, and Claude Code…
Aug 18, 2026
2eb4b5a
fix(cli): keep a plugin's hook subdirectories when installing it
Aug 18, 2026
b1bb07a
refactor(cli): name responsibilities instead of helper buckets
Aug 18, 2026
481d67d
build: let the pre-commit hook repair kanban's dependencies again
Aug 18, 2026
13fc4d4
feat(cli): name tools the way their vendors write them, and drop the …
Aug 19, 2026
dbae247
docs(cli): drop the e2e results snapshot
Aug 19, 2026
038384f
refactor(cli): drop an import left dead by the capability rewiring
Aug 19, 2026
e4172dd
refactor(framework): the run journal records facts, not conclusions
Aug 19, 2026
07b5a75
feat(cli): a sink that keeps what a session exported, and nothing else
Aug 19, 2026
ff14acf
build(cli): enforce the rules that were only ever written down
Aug 19, 2026
2208ef2
docs(cli): say the rule, not the reasoning behind it
Aug 20, 2026
cf00253
refactor(cli): name the shared plugin catalog for what it is
Aug 20, 2026
bad878e
feat(cli): let the tool declare how its telemetry config merges
Aug 20, 2026
4c7d186
docs(telemetry): keep the comments that cost money to establish
Aug 20, 2026
be19d88
feat(cli): the sink keeps the number that orders a session
Aug 20, 2026
968e586
feat(telemetry): the journal records which step was running, on four …
Aug 20, 2026
733b0aa
docs(telemetry): the contract and plan #663 was built from
Aug 20, 2026
b58ab16
feat(cli): read what a session cost from the files the tool already w…
Aug 20, 2026
2771dab
docs(telemetry): the contract and plan the local read was built from
Aug 20, 2026
ec64f2f
feat(cli): a stored record names the tool that produced it
Aug 21, 2026
db3c9bd
docs(telemetry): the contract and plan the metrics work is built from
Aug 21, 2026
58d48a3
feat(cli): a record carries the step that was running, and how it knows
Aug 21, 2026
69d7701
docs(telemetry): the contract a service outside this repository consumes
Aug 21, 2026
40195ac
feat(cli): what a period cost, and what each figure is worth
Aug 21, 2026
2eabdda
feat(framework): the plugin measures on its own, with no CLI installed
Aug 21, 2026
8cfce03
fix(framework): a file written through the shell still reaches its task
Aug 21, 2026
bef31ee
docs(framework): what measurement does, what it cannot, and where it …
Aug 21, 2026
38c1dde
refactor(framework): what the plugin ships can be read
Aug 21, 2026
ae40fb5
docs(telemetry): the plan the Copilot journal is built from, and one …
Aug 21, 2026
63e7c8d
refactor(framework): the plugin's measurement is written, not generated
Aug 21, 2026
b5770dd
feat(cli): the variable a tool expands lives on the tool, not in a bu…
Aug 22, 2026
5216305
fix(cli): a tool that runs hooks receives them, and one that does not…
Aug 22, 2026
3577af8
fix(framework): the journal recognises the payload Copilot actually s…
Aug 22, 2026
5a23cf7
feat(framework): a skill that says whether the chain is actually reco…
Aug 22, 2026
525633c
fix(framework): the turn-end walk counts what it scanned and says wha…
Aug 22, 2026
481919c
feat(framework): every tool journals, each proven by a session that ran
Aug 22, 2026
1e1f327
docs(framework): what each tool can measure, and what it cannot
Aug 22, 2026
5c6f154
chore(repo): the tests a change can break run in seconds, not minutes
Aug 22, 2026
7366b74
feat(framework): a stored record names the project it came from
Aug 22, 2026
bff02c9
feat(framework): a period breaks down by day and by project
Aug 22, 2026
584a317
feat(framework): the question chooses the axis, and hands back an art…
Aug 22, 2026
0ac42b6
fix(cli): a skill's entry file keeps the transform its tool asked for
Aug 22, 2026
2867585
test(cli): a temporary repository is its own, even when git spawned t…
Aug 22, 2026
14e4a48
fix(framework): a run journal is never offered to a commit
Aug 22, 2026
39ac115
fix(cli): a plugin the CLI installed is one the tool has actually reg…
Aug 22, 2026
2343bee
fix(cli): a project set up for Codex uses the model its account has
Aug 22, 2026
a315b1a
feat(framework): copilot reports one honest number for a session
Aug 22, 2026
f6a4b8c
docs(framework): what copilot supplies, and where measurement writes
Aug 22, 2026
a96f7df
fix(repo): a sub-project installs its own dependencies, not the root's
Aug 22, 2026
ae6e55e
build(cli): the bundle budget moves when a feature earns it
Aug 22, 2026
e247754
feat(framework): a session says which ticket it is on
Aug 22, 2026
fdc2a5e
docs(framework): what Linux was measured to do, and how a ticket is k…
Aug 22, 2026
5b40c5e
fix(cli): a plugin Claude Code loads is one it reports as loaded
Aug 22, 2026
6fc9f11
test(framework): the whole chain, proven on every tool in one pass
Aug 22, 2026
11863d3
refactor(framework): the tool declarations exist once
Aug 22, 2026
061d73e
refactor(framework): one file per tool, not five tables
Aug 22, 2026
e284bb3
test(cli): what Windows actually does with a journal
Aug 22, 2026
3a084fc
test(cli): the suites are honest on Windows
Aug 22, 2026
57dd0e1
feat(framework): a report answers any combination of filters
Aug 22, 2026
9c822b7
fix(framework): a journal on Windows is private, not merely asked to be
Aug 22, 2026
ff7377a
fix(cli): a Windows path is a local plugin path
Aug 22, 2026
6c2b2a5
feat(framework): a person can choose to be named, and take it back
Aug 22, 2026
490bee8
fix(cli): an export records no identity at all
Aug 22, 2026
d265ed9
fix(framework): a write the tool stated is recorded as stated, on Win…
Aug 22, 2026
0f5cd60
fix(cli): a build writes where it was told to on Windows
Aug 22, 2026
525a470
ci: the jobs run when the plugin they test changes
Aug 22, 2026
ca72b9b
test(framework): the install-shape guard knows the identity script
Aug 22, 2026
3bfd4a8
fix(framework): close the last Windows failures (#707)
Aug 23, 2026
db1310a
ci(scratch): trigger cli-ci.yml on push to this branch
Aug 23, 2026
b507d61
Revert "ci(scratch): trigger cli-ci.yml on push to this branch"
Aug 23, 2026
5732906
fix(framework): drop the marker, name the resolve() defect (#707 review)
Aug 23, 2026
8c5ec60
fix(framework): un-escape JSON's own doubled backslash, not every one…
Aug 23, 2026
95ee464
fix(framework): mirror resolve() in the third ensure-built-marketplac…
Aug 23, 2026
e7fe9cb
fix(framework): resolve builtDir before it reaches buildFor (#707)
Aug 23, 2026
d09e333
fix(framework): normalize nested() and resolve seeded builtDir litera…
Aug 23, 2026
aacefc1
fix(framework): resolve the outDir-invariant test's cacheRoot literal…
Aug 23, 2026
716661c
fix(framework): fold CRLF to LF before hashing the golden build tree …
Aug 23, 2026
48cae8f
fix(cli): a document parses the same whichever way its lines end (#707)
Aug 23, 2026
867323c
test(framework): the identity tests look where the platform actually …
Aug 23, 2026
1d6616b
docs(telemetry): the two causes left under the first four, and what p…
Aug 23, 2026
7193ebb
fix(cli): a path is absolute when the platform says so, not when it s…
Aug 23, 2026
1b148a5
fix(cli): the CLI resolves a home directory the way the plugin does (…
Aug 23, 2026
fd787c1
test(cli): the mapping that makes Cursor close a turn headlessly is p…
Aug 23, 2026
ae2df4f
test(cli): the last two Windows assertions ask where the file actuall…
Aug 23, 2026
02dc553
test(cli): the parity suite sandboxes a home the way Windows reads on…
Aug 23, 2026
767a1e1
feat(framework): the chain says whether an export is configured and j…
Aug 23, 2026
cb5b8f4
docs(telemetry): the two limits behind the export claims' verdicts (#…
Aug 23, 2026
8b9c9a2
fix(framework): the documented way to find the script works on a fres…
Aug 23, 2026
780930f
feat(framework): a message the tool composed is not a billed request,…
Aug 23, 2026
8906d47
refactor(cli): no type is widened through unknown, in tests as much a…
Aug 23, 2026
c74c504
docs(telemetry): Windows is green, and what the last two red steps tu…
Aug 23, 2026
c3fbcb9
refactor(cli): `as never` is the same lie from the other direction (#…
Aug 23, 2026
5659e0e
test(framework): the OpenCode plugin suite sweeps the repositories it…
Aug 23, 2026
ce6b9fe
fix(framework): Codex closes a turn on SessionEnd, because it has no …
Aug 23, 2026
e91e15f
test(framework): a real Codex SessionEnd capture closes the turn (#707)
Aug 23, 2026
a1ada61
fix(framework): the Codex event rename lands on both install routes (…
Aug 23, 2026
f1e151e
fix(framework): the chain verifier names why a Codex turn did not clo…
Aug 23, 2026
f4645a5
fix(framework): the OpenCode run route names a model, and its one lim…
Aug 23, 2026
f31596b
fix(framework): the skills run in a project that declares type: modul…
Aug 23, 2026
6aed5ce
fix(framework): the hooks run under an ESM host too - the trade did n…
Aug 23, 2026
3eb95ef
fix(cli): a message's completed line wins, not the placeholder that o…
Aug 23, 2026
c7c0385
test(cli): three tests that could not fail now can (#707)
Aug 23, 2026
8e0e6dc
fix(cli): a remote telemetry endpoint has to be typed, not inherited …
Aug 23, 2026
13cb74f
fix: the four defects an adversarial review found under a green suite…
Aug 23, 2026
62651b2
docs(telemetry): these are raw counters, and a tool's own screen may …
Aug 24, 2026
3d242c9
docs(telemetry): the plan for what the adversarial review left standing
Aug 24, 2026
106d71d
docs(telemetry): what checking before executing changed in the plan
Aug 24, 2026
68e284c
fix(telemetry): the four phases the review's residuals plan called for
Aug 24, 2026
c943aef
refactor(telemetry): a skill carries what it needs, and nothing reach…
Aug 24, 2026
433009d
test(telemetry): the suites read the per-skill copies, and one budget…
Aug 24, 2026
55c5f82
docs(telemetry): the rationales stop pointing at a directory that no …
Aug 24, 2026
ec15a80
refactor(telemetry): the plugin names its module system per file, not…
Aug 24, 2026
b714150
fix(test): the module-system guard compares paths, not separators
Aug 24, 2026
2ee4d68
fix(telemetry): Codex re-emits a turn's last token_count, and it was …
Aug 26, 2026
a1d88f3
chore(ci): re-trigger the pull_request checks
Aug 26, 2026
7fe3e10
Merge origin/next into the telemetry branch
Aug 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@
"description": "ALPHA, not ready for use. UI and UX concern: design, review, and improve frontend interfaces.",
"strict": true,
"recommended": false
},
{
"name": "aidd-telemetry",
"source": "./plugins/aidd-telemetry",
"description": "Measurement: journals every session so a unit of work can be tied to what it cost. Ships hooks only, and carries no measurement itself.",
"strict": true,
"recommended": false
}
]
}
29 changes: 16 additions & 13 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,5 @@
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"extraKnownMarketplaces": {
"aidd-framework": {
"source": { "source": "directory", "path": "." }
}
},
"enabledPlugins": {
"aidd-context@aidd-framework": true,
"aidd-dev@aidd-framework": true,
"aidd-vcs@aidd-framework": true,
"aidd-pm@aidd-framework": true,
"aidd-orchestrator@aidd-framework": true,
"aidd-refine@aidd-framework": true
},
"hooks": {
"WorktreeCreate": [
{
Expand All @@ -24,5 +11,21 @@
]
}
]
},
"enabledPlugins": {
"aidd-context@aidd-framework": true,
"aidd-dev@aidd-framework": true,
"aidd-vcs@aidd-framework": true,
"aidd-pm@aidd-framework": true,
"aidd-orchestrator@aidd-framework": true,
"aidd-refine@aidd-framework": true
},
"extraKnownMarketplaces": {
"aidd-framework": {
"source": {
"source": "directory",
"path": "."
}
}
}
}
66 changes: 66 additions & 0 deletions .github/workflows/cli-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,18 @@ on:
paths:
- "cli/**"
- "kanban/**"
# The plugin ships the hooks and skills these jobs exercise, and the Windows job
# exists for them in particular - without this, changing any of it runs nothing.
- "plugins/aidd-telemetry/**"
- "scripts/__tests__/**"
pull_request:
paths:
- "cli/**"
- "kanban/**"
# The plugin ships the hooks and skills these jobs exercise, and the Windows job
# exists for them in particular - without this, changing any of it runs nothing.
- "plugins/aidd-telemetry/**"
- "scripts/__tests__/**"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand Down Expand Up @@ -140,3 +148,61 @@ jobs:
- run: cd kanban && pnpm typecheck
- run: cd kanban && pnpm lint
- run: cd kanban && pnpm test

windows:
# Runs under bash (Git Bash, bundled on windows-latest) so every command is the one the
# Linux jobs run, not a PowerShell rewrite of it.
name: cli / Windows
runs-on: windows-latest
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install pnpm
run: |
corepack enable
corepack prepare pnpm@latest --activate
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "22"

# The chain end to end, on the platform where a home directory, a line ending and an
# absolute path all resolve differently than they do on the Linux jobs above.
- name: Chain - switch telemetry on
run: node plugins/aidd-telemetry/skills/00-init/scripts/telemetry-switch.cjs on
- name: Chain - journal a captured payload
run: |
# The fixture's own cwd is a path from whatever machine captured it - rewritten to
# this checkout's real path so getRepoRoot resolves a repository that exists here.
node -e "const p=require('./scripts/__tests__/fixtures/claude-code-session-start.json'); p.cwd=process.cwd(); require('fs').writeFileSync('payload.json', JSON.stringify(p));"
node plugins/aidd-telemetry/hooks/journal.cjs session-start < payload.json
node plugins/aidd-telemetry/hooks/journal.cjs turn-end < payload.json
- name: Chain - the journal stays private and git add -A still works
run: |
git add -A
git status --porcelain >/dev/null
- name: Chain - read it back
run: |
node plugins/aidd-telemetry/skills/01-cost/scripts/telemetry-report.cjs read
node plugins/aidd-telemetry/skills/01-cost/scripts/telemetry-report.cjs report
- name: Chain - diagnose
run: node plugins/aidd-telemetry/skills/02-check/scripts/telemetry-check.cjs

- name: Plugin suite
run: node --test "scripts/__tests__/*.test.js"

- run: cd kanban && pnpm install --frozen-lockfile
- run: cd cli && pnpm install --frozen-lockfile
- run: cd cli && pnpm test:unit
- run: cd cli && pnpm test:integration
- name: cli e2e
run: |
cd cli
pnpm build
pnpm exec vitest run --project=e2e \
--exclude "tests/e2e/persona.e2e.test.ts" \
--exclude "tests/e2e/telemetry-multi-tool.e2e.test.ts"
# persona.e2e.test.ts hardcodes /usr/bin/expect for TTY emulation, which windows-latest
# does not carry. telemetry-multi-tool.e2e.test.ts puts a `#!/bin/sh` stand-in binary
# with no extension on PATH; Windows resolves an executable by PATHEXT, never a shebang.
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,22 @@ coverage/
.claude/settings.local.json
.claude/worktrees/

# AIDD CLI's own local state (install manifest, auth): machine-local, never
# part of the project's own tracked content. config.json is the exception:
# it is the committed telemetry switch (see .aidd/config.json and
# aidd_docs/tasks/2026_08/2026_08_20_telemetry-export-enable/phase-1.md),
# tracked so a fresh clone inherits the project's decision.
.aidd/*
!.aidd/config.json

# AIDD run-journal records: where they land once .aidd/config.json turns
# telemetry on (see plugins/aidd-telemetry/hooks/journal.js) - this
# directory being committed is a location, not a permission. The records it
# holds never are.
aidd_docs/runs/*
!aidd_docs/runs/.gitkeep
!aidd_docs/runs/README.md

# SpecStory captures (may contain transcripts / secrets)
.specstory/

Expand Down
1 change: 1 addition & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
"plugins/aidd-orchestrator": "2.2.1",
"plugins/aidd-refine": "3.0.0",
"plugins/aidd-ui": "0.2.1-alpha.0",
"plugins/aidd-telemetry": "0.1.0",
"cli": "5.2.1"
}
16 changes: 12 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Unify **engineering teams** around **standardized workflows** and **shared best
🧱 **IDE agnostic** Β· πŸ—οΈ **Legacy systems** Β· 🌱 **Token-optimized** Β· πŸ‡«πŸ‡· **Made in France**

<p>
<!--counts:start--><kbd>7 plugins</kbd> Β· <kbd>47 skills</kbd> Β· <kbd>2 agents</kbd><!--counts:end-->
<!--counts:start--><kbd>8 plugins</kbd> Β· <kbd>50 skills</kbd> Β· <kbd>2 agents</kbd><!--counts:end-->
</p>

[![Open Source](https://img.shields.io/badge/Open_Source-Yes-yellow?logo=open-source-initiative&logoColor=white)](https://opensource.org/)
Expand Down Expand Up @@ -57,7 +57,7 @@ Why not just write your own commands? β†’ [FAQ](docs/FAQ.md#-why-aidd-instead-of

### Claude Code

Installs the 6 stable plugins (`aidd-ui` is 🚧 alpha, install separately β€” see [Plugins](#-plugins)).
Installs the 6 stable plugins (`aidd-ui` and `aidd-telemetry` are 🚧 alpha, install separately β€” see [Plugins](#-plugins)).

**In the session** (slash commands)

Expand Down Expand Up @@ -213,7 +213,7 @@ flowchart TD

## 🧩 Plugins

Seven plugins covering the whole SDLC β€” **install all of them**; they work together. (`aidd-ui` is 🚧 **alpha**, off the curated path.)
Eight plugins covering the whole SDLC β€” **install all of them**; they work together. (`aidd-ui` and `aidd-telemetry` are 🚧 **alpha**, off the curated path.)

<table>
<tr>
Expand Down Expand Up @@ -284,7 +284,15 @@ Synchronous feature flow, async issue-to-PR automation, and product backlog.
UI / UX design β€” smoke-test only, not ready for use.

</td>
<td width="33%" valign="top"></td>
<td width="33%" valign="top">

### πŸ“ˆ [aidd-telemetry](plugins/aidd-telemetry/README.md) 🚧

`3 skills` Β· **alpha**

Answers what a piece of work cost β€” tokens, models, and which skill spent them. Off unless you turn it on, and nothing leaves your machine.

</td>
<td width="33%" valign="top"></td>
</tr>
</table>
Expand Down
6 changes: 5 additions & 1 deletion aidd_docs/memory/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@

## Testing Strategy

- No unit test runner configured at framework level
- The CLI runs vitest in three projects: `unit`, `integration`, `e2e` (`cli/`, ~2,600 tests)
- The plugins' own scripts run under `node --test`, in `scripts/__tests__/`, reaching their subject by path rather than by import
- Skills are validated by running each action's `## Test` end-to-end against a real environment
- Framework correctness validated by running actual skills against a real project (integration)

## Test Execution Process

- **While working, run `pnpm test:changed`** β€” it runs only the specs a change can break: vitest resolves the CLI's import graph, and the plugin specs are selected by the paths their own text names. Minutes become seconds, and nothing that could break is skipped
- Before declaring work done, run the full suites: `cd cli && pnpm test:unit && pnpm test:integration && pnpm test:e2e`, plus `node --test "scripts/__tests__/*.test.js"`
- Run biome through `rtk proxy` (`rtk proxy npx biome check src/ tests/`): the plain call's output is filtered and reports "no issues" while errors are pending
- Each action declares a `## Test` (a command to run, an artifact check, or an observable side-effect) that must pass before the next action runs
- `scripts/build-dist-verification.md` documents how to verify the build output

Expand Down
Loading