@emiliosp/pi-maestro 0.13.1 → 0.14.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/ADR.md CHANGED
@@ -219,3 +219,31 @@ Conflicting imported status and acceptance evidence remain explicit rather than
219
219
  ### Evidence
220
220
 
221
221
  [Roadmap](ROADMAP.md) and [repository instructions](AGENTS.md).
222
+
223
+ ## ADR-008: Use Pi's registry for model availability
224
+
225
+ ### Status
226
+
227
+ Accepted. Implemented.
228
+
229
+ ### Context
230
+
231
+ Maestro's model format regex rejected OpenRouter IDs containing additional slashes. The `owner` selected Pi as the source of truth for models and explicitly retained the
232
+ activation availability check because it uses Pi's registry.
233
+
234
+ ### Decision
235
+
236
+ Treat configured models as strings without a separate format regex. During activation, match each complete `provider/model` identifier against
237
+ `context.modelRegistry.getAvailable()`, preserving slashes inside model IDs. Pass the configured identifier unchanged through `pi-subagents`.
238
+
239
+ Keep Maestro's configuration structure, version, path, thinking-level, and timeout validation.
240
+
241
+ ### Consequences
242
+
243
+ A model absent from Pi's available registry prevents activation. `Maestro` maintains no separate model catalog or authentication check. Provider or authentication
244
+ failures during delegation still use the existing `run` failure path. Workflow recovery and phase transitions remain unchanged.
245
+
246
+ ### Evidence
247
+
248
+ [Configuration](docs/configuration.md#model-access), [activation checks](src/maestro/checks/assertEnvironment.ts), and
249
+ [delegation](src/tools/utils/pi-subagent-delegation.ts).
package/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  This file summarizes meaningful changes to the codebase, including behavior, data formats, architecture, and development tools. Git tags identify version boundaries;
4
4
  GitHub Releases are not required.
5
5
 
6
+ ## 0.14.0
7
+
8
+ 1. Removed Maestro's model format regex while retaining activation checks against Pi's available model registry. Complete identifiers, including
9
+ `openrouter/~openai/gpt-mini-latest`, are matched without truncation and passed unchanged to `pi-subagents`. Maestro's other configuration validation remains
10
+ unchanged.
11
+
6
12
  ## 0.13.1
7
13
 
8
14
  1. Restored `ROADMAP.md` as the planning source of truth from the current Linear issues, retaining their identifiers and recorded evidence. Updated repository guidance,
package/README.md CHANGED
@@ -101,7 +101,8 @@ Activate `Maestro`:
101
101
  /maestro
102
102
  ```
103
103
 
104
- During activation, `Maestro` checks project trust, configuration, models, and agent availability. If a check fails, `Maestro` stays disabled and reports the problem.
104
+ During activation, `Maestro` checks project trust, configuration, models, and agent availability. Model availability comes from Pi's model registry. If a check fails,
105
+ `Maestro` stays disabled and reports the problem.
105
106
 
106
107
  The `owner` follows this workflow:
107
108
 
package/ROADMAP.md CHANGED
@@ -3,12 +3,38 @@
3
3
  This file is the source of truth for planned outcomes and recorded completion. Roadmap entries are not permission to implement them. The `owner` selects work and approves
4
4
  its `specification` before implementation starts. Detailed requirements, technical decisions, and `acceptance criteria` belong in that `specification`.
5
5
 
6
- Items were restored from the Linear `MAESTRO` team. Existing identifiers remain stable; Linear is historical reference only and does not need to be read or updated.
7
6
  Backlog items have no agreed order or date. The `owner` approves priority and scope changes.
8
7
 
9
8
  Completed entries preserve recorded outcomes and evidence, which may describe behavior later changed. Completion requires `owner` acceptance, not only passing checks or
10
9
  reaching `candidate-ready`. Linear onboarding and test issues are not project roadmap items and are omitted.
11
10
 
11
+ ## Overview
12
+
13
+ | ID | Item | Status |
14
+ | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- |
15
+ | MAESTRO-6 | [Display specs in a browser](#maestro-6-display-specs-in-a-browser) | Backlog |
16
+ | MAESTRO-7 | [Route builder failures through owner escalations](#maestro-7-route-builder-failures-through-owner-escalations) | Completed |
17
+ | MAESTRO-8 | [Store escalations and owner decisions in builder handoffs](#maestro-8-store-escalations-and-owner-decisions-in-builder-handoffs) | Completed |
18
+ | MAESTRO-9 | [Format glossary terms consistently](#maestro-9-format-glossary-terms-consistently) | Completed |
19
+ | MAESTRO-10 | [Improve status presentation and activation feedback](#maestro-10-improve-status-presentation-and-activation-feedback) | Completed |
20
+ | MAESTRO-11 | [Introduce Maestro at activation](#maestro-11-introduce-maestro-at-activation) | Completed |
21
+ | MAESTRO-12 | [Verify code quality against AGENTS.md instructions](#maestro-12-verify-code-quality-against-agentsmd-instructions) | Completed |
22
+ | MAESTRO-13 | [Check subagent extensions at activation](#maestro-13-check-subagent-extensions-at-activation) | Completed |
23
+ | MAESTRO-14 | [Rename the test support directory](#maestro-14-rename-the-test-support-directory) | Completed |
24
+ | MAESTRO-15 | [Match handoff criteria to the approved spec](#maestro-15-match-handoff-criteria-to-the-approved-spec) | Completed |
25
+ | MAESTRO-16 | [Route finding-driven spec revisions through drafting-spec](#maestro-16-route-finding-driven-spec-revisions-through-drafting-spec) | Completed |
26
+ | MAESTRO-17 | [Keep acceptance criterion numbering continuous](#maestro-17-keep-acceptance-criterion-numbering-continuous) | Completed |
27
+ | MAESTRO-18 | [Record escalation resolutions when the spec changes](#maestro-18-record-escalation-resolutions-when-the-spec-changes) | Completed |
28
+ | MAESTRO-19 | [Guide initial configuration](#maestro-19-guide-initial-configuration) | Backlog |
29
+ | MAESTRO-20 | [Rename the npm package](#maestro-20-rename-the-npm-package) | Backlog |
30
+ | MAESTRO-21 | [Label acceptance criterion coverage](#maestro-21-label-acceptance-criterion-coverage) | Completed |
31
+ | MAESTRO-22 | [Avoid acceptance criteria already covered by tests](#maestro-22-avoid-acceptance-criteria-already-covered-by-tests) | Completed |
32
+ | MAESTRO-23 | [Change agent models before a builder run](#maestro-23-change-agent-models-before-a-builder-run) | Backlog |
33
+ | MAESTRO-24 | [Add a simplifier with one clear purpose per agent](#maestro-24-add-a-simplifier-with-one-clear-purpose-per-agent) | Completed |
34
+ | MAESTRO-25 | [Define workflow reconciliation](#maestro-25-define-workflow-reconciliation) | Backlog |
35
+ | MAESTRO-26 | [Exit Maestro mode automatically at workflow completion](#maestro-26-exit-maestro-mode-automatically-at-workflow-completion) | Implemented, acceptance not confirmed |
36
+ | MAESTRO-27 | [Make verifier and simplifier phases optional](#maestro-27-make-verifier-and-simplifier-phases-optional) | Backlog |
37
+
12
38
  ## Backlog
13
39
 
14
40
  ### MAESTRO-6: Display specs in a browser
@@ -39,19 +39,22 @@ For example, if Pi starts in `/work/app/src`, `Maestro` reads `/work/app/src/.pi
39
39
  | `version` | Yes, when the file exists | `1.0.0` | Configuration format version. Only `1.0.0` is supported. |
40
40
  | `specDirectory` | No | `.specs` | Relative path below the project root. |
41
41
  | `builder` | No | `Builder` defaults | Overrides supported `builder` fields. |
42
- | `builder.model` | No | `openai-codex/gpt-5.6-luna` | Full `provider/model` identifier. |
42
+ | `builder.model` | No | `openai-codex/gpt-5.6-luna` | Model string passed unchanged to Pi. |
43
43
  | `builder.thinking` | No | `max` | One supported thinking level. |
44
44
  | `builder.timeoutMinutes` | No | `60` | Integer from `1` to `1440`. Applies to each `builder` `run`. |
45
45
  | `verifier` | No | `Verifier` defaults | Overrides supported `verifier` fields. |
46
- | `verifier.model` | No | `openai-codex/gpt-6.1-sol` | Full `provider/model` identifier. |
46
+ | `verifier.model` | No | `openai-codex/gpt-6.1-sol` | Model string passed unchanged to Pi. |
47
47
  | `verifier.thinking` | No | `high` | One supported thinking level. |
48
48
  | `verifier.timeoutMinutes` | No | `60` | Integer from `1` to `1440`. Applies to each `verifier` `run`. |
49
49
  | `simplifier` | No | `Simplifier` defaults | Overrides supported `simplifier` fields. |
50
- | `simplifier.model` | No | `openai-codex/gpt-6.1-sol` | Full `provider/model` identifier. |
50
+ | `simplifier.model` | No | `openai-codex/gpt-6.1-sol` | Model string passed unchanged to Pi. |
51
51
  | `simplifier.thinking` | No | `high` | One supported thinking level. |
52
52
  | `simplifier.timeoutMinutes` | No | `60` | Integer from `1` to `1440`. Applies to each `simplifier` `run`. |
53
53
 
54
- Model identifiers use the full `provider/model` form shown in the defaults. `Maestro` accepts these thinking levels:
54
+ Model values use the full `provider/model` identifier supplied by Pi's model registry, such as `openrouter/~openai/gpt-mini-latest`. Model IDs may contain additional
55
+ slashes. `Maestro` does not apply a separate format rule; it matches the complete identifier against Pi's available models and passes it unchanged through `pi-subagents`.
56
+
57
+ `Maestro` accepts these thinking levels:
55
58
 
56
59
  ```text
57
60
  off
@@ -95,7 +98,8 @@ For example, `specDirectory: "planning/specs"` places `specs` in `<project-root>
95
98
 
96
99
  ## Model access
97
100
 
98
- `Maestro` checks all three configured models during activation. Each model must exist and have valid authentication.
101
+ During activation, `Maestro` checks all three configured models against `context.modelRegistry.getAvailable()`. Pi's registry is the source of truth for model
102
+ availability; `Maestro` does not maintain a separate model list or authentication check. A missing model stops activation and identifies the full configured identifier.
99
103
 
100
- A model error stops activation and identifies the affected model. The `owner` can correct the model identifier or authenticate the provider, then run `/maestro` again.
101
- Agent names and context are described in [Subagent integration](subagent-integration.md#roles-and-context).
104
+ The `owner` can correct the identifier or authenticate the provider in Pi, then retry `/maestro`. Authentication or provider errors during delegation still appear as
105
+ `run` failures. Agent names and context are described in [Subagent integration](subagent-integration.md#roles-and-context).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emiliosp/pi-maestro",
3
- "version": "0.13.1",
3
+ "version": "0.14.0",
4
4
  "description": "A spec-driven multiagent development workflow for Pi.",
5
5
  "keywords": [
6
6
  "orchestration",
@@ -39,7 +39,7 @@ const formatError = (error: SchemaValidationError): string => {
39
39
  }
40
40
 
41
41
  if (path.endsWith('model')) {
42
- return `Invalid model identifier at "${path}". Must use "provider/model" format.`;
42
+ return `Invalid model at "${path}": expected a string.`;
43
43
  }
44
44
 
45
45
  if (path === 'builder' || path === 'verifier' || path === 'simplifier') {
@@ -23,8 +23,6 @@ export const THINKING_LEVELS = {
23
23
 
24
24
  export type ThinkingLevel = (typeof THINKING_LEVELS)[keyof typeof THINKING_LEVELS];
25
25
 
26
- export const MODEL_PATTERN = '^[^/\\s]+/[^/\\s]+$';
27
-
28
26
  export const SUPPORTED_CONFIG_VERSION = '1.0.0';
29
27
 
30
28
  export const MIN_TIMEOUT_MINUTES = 1;
@@ -43,7 +41,7 @@ export const ThinkingSchema = Type.Union([
43
41
 
44
42
  export const PartialAgentConfigSchema = Type.Object(
45
43
  {
46
- model: Type.Optional(Type.String({ pattern: MODEL_PATTERN })),
44
+ model: Type.Optional(Type.String()),
47
45
  thinking: Type.Optional(ThinkingSchema),
48
46
  timeoutMinutes: Type.Optional(
49
47
  Type.Integer({
@@ -68,7 +66,7 @@ export const MaestroConfigInputSchema = Type.Object(
68
66
 
69
67
  export const ResolvedAgentConfigSchema = Type.Object(
70
68
  {
71
- model: Type.String({ pattern: MODEL_PATTERN }),
69
+ model: Type.String(),
72
70
  thinking: ThinkingSchema,
73
71
  timeoutMinutes: Type.Integer({
74
72
  minimum: MIN_TIMEOUT_MINUTES,
@@ -57,9 +57,7 @@ function assertModelsAvailable({ context, config }: AssertModelsAvailableInput):
57
57
  const availableModels = context.modelRegistry.getAvailable();
58
58
 
59
59
  for (const model of [config.builder.model, config.verifier.model, config.simplifier.model]) {
60
- const [provider, id] = model.split('/');
61
-
62
- if (!availableModels.some((entry) => entry.provider === provider && entry.id === id)) {
60
+ if (!availableModels.some((entry) => `${entry.provider}/${entry.id}` === model)) {
63
61
  throw new Error(`Configured model is not available: "${model}".`);
64
62
  }
65
63
  }