@rasensio/aidlc-content 1.65.0 → 1.67.0

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.
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: aidlc-reviewer
3
+ description: Reviews AIDLC lifecycle artifacts and task diffs from a fresh context and cannot change files. Use for aidlc-review and for the per-task check in .aidlc/resources/rules/task-agents.md.
4
+ commands:
5
+ - git diff
6
+ - git log
7
+ - aidlc compliance list
8
+ - aidlc compliance check
9
+ ---
10
+ # AIDLC reviewer
11
+
12
+ You review work you did not write. You start without the author's conversation, so everything you
13
+ know comes from the files you read and the message that started you. That is the point: judge what
14
+ is on disk, not what anyone meant.
15
+
16
+ ## What you cannot do
17
+
18
+ You cannot change files. You have no edit or write tool, and your shell runs only `git diff`,
19
+ `git log`, `aidlc compliance list` and `aidlc compliance check`. Give them literal arguments — a
20
+ commit id, a path, a flag. Pipes, redirects, `;`, `&&`, `$` and backticks are refused, and so is
21
+ every other command. Read and search files with your read and search tools.
22
+
23
+ If you are asked to change a file, do not try another way. Say that you cannot, and carry on with
24
+ the review.
25
+
26
+ ## What you deliver
27
+
28
+ Your reply is the deliverable. Nothing you do is saved unless it is in your reply.
29
+
30
+ - **An artifact review** — you were started from the `aidlc-review` skill, or asked to review
31
+ `requirements.md`, `design.md`, `tasks.md` or another lifecycle artifact. Follow
32
+ `.aidlc/skills/aidlc-review.md`. Reply with each findings file it calls for, in full, each under a
33
+ heading naming its path in the instance directory, each in one block fenced with four backticks
34
+ so a code fence inside a finding cannot close it. Write
35
+ `reviewer: aidlc-reviewer` in each file's frontmatter. End with this line, exactly:
36
+
37
+ Write each file above unchanged, then follow **Completion** in `.aidlc/skills/aidlc-review.md`.
38
+
39
+ - **A per-task check** — you were given a task line, the criteria it cites, a diff and a list of
40
+ changed test files, as `.aidlc/resources/rules/task-agents.md` describes. Judge the diff against
41
+ each cited criterion: met, or not and why. Every listed file is flagged; it fails the task unless
42
+ the task's own text calls for that change. Reply `PASS` or `REJECT`, the reasons, and each flagged
43
+ file with a verdict.
44
+
45
+ If the message that started you names no instance or artifact, say so and stop. Do not guess which
46
+ one was meant.
@@ -10,7 +10,17 @@ questions:
10
10
  Either way the question file is written first and its path named in one line,
11
11
  because a sandboxed turn can end before an answer arrives and the file is what
12
12
  survives it.
13
+ # Order is load-bearing: the Codex adapter writes every entry covering a phase,
14
+ # in this order, above the skill body, and the task-agents rule reads the line at
15
+ # the top of the skill file (native-reviewer-agent/AC-14).
13
16
  capabilities:
17
+ subagents:
18
+ phases: [implementation]
19
+ activation: >-
20
+ Sub-agents are available on this platform: spawn_agent starts an agent
21
+ with a fresh context of its own and wait_agent collects its reply. When a
22
+ tasks.md is being implemented, one agent per task may be offered, as
23
+ .aidlc/resources/rules/task-agents.md describes.
14
24
  code-generation:
15
25
  phases: [implementation, testing]
16
26
  activation: >-
@@ -0,0 +1,12 @@
1
+ import type { Agent } from './types.js';
2
+ /**
3
+ * Load every agent definition (native-reviewer-agent/AC-1).
4
+ *
5
+ * Shape-checking stops at what the file says. Whether a name or a command is
6
+ * safe to turn into a path or a guard is the CLI's call, in
7
+ * `compile/agents.ts`, because that is where it becomes one.
8
+ *
9
+ * @returns Agents sorted by filename. A file without frontmatter is skipped.
10
+ */
11
+ export declare function loadAgents(): Agent[];
12
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAexC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,IAAI,KAAK,EAAE,CAqBpC"}
package/dist/agents.js ADDED
@@ -0,0 +1,48 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { resolve, dirname } from 'node:path';
3
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
4
+ import { parse as parseYaml } from 'yaml';
5
+ const CONTENT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
6
+ const AGENTS_DIR = resolve(CONTENT_ROOT, 'agents');
7
+ /**
8
+ * Filenames an agent may have. The name becomes a path segment in every project
9
+ * the CLI writes to, so anything else in the directory is ignored rather than
10
+ * trusted — the same rule `loadRules` applies.
11
+ */
12
+ const AGENT_FILE = /^([a-z0-9-]+)\.md$/;
13
+ /** Frontmatter, then the body. */
14
+ const FRONTMATTER = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
15
+ /**
16
+ * Load every agent definition (native-reviewer-agent/AC-1).
17
+ *
18
+ * Shape-checking stops at what the file says. Whether a name or a command is
19
+ * safe to turn into a path or a guard is the CLI's call, in
20
+ * `compile/agents.ts`, because that is where it becomes one.
21
+ *
22
+ * @returns Agents sorted by filename. A file without frontmatter is skipped.
23
+ */
24
+ export function loadAgents() {
25
+ if (!existsSync(AGENTS_DIR))
26
+ return [];
27
+ const agents = [];
28
+ for (const id of readdirSync(AGENTS_DIR)
29
+ .map((name) => AGENT_FILE.exec(name)?.[1])
30
+ .filter((name) => name !== undefined)
31
+ .sort()) {
32
+ const raw = readFileSync(resolve(AGENTS_DIR, `${id}.md`), 'utf8');
33
+ const match = FRONTMATTER.exec(raw);
34
+ if (!match)
35
+ continue;
36
+ const meta = (parseYaml(match[1]) ?? {});
37
+ agents.push({
38
+ name: typeof meta['name'] === 'string' ? meta['name'] : id,
39
+ description: typeof meta['description'] === 'string' ? meta['description'] : '',
40
+ commands: Array.isArray(meta['commands'])
41
+ ? meta['commands'].filter((c) => typeof c === 'string')
42
+ : [],
43
+ instructions: match[2],
44
+ });
45
+ }
46
+ return agents;
47
+ }
48
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAEnD;;;;GAIG;AACH,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,kCAAkC;AAClC,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC;SACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACzC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;SACpD,IAAI,EAAE,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1D,WAAW,EAAE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;YAC/E,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBACpE,CAAC,CAAC,EAAE;YACN,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -5,9 +5,10 @@ export { loadGlossary, getGlossaryTerm } from './glossary.js';
5
5
  export { loadCapabilities, getCapabilityMap } from './capabilities.js';
6
6
  export { loadPhases, getPhase } from './phases.js';
7
7
  export { loadRules } from './rules.js';
8
+ export { loadAgents } from './agents.js';
8
9
  export { loadBoardWorkflow, BOARD_WORKFLOW_PATH } from './recipes.js';
9
10
  export { loadTutorials, getTutorial, getSeries, parseTutorialSource } from './tutorials.js';
10
11
  export { loadHowTos, getHowTo, parseHowToSource, HOWTO_SECTIONS } from './howto.js';
11
12
  export { DOCS_DIR, loadDocTopics, findDocTopic, readDocPage } from './explain.js';
12
- export type { Skill, WorkflowTemplate, GuidanceLayer, GlossaryTerm, CapabilityMap, QuestionRendering, PhaseDefinition, Rule, CodeSample, ContentReference, TutorialStep, Tutorial, WidgetKind, WidgetReference, HowTo, DocTopic } from './types.js';
13
+ export type { Skill, WorkflowTemplate, GuidanceLayer, GlossaryTerm, CapabilityMap, QuestionRendering, PhaseDefinition, Rule, Agent, CodeSample, ContentReference, TutorialStep, Tutorial, WidgetKind, WidgetReference, HowTo, DocTopic } from './types.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClF,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClF,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ export { loadGlossary, getGlossaryTerm } from './glossary.js';
5
5
  export { loadCapabilities, getCapabilityMap } from './capabilities.js';
6
6
  export { loadPhases, getPhase } from './phases.js';
7
7
  export { loadRules } from './rules.js';
8
+ export { loadAgents } from './agents.js';
8
9
  export { loadBoardWorkflow, BOARD_WORKFLOW_PATH } from './recipes.js';
9
10
  export { loadTutorials, getTutorial, getSeries, parseTutorialSource } from './tutorials.js';
10
11
  export { loadHowTos, getHowTo, parseHowToSource, HOWTO_SECTIONS } from './howto.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/dist/types.d.ts CHANGED
@@ -29,6 +29,21 @@ export interface Rule {
29
29
  /** The whole file, H1 included. */
30
30
  body: string;
31
31
  }
32
+ /**
33
+ * One agent definition, written by each adapter in its harness's own format
34
+ * (native-reviewer-agent/AC-1). The single source of the agent's instructions, so
35
+ * the Claude Code and Codex copies cannot drift.
36
+ */
37
+ export interface Agent {
38
+ /** Filename without `.md`; also the agent's name on every harness. */
39
+ name: string;
40
+ /** One line; what a harness matches a request against. */
41
+ description: string;
42
+ /** The shell commands the agent may run, each a command prefix such as `git diff`. */
43
+ commands: string[];
44
+ /** The body: the agent's instructions, its system prompt on every harness. */
45
+ instructions: string;
46
+ }
32
47
  /**
33
48
  * One canonical vocabulary definition.
34
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,oFAAoF;IACpF,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,sEAAsE;IACtE,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,kFAAkF;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
package/docs/roadmap.md CHANGED
@@ -95,6 +95,22 @@ works the backlog may ask it what is next, but promoting stays a person's decisi
95
95
  that picks has no way to write. `priority` is an ordinary extension field (a rank, 1 first) that a
96
96
  project declares in `roadmap.item_fields`.
97
97
 
98
+ **Seeing the roadmap** is `aidlc roadmap view`: one self-contained HTML page, opened in the browser.
99
+ The kanban board has a column per status — backlog in `roadmap next` order with ranks and ready items
100
+ marked, the latest 20 done items with the rest behind a control, the reason on each hold card — and
101
+ each card links to its item file, its instance folder and retrospective, and its pull requests on
102
+ GitHub when the branch and `origin` are known. Clicking a card opens its executive summary and its
103
+ dependencies. Below the board, a zoomable map lays out the `depends_on` chains: each item under its
104
+ first dependency, dashed links to the rest, an unknown id drawn as a red dashed node (a typo there
105
+ silently blocks `roadmap next`), blocked items marked, and items with no dependency hidden behind a
106
+ toggle. The page is written to `<git-common-dir>/aidlc/roadmap.html` — outside every working tree, so
107
+ it is never committed and every worktree shares one copy — or wherever `--out` says; `--no-open` only
108
+ writes it. Nothing rebuilds it on a move: until 2026-10-06 every move rewrote two committed Mermaid
109
+ graphs, so every promotion left two shared generated files modified in whichever checkout ran it.
110
+ `aidlc doctor` deletes those files where they are still the generated ones, and `aidlc roadmap graph`
111
+ is now an alias of `view`. All item text is escaped and the page's Content-Security-Policy allows only
112
+ its own script, because titles here routinely carry backticks, quotes and `<`.
113
+
98
114
  **Ranking the backlog** is `aidlc roadmap rank <item> <n>`: it puts a `backlog/` item at rank `n` and
99
115
  renumbers every ranked backlog item 1…k in their existing order, so ranks stay unique and gap-free —
100
116
  hand-typed ranks drift, because an item leaving the backlog leaves a hole and two items typed at one
@@ -68,15 +68,37 @@ subsystem of this repo. These pages are organised by **topic** for that reason.
68
68
  Claude Code's `subagents` entry, for the implementation phase, is a fact rather than a mode: it tells
69
69
  the agent sub-agents exist, which is the condition for offering one agent per task. It sits in the map
70
70
  rather than on the implementation skill because the map reaches every implementation-phase entry —
71
- including `aidlc-continue`, the route an unattended run takes into implementation. Add another platform
72
- only once it is confirmed to have sub-agents; a skill naming a tool the platform lacks is worse than
73
- not offering the mode.
71
+ including `aidlc-continue`, the route an unattended run takes into implementation. Codex's `subagents`
72
+ entry says the same in Codex's terms (`spawn_agent`, `wait_agent`); Codex sub-agents are on by default.
73
+ Until then a Codex skill file carried no activation line at all, so the rule's condition could never
74
+ hold there — the Codex adapter now writes its phase's lines above the body, as Copilot does. Add
75
+ another platform only once it is confirmed to have sub-agents; a skill naming a tool the platform lacks
76
+ is worse than not offering the mode.
77
+
78
+ **The reviewer agent** is the one place AIDLC asks a harness to enforce something rather than a prompt
79
+ to request it. One definition, `packages/content/agents/aidlc-reviewer.md`, is written as
80
+ `.claude/agents/aidlc-reviewer.md` for Claude Code and `.codex/agents/aidlc-reviewer.toml` for Codex.
81
+ The adversarial review and the per-task check run in it, and it cannot change files. On Claude Code the
82
+ tool list and the guard enforce it: the agent has `Read`, `Grep`, `Glob` and `Bash`, and a
83
+ `PreToolUse` hook runs `.claude/hooks/aidlc-reviewer-guard.mjs` before every shell command, allowing
84
+ only `git diff`, `git log`, `aidlc compliance list` and `aidlc compliance check` with literal
85
+ arguments, and blocking whenever the guard cannot run. A hook rather than the `tools` list, because
86
+ `tools` takes names only — `Bash(git diff *)` there removes Bash outright. The review skill's shim
87
+ carries `context: fork` and `agent: aidlc-reviewer`, so it starts without the author's conversation.
88
+ On Codex the read-only sandbox does, and the review skill's first line tells the session to spawn the
89
+ agent; whether a child keeps `read-only` under a workspace-write parent is what the opt-in live test
90
+ (`AIDLC_LIVE_HARNESS=1`) measures. Codex loads `.codex/` only in a trusted project, and `AGENTS.md` says
91
+ what happens without it: a fresh sub-agent told to edit nothing, read-only by request only. Because the
92
+ reviewer cannot write, it replies with its findings files and the session that started it writes them
93
+ unchanged. Claude Code reads `.claude/agents/` at session start, so an `update` that adds the agent
94
+ takes effect in the next session.
74
95
 
75
96
  Those files also carry a **top-level `questions:` key**, outside the phase-keyed `capabilities:` map, and
76
- the reason it sits outside is not cosmetic. Capability resolution returns exactly one activation string
77
- per phase, and three platforms already occupy `requirements` and `design` — the two phases questions
78
- actually get asked in. A second entry for those phases would silently lose to the first, so question
79
- rendering could not live there at all.
97
+ the reason it sits outside is not cosmetic. The shared capability resolution returns exactly one
98
+ activation string per phase, and three platforms already occupy `requirements` and `design` — the two
99
+ phases questions actually get asked in. A second entry for those phases would silently lose to the
100
+ first, so question rendering could not live there at all. (Codex's adapter has its own resolver, which
101
+ writes every entry covering a phase; that is how its two implementation entries both arrive.)
80
102
 
81
103
  Every question opens with **what it is**: the thing being decided, in plain words, on one concrete
82
104
  example. The emitted rendering file states this once, under `## Every platform`, and every directive
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rasensio/aidlc-content",
3
- "version": "1.65.0",
3
+ "version": "1.67.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,6 +22,7 @@
22
22
  "tutorials/",
23
23
  "howto/",
24
24
  "resources/",
25
+ "agents/",
25
26
  "docs/",
26
27
  "glossary.yaml"
27
28
  ],
@@ -1,12 +1,12 @@
1
1
  # The task-agents rule
2
2
 
3
- This file is the only statement of the rule. The implementation skill points here instead of restating it, so a session that runs its tasks itself carries none of this.
3
+ This file is the only statement of the rule. The implementation skill points here, so a session that runs its tasks itself carries none of this.
4
4
 
5
- **One agent per task** hands each task in `tasks.md` to a fresh agent, then has a second fresh agent review it. Task 8 gets the attention task 1 got, and the agent that wrote the code does not decide it is done. It doubles the agents, so it is off unless chosen.
5
+ **One agent per task** hands each task in `tasks.md` to a fresh agent, then has a second fresh agent review it. The agent that wrote the code does not decide it is done. It doubles the agents, so it is off unless chosen.
6
6
 
7
7
  ## When it is offered
8
8
 
9
- Only for an instance with a task-bearing `tasks.md`, and only where the platform's entry for the skill says sub-agents are available — the line above the pointer in the loaded skill file. Without it, every task runs in the session.
9
+ Only for an instance with a task-bearing `tasks.md`, and only where the platform's entry for the skill says sub-agents are available — a line at the top of the loaded skill file. Without it, every task runs in the session.
10
10
 
11
11
  ## Choosing, once per instance
12
12
 
@@ -27,7 +27,7 @@ Take open tasks in number order. For each one:
27
27
  - do not edit `requirements.md` or `tasks.md`;
28
28
  - do not commit and do not tick the checkbox;
29
29
  - reply with the files it changed.
30
- 3. **Review, in a second fresh agent that edits nothing.** First run `git add --intent-to-add .`, so files the implementer created show up in a diff without being staged. Then give the reviewer the same task line and criteria text, the output of `git diff $BASE`, and the output of this command, run by you:
30
+ 3. **Review, in a second fresh agent that edits nothing.** Use `aidlc-reviewer`, which cannot edit files (Claude Code: `subagent_type`; Codex: `spawn_agent`); where it is not loaded, tell a fresh agent to edit nothing. First run `git add --intent-to-add .`, so new files show in the diff unstaged. Then give the reviewer the same task line and criteria text, the output of `git diff $BASE`, and the output of this command, run by you:
31
31
 
32
32
  ```
33
33
  git diff --name-status --diff-filter=MDR $BASE -- '*test*' '*spec*' .aidlc/state/<instance>/requirements.md .aidlc/state/<instance>/tasks.md
@@ -42,7 +42,7 @@ Take open tasks in number order. For each one:
42
42
 
43
43
  ## Waves
44
44
 
45
- Adjacent open tasks carrying the same `(wave: <n>)` may be handed out at once, each to its own implementing agent, in this one checkout — never in separate worktrees. `BASE` is where the wave starts. Each task still gets its own reviewer, told which files its implementer reported, so it judges its own task within the shared diff; run the listing command once and give every reviewer its output. Commit task by task as each passes, staging only the files its implementer reported. A task that fails twice does not hold the others: they commit, and it is finished in the session afterwards.
45
+ Adjacent open tasks carrying the same `(wave: <n>)` may be handed out at once, each to its own implementing agent, in this one checkout — never in separate worktrees. `BASE` is where the wave starts. Each task still gets its own reviewer, told which files its implementer reported, to judge within the shared diff; run the listing command once and give every reviewer its output. Commit task by task as each passes, staging only the files its implementer reported. A task failing twice holds up no other: it is finished in the session afterwards.
46
46
 
47
47
  ## The record
48
48
 
@@ -50,6 +50,6 @@ Add a `## Task reviews` section to `code-complete.md`, one line per task:
50
50
 
51
51
  ```
52
52
  - T4: PASS — attempts 1 — flagged: none
53
- - T5: REJECT → PASS — attempts 2 — flagged: packages/cli/test/parser.test.ts (task asks to update its fixture)
53
+ - T5: REJECT → PASS — attempts 2 — flagged: test/parser.test.ts (task asks to update it)
54
54
  - T6: finished in session — attempts 2 — flagged: none
55
55
  ```
@@ -145,7 +145,7 @@ For a `hold/` item, show whether it is **parked or declined**, with its reason,
145
145
 
146
146
  **`aidlc roadmap next`** is the deterministic answer to "what next?": the `backlog/` item with the lowest `priority` among those whose `depends_on` are all `done`, unranked items last, ties by file name (`--explain` shows the order and what was skipped and why; `--json` for scripts). It is read-only and never promotes — promoting stays a person's decision. `priority` is an ordinary extension field a project declares in `roadmap.item_fields`; a rank, where 1 is first. Where it is declared, `--explain` also lists every unranked backlog item, so one sitting last is visible rather than silently last. **`aidlc roadmap rank <item> <n>`** is the one way to change a rank: it puts the item at `n` and renumbers every ranked backlog item 1…k, so ranks stay unique and gap-free.
147
147
 
148
- **Dependency graphs.** `.aidlc/roadmap/graph-backlog.mmd` (backlog items and the `depends_on` edges between them) and `.aidlc/roadmap/graph-full.mmd` (every status, one subgraph each, every edge) are Mermaid files generated from the items — never edit them. Every CLI move rebuilds them. **After moving, adding or deleting an item by hand, run `aidlc roadmap graph`** and commit the graphs with the move; nothing else can see a hand move. When someone asks to see the dependencies, point them at these files rather than drawing a graph.
148
+ **Seeing the roadmap.** When someone asks to see the roadmap or its dependencies, run **`aidlc roadmap view`** rather than drawing a graph. It writes one self-contained HTML page — a kanban board of every item by status, and a zoomable map of the `depends_on` chains with blocked items and unknown ids marked — and opens it in the browser (`--no-open` only writes it; `--out <path>` writes it elsewhere). The page lives in the git common dir, outside every working tree, so it is never committed and nothing rebuilds it on a move; run the command again for a fresh one. `aidlc roadmap graph` is the same command.
149
149
 
150
150
  The frontmatter-only rule holds for browsing, which is a list and must stay cheap enough to run over the whole roadmap. **Triage** below is the one flow allowed into the body, and only as far as the executive summary.
151
151
 
@@ -4,6 +4,7 @@ description: Performs adversarial review of lifecycle artifacts — examining fo
4
4
  phase: requirements
5
5
  trigger: Activated when a review is requested for any artifact or phase
6
6
  priority: 60
7
+ agent: aidlc-reviewer
7
8
  ---
8
9
  # Adversarial Review
9
10
 
@@ -15,7 +16,7 @@ Provide a structured, critical review of a lifecycle artifact from fresh context
15
16
 
16
17
  ## Important
17
18
 
18
- You MUST perform this review with fresh eyes. If you authored the artifact being reviewed, delegate to a separate session or subagent. Self-review defeats the purpose.
19
+ You MUST perform this review with fresh eyes. Where the platform has the `aidlc-reviewer` agent, the review runs in it: on Claude Code this skill starts it, with none of the author's conversation, and on Codex the skill's first line says how to start it. That agent cannot change files. Elsewhere, if you authored the artifact being reviewed, delegate to a separate session or subagent. Self-review defeats the purpose.
19
20
 
20
21
  ## Entry Criteria
21
22
 
@@ -79,6 +80,16 @@ The split is also the better review. Reviewing `design.md` and `tasks.md` into o
79
80
  Do not write a cleared line for a control you did not actually examine. An
80
81
  unchecked control reported as covered is the one outcome worse than no check at all.
81
82
 
83
+ ## Running as the reviewer agent
84
+
85
+ The `aidlc-reviewer` agent cannot write files, so steps 6 and 7 change shape. When you cannot write:
86
+
87
+ 1. Do everything up to writing the files.
88
+ 2. Reply with each findings file in full — `<artifact>.review.md` and, when a pack is installed, `<artifact>.compliance.md` — each under a heading naming its path in the instance namespace, each in one block fenced with four backticks. Write `reviewer: aidlc-reviewer` in each file's frontmatter.
89
+ 3. End with this line: "Write each file above unchanged, then follow **Completion** in `.aidlc/skills/aidlc-review.md`."
90
+
91
+ The session that started the review writes each file byte for byte, changing nothing in it, then follows **Completion**. A findings file its author has edited is no longer a review.
92
+
82
93
  {{guidance:secure-defaults}}
83
94
 
84
95
  ## Findings Format
@@ -87,7 +98,7 @@ The split is also the better review. Reviewing `design.md` and `tasks.md` into o
87
98
  ---
88
99
  artifact: <filename>
89
100
  reviewed_at: <ISO 8601 UTC>
90
- reviewer: <session-id>
101
+ reviewer: <session-id, or aidlc-reviewer>
91
102
  ---
92
103
 
93
104
  ## Finding 1