Write applications, not source code.
IDD is a repo-native contract for describing software in natural language. You and Copilot maintain the intent; the model maintains the code. It is dramatically more productive than hand-writing every line, and it gets better every time the model does.
Install
curl -fsSL https://raw.githubusercontent.com/dan1hc/idd/main/install.sh | bash
Flow
- Install
Bootstraps the operating contract and the IDD artifact set.
- Bootstrap
Run
/idd-initfor a new repo, or/idd-discoveragainst an existing one. Copilot seeds architecture, conventions, and the first wiki entries. - Think in the wiki
You and Copilot flesh out a concept, subsystem, or feature as one or more wiki entries. This is the design surface. No code yet.
- Derive feature specs
Run
/idd-feature. The wiki entry holds the concept; each feature spec is one bounded change to it. A wiki entry can spawn many feature specs over time — initial build, additions, refactors. - Execute
Copilot works through specs sequentially under Red / Green TDD, then writes back so prose follows source.
- Enforce
Approving a learned rule compiles it in the same session: mechanical rules become linter config or committed ast-grep checks that session hooks run on every edit and as a blocking gate on
git commit; judgment rules become path-scoped instruction files plus a mandatory in-session review of the diff before it's proposed. Everything runs in-session — no CI, no git hooks. Enforced rules drop out of prose, keeping the rule set small. - Review
Run
/idd-linton demand to sweep for drift, duplicates, orphans, broken anchors, and enforcement sync (rule ↔ check ↔ compiled artifact).
Enforcement setup
Enforcement runs entirely in-session, so there are no repo secrets and no branch-protection settings. The hooks need two local tools; without them they degrade to silent no-ops:
- Install ast-grep
brew install ast-grep(ornpm i -g @ast-grep/cli). Runs the committed mechanical checks on every edit and as the blocking in-session commit gate. - Install jq
brew install jq. The hooks use it to read the harness event payload.