@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 +28 -0
- package/CHANGELOG.md +6 -0
- package/README.md +2 -1
- package/ROADMAP.md +27 -1
- package/docs/configuration.md +11 -7
- package/package.json +1 -1
- package/src/config/assertConfiguration.ts +1 -1
- package/src/config/schema.ts +2 -4
- package/src/maestro/checks/assertEnvironment.ts +1 -3
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.
|
|
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
|
package/docs/configuration.md
CHANGED
|
@@ -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` |
|
|
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` |
|
|
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` |
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
@@ -39,7 +39,7 @@ const formatError = (error: SchemaValidationError): string => {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
if (path.endsWith('model')) {
|
|
42
|
-
return `Invalid model
|
|
42
|
+
return `Invalid model at "${path}": expected a string.`;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
if (path === 'builder' || path === 'verifier' || path === 'simplifier') {
|
package/src/config/schema.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
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
|
}
|