meto-cli 0.12.1 → 0.13.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.
package/README.md CHANGED
@@ -165,6 +165,13 @@ your-project/
165
165
  │ │ ├── product-vision.md
166
166
  │ │ ├── tech-stack.md
167
167
  │ │ └── test-log.md
168
+ │ ├── contracts/
169
+ │ │ └── slice-NNN-contract.md # sprint contract per slice
170
+ │ ├── handoff/
171
+ │ │ └── current.md # session handoff artifact
172
+ │ ├── rubric/
173
+ │ │ ├── tester-rubric.md # grading dimensions + thresholds
174
+ │ │ └── tester-calibration-log.md
168
175
  │ ├── tasks/
169
176
  │ │ ├── tasks-backlog.md
170
177
  │ │ ├── tasks-done.md
@@ -265,7 +272,7 @@ Meto is optimized for Claude Code's **1M token context window**. With 5x more ro
265
272
  - **Less frequent `/compact`** -- use it when responses slow down, not proactively
266
273
  - **Memory files still matter** -- they persist across sessions, not just within them
267
274
 
268
- Each agent has a memory file in `.claude/agent-memory/` that it reads at session start and updates at session end. Session checkpoints (`ai/workflows/session-checkpoint.md`) help hand off between sessions when needed.
275
+ Each agent has a memory file in `.claude/agent-memory/` that it reads at session start and updates at session end. Every session also ends by writing `ai/handoff/current.md` a structured snapshot of sprint state, completed steps, blockers, and the single next action. The next agent reads this before anything else. Git history preserves the full audit trail of handoffs.
269
276
 
270
277
  ---
271
278
 
@@ -315,6 +322,7 @@ Meto scaffolds projects ready for Agent Teams out of the box:
315
322
  | `meto-cli init --no-ai` | Scaffold using static prompts only, skip AI generation |
316
323
  | `meto-cli init --dry-run` | Preview the generated file tree without writing to disk |
317
324
  | `meto-cli audit` | Scan an existing project against the methodology blueprint and fix gaps interactively |
325
+ | `meto-cli audit --rubric` | Check the last 5 completed slices for sprint contracts, rubric scores, and passing tests |
318
326
  | `meto-cli doctor` | Check methodology health of the current project |
319
327
  | `meto-cli status` | Show swarm progress dashboard (reads SWARM_AWARENESS.md) |
320
328
  | `meto-cli --help` | Show available commands and options |
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/audit/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQpD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AA6LD;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAyJ3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/audit/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AASpD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;CACjB;AA8LD;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAoL3D"}
@@ -5,6 +5,8 @@ import { AUDIT_BLUEPRINT } from "./blueprint.js";
5
5
  import { detectStack } from "./detect-stack.js";
6
6
  import { scanLayer, skipLayer, layerPassed, getFailedResults, } from "./scanner.js";
7
7
  import { fixLayer, fixLayerTwo, fixLayerThree } from "./fixer.js";
8
+ import { extractLastSlices, buildRubricChecks, } from "./rubric-check.js";
9
+ import { displayRubricResults, rubricHasFailed, } from "./rubric-display.js";
8
10
  import { getCodeGuidelines, getDefinitionOfDone } from "../stacks.js";
9
11
  // ---------------------------------------------------------------------------
10
12
  // Display helpers
@@ -55,6 +57,7 @@ function printAuditHelp() {
55
57
  "",
56
58
  "Options:",
57
59
  " --help, -h Show this help message",
60
+ " --rubric Also check the last 5 completed slices for contract and rubric score files",
58
61
  ].join("\n"), "Help");
59
62
  p.outro("Run 'meto-cli audit' from your project root.");
60
63
  }
@@ -279,12 +282,33 @@ export async function runAudit() {
279
282
  "and leave you with one coherent project.",
280
283
  ].join("\n"), "Next step: migrate your existing content");
281
284
  }
282
- if (totalFailed > 0) {
283
- p.outro(`Audit complete: ${totalPassed}/${totalExpectations} passed, ${totalFailed} failed`);
285
+ // --rubric flag: runs after existing layers (additive)
286
+ let rubricResults = [];
287
+ const hasRubricFlag = args.includes("--rubric");
288
+ if (hasRubricFlag) {
289
+ p.log.info("Running rubric compliance checks on last 5 completed slices...");
290
+ const sliceIds = await extractLastSlices(projectDir, 5);
291
+ if (sliceIds.length === 0) {
292
+ p.note("ai/tasks/tasks-done.md is missing or contains no completed slices.\nAdd completed slices to tasks-done.md before running --rubric.", "Rubric Compliance");
293
+ }
294
+ else {
295
+ rubricResults = await buildRubricChecks(projectDir, sliceIds);
296
+ displayRubricResults(rubricResults);
297
+ }
298
+ }
299
+ const rubricFailed = rubricHasFailed(rubricResults);
300
+ if (totalFailed > 0 || rubricFailed) {
301
+ p.outro(`Audit complete: ${totalPassed}/${totalExpectations} passed, ${totalFailed} failed` +
302
+ (hasRubricFlag
303
+ ? ` | Rubric: ${rubricResults.filter((r) => r.status === "fail").length} gap(s) found`
304
+ : ""));
284
305
  process.exit(1);
285
306
  }
286
307
  else {
287
- p.outro(`Audit complete: ${totalPassed}/${totalExpectations} checks passed`);
308
+ p.outro(`Audit complete: ${totalPassed}/${totalExpectations} checks passed` +
309
+ (hasRubricFlag && rubricResults.length > 0
310
+ ? ` | Rubric: ${rubricResults.length} checks passed`
311
+ : ""));
288
312
  }
289
313
  return allLayerResults;
290
314
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/audit/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/audit/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Rubric compliance checker for the `meto audit --rubric` flag.
3
+ *
4
+ * Reads the last N completed slices from tasks-done.md and checks each one for:
5
+ * 1. Sprint contract file at ai/contracts/slice-NNN-contract.md
6
+ * 2. Rubric score file at ai/rubric/slice-NNN-score.md
7
+ * 3. Verification commands listed in the rubric score file (run live)
8
+ */
9
+ /** The kind of check performed for a slice. */
10
+ export type RubricCheckType = "contract" | "score" | "verification";
11
+ /** Outcome of a single rubric check. */
12
+ export type RubricCheckStatus = "pass" | "fail";
13
+ /**
14
+ * Result of one rubric check for one slice.
15
+ */
16
+ export interface RubricSliceResult {
17
+ /** The slice ID (e.g. "slice-042") */
18
+ sliceId: string;
19
+ /** Which kind of check this result is for */
20
+ checkType: RubricCheckType;
21
+ /** Whether the check passed or failed */
22
+ status: RubricCheckStatus;
23
+ /** Human-readable explanation */
24
+ message: string;
25
+ /** Instruction for fixing the gap (only present on fail) */
26
+ fixInstruction: string | undefined;
27
+ }
28
+ /**
29
+ * Parses verification commands from a rubric score file.
30
+ *
31
+ * Looks for a "## Verification Commands Run" section and extracts commands
32
+ * from the first column of the markdown table rows below it.
33
+ * Table rows look like: | `npx vitest run` | 0 | |
34
+ */
35
+ export declare function parseVerificationCommands(content: string): string[];
36
+ /**
37
+ * Reads ai/tasks/tasks-done.md and extracts the top N slice IDs.
38
+ * Slices appear newest-first in the file (most recently added at the top).
39
+ *
40
+ * Returns an array of slice IDs like ["slice-091", "slice-090", ...].
41
+ * Returns an empty array if the file is missing or unreadable.
42
+ */
43
+ export declare function extractLastSlices(projectDir: string, count: number): Promise<string[]>;
44
+ /**
45
+ * Runs rubric compliance checks for the given slice IDs.
46
+ *
47
+ * For each slice:
48
+ * - Checks contract file exists at ai/contracts/slice-NNN-contract.md
49
+ * - Checks rubric score file exists at ai/rubric/slice-NNN-score.md
50
+ * - If score file exists, parses and runs verification commands live
51
+ *
52
+ * Returns a flat array of RubricSliceResult (multiple results per slice).
53
+ */
54
+ export declare function buildRubricChecks(projectDir: string, sliceIds: string[]): Promise<RubricSliceResult[]>;
55
+ //# sourceMappingURL=rubric-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rubric-check.d.ts","sourceRoot":"","sources":["../../../src/cli/audit/rubric-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,+CAA+C;AAC/C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;AAEpE,wCAAwC;AACxC,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,EAAE,eAAe,CAAC;IAC3B,yCAAyC;IACzC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AA6BD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBnE;AAyBD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmF9B"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Rubric compliance checker for the `meto audit --rubric` flag.
3
+ *
4
+ * Reads the last N completed slices from tasks-done.md and checks each one for:
5
+ * 1. Sprint contract file at ai/contracts/slice-NNN-contract.md
6
+ * 2. Rubric score file at ai/rubric/slice-NNN-score.md
7
+ * 3. Verification commands listed in the rubric score file (run live)
8
+ */
9
+ import { readFile, stat } from "node:fs/promises";
10
+ import { join } from "node:path";
11
+ import { spawnSync } from "node:child_process";
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Returns true if the path exists as a regular file.
17
+ */
18
+ async function fileExists(filePath) {
19
+ try {
20
+ const s = await stat(filePath);
21
+ return s.isFile();
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ /**
28
+ * Reads a file and returns its content, or null on error.
29
+ */
30
+ async function readFileOrNull(filePath) {
31
+ try {
32
+ return await readFile(filePath, "utf-8");
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ /**
39
+ * Parses verification commands from a rubric score file.
40
+ *
41
+ * Looks for a "## Verification Commands Run" section and extracts commands
42
+ * from the first column of the markdown table rows below it.
43
+ * Table rows look like: | `npx vitest run` | 0 | |
44
+ */
45
+ export function parseVerificationCommands(content) {
46
+ const sectionMatch = content.match(/## Verification Commands Run[\s\S]*?(?=\n## |\n---|\s*$)/);
47
+ if (!sectionMatch) {
48
+ return [];
49
+ }
50
+ const section = sectionMatch[0];
51
+ const commands = [];
52
+ for (const line of section.split("\n")) {
53
+ // Match table rows: | `command` | ... |
54
+ const rowMatch = line.match(/^\|\s*`([^`]+)`\s*\|/);
55
+ if (rowMatch) {
56
+ const cmd = rowMatch[1].trim();
57
+ // Skip placeholder lines like "(lint command if present)"
58
+ if (!cmd.startsWith("_") && !cmd.includes("if present")) {
59
+ commands.push(cmd);
60
+ }
61
+ }
62
+ }
63
+ return commands;
64
+ }
65
+ /**
66
+ * Runs a shell command synchronously and returns its exit code.
67
+ * The command is split on the first space: head = binary, rest = args.
68
+ */
69
+ function runCommand(command, cwd) {
70
+ const parts = command.split(/\s+/);
71
+ const bin = parts[0];
72
+ const args = parts.slice(1);
73
+ const result = spawnSync(bin, args, {
74
+ cwd,
75
+ stdio: "pipe",
76
+ encoding: "utf-8",
77
+ shell: false,
78
+ });
79
+ return result.status ?? 1;
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Public API
83
+ // ---------------------------------------------------------------------------
84
+ /**
85
+ * Reads ai/tasks/tasks-done.md and extracts the top N slice IDs.
86
+ * Slices appear newest-first in the file (most recently added at the top).
87
+ *
88
+ * Returns an array of slice IDs like ["slice-091", "slice-090", ...].
89
+ * Returns an empty array if the file is missing or unreadable.
90
+ */
91
+ export async function extractLastSlices(projectDir, count) {
92
+ const filePath = join(projectDir, "ai", "tasks", "tasks-done.md");
93
+ const content = await readFileOrNull(filePath);
94
+ if (content === null) {
95
+ return [];
96
+ }
97
+ const sliceIds = [];
98
+ for (const line of content.split("\n")) {
99
+ // Match: ## [slice-NNN] -- ...
100
+ const match = line.match(/^##\s+\[(slice-\d+)\]/);
101
+ if (match) {
102
+ sliceIds.push(match[1]);
103
+ }
104
+ }
105
+ return sliceIds.slice(0, count);
106
+ }
107
+ /**
108
+ * Runs rubric compliance checks for the given slice IDs.
109
+ *
110
+ * For each slice:
111
+ * - Checks contract file exists at ai/contracts/slice-NNN-contract.md
112
+ * - Checks rubric score file exists at ai/rubric/slice-NNN-score.md
113
+ * - If score file exists, parses and runs verification commands live
114
+ *
115
+ * Returns a flat array of RubricSliceResult (multiple results per slice).
116
+ */
117
+ export async function buildRubricChecks(projectDir, sliceIds) {
118
+ const results = [];
119
+ for (const sliceId of sliceIds) {
120
+ const sliceNum = sliceId.replace("slice-", "");
121
+ // Check 1: contract file
122
+ const contractPath = join(projectDir, "ai", "contracts", `slice-${sliceNum}-contract.md`);
123
+ const contractExists = await fileExists(contractPath);
124
+ results.push({
125
+ sliceId,
126
+ checkType: "contract",
127
+ status: contractExists ? "pass" : "fail",
128
+ message: contractExists
129
+ ? `Found ai/contracts/slice-${sliceNum}-contract.md`
130
+ : `Missing ai/contracts/slice-${sliceNum}-contract.md`,
131
+ fixInstruction: contractExists
132
+ ? undefined
133
+ : `Create ai/contracts/slice-${sliceNum}-contract.md from the sprint contract template before work begins`,
134
+ });
135
+ // Check 2: rubric score file
136
+ const scorePath = join(projectDir, "ai", "rubric", `slice-${sliceNum}-score.md`);
137
+ const scoreExists = await fileExists(scorePath);
138
+ results.push({
139
+ sliceId,
140
+ checkType: "score",
141
+ status: scoreExists ? "pass" : "fail",
142
+ message: scoreExists
143
+ ? `Found ai/rubric/slice-${sliceNum}-score.md`
144
+ : `Missing ai/rubric/slice-${sliceNum}-score.md`,
145
+ fixInstruction: scoreExists
146
+ ? undefined
147
+ : `@meto-tester must create ai/rubric/slice-${sliceNum}-score.md after evaluating slice-${sliceNum}`,
148
+ });
149
+ // Check 3: verification commands in score file (only if score file exists)
150
+ if (scoreExists) {
151
+ const scoreContent = await readFileOrNull(scorePath);
152
+ const commands = scoreContent
153
+ ? parseVerificationCommands(scoreContent)
154
+ : [];
155
+ if (commands.length === 0) {
156
+ results.push({
157
+ sliceId,
158
+ checkType: "verification",
159
+ status: "fail",
160
+ message: `No verification commands found in ai/rubric/slice-${sliceNum}-score.md`,
161
+ fixInstruction: `Add a 'Verification Commands Run' table to ai/rubric/slice-${sliceNum}-score.md listing commands and their exit codes`,
162
+ });
163
+ }
164
+ else {
165
+ for (const cmd of commands) {
166
+ const exitCode = runCommand(cmd, projectDir);
167
+ const passed = exitCode === 0;
168
+ results.push({
169
+ sliceId,
170
+ checkType: "verification",
171
+ status: passed ? "pass" : "fail",
172
+ message: passed
173
+ ? `\`${cmd}\` exited 0`
174
+ : `\`${cmd}\` exited ${exitCode} (expected 0)`,
175
+ fixInstruction: passed
176
+ ? undefined
177
+ : `Run \`${cmd}\` in the project root and fix all errors before closing slice-${sliceNum}`,
178
+ });
179
+ }
180
+ }
181
+ }
182
+ }
183
+ return results;
184
+ }
185
+ //# sourceMappingURL=rubric-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rubric-check.js","sourceRoot":"","sources":["../../../src/cli/audit/rubric-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Display helpers for the `meto audit --rubric` flag.
3
+ *
4
+ * Separated from rubric-check.ts (pure data) and index.ts (CLI entry point)
5
+ * so it can be unit-tested without stdin/process.exit mocking.
6
+ */
7
+ import type { RubricSliceResult } from "./rubric-check.js";
8
+ /**
9
+ * Summary counts returned by displayRubricResults.
10
+ * Used by the caller (index.ts) to drive the exit code and outro message.
11
+ */
12
+ export interface RubricSummary {
13
+ passed: number;
14
+ failed: number;
15
+ total: number;
16
+ /** All formatted lines emitted (for testing without mocking @clack/prompts). */
17
+ lines: string[];
18
+ }
19
+ /**
20
+ * Returns true if any result in the array has status "fail".
21
+ */
22
+ export declare function rubricHasFailed(results: RubricSliceResult[]): boolean;
23
+ /**
24
+ * Formats a single rubric check result into a human-readable label.
25
+ * Used internally and exposed for testing.
26
+ */
27
+ export declare function formatRubricLine(result: RubricSliceResult): string;
28
+ /**
29
+ * Renders rubric check results using the same @clack/prompts styling as the
30
+ * existing audit layers, then returns a RubricSummary for exit-code decisions.
31
+ *
32
+ * This function calls p.log.success / p.log.error so it must only be called
33
+ * from the CLI entry point, not from unit tests.
34
+ */
35
+ export declare function displayRubricResults(results: RubricSliceResult[]): RubricSummary;
36
+ //# sourceMappingURL=rubric-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rubric-display.d.ts","sourceRoot":"","sources":["../../../src/cli/audit/rubric-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAM3D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAgBlE;AAMD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,iBAAiB,EAAE,GAC3B,aAAa,CA0Bf"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Display helpers for the `meto audit --rubric` flag.
3
+ *
4
+ * Separated from rubric-check.ts (pure data) and index.ts (CLI entry point)
5
+ * so it can be unit-tested without stdin/process.exit mocking.
6
+ */
7
+ import * as p from "@clack/prompts";
8
+ // ---------------------------------------------------------------------------
9
+ // Pure helpers
10
+ // ---------------------------------------------------------------------------
11
+ /**
12
+ * Returns true if any result in the array has status "fail".
13
+ */
14
+ export function rubricHasFailed(results) {
15
+ return results.some((r) => r.status === "fail");
16
+ }
17
+ /**
18
+ * Formats a single rubric check result into a human-readable label.
19
+ * Used internally and exposed for testing.
20
+ */
21
+ export function formatRubricLine(result) {
22
+ const typeLabel = result.checkType === "contract"
23
+ ? "contract"
24
+ : result.checkType === "score"
25
+ ? "rubric score"
26
+ : "verification";
27
+ const status = result.status === "pass" ? "pass" : "FAIL";
28
+ let line = `[${result.sliceId}] ${typeLabel}: ${status} — ${result.message}`;
29
+ if (result.status === "fail" && result.fixInstruction !== undefined) {
30
+ line += `\n Fix: ${result.fixInstruction}`;
31
+ }
32
+ return line;
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Display (calls @clack/prompts — not unit-tested directly)
36
+ // ---------------------------------------------------------------------------
37
+ /**
38
+ * Renders rubric check results using the same @clack/prompts styling as the
39
+ * existing audit layers, then returns a RubricSummary for exit-code decisions.
40
+ *
41
+ * This function calls p.log.success / p.log.error so it must only be called
42
+ * from the CLI entry point, not from unit tests.
43
+ */
44
+ export function displayRubricResults(results) {
45
+ const lines = [];
46
+ let passed = 0;
47
+ let failed = 0;
48
+ for (const result of results) {
49
+ const line = formatRubricLine(result);
50
+ lines.push(line);
51
+ if (result.status === "pass") {
52
+ p.log.success(line);
53
+ passed++;
54
+ }
55
+ else {
56
+ p.log.error(line);
57
+ failed++;
58
+ }
59
+ }
60
+ const total = results.length;
61
+ p.note(`${passed}/${total} passed, ${failed} failed`, "Rubric Compliance");
62
+ return { passed, failed, total, lines };
63
+ }
64
+ //# sourceMappingURL=rubric-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rubric-display.js","sourceRoot":"","sources":["../../../src/cli/audit/rubric-display.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAmBpC,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAA4B;IAC1D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAyB;IACxD,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,KAAK,UAAU;QAC7B,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,OAAO;YAC5B,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,cAAc,CAAC;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,KAAK,MAAM,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAE7E,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACpE,IAAI,IAAI,YAAY,MAAM,CAAC,cAAc,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA4B;IAE5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAE7B,CAAC,CAAC,IAAI,CACJ,GAAG,MAAM,IAAI,KAAK,YAAY,MAAM,SAAS,EAC7C,mBAAmB,CACpB,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "meto-cli",
3
- "version": "0.12.1",
3
+ "version": "0.13.0",
4
4
  "description": "Scaffold structured software projects with built-in methodology",
5
5
  "type": "module",
6
6
  "bin": {
@@ -2,6 +2,10 @@
2
2
 
3
3
  *Read at session start. Update at session end.*
4
4
 
5
+ **Session start checklist:**
6
+ - [ ] Read `ai/handoff/current.md` — understand current sprint state before doing anything else
7
+ - [ ] Read this MEMORY.md file
8
+
5
9
  ---
6
10
 
7
11
  ## Product Understanding
@@ -2,6 +2,11 @@
2
2
 
3
3
  *Read at session start. Update at session end.*
4
4
 
5
+ **Session start checklist:**
6
+ - [ ] Read `ai/handoff/current.md` — understand current sprint state before doing anything else
7
+ - [ ] Read this MEMORY.md file
8
+ - [ ] Read `ai/tasks/tasks-in-progress.md` — confirm what to work on
9
+
5
10
  ---
6
11
 
7
12
  ## Red Flags — Stop Before Acting
@@ -2,6 +2,11 @@
2
2
 
3
3
  *Read at session start. Update at session end.*
4
4
 
5
+ **Session start checklist:**
6
+ - [ ] Read `ai/handoff/current.md` — understand current sprint state before doing anything else
7
+ - [ ] Read this MEMORY.md file
8
+ - [ ] Read `ai/tasks/tasks-todo.md` and `ai/tasks/tasks-backlog.md` — understand what needs planning
9
+
5
10
  ---
6
11
 
7
12
  ## Red Flags — Stop Before Acting
@@ -4,6 +4,16 @@
4
4
 
5
5
  ---
6
6
 
7
+ ## Session Start Checklist
8
+
9
+ - [ ] Read `ai/handoff/current.md` — understand current sprint state before doing anything else
10
+ - [ ] Read this MEMORY.md file
11
+ - [ ] Read `ai/rubric/tester-calibration-log.md` — apply the Current Calibration Rules to all evaluations this session
12
+ - [ ] Read `ai/tasks/tasks-in-testing.md` — identify the slice to validate
13
+ - [ ] Read the slice definition in full before running any checks
14
+
15
+ ---
16
+
7
17
  ## Review Conduct
8
18
 
9
19
  - **No performative acceptance** — never say "you're absolutely right" and immediately implement without evaluating.
@@ -7,12 +7,17 @@ tools: Read, Write, Edit, Bash, Glob, Grep
7
7
  # Developer Agent
8
8
 
9
9
  ## Session Start
10
- 1. Read `CLAUDE.md`
11
- 2. Read `.claude/agent-memory/meto-developer/MEMORY.md`
12
- 3. Read `/ai/workflows/code-guidelines.md` — enforce these during implementation
13
- 4. Proceed with task pickup
10
+ 1. **Read `ai/handoff/current.md`** — understand current sprint state and next action before reading anything else
11
+ > **Fallback:** If `ai/handoff/current.md` does not exist, read `ai/tasks/tasks-in-progress.md` and your memory file instead.
12
+ 2. Read `CLAUDE.md`
13
+ 3. Read `.claude/agent-memory/meto-developer/MEMORY.md`
14
+ 4. Read `/ai/workflows/code-guidelines.md` — enforce these during implementation
15
+ 5. Proceed with task pickup
14
16
 
15
17
  ## Session End
18
+ **[BLOCKING] Write `ai/handoff/current.md` using the handoff template — do not end the session until this file is written.**
19
+ > If context is near the limit, write the handoff before doing anything else — it is the most important session-end action.
20
+
16
21
  Update `.claude/agent-memory/meto-developer/MEMORY.md` with anything worth remembering.
17
22
 
18
23
  ## What I Own
@@ -22,6 +27,8 @@ Update `.claude/agent-memory/meto-developer/MEMORY.md` with anything worth remem
22
27
  - `package.json`, config files
23
28
 
24
29
  ## NEVER DO
30
+ - End a session without writing `ai/handoff/current.md`
31
+ - Write implementation code before a signed sprint contract exists for the current slice (`ai/contracts/slice-NNN-contract.md` signed by @meto-tester)
25
32
  - Cherry-pick — always take the TOP item(s) from `tasks-todo.md`
26
33
  - Modify `/ai/backlog/`, `/ai/context/`, `/ai/workflows/`
27
34
  - Modify `tasks-backlog.md` or `tasks-todo.md`
@@ -41,17 +48,33 @@ Never write to `/ai/backlog/`, `/ai/context/`, `tasks-backlog.md`, `tasks-todo.m
41
48
  - Max 10 files open before acting — note key info in memory
42
49
  - Check Codebase Map in your memory file before reading files — it may already have what you need
43
50
 
51
+ ## Contract Negotiation
52
+
53
+ Before writing any implementation code, negotiate a sprint contract with @meto-tester.
54
+
55
+ **Protocol (blocking — do not skip):**
56
+ 1. Read the PM slice definition from `tasks-todo.md`
57
+ 2. Create `ai/contracts/slice-{{SLICE_ID}}-contract.md` from the template at `ai/contracts/slice-NNN-contract.md`
58
+ 3. Fill in: Proposed Criteria (from the PM slice), initial Agreed Test Behaviors, and any Edge Cases you anticipate
59
+ 4. Send the draft to @meto-tester for review (e.g. "tell @meto-tester the contract for slice-NNN is ready for review")
60
+ 5. Incorporate any feedback from @meto-tester
61
+ 6. Wait for @meto-tester to record explicit sign-off in the contract file's Sign-off section
62
+ 7. Only after sign-off is recorded may you write implementation code
63
+
64
+ **You may not proceed to implementation until the contract file exists and @meto-tester has signed it.**
65
+
44
66
  ## Task Pickup Protocol
45
67
  1. Read `tasks-todo.md` — take TOP item (or batch of consecutive items in batch mode)
46
68
  2. Copy full task block(s) to `tasks-in-progress.md`, add `Started: [date]`
47
69
  3. Delete the task block(s) from `tasks-todo.md`
48
- 4. Implement against acceptance criteria
49
- 5. Run self-check
50
- 6. Route by size:
70
+ 4. Complete the Contract Negotiation loop (see above) — no code until signed
71
+ 5. Implement against acceptance criteria
72
+ 6. Run self-check
73
+ 7. Route by size:
51
74
  - **XS/S:** Copy to `tasks-done.md` with `Completed: [date]`, `Files changed: [list]`, and `Self-validated: PASS`
52
75
  - **M/L:** Copy to `tasks-in-testing.md` with `Completed: [date]` and `Files changed: [list]`
53
- 7. Delete the task block(s) from `tasks-in-progress.md`
54
- 8. Commit once at the end of the batch: `feat(scope): description [dev-agent]`
76
+ 8. Delete the task block(s) from `tasks-in-progress.md`
77
+ 9. Commit once at the end of the batch: `feat(scope): description [dev-agent]`
55
78
 
56
79
  ## Self-Check Before Moving to Testing
57
80
  - [ ] All acceptance criteria implemented