@topy-ai/maggie 0.7.23 → 0.7.25
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 +63 -8
- package/README.zh-TW.md +7 -1
- package/bin/maggie.js +9 -2
- package/bundled-contracts/maggie-deployment/readiness-v1.schema.json +2 -1
- package/bundled-contracts/maggie-deployment/runtime-parity-v1.schema.json +38 -0
- package/bundled-contracts/maggie-design/mobile-app-surface-v1.schema.json +99 -0
- package/bundled-contracts/maggie-service-booking/onboarding-orchestration-v1.schema.json +34 -0
- package/bundled-skills/maggie-deployment/SKILL.md +27 -5
- package/bundled-skills/maggie-design/SKILL.md +41 -5
- package/bundled-skills/maggie-feedback/SKILL.md +36 -1
- package/bundled-skills/maggie-qa-workflow/SKILL.md +9 -5
- package/bundled-skills/maggie-service-booking/SKILL.md +35 -1
- package/bundled-tools/clis/maggie_deployment_parity.py +170 -0
- package/bundled-tools/clis/maggie_deployment_readiness.py +14 -0
- package/bundled-tools/clis/maggie_design.py +134 -1
- package/bundled-tools/clis/maggie_feedback.py +100 -2
- package/bundled-tools/clis/maggie_qa_workflow.py +14 -1
- package/bundled-tools/clis/maggie_service_onboarding.py +186 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,6 +60,10 @@ Maggie keeps the existing project foundation and asks for decisions before
|
|
|
60
60
|
shared routes, analytics, or publishing boundaries change. The current
|
|
61
61
|
package ships 19 installable skills and a local-first MaggieDash foundation.
|
|
62
62
|
|
|
63
|
+
The current release is `0.7.25`. It adds a host-owned mobile app surface
|
|
64
|
+
contract (`maggie design app-init`/`app-validate`), direct Astro route
|
|
65
|
+
resolution, correlated feedback batches, and runtime package-version capture.
|
|
66
|
+
|
|
63
67
|
For repeatable browser QA, create a project-owned scenario manifest and record
|
|
64
68
|
the test, fix, and retest lifecycle:
|
|
65
69
|
|
|
@@ -87,7 +91,9 @@ maggie qa assertion-audit --project . \
|
|
|
87
91
|
|
|
88
92
|
For a dialog or drawer, include a browser-runtime `scroll-owner-count` check
|
|
89
93
|
with `expected: 1`. This catches the fixed-shell plus inner-content double
|
|
90
|
-
scrollbar that static class checks can miss.
|
|
94
|
+
scrollbar that static class checks can miss. For icon controls, use
|
|
95
|
+
`icon-rendered` with a visible glyph, positive width/height, and an accessible
|
|
96
|
+
label; this catches a missing runtime glyph that build/typecheck cannot see.
|
|
91
97
|
|
|
92
98
|
Dashboard and documentation audits are provider-neutral and keep host data
|
|
93
99
|
behind explicit evidence files:
|
|
@@ -211,10 +217,10 @@ maggie design ... # authorized interior-page design
|
|
|
211
217
|
maggie clone-to-template ... # URL → validated marketplace template
|
|
212
218
|
maggie marketplace ... # catalog and on-demand template workflow
|
|
213
219
|
maggie memory ... # confirmed preferences and lessons
|
|
214
|
-
maggie feedback ... # redact, preview, submit, list
|
|
220
|
+
maggie feedback ... # redact, preview, batch, submit, list
|
|
215
221
|
maggie qa ... # scenario browser QA, fix/retest, release gate
|
|
216
222
|
maggie localization ... # plan, validate, review, publish, stale
|
|
217
|
-
maggie service ...
|
|
223
|
+
maggie service ... # import, sync/report, catalogue, lifecycle, validate
|
|
218
224
|
maggie seo performance ... # sampled PageSpeed/CWV report and baseline
|
|
219
225
|
maggie seo images ... # inventory, variants, confirmation, validate
|
|
220
226
|
maggie seo sitemap ... # typed/semantic plan, agent-files, apply, rollback
|
|
@@ -224,6 +230,7 @@ maggie seo head-tags ... # rendered-shell head metadata drift audit
|
|
|
224
230
|
maggie ops favicon-check ... # served favicon behaviour check
|
|
225
231
|
maggie deployment | migration | release | analytics | schedule
|
|
226
232
|
maggie deployment readiness --project PATH
|
|
233
|
+
maggie deployment parity --project PATH --evidence FILE --output FILE
|
|
227
234
|
maggie migration identity --identity-file FILE [--expected-file FILE]
|
|
228
235
|
maggie deployment canary --asset URL=SHA256 --render-report report.json
|
|
229
236
|
maggie design icon-inventory --source-dir src --runtime assets/icons.css
|
|
@@ -298,6 +305,11 @@ maggie design icon-inventory --project . --source-dir src \
|
|
|
298
305
|
--runtime public/assets/icons.css --output docs/icon-inventory.json
|
|
299
306
|
```
|
|
300
307
|
|
|
308
|
+
The inventory covers compound selectors such as `.ph.ph-arrow-square-out`
|
|
309
|
+
and is only static name coverage. Pair changed icon controls with a
|
|
310
|
+
browser-runtime `icon-rendered` assertion so the host adapter proves that the
|
|
311
|
+
glyph is visible, has positive dimensions, and has an accessible label.
|
|
312
|
+
|
|
301
313
|
After deployment, compare an immutable asset fingerprint and validate the
|
|
302
314
|
browser adapter's rendered report:
|
|
303
315
|
|
|
@@ -312,8 +324,23 @@ The canary report requires a screenshot and zero console errors, missing
|
|
|
312
324
|
assets, and visual placeholders for every route. It records safe cache headers
|
|
313
325
|
only and never stores response bodies, cookies, or credentials.
|
|
314
326
|
|
|
327
|
+
When workers, migrations, browser drivers, import jobs, or route APIs are part
|
|
328
|
+
of the deployment, validate their sanitized parity evidence before the canary:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
maggie deployment parity --project . \
|
|
332
|
+
--evidence .maggie/verification/runtime-parity-input.json \
|
|
333
|
+
--output .maggie/verification/runtime-parity.json
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
The parity contract checks required worker configuration, migration
|
|
337
|
+
privileges, route API status, stale resident processes, source-job IDs, and
|
|
338
|
+
browser/driver compatibility. Add the resulting report to readiness with
|
|
339
|
+
`--runtime-parity`; a failed report blocks the gate.
|
|
340
|
+
|
|
315
341
|
Unit regression does not establish runtime release readiness. Produce unit
|
|
316
|
-
evidence and then validate all
|
|
342
|
+
evidence and then validate all required release evidence slots; add
|
|
343
|
+
`--runtime-parity` when the deployment uses the worker/browser surfaces above:
|
|
317
344
|
|
|
318
345
|
```bash
|
|
319
346
|
python3 tools/tests/run_regression.py \
|
|
@@ -323,13 +350,27 @@ maggie deployment readiness --project . \
|
|
|
323
350
|
--browser-report .maggie/verification/browser-evidence.json \
|
|
324
351
|
--rendered-canary .maggie/deployment-canary.json \
|
|
325
352
|
--deployment-preflight .maggie/release-preflight.json \
|
|
353
|
+
--runtime-parity .maggie/verification/runtime-parity.json \
|
|
326
354
|
--output .maggie/deployment-readiness.json
|
|
327
355
|
```
|
|
328
356
|
|
|
329
357
|
The readiness report follows `maggie-deployment-readiness.v1`. It reports unit
|
|
330
358
|
regression, package smoke, host browser evidence, rendered canary, and
|
|
331
359
|
deployment preflight separately. Missing host adapter evidence is
|
|
332
|
-
`inconclusive`; only
|
|
360
|
+
`inconclusive`; only all configured slots produce `passed`.
|
|
361
|
+
|
|
362
|
+
For service-booking hosts, validate independent import, local-search, and
|
|
363
|
+
website-research jobs before public generation:
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
maggie service orchestration-validate --project . \
|
|
367
|
+
--manifest .maggie/booking/onboarding-orchestration.json \
|
|
368
|
+
--output docs/service-onboarding-orchestration.json
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
The contract requires unique idempotency keys, bounded retry history, pollable
|
|
372
|
+
status references, and disjoint field ownership so one onboarding workflow
|
|
373
|
+
cannot overwrite another.
|
|
333
374
|
|
|
334
375
|
### Localization and analytics release gates
|
|
335
376
|
|
|
@@ -356,8 +397,8 @@ artifact schemas.
|
|
|
356
397
|
Recommended upgrade sequence for the current release:
|
|
357
398
|
|
|
358
399
|
```bash
|
|
359
|
-
npx @topy-ai/maggie@0.7.
|
|
360
|
-
npx @topy-ai/maggie@0.7.
|
|
400
|
+
npx @topy-ai/maggie@0.7.25 update --project . --force
|
|
401
|
+
npx @topy-ai/maggie@0.7.25 cleanup --project .
|
|
361
402
|
```
|
|
362
403
|
|
|
363
404
|
Maintainers should pass npm credentials through the repository helper, never
|
|
@@ -367,7 +408,12 @@ as a command-line argument:
|
|
|
367
408
|
node scripts/publish-npm.mjs --maggie-env-file ../.env
|
|
368
409
|
```
|
|
369
410
|
|
|
370
|
-
The 0.7.
|
|
411
|
+
The 0.7.25 workflow adds host-owned mobile app surface plans with signed-in
|
|
412
|
+
camera-state QA, direct `.astro` route resolution, correlated feedback batch
|
|
413
|
+
drafts, and runtime package-version precedence. The 0.7.24 workflow adds
|
|
414
|
+
browser-runtime `icon-rendered` assertions, sanitized
|
|
415
|
+
worker/browser parity preflight evidence, and the provider-neutral asynchronous
|
|
416
|
+
service-onboarding contract. The 0.7.23 workflow adds the single-scroll-owner MaggieDash modal primitive,
|
|
371
417
|
server-runtime-only auth/provider configuration guidance, best-effort optional
|
|
372
418
|
identity-mirror semantics, and `scroll-owner-count` browser QA evidence. The
|
|
373
419
|
0.7.22 workflow adds provider-catalogue authority checks, field/variant
|
|
@@ -514,6 +560,15 @@ maggie feedback submit .maggie/feedback/<feedback-id>.json \
|
|
|
514
560
|
--endpoint https://feedback.noblox.app/api/feedback --confirm
|
|
515
561
|
```
|
|
516
562
|
|
|
563
|
+
For related observations, create 1–50 local drafts with shared correlation
|
|
564
|
+
metadata and review them before submitting:
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
maggie feedback batch --project . --batch-file ./feedback-batch.json
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
The batch command never submits automatically or writes active memory.
|
|
571
|
+
|
|
517
572
|
Submission is never implicit. Project paths, source files, logs, and secrets
|
|
518
573
|
are excluded by default. The hosted endpoint stores the normalized feedback in
|
|
519
574
|
NoBlox for maintainer review; it does not automatically create a GitHub Issue.
|
package/README.zh-TW.md
CHANGED
|
@@ -8,7 +8,7 @@ Codex、Claude Code 與相容的 coding agents。
|
|
|
8
8
|
## 安裝
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
npx @topy-ai/maggie@0.7.
|
|
11
|
+
npx @topy-ai/maggie@0.7.25 init --agent all
|
|
12
12
|
npx @topy-ai/maggie doctor --project .
|
|
13
13
|
```
|
|
14
14
|
|
|
@@ -25,6 +25,12 @@ maggie doctor --project . --require-bootstrap --strict
|
|
|
25
25
|
deployment、memory、feedback 和 MaggieDash。內容先 draft/review,外部寫入、
|
|
26
26
|
publish 與 production deployment 需要明確確認。
|
|
27
27
|
|
|
28
|
+
目前 release 是 `0.7.25`,加入 host-owned mobile app surface contract、signed-in
|
|
29
|
+
camera-state QA、直接 Astro route resolution、correlated feedback batch,以及
|
|
30
|
+
runtime package version capture。
|
|
31
|
+
|
|
32
|
+
0.7.24 加入 `icon-rendered` browser QA assertion、worker/browser deployment parity
|
|
33
|
+
preflight,以及 import/search/research 的非同步 service onboarding contract。
|
|
28
34
|
0.7.23 加入 dashboard dialog 單一 scroll owner、server runtime-only auth/provider
|
|
29
35
|
設定規則、optional identity mirror 的 best-effort 邊界,以及 QA 的
|
|
30
36
|
`scroll-owner-count` browser evidence。0.7.22 加入 provider catalogue authority check、field/variant sync report、
|
package/bin/maggie.js
CHANGED
|
@@ -88,6 +88,8 @@ Usage:
|
|
|
88
88
|
maggie design reference-ui --project PATH --reference PATH --surface blog,service --confirm
|
|
89
89
|
maggie design init --project PATH --surface blog|service --reference-run PATH --confirm
|
|
90
90
|
maggie design validate-ui --project PATH --plan PATH --rendered-dir PATH --confirm
|
|
91
|
+
maggie design app-init --project PATH --route /app/valuation --auth-mode email-password --confirm
|
|
92
|
+
maggie design app-validate --project PATH --plan PATH --runtime-evidence FILE --rendered-dir PATH --confirm
|
|
91
93
|
maggie design icon-inventory --project PATH --source-dir src --runtime assets/icons.css --output docs/icon-inventory.json
|
|
92
94
|
maggie design author --project PATH --route /about --purpose TEXT --audience TEXT --confirm
|
|
93
95
|
maggie design in-place --project PATH --route /pricing [--content-source PATH]
|
|
@@ -108,10 +110,12 @@ Usage:
|
|
|
108
110
|
maggie service validate --project PATH
|
|
109
111
|
maggie service inspect --project PATH
|
|
110
112
|
maggie service status --project PATH
|
|
113
|
+
maggie service orchestration-validate --project PATH --manifest FILE
|
|
111
114
|
maggie service convert-page <page-path> --project PATH
|
|
112
115
|
maggie service match-pages --project PATH --pages-dir src/pages
|
|
113
116
|
maggie deployment --project PATH --target vps-with-cloudflare-dns
|
|
114
117
|
maggie deployment readiness --project PATH
|
|
118
|
+
maggie deployment parity --project PATH --evidence FILE --output FILE
|
|
115
119
|
maggie deployment canary --project PATH --asset URL=SHA256 --render-report report.json --output docs/deployment-canary.json
|
|
116
120
|
maggie migration --project PATH --environment staging
|
|
117
121
|
maggie migration identity --identity-file FILE [--expected-file FILE]
|
|
@@ -301,7 +305,8 @@ function marketplace(args) {
|
|
|
301
305
|
|
|
302
306
|
function service(args) {
|
|
303
307
|
const root = projectRoot(args);
|
|
304
|
-
const
|
|
308
|
+
const scriptName = args[0] === "orchestration-validate" ? "maggie_service_onboarding.py" : "maggie_service_booking.py";
|
|
309
|
+
const script = join(root, "tools", "clis", scriptName);
|
|
305
310
|
if (!existsSync(script)) throw new Error(`service booking CLI is missing: ${script}`);
|
|
306
311
|
const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root, env: { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION } });
|
|
307
312
|
if (result.error) throw result.error;
|
|
@@ -324,7 +329,8 @@ function workflowCli(name, args) {
|
|
|
324
329
|
const root = projectRoot(args);
|
|
325
330
|
const script = join(root, "tools", "clis", name);
|
|
326
331
|
if (!existsSync(script)) throw new Error(`${name} is missing: ${script}`);
|
|
327
|
-
const
|
|
332
|
+
const env = name === "maggie_feedback.py" ? { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION } : process.env;
|
|
333
|
+
const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root, env });
|
|
328
334
|
if (result.error) throw result.error;
|
|
329
335
|
process.exitCode = result.status ?? 1;
|
|
330
336
|
}
|
|
@@ -413,6 +419,7 @@ try {
|
|
|
413
419
|
else if (command === "ops") workflowCli("maggie_ops.py", args);
|
|
414
420
|
else if (command === "deployment" && args[0] === "canary") workflowCli("maggie_deployment_canary.py", args.slice(1));
|
|
415
421
|
else if (command === "deployment" && args[0] === "readiness") workflowCli("maggie_deployment_readiness.py", args.slice(1));
|
|
422
|
+
else if (command === "deployment" && args[0] === "parity") workflowCli("maggie_deployment_parity.py", args.slice(1));
|
|
416
423
|
else if (command === "deployment") workflowCli("maggie_deployment.py", args);
|
|
417
424
|
else if (command === "migration") workflowCli("maggie_migration.py", args);
|
|
418
425
|
else if (command === "schedule") workflowCli("maggie_schedule.py", args);
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
"packageSmoke": {"$ref": "#/$defs/check"},
|
|
17
17
|
"browserEvidence": {"$ref": "#/$defs/check"},
|
|
18
18
|
"renderedCanary": {"$ref": "#/$defs/check"},
|
|
19
|
-
"deploymentPreflight": {"$ref": "#/$defs/check"}
|
|
19
|
+
"deploymentPreflight": {"$ref": "#/$defs/check"},
|
|
20
|
+
"runtimeParity": {"$ref": "#/$defs/check"}
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
},
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://maggie.noblox.app/contracts/deployment-runtime-parity-v1.json",
|
|
4
|
+
"title": "Maggie deployment worker and browser runtime parity evidence",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "environment", "passed", "worker", "browser"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": {"const": "maggie-deployment-runtime-parity.v1"},
|
|
9
|
+
"environment": {"enum": ["development", "staging", "production"]},
|
|
10
|
+
"passed": {"const": true},
|
|
11
|
+
"worker": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"required": ["config", "migration", "routeApis", "residentProcesses", "sourceJobs"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"config": {"$ref": "#/$defs/config"},
|
|
16
|
+
"migration": {"type": "object", "required": ["privilegeCheck"], "properties": {"privilegeCheck": {"$ref": "#/$defs/passed"}}},
|
|
17
|
+
"routeApis": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/route"}},
|
|
18
|
+
"residentProcesses": {"$ref": "#/$defs/processes"},
|
|
19
|
+
"sourceJobs": {"type": "array", "items": {"$ref": "#/$defs/job"}}
|
|
20
|
+
},
|
|
21
|
+
"additionalProperties": true
|
|
22
|
+
},
|
|
23
|
+
"browser": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"required": ["browserVersion", "driverVersion", "compatible"],
|
|
26
|
+
"properties": {"browserVersion": {"type": "string", "minLength": 1}, "driverVersion": {"type": "string", "minLength": 1}, "compatible": {"const": true}},
|
|
27
|
+
"additionalProperties": true
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"$defs": {
|
|
31
|
+
"passed": {"type": "object", "required": ["passed"], "properties": {"passed": {"const": true}}, "additionalProperties": true},
|
|
32
|
+
"config": {"type": "object", "required": ["required", "missing", "passed"], "properties": {"required": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}}, "missing": {"type": "array", "maxItems": 0}, "passed": {"const": true}}, "additionalProperties": true},
|
|
33
|
+
"route": {"type": "object", "required": ["method", "path", "status", "passed"], "properties": {"method": {"type": "string"}, "path": {"type": "string", "pattern": "^/"}, "status": {"type": "integer", "minimum": 200, "maximum": 399}, "passed": {"const": true}}, "additionalProperties": true},
|
|
34
|
+
"processes": {"type": "object", "required": ["checked", "unexpected", "stale", "passed"], "properties": {"checked": {"const": true}, "unexpected": {"type": "array", "maxItems": 0}, "stale": {"type": "array", "maxItems": 0}, "passed": {"const": true}}, "additionalProperties": true},
|
|
35
|
+
"job": {"type": "object", "required": ["jobId", "passed"], "properties": {"jobId": {"type": "string", "minLength": 1}, "passed": {"const": true}}, "additionalProperties": true}
|
|
36
|
+
},
|
|
37
|
+
"additionalProperties": true
|
|
38
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/TOPY-AI-LTD/ai-cmo-skills/blob/main/contracts/maggie-design/mobile-app-surface-v1.schema.json",
|
|
4
|
+
"title": "Maggie mobile app surface contract",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"schemaVersion",
|
|
8
|
+
"workflow",
|
|
9
|
+
"mode",
|
|
10
|
+
"route",
|
|
11
|
+
"auth",
|
|
12
|
+
"shell",
|
|
13
|
+
"camera",
|
|
14
|
+
"viewports",
|
|
15
|
+
"requiredSteps",
|
|
16
|
+
"publicWrite"
|
|
17
|
+
],
|
|
18
|
+
"properties": {
|
|
19
|
+
"schemaVersion": {
|
|
20
|
+
"const": "maggie-mobile-app-surface.v1"
|
|
21
|
+
},
|
|
22
|
+
"workflow": {
|
|
23
|
+
"const": "maggie-design"
|
|
24
|
+
},
|
|
25
|
+
"mode": {
|
|
26
|
+
"const": "app-view-init"
|
|
27
|
+
},
|
|
28
|
+
"route": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"pattern": "^/"
|
|
31
|
+
},
|
|
32
|
+
"auth": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"required": ["mode", "required", "credentialPolicy"],
|
|
35
|
+
"properties": {
|
|
36
|
+
"mode": {
|
|
37
|
+
"enum": ["email-password", "existing-session", "none"]
|
|
38
|
+
},
|
|
39
|
+
"required": {
|
|
40
|
+
"type": "boolean"
|
|
41
|
+
},
|
|
42
|
+
"credentialPolicy": {
|
|
43
|
+
"const": "use-host-auth-without-recording-credentials"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"additionalProperties": true
|
|
47
|
+
},
|
|
48
|
+
"shell": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"required": ["fixedHeader", "fixedFooter", "oneScrollOwner"],
|
|
51
|
+
"properties": {
|
|
52
|
+
"fixedHeader": {"const": true},
|
|
53
|
+
"fixedFooter": {"const": true},
|
|
54
|
+
"oneScrollOwner": {"const": true}
|
|
55
|
+
},
|
|
56
|
+
"additionalProperties": true
|
|
57
|
+
},
|
|
58
|
+
"camera": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"required": ["requiredStates", "controls", "fallback"],
|
|
61
|
+
"properties": {
|
|
62
|
+
"requiredStates": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"contains": {"const": "permission"}
|
|
65
|
+
},
|
|
66
|
+
"controls": {
|
|
67
|
+
"type": "array",
|
|
68
|
+
"minItems": 4
|
|
69
|
+
},
|
|
70
|
+
"fallback": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"minLength": 1
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"additionalProperties": true
|
|
76
|
+
},
|
|
77
|
+
"viewports": {
|
|
78
|
+
"type": "object",
|
|
79
|
+
"required": ["desktop", "tablet", "mobile"],
|
|
80
|
+
"additionalProperties": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"prefixItems": [
|
|
83
|
+
{"type": "integer", "minimum": 1},
|
|
84
|
+
{"type": "integer", "minimum": 1}
|
|
85
|
+
],
|
|
86
|
+
"minItems": 2,
|
|
87
|
+
"maxItems": 2
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"requiredSteps": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"contains": {"const": "signed-in-browser-qa"}
|
|
93
|
+
},
|
|
94
|
+
"publicWrite": {
|
|
95
|
+
"const": false
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"additionalProperties": true
|
|
99
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://maggie.noblox.app/contracts/service-onboarding-orchestration-v1.json",
|
|
4
|
+
"title": "Maggie provider-neutral asynchronous service onboarding orchestration",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "workflows", "fieldOwnership"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": {"const": "maggie-service-onboarding-orchestration.v1"},
|
|
9
|
+
"workflows": {"type": "array", "minItems": 3, "maxItems": 3, "items": {"$ref": "#/$defs/workflow"}},
|
|
10
|
+
"fieldOwnership": {"type": "object", "minProperties": 1, "additionalProperties": {"enum": ["import", "search", "research"]}}
|
|
11
|
+
},
|
|
12
|
+
"$defs": {
|
|
13
|
+
"workflow": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"required": ["name", "jobId", "idempotencyKey", "state", "history", "attempt", "maxAttempts", "owner", "statusRef", "nextAction", "writes"],
|
|
16
|
+
"properties": {
|
|
17
|
+
"name": {"enum": ["import", "search", "research"]},
|
|
18
|
+
"jobId": {"type": "string", "minLength": 1},
|
|
19
|
+
"idempotencyKey": {"type": "string", "minLength": 1},
|
|
20
|
+
"state": {"enum": ["queued", "running", "succeeded", "failed", "blocked", "cancelled"]},
|
|
21
|
+
"history": {"type": "array", "minItems": 1, "items": {"type": "object", "required": ["state", "at"], "properties": {"state": {"type": "string"}, "at": {"type": "string"}}}},
|
|
22
|
+
"attempt": {"type": "integer", "minimum": 1},
|
|
23
|
+
"maxAttempts": {"type": "integer", "minimum": 1},
|
|
24
|
+
"owner": {"type": "string", "minLength": 1},
|
|
25
|
+
"statusRef": {"type": "string", "minLength": 1},
|
|
26
|
+
"nextAction": {"type": "string", "minLength": 1},
|
|
27
|
+
"writes": {"type": "array", "minItems": 1, "items": {"type": "string", "minLength": 1}},
|
|
28
|
+
"errorCode": {"type": ["string", "null"]}
|
|
29
|
+
},
|
|
30
|
+
"additionalProperties": true
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"additionalProperties": true
|
|
34
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-deployment
|
|
3
3
|
description: Deploy and operate Maggie blog projects with Cloudflare Workers as the default target, while preserving an adapter boundary for VPS, GCP, and AWS.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.4.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Deployment
|
|
@@ -37,12 +37,33 @@ visitor-facing files. The canary must include screenshots, zero console or
|
|
|
37
37
|
network errors, and zero placeholder matches. Query-driven routes belong in
|
|
38
38
|
behavior/API checks, not static byte baselines.
|
|
39
39
|
|
|
40
|
+
## Worker/browser runtime parity
|
|
41
|
+
|
|
42
|
+
Before a canary when the release depends on workers, migrations, browser
|
|
43
|
+
automation, import jobs, or route APIs, collect sanitized host-adapter evidence
|
|
44
|
+
and validate it before traffic moves:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
maggie deployment parity --project . \
|
|
48
|
+
--evidence .maggie/verification/runtime-parity-input.json \
|
|
49
|
+
--output .maggie/verification/runtime-parity.json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The `maggie-deployment-runtime-parity.v1` contract checks required worker
|
|
53
|
+
configuration and missing bindings, migration privileges, route API status,
|
|
54
|
+
stale/unexpected resident import processes, non-empty source-job IDs, and
|
|
55
|
+
browser/driver compatibility. It is provider-neutral: the host adapter runs
|
|
56
|
+
the environment checks and supplies only safe facts; Maggie validates the
|
|
57
|
+
evidence and never receives credentials, cookies, or response bodies. A failed
|
|
58
|
+
parity report blocks the readiness command and therefore the canary.
|
|
59
|
+
|
|
40
60
|
## Release readiness evidence
|
|
41
61
|
|
|
42
62
|
Unit regression is necessary but does not prove runtime release readiness. The
|
|
43
|
-
readiness command keeps five evidence slots separate: dependency-free
|
|
44
|
-
regression, package smoke, host browser evidence, rendered canary, and
|
|
45
|
-
deployment preflight
|
|
63
|
+
readiness command keeps five required evidence slots separate: dependency-free
|
|
64
|
+
unit regression, package smoke, host browser evidence, rendered canary, and
|
|
65
|
+
deployment preflight. Add the optional `runtimeParity` slot whenever the
|
|
66
|
+
release uses the worker/browser surfaces described above:
|
|
46
67
|
|
|
47
68
|
```bash
|
|
48
69
|
python3 tools/tests/run_regression.py \
|
|
@@ -52,12 +73,13 @@ maggie deployment readiness --project . \
|
|
|
52
73
|
--browser-report .maggie/verification/browser-evidence.json \
|
|
53
74
|
--rendered-canary .maggie/deployment-canary.json \
|
|
54
75
|
--deployment-preflight .maggie/release-preflight.json \
|
|
76
|
+
--runtime-parity .maggie/verification/runtime-parity.json \
|
|
55
77
|
--output .maggie/deployment-readiness.json
|
|
56
78
|
```
|
|
57
79
|
|
|
58
80
|
The report follows `maggie-deployment-readiness.v1`. A failed evidence file
|
|
59
81
|
returns `failed`; a missing or unavailable host/browser adapter returns
|
|
60
|
-
`inconclusive`; only
|
|
82
|
+
`inconclusive`; only all configured evidence slots return `passed`. Maggie does
|
|
61
83
|
not fabricate browser, rendered, or deployment evidence and does not deploy
|
|
62
84
|
from this command. See
|
|
63
85
|
[`readiness-v1.schema.json`](../../bundled-contracts/maggie-deployment/readiness-v1.schema.json).
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-design
|
|
3
3
|
description: Design authorized interior pages, review rendered responsive layouts, or explicitly rebrand a packaged homepage/template. Use rebrand only with a named source brand and target brand.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.6.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Design
|
|
@@ -10,7 +10,7 @@ metadata:
|
|
|
10
10
|
## In-place route evidence
|
|
11
11
|
|
|
12
12
|
`maggie design in-place --project . --route /example` resolves local source
|
|
13
|
-
files and falls back to a discovered `[...slug]`/`[[...slug]]` file. A catch-all
|
|
13
|
+
files, including direct `src/pages/<route>.astro` files, and falls back to a discovered `[...slug]`/`[[...slug]]` file. A catch-all
|
|
14
14
|
is recorded as `resolution: unproven` unless `--content-source` names the
|
|
15
15
|
actual DB/content resolver. A source candidate is not proof that the concrete
|
|
16
16
|
URL is served: verify the HTTP response, content identity, and framework route
|
|
@@ -55,9 +55,18 @@ Use `missing`, `unknown`, and `coverage` from the versioned
|
|
|
55
55
|
name map is reported as evidence only; it must not be treated as proof that a
|
|
56
56
|
glyph exists. Fix the source token or add the runtime definition before
|
|
57
57
|
shipping. The inventory compares a scoped runtime icon family (`ph-*`, `fa-*`,
|
|
58
|
-
or `lucide-*`),
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
or `lucide-*`), including compound CSS selectors such as
|
|
59
|
+
`.ph.ph-arrow-square-out`, normalizes family prefixes, and ignores inline SVG
|
|
60
|
+
IDs and font filename noise. Do not paste private source, URLs with
|
|
61
|
+
credentials, or user data into the report.
|
|
62
|
+
|
|
63
|
+
Inventory is static name coverage, not proof that the browser painted a glyph.
|
|
64
|
+
For every new or changed icon control, pair it with the QA `icon-rendered`
|
|
65
|
+
assertion: the host browser adapter must record a visible glyph, positive
|
|
66
|
+
rendered width and height, and an accessible label. If the runtime font/map
|
|
67
|
+
cannot render the icon, add an approved runtime definition or inline SVG
|
|
68
|
+
fallback and rerun both checks. Never release a source token solely because
|
|
69
|
+
typecheck or build succeeded.
|
|
61
70
|
|
|
62
71
|
## Automatic memory hook
|
|
63
72
|
|
|
@@ -193,6 +202,33 @@ semantics from `maggie-blog`. For service UI, preserve provider identity,
|
|
|
193
202
|
variants, booking URLs, duplicate canonical/noindex decisions, and service
|
|
194
203
|
sitemap semantics from `maggie-service-booking`.
|
|
195
204
|
|
|
205
|
+
## Mobile app surfaces
|
|
206
|
+
|
|
207
|
+
Use the app surface contract for camera, scan, inventory, valuation, or other
|
|
208
|
+
authenticated app views. It is a general host contract, not a replacement for
|
|
209
|
+
the project's auth or camera implementation:
|
|
210
|
+
|
|
211
|
+
maggie design app-init --project . --route /app/valuation \
|
|
212
|
+
--auth-mode email-password --confirm
|
|
213
|
+
|
|
214
|
+
The initializer records the fixed header/footer, one-scroll-owner rule,
|
|
215
|
+
camera permission/ready/gallery/scan/unavailable states, decision-critical UI,
|
|
216
|
+
and desktop/tablet/mobile evidence requirements. It never collects credentials
|
|
217
|
+
or copies private project data. Use `existing-session` only when the host
|
|
218
|
+
already supplies a safe signed-in session; use `none` for public app surfaces.
|
|
219
|
+
|
|
220
|
+
After implementation, validate sanitized runtime evidence and screenshots:
|
|
221
|
+
|
|
222
|
+
maggie design app-validate --project . \
|
|
223
|
+
--plan .maggie/design/app-view/app-<id>/plan.json \
|
|
224
|
+
--runtime-evidence ./qa/mobile-app-evidence.json \
|
|
225
|
+
--rendered-dir ./qa/screenshots --confirm
|
|
226
|
+
|
|
227
|
+
The evidence must prove the auth state, fixed shell, exactly one scroll owner,
|
|
228
|
+
all required camera states, and valid PNGs at 390px, 768px, and desktop
|
|
229
|
+
widths. The machine-readable contract is
|
|
230
|
+
[mobile-app-surface-v1.schema.json](../../bundled-contracts/maggie-design/mobile-app-surface-v1.schema.json).
|
|
231
|
+
|
|
196
232
|
## Explicit homepage rebrand mode
|
|
197
233
|
|
|
198
234
|
The homepage `review` mode only compares screenshots. It does not rebrand a
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-feedback
|
|
3
3
|
description: Collect, review, and explicitly submit privacy-safe feedback about a Maggie skill run, workflow result, bug, or feature request.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.1.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie Feedback
|
|
@@ -39,6 +39,41 @@ If a draft is marked fixed with `--fixed` (or the supplied run report says
|
|
|
39
39
|
also scrubs common POSIX/home/temp and Windows absolute paths by default while
|
|
40
40
|
preserving public URLs and route paths.
|
|
41
41
|
|
|
42
|
+
The CLI records the executing Maggie package version when it is available from
|
|
43
|
+
the runtime environment or `node_modules/@topy-ai/maggie/package.json`. A
|
|
44
|
+
stale `.maggie/install.json` is only a fallback; conflicting runtime package
|
|
45
|
+
versions fail closed as `unknown`.
|
|
46
|
+
|
|
47
|
+
## Correlated feedback batches
|
|
48
|
+
|
|
49
|
+
When several observations belong to one workflow run, create bounded drafts
|
|
50
|
+
with one shared correlation ID instead of losing their relationship:
|
|
51
|
+
|
|
52
|
+
maggie feedback batch --project . --batch-file ./feedback-batch.json
|
|
53
|
+
|
|
54
|
+
The batch file contains 1–50 items and may provide shared `skill`, `runId`,
|
|
55
|
+
`phase`, `priority`, and `affectedCli` values. An item can override those
|
|
56
|
+
fields and supplies the normal `type`, `summary`, `expected`, `actual`,
|
|
57
|
+
`errorFingerprint`, reproduction, resolution, validation, and screenshot
|
|
58
|
+
metadata fields. Each generated draft stores only the safe batch ID, zero-based
|
|
59
|
+
index, and bounded size. The batch command still creates local drafts only;
|
|
60
|
+
review each draft and submit explicitly.
|
|
61
|
+
|
|
62
|
+
Example:
|
|
63
|
+
|
|
64
|
+
{
|
|
65
|
+
"batchId": "run-review-001",
|
|
66
|
+
"skill": "maggie-design",
|
|
67
|
+
"runId": "design-001",
|
|
68
|
+
"phase": "post-release-review",
|
|
69
|
+
"priority": "normal",
|
|
70
|
+
"affectedCli": "design",
|
|
71
|
+
"items": [
|
|
72
|
+
{"type": "bug", "summary": "Route evidence is incomplete", "expected": "Direct route resolves", "actual": "Fallback was used"},
|
|
73
|
+
{"type": "feature", "summary": "Need an app-surface QA contract", "expected": "Reusable evidence plan", "actual": "Only public-page rules exist"}
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
|
|
42
77
|
## Submit explicitly
|
|
43
78
|
|
|
44
79
|
The CLI never submits automatically. After reviewing the draft:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: maggie-qa-workflow
|
|
3
3
|
description: Run scenario-based browser QA with explicit evidence, fix/retest lifecycle, and release-gate decisions for web projects.
|
|
4
4
|
metadata:
|
|
5
|
-
version: 1.
|
|
5
|
+
version: 1.2.0
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Maggie QA Workflow
|
|
@@ -91,10 +91,14 @@ HTTP status evidence, a screenshot/reference, and boolean results for runtime
|
|
|
91
91
|
checks such as `text-present`, `text-absent`, `meta`, `link-absent`, or
|
|
92
92
|
`redirect`. For dialogs and drawers, `scroll-owner-count` records the browser
|
|
93
93
|
runtime's computed number of intentional scroll owners and must use
|
|
94
|
-
`expected: 1`.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
`expected: 1`. For an icon control, `icon-rendered` records browser-runtime
|
|
95
|
+
evidence with `actual.visible: true`, positive `actual.width` and
|
|
96
|
+
`actual.height`, and `actual.accessibleLabel: true`; a blank glyph, zero-sized
|
|
97
|
+
glyph, or unlabelled control fails the audit even when build/typecheck passes.
|
|
98
|
+
Source/class/markup-only checks are rejected. The audit stores assertion IDs
|
|
99
|
+
and safe pass/fail metadata, never response bodies, credentials, or cookies. A
|
|
100
|
+
passing assertion audit complements browser evidence; it does not replace the
|
|
101
|
+
host adapter's actual HTTP and screenshot capture.
|
|
98
102
|
|
|
99
103
|
## Gate and release evidence
|
|
100
104
|
|