Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
256 commits
Select commit Hold shift + click to select a range
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
f53ede9
docs(telemetry): the plan the CLI pivot is built from
Aug 26, 2026
40f13dc
feat(telemetry): 01-cost answers through the CLI, and its second repo…
Aug 26, 2026
38de97d
feat(telemetry): identity and the switch move to the CLI, and `on` st…
Aug 27, 2026
d92ea2c
test(telemetry): a run's result stops depending on the machine it run…
Aug 27, 2026
b2ffc50
docs(telemetry): the promise is three acts, not two halves
Aug 27, 2026
d08c3d5
feat(telemetry): the diagnostic moves to the CLI, and the plugin ship…
Aug 27, 2026
ea0a084
fix(telemetry): the review pass finds one duplication and three stale…
Aug 27, 2026
46706f1
fix(telemetry): two guards that asserted the runner, not the code
Aug 27, 2026
9f88c36
fix(telemetry): a sandboxed run's sink is not .config on every platform
Aug 27, 2026
4b165bf
docs(framework): copilot's event log is not a payload capture
Aug 28, 2026
b1931f9
test(framework): the session #681 asked for, and what it settled
Aug 28, 2026
e98cc17
test(ci): the identifier join is re-checked on every pull request, free
Aug 28, 2026
a9b0d99
fix(cli): cost-report.ts was binary to grep, and silently so
Aug 28, 2026
5718f06
feat(cli): resolve a raw identity to the person who declared it
Aug 28, 2026
ca430bb
feat(cli): add the person breakdown to the cost report
Aug 28, 2026
c1c6a37
fix(cli): catch a personId colliding with another entry's identity
Aug 28, 2026
53df707
feat(cli): let a person declare which identifiers are them
Aug 28, 2026
767ea5d
test(cli): prove the resolution guarantees end to end
Aug 28, 2026
b26914f
fix(cli): update the pinned report envelope fixture for by_person
Aug 28, 2026
5e18917
test(cli): close two gaps found in review of the person breakdown
Aug 28, 2026
f5f635e
docs(telemetry): mark resolve-one-person implemented
Aug 28, 2026
a959f58
fix(cli): repair review findings for the person-mapping report path
Aug 28, 2026
3670b61
docs(telemetry): fix stale per-person docs, document identity link/un…
Aug 28, 2026
eb7a0a4
fix(cli): repair findings from the re-check of the #661 repair
Aug 28, 2026
163ccff
feat(telemetry): identity carries who is also this person
Aug 28, 2026
6648646
feat(telemetry): one store, one file, one set of verbs
Aug 28, 2026
6b0a9fa
feat(telemetry): the report reads the identity, and names what stoppe…
Aug 28, 2026
b7c2861
docs(telemetry): mark identity-is-the-person implemented
Aug 28, 2026
0c41d0d
fix(cli): repair review findings for identity-is-the-person
Aug 28, 2026
9124f44
fix(cli): withdrawing removes an identity file that names nobody
Aug 28, 2026
47f114d
fix(cli): a person's own identifier is never listed as added onto them
Aug 28, 2026
3ef6700
feat(telemetry): a person can refuse, and turning it on for everyone …
Aug 28, 2026
1912298
feat(telemetry): delete the export writer, keep reading what it wrote
Aug 28, 2026
2fcf3e0
feat(telemetry): the check skill and the four-claim command agree, an…
Aug 28, 2026
e449df9
feat(telemetry): the report says whether it is measuring, and every s…
Aug 28, 2026
b3d777b
fix(cli): the sink is pruned again, by the command that now writes it
Aug 28, 2026
85a8628
fix(cli): telemetry off and check name a leftover export, and read ho…
Aug 28, 2026
a236013
fix(cli): the report names its own scope, and --json/--axis say if me…
Aug 28, 2026
78b06e4
docs(telemetry): the journal doc lists source, and the contract cites…
Aug 28, 2026
a7d68f1
test(telemetry): the claim-count guard reads both files that state it
Aug 28, 2026
5736734
docs(telemetry): phase-2's projection lists what actually got deleted
Aug 28, 2026
32ac0f1
docs(telemetry): record the review and each finding's outcome
Aug 28, 2026
f63f77b
test(ci): the identifier join is proved where it now happens
Aug 29, 2026
05d346f
Merge remote-tracking branch 'origin/next' into claude/aidd-telemetry…
Aug 29, 2026
2e7632b
feat(cli): check states what is in place before it grades anything
Aug 29, 2026
d075139
fix(cli): a hook that has not run yet is not the same failure as one …
Aug 29, 2026
ae6dde2
docs(telemetry): the check skill relays what is in place, and the dec…
Aug 29, 2026
b13d73c
docs(telemetry): the check-says-what-it-grades plan is implemented
Aug 29, 2026
dc0db32
fix(cli): the reason id names the cause it now has, not the one it lost
Aug 29, 2026
a048690
fix(cli): a hooks block is a declaration too, not just enabledPlugins
Aug 29, 2026
cbd2284
fix(cli): an absence with more than one cause is never one of them
Aug 29, 2026
163f3ff
fix(telemetry): the guard bites when the skill and the code disagree
Aug 29, 2026
e81e7ac
docs(telemetry): record the review and each finding's outcome
Aug 29, 2026
92e9c88
docs(framework): amend #297 β€” a hosted destination is allowed, and ne…
Aug 31, 2026
3053dcb
feat(telemetry): resolve what a removal would touch, once
Aug 31, 2026
36e7b54
feat(telemetry): add the seventh command, aidd telemetry forget
Aug 31, 2026
983edca
feat(telemetry): let the skill answer a person who asks to be forgotten
Aug 31, 2026
6215797
fix(cli): make the deletion path act on exactly what it showed, never…
Aug 31, 2026
9d9316a
fix(cli): point aidd telemetry off at forget
Aug 31, 2026
eadfae1
docs(telemetry): correct phase-1's architecture projection
Aug 31, 2026
85a0543
test(cli): refuse forget under an unsandboxed HOME in e2e helpers
Aug 31, 2026
8a617be
docs(telemetry): record the deletion-path review and each finding's o…
Aug 31, 2026
2d27775
docs(framework): the decision says what a person sees about themselve…
Aug 31, 2026
c10c222
docs(framework): three documents catch up with the code they describe
Aug 31, 2026
d7f88bb
fix(cli): say that Copilot's input count may not exclude the cached p…
Aug 31, 2026
60d685a
feat(telemetry): the sixth question gets its breakdown
Aug 31, 2026
ba7ecb4
test(telemetry): give OpenCode's plugin events real captures, not a d…
Aug 31, 2026
e0612bf
test(telemetry): prove task declaration against real captures, not in…
Aug 31, 2026
522455e
docs(framework): the decision of record joins the project memory, rea…
Aug 31, 2026
e75b967
docs(telemetry): the six-questions contract, the capture matrix and t…
Aug 31, 2026
be4297a
fix(telemetry): a task declared mid-session attributes what follows it
Aug 31, 2026
ead9a2f
test: codex's task fixture becomes a genuine capture, not a derivation
Aug 31, 2026
25957e5
feat(telemetry): opencode declares a task from a genuine captured part
Aug 31, 2026
9adb2d3
docs(telemetry): the task-attribution contract and the plan it was bu…
Aug 31, 2026
92bfb22
fix(telemetry): a reason never claims nothing was declared when somet…
Aug 31, 2026
a278e26
fix(telemetry): the codex fixture carries the shape its live capture …
Aug 31, 2026
0477705
perf(telemetry): opencode only spawns the journal for a tool call tha…
Aug 31, 2026
dc761a9
docs(telemetry): the capture matrix, plan and README agree with what …
Aug 31, 2026
52a78b7
docs(telemetry): record remediation outcomes against the task-attribu…
Aug 31, 2026
dc71519
feat(telemetry): a task folder can declare the backlog item it delivers
Aug 31, 2026
f618db6
feat(telemetry): a period breaks down by the backlog item it delivered
Aug 31, 2026
7b3a044
feat(pm,dev): the skills that open a task folder declare its backlog …
Aug 31, 2026
0c99a61
test(telemetry,dev): close three acceptance-criteria gaps left by review
Aug 31, 2026
82eda1a
feat(telemetry): a period breaks down by the flow that ran
Sep 1, 2026
1f13358
feat(telemetry): each producer stamps its own version on what it writes
Sep 1, 2026
fd74f44
feat(telemetry): fewer verbs, one place per nature, one reference week
Sep 1, 2026
9a7d464
fix(cli): the flow axis orders like its neighbours and states its own…
Sep 1, 2026
51e31e7
docs(telemetry): a price table is the destination's, and the axis rea…
Sep 1, 2026
1cf155d
fix(telemetry): every comment that names a file names one that exists
Sep 1, 2026
67745cc
docs(telemetry): the destination's own backlog settles the price ques…
Sep 1, 2026
f67528d
feat(telemetry): a commit names the session that made it
Sep 1, 2026
ca86ff1
refactor(telemetry): drop the trailer reader nobody reads, name what …
Sep 1, 2026
2bec18e
docs(telemetry): the commit join is measured on one host, not two
Sep 1, 2026
b339a73
fix(telemetry): a line on disk holds whatever it holds, not what its …
Sep 2, 2026
2214c85
docs(telemetry): finish the read-through, and make the guard catch wh…
Sep 2, 2026
7f66e03
Merge origin/next into claude/aidd-telemetry-layer-e403uf
Sep 2, 2026
342a592
docs(telemetry): cursor writes no consumption, and now it is measured…
Sep 2, 2026
346ddf0
docs(telemetry): the commit join is measured on Codex too, and a resu…
Sep 2, 2026
29af733
test(telemetry): the six files the tier audit found untested
Sep 2, 2026
8e557bb
test(telemetry): the fifth host's write path, which nothing drove
Sep 2, 2026
9eb674b
fix(telemetry): the commit hook names its delegate the only way sh ca…
Sep 2, 2026
6e3637c
docs(telemetry): an AIDD-Session-Id, not a
Sep 2, 2026
a73be18
fix(telemetry): the reference week ignores a leaked GIT_DIR, like eve…
Sep 2, 2026
6e49c14
Merge remote-tracking branch 'origin/next' into claude/aidd-telemetry…
Sep 2, 2026
8b3e342
fix(ci): dev-sync's own tests run on Windows, so the Windows job reac…
Sep 2, 2026
6a7cf97
fix(test): the sandboxed PATH carries the shell git runs every hook t…
Sep 2, 2026
2d1097a
ci(cli): print what decides the Windows hook failure, instead of gues…
Sep 2, 2026
8deaef9
fix(test): pick the hook's shell from PATH itself, not from where git…
Sep 2, 2026
892ef2f
docs(telemetry): what is left is bounded or decided, and says which
Sep 2, 2026
b059060
docs(telemetry): the plugin's own two descriptions say what it ships now
Sep 2, 2026
168c546
docs(telemetry): say that a report catches the sink up, so nobody run…
Sep 2, 2026
e526ea7
ci(cli): the plugin's prose no longer books a Windows runner
Sep 2, 2026
cd93212
ci(cli): say where the prose exclusion actually saves a run, measured
Sep 2, 2026
4986067
docs(telemetry): beta, not alpha β€” usable and waiting to be proven el…
Sep 2, 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. The hooks record on plain node; its three skills reach the `aidd` CLI to turn it on, answer and check.",
"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": "."
}
}
}
}
157 changes: 157 additions & 0 deletions .github/workflows/cli-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,48 @@ 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__/**"
# Except its prose. The plugin's markdown is asserted - the README's coverage
# table, where its scripts say they live - but only by `scripts/__tests__`,
# which `validate.yml` already runs over the whole tree on every push and
# pull request, unfiltered and required. Re-running it here costs a Windows
# runner for a paragraph, and proves nothing that job did not.
#
# `**.md`, not `**/*.md`: GitHub's `**` matches any character including a
# slash, so the second form needs a slash after it and would miss the
# top-level README.md that this exists for.
#
# Bounded on purpose: on `pull_request` GitHub matches the whole diff, not
# the last push, so a branch that also touches cli/ runs everything however
# small its newest commit is. This saves the run on a push to next or main,
# and on a pull request whose diff is prose and nothing else.
- "!plugins/aidd-telemetry/**.md"
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__/**"
# Except its prose. The plugin's markdown is asserted - the README's coverage
# table, where its scripts say they live - but only by `scripts/__tests__`,
# which `validate.yml` already runs over the whole tree on every push and
# pull request, unfiltered and required. Re-running it here costs a Windows
# runner for a paragraph, and proves nothing that job did not.
#
# `**.md`, not `**/*.md`: GitHub's `**` matches any character including a
# slash, so the second form needs a slash after it and would miss the
# top-level README.md that this exists for.
#
# Bounded on purpose: on `pull_request` GitHub matches the whole diff, not
# the last push, so a branch that also touches cli/ runs everything however
# small its newest commit is. This saves the run on a push to next or main,
# and on a pull request whose diff is prose and nothing else.
- "!plugins/aidd-telemetry/**.md"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand Down Expand Up @@ -108,6 +146,32 @@ jobs:
- run: cd cli && pnpm install --frozen-lockfile
- run: cd cli && pnpm knip:production

identifier-join:
name: cli / Identifier join (Claude Code)
runs-on: ubuntu-latest
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"
- run: cd cli && pnpm install --frozen-lockfile
- run: cd cli && pnpm build
# The probe drives the real tool, so the real tool has to be here. No credentials are
# configured and none are needed: it points Claude Code at a dead address with a fake
# key, and the session id is minted before any of that matters.
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
# Re-checks what #632 measured once, by running a session: that the identifier a hook
# receives is the one the export carries. Everything in this layer joins on that, and a
# tool update can break it with nothing else turning red. Exit 2 means the probe could
# not form an opinion and says so rather than blaming the tool.
- name: Probe the identifier join
run: node scripts/probe-identifier-join.cjs

cli-jscpd:
name: cli / JSCPD (duplication)
runs-on: ubuntu-latest
Expand Down Expand Up @@ -140,3 +204,96 @@ 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 WRITE path, 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. It runs before the
# CLI is built, on purpose: recording is supposed to need nothing installed, and this is
# where that claim is exercised. Reading is the CLI's now, and the e2e project below
# covers it on this same runner.
- name: Chain - allow measurement, with nothing installed
run: |
# Written directly rather than through a command: the switch is a file, the hooks
# read it fresh at every write, and no binary has to exist for that to work.
mkdir -p .aidd
node -e "require('fs').writeFileSync('.aidd/config.json', JSON.stringify({ telemetry: { enabled: true } }, null, 2) + '\n');"
- 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: Plugin suite
run: node --test "scripts/__tests__/*.test.js"

- run: cd kanban && pnpm install --frozen-lockfile
- run: cd cli && pnpm install --frozen-lockfile
# A real global install, not `node dist/cli.js` by path: build, pack, and
# `npm install -g` the tarball β€” the same shim generation a person's own
# `npm install -g @ai-driven-dev/cli` produces. Every suite below invokes the built
# file directly and proves nothing about whether `aidd` actually resolves on this
# platform's PATH β€” Windows is where that kind of assumption has broken silently
# before (`os.homedir()` never reading `$HOME` here). Built here, ahead of the
# unit/integration/e2e suites below, so this is the only build this job needs.
#
# Inlined rather than `pnpm run install:local` (the equivalent script this package
# already ships): a package.json script runs through pnpm's own configured shell,
# `cmd.exe` on Windows unless `script-shell` says otherwise, which this repository
# never sets β€” its `$(node -p ...)` command substitution is bash syntax and would
# not survive that. This step's own `run:` block is guaranteed bash by the job's
# `defaults.run.shell` above, so the same two commands run here directly instead,
# with a glob standing in for the version substitution.
- name: Install the built CLI globally, the way a person actually would
run: |
cd cli
pnpm build
pnpm pack --pack-destination ./dist
npm install -g ./dist/ai-driven-dev-cli-*.tgz --force
# `02-check` diagnoses the chain above through this exact command, lifted from its
# own markdown β€” not a script beside it, the same move `00-init`'s own chain step
# made for the switch. `aidd --version` is the same command every skill's own locate
# step runs first; failing here means the CLI could not be resolved on the PATH.
- name: Chain - diagnose, through the command every skill's own markdown names
run: |
aidd --version
aidd telemetry check
- run: cd cli && pnpm test:unit
- run: cd cli && pnpm test:integration
# Every e2e but the two named below β€” and one of them is why this step matters most:
# `telemetry-commit-trailer.e2e.test.ts` makes real commits and reads their messages
# back, which is the only thing that proves the `prepare-commit-msg` hook this build
# installs is reachable by the shell Git for Windows ships. A path written with
# backslashes is not, and nothing but this catches it. Exclude it only for a reason as
# concrete as the two below.
- name: cli e2e
run: |
cd cli
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.2"
}
4 changes: 4 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ Project docs, memory, specs, and plans live in `aidd_docs/`.
[aidd_docs/memory/testing.md](aidd_docs/memory/testing.md)
[aidd_docs/memory/vcs.md](aidd_docs/memory/vcs.md)

<!-- read on demand, not auto-loaded -->
- aidd_docs/memory/internal/decisions/a-price-table-is-the-destination-s.md
- aidd_docs/memory/internal/decisions/measurement-may-reach-a-hosted-destination.md

<!-- aidd_project_memory:end -->

- If the block above is empty, run `ls -1tr aidd_docs/memory/` and read each file.
Expand Down
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ Project docs, memory, specs, and plans live in `aidd_docs/`.
@aidd_docs/memory/testing.md
@aidd_docs/memory/vcs.md

<!-- read on demand, not auto-loaded -->
- aidd_docs/memory/internal/decisions/a-price-table-is-the-destination-s.md
- aidd_docs/memory/internal/decisions/measurement-may-reach-a-hosted-destination.md

<!-- aidd_project_memory:end -->

- If the block above is empty, run `ls -1tr aidd_docs/memory/` and read each file.
Expand Down
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` is 🚧 alpha and `aidd-telemetry` πŸ§ͺ beta, install separately β€” see [Plugins](#-plugins)).

**In the session** (slash commands)

Expand Down Expand Up @@ -231,7 +231,7 @@ learning only when it is durable enough to improve the next feature.

## 🧩 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` is 🚧 **alpha** and `aidd-telemetry` πŸ§ͺ **beta** β€” both off the curated path.)

<table>
<tr>
Expand Down Expand Up @@ -302,7 +302,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` Β· **beta**

Answers what a piece of work cost β€” tokens, models, and which skill spent them. The switch is git-tracked, so it applies to everyone who clones; opt out per person with `AIDD_TELEMETRY=0`. Nothing leaves your machine.

</td>
<td width="33%" valign="top"></td>
</tr>
</table>
Expand Down
5 changes: 5 additions & 0 deletions aidd_docs/memory/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ Refreshed automatically by the memory hook. Do not edit by hand.
- [project-brief.md](project-brief.md)
- [testing.md](testing.md)
- [vcs.md](vcs.md)

Read on demand:

- [internal/decisions/a-price-table-is-the-destination-s.md](internal/decisions/a-price-table-is-the-destination-s.md)
- [internal/decisions/measurement-may-reach-a-hosted-destination.md](internal/decisions/measurement-may-reach-a-hosted-destination.md)
<!-- files:end -->

## Maintaining it
Expand Down
Loading