@topy-ai/maggie 0.7.45 → 0.7.47

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.
Files changed (33) hide show
  1. package/README-zh-TW.md +15 -2
  2. package/README.md +55 -3
  3. package/bin/maggie.js +22 -4
  4. package/bundled-contracts/google-integrations/capability-report-v2.schema.json +76 -0
  5. package/bundled-contracts/google-integrations/external-write-readback-v1.schema.json +36 -0
  6. package/bundled-contracts/maggie-deployment/deployer-delegation-v1.schema.json +20 -0
  7. package/bundled-contracts/maggie-deployment/release-profile-v1.schema.json +34 -0
  8. package/bundled-contracts/maggie-design/browser-capability-v1.schema.json +33 -0
  9. package/bundled-contracts/maggie-feedback/evidence-bundle-v1.schema.json +38 -0
  10. package/bundled-references/browser-inspection.md +17 -0
  11. package/bundled-references/google-integrations-runbook.md +8 -1
  12. package/bundled-references/memory-hook.md +18 -5
  13. package/bundled-skills/maggie-clone/SKILL.md +7 -0
  14. package/bundled-skills/maggie-deployment/SKILL.md +55 -15
  15. package/bundled-skills/maggie-feedback/SKILL.md +26 -1
  16. package/bundled-skills/maggie-memory/SKILL.md +10 -1
  17. package/bundled-skills/maggie-ops/SKILL.md +22 -0
  18. package/bundled-skills/maggie-seo-geo/SKILL.md +4 -1
  19. package/bundled-tools/clis/maggie_analytics.py +8 -0
  20. package/bundled-tools/clis/maggie_browser_audit.py +13 -2
  21. package/bundled-tools/clis/maggie_deployment.py +214 -6
  22. package/bundled-tools/clis/maggie_feedback.py +116 -1
  23. package/bundled-tools/clis/maggie_memory.py +10 -3
  24. package/bundled-tools/clis/maggie_ops.py +33 -0
  25. package/bundled-tools/clis/maggie_release.py +124 -19
  26. package/bundled-tools/runtime/browser_capability.py +143 -0
  27. package/bundled-tools/runtime/external_write.py +122 -0
  28. package/bundled-tools/runtime/google_capabilities.py +37 -5
  29. package/bundled-tools/runtime/maggie_memory.py +17 -2
  30. package/package.json +1 -1
  31. package/references/browser-inspection.md +17 -0
  32. package/references/google-integrations-runbook.md +8 -1
  33. package/references/memory-hook.md +18 -5
package/README-zh-TW.md CHANGED
@@ -29,7 +29,20 @@ npx @topy-ai/maggie init --scope project --agent all
29
29
  npx @topy-ai/maggie doctor --scope project --project .
30
30
  ```
31
31
 
32
- 目前 release 是 `0.7.45`。新增 Codex/Claude Code 的一次性 user-scope 安裝、bundled
32
+ 目前 release 是 `0.7.47`。本版處理 2026-09-26 五條新 feedback:project-scope
33
+ `maggie init` 會建立本地 memory store;context 預設只讀取本 project scope;memory hook
34
+ 在 local Python adapter 不存在時 fallback 到已安裝 CLI;重複 init 保留既有檔案與時間戳;
35
+ `maggie feedback list` 的 `--project` 可放在子命令前或後。Generated VPS runner 現在記錄
36
+ Maggie 版本與 template fingerprint;preflight 會警示過期/無標記 runner,其他路徑可用
37
+ `maggie deployment --check-runner PATH` 檢查。
38
+
39
+ 0.7.46 feedback batch 仍包含 release profile capability gate、deployment readiness bounded
40
+ retry、Google account/property target verification、GA/GTM external-write idempotency/readback、
41
+ browser adapter capability preflight、privacy-safe feedback evidence references/relationships,
42
+ 以及 root-level unittest import 支援。`browser-audit
43
+ --check-browser` 會在導覽前拒絕 missing/incompatible adapter,包括解析成
44
+ `xdg-open` 的系統 `browse`;feedback graph 不保存 raw payload、logs、credentials
45
+ 或本機路徑。另包含 0.7.45 的 Codex/Claude Code 一次性 user-scope 安裝、bundled
33
46
  workflow runner 與 user-scope maintenance commands;並完成 2026-09-24 booking feedback batch:MaggieDash
34
47
  Calendar availability grid/free-slot entry,以及 ORA modal focus restoration
35
48
  的驗證證據。另新增 secret-free Starter marketplace provisioning
@@ -100,7 +113,7 @@ structure drift 或重複 treatment product 時 fail closed。
100
113
  deployment、memory、feedback 和 MaggieDash。內容先 draft/review,外部寫入、
101
114
  publish 與 production deployment 需要明確確認。
102
115
 
103
- 目前 source tree 的正式 release 是 `0.7.45`。本版完成 2026-09-24 booking feedback batch:Calendar grid/free-slot entry 與 host modal focus-restoration evidence。本版新增 Starter marketplace provisioning plan;本版完成 feedback batches 22、23:加入 declarative browser interaction evidence、design markup/style/content-key gate、compiler source anchoring、entity double-escape protection、`update --help` read-only、noindex hypothetical indexability、可過期 baseline acknowledgement、DOM-only link extraction regression,以及 MaggieDash 0.2.10 的 content override、短期 browser session、CDN-safe public-session cache contracts。authentication 和 isolated dev server 仍由 host 負責。`maggie-booking` workflow、傳統 email/password、Stripe、Resend、public booking flow 及既有安全邊界維持不變;provider-bound video generation 與 transactional delivery 仍記錄在 issue #39,前一批延後功能仍在 issue #38,不會直接成為 active memory。0.7.33 記錄並審查一筆更正回饋;確認 0.7.32 已正確處理 batch index,沒有修改已驗證的 shared behavior。0.7.32 加入 feedback 一基索引支援、MaggieDash panel 的 source/freshness/error evidence、Consent Mode 與實際 write/no-op reconciliation、SEO baseline recapture、sitemap origin rebasing、content-diff scope、migration ledger reconciliation、deployment credential preflight、release provenance/runtime preflight、icon release gate、opt-in blog auto-publish gate,以及 least-privilege VPS deployer。也修復 top-level `maggie feedback` dispatcher parity。0.7.31 加入 update 差異摘要、atomic installer copy、subset install manifest merge,以及 inventory drift 時 doctor non-zero。0.7.30 補上 feedback tracking issue closeout gate 與 batch 14/15 audit ledger。0.7.29 修正 npm package landing page 使用英文 README;0.7.28 加入 versioned Gemini model policy、明確 fallback 與 provenance、bundled-first CLI
116
+ 目前 source tree 的正式 release 是 `0.7.47`。本版完成 2026-09-24 booking feedback batch:Calendar grid/free-slot entry 與 host modal focus-restoration evidence。本版新增 Starter marketplace provisioning plan;本版完成 feedback batches 22、23:加入 declarative browser interaction evidence、design markup/style/content-key gate、compiler source anchoring、entity double-escape protection、`update --help` read-only、noindex hypothetical indexability、可過期 baseline acknowledgement、DOM-only link extraction regression,以及 MaggieDash 0.2.10 的 content override、短期 browser session、CDN-safe public-session cache contracts。authentication 和 isolated dev server 仍由 host 負責。`maggie-booking` workflow、傳統 email/password、Stripe、Resend、public booking flow 及既有安全邊界維持不變;provider-bound video generation 與 transactional delivery 仍記錄在 issue #39,前一批延後功能仍在 issue #38,不會直接成為 active memory。0.7.33 記錄並審查一筆更正回饋;確認 0.7.32 已正確處理 batch index,沒有修改已驗證的 shared behavior。0.7.32 加入 feedback 一基索引支援、MaggieDash panel 的 source/freshness/error evidence、Consent Mode 與實際 write/no-op reconciliation、SEO baseline recapture、sitemap origin rebasing、content-diff scope、migration ledger reconciliation、deployment credential preflight、release provenance/runtime preflight、icon release gate、opt-in blog auto-publish gate,以及 least-privilege VPS deployer。也修復 top-level `maggie feedback` dispatcher parity。0.7.31 加入 update 差異摘要、atomic installer copy、subset install manifest merge,以及 inventory drift 時 doctor non-zero。0.7.30 補上 feedback tracking issue closeout gate 與 batch 14/15 audit ledger。0.7.29 修正 npm package landing page 使用英文 README;0.7.28 加入 versioned Gemini model policy、明確 fallback 與 provenance、bundled-first CLI
104
117
  dispatch、`maggie --version`、feedback batch review 聚合與重複偵測、marketplace enrichment evidence、booking
105
118
  worker/resolver evidence,以及 read-only migration preflight。它也包含 host-owned mobile app surface contract、signed-in
106
119
  camera-state QA、直接 Astro route resolution、correlated feedback batch,以及
package/README.md CHANGED
@@ -89,7 +89,22 @@ Maggie keeps the existing project foundation and asks for decisions before
89
89
  shared routes, analytics, or publishing boundaries change. The current
90
90
  package ships 20 installable skills and a local-first MaggieDash foundation.
91
91
 
92
- The current release is `0.7.45`. It adds one-time user-scope installation for
92
+ The current release is `0.7.47`. Project initialization creates a local Maggie
93
+ Memory store, memory contexts default to project scope, and the shared hook
94
+ falls back to the installed CLI if project Python tools are absent. Repeated
95
+ memory initialization preserves existing files and timestamps. Feedback list
96
+ accepts `--project` before or after its subcommand. Generated VPS runners record
97
+ their Maggie version and template fingerprint; deployment preflight warns on
98
+ stale or unmarked runners, with `maggie deployment --check-runner PATH` for
99
+ other locations.
100
+
101
+ The 0.7.46 feedback batch remains included: capability-aware release profiles,
102
+ bounded deployment-readiness retries, verified Google account/target evidence,
103
+ idempotent external-write readback, browser-adapter capability preflight,
104
+ privacy-safe feedback evidence and relationships, and root-level unittest
105
+ import support. `browser-audit --check-browser` rejects missing or incompatible
106
+ adapters before navigation, including a system `browse`/`xdg-open` opener.
107
+ It also includes the 0.7.45 one-time user-scope installation for
93
108
  Codex and Claude Code, a bundled workflow runner, and scoped maintenance
94
109
  commands. It also closes the 2026-09-24 booking feedback
95
110
  batch with the canonical MaggieDash Calendar availability grid/free-slot
@@ -490,6 +505,23 @@ maggie blog auto-publish-gate \
490
505
 
491
506
  ### Design and deployment release gates
492
507
 
508
+ `maggie release` requires an explicit `.maggie/release-profile.json` capability
509
+ manifest. This prevents a public Astro site from being evaluated against
510
+ unrelated MaggieDash, Booking, migration, service-catalogue, or analytics
511
+ artifacts. A minimal profile is:
512
+
513
+ ```json
514
+ {
515
+ "schemaVersion": "maggie-release-profile.v1",
516
+ "profile": "public-astro",
517
+ "projectType": "astro",
518
+ "capabilities": ["deployment"]
519
+ }
520
+ ```
521
+
522
+ Declare optional capabilities only when the project owns their evidence. The
523
+ release report records undeclared optional gates as `skipped`.
524
+
493
525
  Check source-to-runtime icon coverage before shipping a design:
494
526
 
495
527
  ```bash
@@ -588,6 +620,10 @@ maggie deployment readiness --project . \
588
620
  --output .maggie/deployment-readiness.json
589
621
  ```
590
622
 
623
+ Individual suites can also be invoked from the repository root with
624
+ `python3 -m unittest tools.tests.test_maggie_feedback_batch`. Use the
625
+ regression runner for the complete discovered suite.
626
+
591
627
  The readiness report follows `maggie-deployment-readiness.v1`. It reports unit
592
628
  regression, package smoke, host browser evidence, rendered canary, and
593
629
  deployment preflight separately. Missing host adapter evidence is
@@ -631,8 +667,8 @@ artifact schemas.
631
667
  Recommended upgrade sequence for the current release:
632
668
 
633
669
  ```bash
634
- npx @topy-ai/maggie@0.7.45 update --scope project --project . --force
635
- npx @topy-ai/maggie@0.7.45 cleanup --scope project --project .
670
+ npx @topy-ai/maggie@0.7.47 update --scope project --project . --force
671
+ npx @topy-ai/maggie@0.7.47 cleanup --scope project --project .
636
672
  ```
637
673
 
638
674
  Maintainers should pass npm credentials through the repository helper, never
@@ -930,6 +966,16 @@ The `maggie-feedback-batch-review.v1` report retains bounded observations,
930
966
  missing-index and duplicate checks, and privacy flags. It never contains raw
931
967
  responses, local paths, or secrets.
932
968
 
969
+ Add safe relationships when a report must point to a test or related run:
970
+
971
+ ```bash
972
+ maggie feedback collect --project . --summary "Adapter unavailable" \
973
+ --evidence-ref test:browser-capability:passed \
974
+ --relationship same-run=clone-001
975
+ ```
976
+
977
+ Batch review also emits bounded `evidenceGraph` and remediation suggestions.
978
+
933
979
  The same evidence-first pattern is available for the other maintainer checks:
934
980
 
935
981
  ```bash
@@ -1179,6 +1225,12 @@ maggie browser-audit https://example.com \
1179
1225
  It captures scroll/geometry samples and screenshots, then fails on hidden
1180
1226
  required elements, horizontal overflow or invalid sticky positioning.
1181
1227
 
1228
+ Before navigation, the command writes a redacted
1229
+ `maggie-browser-capability.v1` report and rejects missing or incompatible
1230
+ adapters, including a system `browse`/`xdg-open` desktop opener. Add
1231
+ `--check-browser` to run only this preflight and receive bounded
1232
+ installation/fallback guidance.
1233
+
1182
1234
  List every installed skill and command:
1183
1235
 
1184
1236
  ```bash
package/bin/maggie.js CHANGED
@@ -19,6 +19,23 @@ const TEMPLATES_ROOT = join(PACKAGE_ROOT, "bundled-templates");
19
19
  const STATE_DIR = ".maggie";
20
20
  const USER_SCOPE = "user";
21
21
  const PROJECT_SCOPE = "project";
22
+ const PROJECT_MEMORY_FILES = {
23
+ preferences: "preferences.json",
24
+ conventions: "project-conventions.json",
25
+ lessons: "lessons.json",
26
+ errors: "error-patterns.json",
27
+ };
28
+
29
+ function initializeProjectMemory(root) {
30
+ const memoryRoot = join(root, STATE_DIR, "memory");
31
+ mkdirSync(memoryRoot, { recursive: true });
32
+ for (const [kind, filename] of Object.entries(PROJECT_MEMORY_FILES)) {
33
+ const path = join(memoryRoot, filename);
34
+ if (!existsSync(path)) {
35
+ writeFileSync(path, `${JSON.stringify({ schemaVersion: 1, kind, updatedAt: new Date().toISOString(), items: [] }, null, 2)}\n`, { flag: "wx" });
36
+ }
37
+ }
38
+ }
22
39
  function loadSkillNames() {
23
40
  try {
24
41
  return JSON.parse(readFileSync(join(SKILLS_ROOT, "catalog.json"), "utf8")).skills.map((skill) => skill.name);
@@ -153,7 +170,7 @@ Usage:
153
170
  maggie brand-kit --manifest FILE | --project PATH --design DESIGN.md [--write --confirm]
154
171
  maggie npm11 --project PATH [--smoke --confirm]
155
172
  maggie booking-delivery [--policy FILE]
156
- maggie release PATH --environment staging --target vps-with-cloudflare-dns
173
+ maggie release PATH --profile .maggie/release-profile.json --environment staging --target vps-with-cloudflare-dns
157
174
  maggie api lifecycle --project PATH [--execute --allow-quota]
158
175
  maggie memory <init|list|search|context|add|record-error|transition|export> --project PATH
159
176
  maggie localization <extract|plan|generate|preview|validate|review|publish|stale|glossary> [options]
@@ -163,7 +180,7 @@ Usage:
163
180
  maggie site-audit URL [--crawl] [--access-log FILE] [--require-sitemap-request] [--languages en-GB,es-MX,ja-JP] [--check-hreflang] [--check-internal-links]
164
181
  maggie site-audit URL --crawl --save-baseline FILE --reviewer NAME
165
182
  maggie site-audit URL --crawl --baseline FILE [--reason-all REASON]
166
- maggie browser-audit URL --browse PATH --output DIR --required SELECTOR [--sticky SELECTOR] [--interactions FILE]
183
+ maggie browser-audit URL --browse PATH --output DIR [--required SELECTOR] [--sticky SELECTOR] [--interactions FILE] [--check-browser]
167
184
  maggie verification coverage --contract FILE --evidence FILE
168
185
  maggie ops audit|preflight|verify|lockfiles|seed-manifest|google-capabilities|favicon-check --project PATH
169
186
  maggie ops google-capabilities --project PATH --report FILE [--output FILE]
@@ -488,6 +505,7 @@ function install(args) {
488
505
  if (existsSync(MARKETPLACE_ROOT)) copyIfMissing(MARKETPLACE_ROOT, join(root, "marketplace"));
489
506
  if (existsSync(CONTRACTS_ROOT)) copyIfMissing(CONTRACTS_ROOT, join(root, "contracts"));
490
507
  if (existsSync(join(TEMPLATES_ROOT, "maggiedash"))) copyIfMissing(join(TEMPLATES_ROOT, "maggiedash"), join(root, "templates", "maggiedash"));
508
+ initializeProjectMemory(root);
491
509
  }
492
510
  const manifestRoots = scope === USER_SCOPE ? allUserAgentRoots() : roots;
493
511
  const installedUserSkills = scope === USER_SCOPE ? mergedUserSkillNames(manifestRoots) : [];
@@ -496,7 +514,7 @@ function install(args) {
496
514
  : { scope, version: PACKAGE_VERSION, agents: roots.map((item) => item.slice(root.length + 1)), skills: mergedSkillNames(root, skills), managedFiles: managedFileDigests(root, roots, skills), installed_at: new Date().toISOString() };
497
515
  writeInstallManifest(root, manifest, scope);
498
516
  console.log(scope === USER_SCOPE ? `Maggie installed for this user in ${userStateRoot()}` : `Maggie installed in ${root}`);
499
- console.log(scope === USER_SCOPE ? "Project state remains local; run `maggie doctor --scope user` to verify the user install." : "Run `maggie doctor --project .` before using mutating workflows.");
517
+ console.log(scope === USER_SCOPE ? "Project state remains local; run `maggie doctor --scope user` to verify the user install." : "Project-scoped Maggie Memory is initialized locally; run `maggie doctor --project .` before using mutating workflows.");
500
518
  }
501
519
 
502
520
  function update(args) {
@@ -591,7 +609,7 @@ function workflowCli(name, args) {
591
609
  const root = projectRoot(args);
592
610
  const script = toolScript(name, root);
593
611
  if (!existsSync(script)) throw new Error(`${name} is missing: ${script}`);
594
- const env = name === "maggie_feedback.py" ? { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION } : process.env;
612
+ const env = { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION };
595
613
  const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root, env });
596
614
  if (result.error) throw result.error;
597
615
  process.exitCode = result.status ?? 1;
@@ -0,0 +1,76 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggie.noblox.app/contracts/google-integrations/capability-report-v2.json",
4
+ "title": "Maggie Google integrations capability report v2",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "generatedAt", "providerResults", "passed", "mutationsAllowed"],
8
+ "properties": {
9
+ "schemaVersion": {"const": "maggie-google-capability-report.v2"},
10
+ "generatedAt": {"type": "string", "minLength": 1},
11
+ "providerResults": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/providerResult"}},
12
+ "passed": {"type": "boolean"},
13
+ "mutationsAllowed": {"const": false}
14
+ },
15
+ "$defs": {
16
+ "providerResult": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": ["provider", "resource", "activeAccount", "target", "authMode", "scopes", "productRole", "evidence", "capabilities", "nextAction"],
20
+ "properties": {
21
+ "provider": {"enum": ["gsc", "ga4", "gtm", "google-ads", "firebase"]},
22
+ "resource": {"type": "string", "minLength": 1, "maxLength": 200},
23
+ "activeAccount": {"$ref": "#/$defs/verifiedRef"},
24
+ "target": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["id", "kind", "verified"],
28
+ "properties": {
29
+ "id": {"type": "string", "minLength": 1, "maxLength": 200},
30
+ "kind": {"enum": ["property", "container", "customer", "project", "site", "account"]},
31
+ "verified": {"const": true}
32
+ }
33
+ },
34
+ "authMode": {"enum": ["desktop-oauth", "service-account-impersonation", "none"]},
35
+ "scopes": {"type": "array", "items": {"type": "string", "minLength": 1}, "uniqueItems": true},
36
+ "productRole": {"type": "string", "minLength": 1, "maxLength": 200},
37
+ "evidence": {"$ref": "#/$defs/evidence"},
38
+ "capabilities": {"$ref": "#/$defs/capabilities"},
39
+ "nextAction": {"type": "string", "minLength": 1, "maxLength": 500}
40
+ }
41
+ },
42
+ "verifiedRef": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": ["id", "verified"],
46
+ "properties": {
47
+ "id": {"type": "string", "pattern": "^[^@\\s]{1,200}$"},
48
+ "verified": {"const": true}
49
+ }
50
+ },
51
+ "evidence": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": ["verified", "endpoint", "statusCode", "readOnly"],
55
+ "properties": {
56
+ "verified": {"type": "boolean"},
57
+ "endpoint": {"type": "string", "minLength": 1, "maxLength": 500},
58
+ "statusCode": {"type": "integer", "minimum": 100, "maximum": 599},
59
+ "readOnly": {"type": "boolean"},
60
+ "writeTest": {"type": "object"},
61
+ "adsPrerequisites": {"type": "object"}
62
+ }
63
+ },
64
+ "capabilities": {
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "required": ["read", "report", "edit", "publish"],
68
+ "properties": {
69
+ "read": {"enum": ["verified", "not_tested", "not_available", "blocked"]},
70
+ "report": {"enum": ["verified", "not_tested", "not_available", "blocked"]},
71
+ "edit": {"enum": ["verified", "not_tested", "not_available", "blocked"]},
72
+ "publish": {"enum": ["verified", "not_tested", "not_available", "blocked"]}
73
+ }
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggie.noblox.app/contracts/google-integrations/external-write-readback-v1.json",
4
+ "title": "Maggie external provider write readback evidence v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "generatedAt", "provider", "resource", "operation", "idempotencyKey", "retry", "mutation", "readback", "duplicates", "orphaned", "cleanup", "mutationExecuted"],
8
+ "properties": {
9
+ "schemaVersion": {"const": "maggie-external-write-readback.v1"},
10
+ "generatedAt": {"type": "string", "minLength": 1},
11
+ "provider": {"enum": ["ga4", "gtm", "gsc", "google-ads", "firebase"]},
12
+ "resource": {"type": "string", "minLength": 1, "maxLength": 200},
13
+ "operation": {"type": "string", "pattern": "^[a-z][a-z0-9_.-]{1,63}$"},
14
+ "idempotencyKey": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{2,127}$"},
15
+ "retry": {
16
+ "type": "object", "additionalProperties": false, "required": ["attempt", "maxAttempts", "sameKeyOnRetry"],
17
+ "properties": {"attempt": {"type": "integer", "minimum": 1, "maximum": 3}, "maxAttempts": {"type": "integer", "minimum": 1, "maximum": 3}, "sameKeyOnRetry": {"const": true}}
18
+ },
19
+ "mutation": {
20
+ "type": "object", "additionalProperties": false, "required": ["status", "statusCode", "explicitConfirmation"],
21
+ "properties": {"status": {"enum": ["created", "updated", "no-op"]}, "statusCode": {"type": "integer", "minimum": 200, "maximum": 299}, "explicitConfirmation": {"const": true}}
22
+ },
23
+ "readback": {
24
+ "type": "object", "additionalProperties": false, "required": ["passed", "endpoint", "checks"],
25
+ "properties": {
26
+ "passed": {"const": true},
27
+ "endpoint": {"type": "string", "pattern": "^https://[^\\s?#]+$"},
28
+ "checks": {"type": "array", "minItems": 1, "items": {"type": "object"}}
29
+ }
30
+ },
31
+ "duplicates": {"type": "array", "maxItems": 0},
32
+ "orphaned": {"type": "array", "maxItems": 0},
33
+ "cleanup": {"type": "object", "additionalProperties": false, "required": ["status", "checked"], "properties": {"status": {"enum": ["not-needed", "passed"]}, "checked": {"const": true}}},
34
+ "mutationExecuted": {"const": true}
35
+ }
36
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggiedash.noblox.app/contracts/deployer-delegation-v1.schema.json",
4
+ "title": "Maggie deployment deployer delegation evidence v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "host", "user", "releaseRoot", "service", "state", "passed", "checks", "mutation"],
8
+ "properties": {
9
+ "schemaVersion": {"const": "maggie-deployment-delegation.v1"},
10
+ "host": {"type": "string", "minLength": 1},
11
+ "user": {"type": "string", "pattern": "^[a-z_][a-z0-9_-]{0,31}\\$?$"},
12
+ "releaseRoot": {"type": "string", "pattern": "^/[^\\r\\n]*$"},
13
+ "service": {"type": "string", "pattern": "^[A-Za-z0-9_.@-]+$"},
14
+ "state": {"enum": ["passed", "failed", "transient", "inconclusive"]},
15
+ "passed": {"type": "boolean"},
16
+ "checks": {"type": "object"},
17
+ "errors": {"type": "array", "items": {"type": "string"}},
18
+ "mutation": {"const": "not executed"}
19
+ }
20
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggiedash.noblox.app/contracts/release-profile-v1.schema.json",
4
+ "title": "Maggie release profile v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "profile", "capabilities"],
8
+ "properties": {
9
+ "schemaVersion": {"const": "maggie-release-profile.v1"},
10
+ "profile": {"type": "string", "pattern": "^[a-z][a-z0-9-]{1,63}$"},
11
+ "projectType": {"type": "string", "enum": ["astro", "nextjs", "sveltekit", "nuxt", "vite-react", "vite-vue", "other"]},
12
+ "capabilities": {
13
+ "type": "array",
14
+ "minItems": 1,
15
+ "uniqueItems": true,
16
+ "items": {
17
+ "enum": [
18
+ "deployment",
19
+ "scenario-qa",
20
+ "social-card-audit",
21
+ "migration",
22
+ "maggiedash-health",
23
+ "schedule",
24
+ "analytics-contract",
25
+ "analytics-release-gate",
26
+ "service-facts",
27
+ "maggiedash-schema",
28
+ "editorial-review",
29
+ "durable-site-evidence"
30
+ ]
31
+ }
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggie.noblox.app/contracts/browser-capability-v1.schema.json",
4
+ "title": "Maggie browser adapter capability report v1",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "adapter", "status", "checks", "requiredCommands", "fallback"],
7
+ "properties": {
8
+ "schemaVersion": {"const": "maggie-browser-capability.v1"},
9
+ "adapter": {
10
+ "type": "object",
11
+ "required": ["requested"],
12
+ "properties": {
13
+ "requested": {"type": "string", "minLength": 1, "maxLength": 160},
14
+ "name": {"type": "string", "maxLength": 160},
15
+ "requestedPathFingerprint": {"type": ["string", "null"], "pattern": "^(sha256:[a-f0-9]{64})?$"},
16
+ "resolvedPathFingerprint": {"type": ["string", "null"], "pattern": "^(sha256:[a-f0-9]{64})?$"}
17
+ },
18
+ "additionalProperties": false
19
+ },
20
+ "status": {"enum": ["ready", "missing", "incompatible"]},
21
+ "errorCode": {"type": "string", "maxLength": 80},
22
+ "message": {"type": "string", "maxLength": 240},
23
+ "checks": {
24
+ "type": "object",
25
+ "required": ["resolved", "regularFile", "executable", "help", "requiredCommands", "interactionCommands"],
26
+ "additionalProperties": {"type": "boolean"}
27
+ },
28
+ "requiredCommands": {"type": "array", "items": {"type": "string"}, "minItems": 1, "maxItems": 20},
29
+ "missingCommands": {"type": "array", "items": {"type": "string"}, "maxItems": 20},
30
+ "fallback": {"type": "array", "items": {"type": "string", "maxLength": 240}, "maxItems": 8}
31
+ },
32
+ "additionalProperties": false
33
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://maggie.noblox.app/contracts/feedback-evidence-bundle-v1.schema.json",
4
+ "title": "Maggie privacy-safe feedback evidence bundle v1",
5
+ "type": "object",
6
+ "required": ["evidence", "relationships"],
7
+ "properties": {
8
+ "evidence": {
9
+ "type": "array",
10
+ "maxItems": 20,
11
+ "items": {
12
+ "type": "object",
13
+ "required": ["kind", "ref", "status"],
14
+ "properties": {
15
+ "kind": {"enum": ["test", "report", "screenshot", "command", "deployment", "issue", "commit", "artifact"]},
16
+ "ref": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/=-]{0,159}$"},
17
+ "status": {"enum": ["passed", "failed", "observed", "not-run", "unknown"]}
18
+ },
19
+ "additionalProperties": false
20
+ }
21
+ },
22
+ "relationships": {
23
+ "type": "array",
24
+ "maxItems": 20,
25
+ "items": {
26
+ "type": "object",
27
+ "required": ["kind", "target", "confidence"],
28
+ "properties": {
29
+ "kind": {"enum": ["related", "same-run", "same-fingerprint", "duplicates", "validates", "remediates", "caused-by"]},
30
+ "target": {"type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:/=-]{0,159}$"},
31
+ "confidence": {"enum": ["low", "medium", "high"]}
32
+ },
33
+ "additionalProperties": false
34
+ }
35
+ }
36
+ },
37
+ "additionalProperties": false
38
+ }
@@ -14,6 +14,23 @@ The browser capability must support:
14
14
  - slow scrolling, click, hover, keyboard focus, and back/forward navigation;
15
15
  - reading computed CSS, media sources, links, and visible accessibility labels.
16
16
 
17
+ Before navigation, Maggie runs a capability preflight against the configured
18
+ adapter. The report is `maggie-browser-capability.v1` and classifies the
19
+ adapter as `ready`, `missing`, or `incompatible`. This prevents a system
20
+ `browse`/`xdg-open` desktop opener from being mistaken for a browser adapter:
21
+
22
+ ```bash
23
+ maggie browser-audit https://example.com \
24
+ --browse "$HOME/.codex/skills/gstack/browse/dist/browse" \
25
+ --output .maggie/browser-audit --required body --check-browser
26
+ ```
27
+
28
+ The report contains only the adapter name, path fingerprints, capability
29
+ checks, and bounded installation/fallback guidance. If it is `missing` or
30
+ `incompatible`, install or enable an authorized Chrome/Playwright/gstack
31
+ adapter and pass its executable path. Maggie does not silently install a
32
+ browser runtime or use a desktop opener as a fallback.
33
+
17
34
  The minimum extraction result for a target is:
18
35
 
19
36
  ```text
@@ -111,8 +111,13 @@ maggie ops google-capabilities \
111
111
  ```
112
112
 
113
113
  The report contract is
114
- [`capability-report-v1.json`](../bundled-contracts/google-integrations/capability-report-v1.json).
114
+ [`capability-report-v2.schema.json`](../bundled-contracts/google-integrations/capability-report-v2.schema.json).
115
115
  The CLI writes a normalized result and never copies arbitrary input fields.
116
+ Every provider row must also identify the redacted active account and selected
117
+ target resource, both with `verified: true`; the target ID must equal the
118
+ selected `resource`. A report that only proves account discovery, or comes from
119
+ the wrong browser account/property, is rejected before a write workflow can use
120
+ it.
116
121
 
117
122
  ## Capability matrix
118
123
 
@@ -121,6 +126,8 @@ Every provider/resource row must expose this shape:
121
126
  | Field | Meaning |
122
127
  |---|---|
123
128
  | `provider` / `resource` | The Google product and scoped resource being checked |
129
+ | `activeAccount` | Redacted account/principal reference confirmed by the current auth session |
130
+ | `target` | Resource ID and kind confirmed in the current account; must match `resource` |
124
131
  | `authMode` | `desktop-oauth`, `service-account-impersonation`, or `none` |
125
132
  | `scopes` | Exact allowlisted OAuth scopes, never token values |
126
133
  | `productRole` | Role granted in the product, distinct from Cloud IAM |
@@ -1,23 +1,36 @@
1
1
  # Maggie Memory Hook
2
2
 
3
- Every Maggie skill invocation has an automatic memory lifecycle when the host
4
- project contains `tools/clis/maggie_memory.py`.
3
+ Every Maggie skill invocation uses the current project's Maggie Memory by
4
+ default. Project initialization creates `.maggie/memory/` for that repository.
5
5
 
6
6
  ## Before work
7
7
 
8
- Run:
8
+ Use the project-local adapter when it is present:
9
9
 
10
10
  ```bash
11
11
  python3 tools/clis/maggie_memory.py context --project . --skill <current-skill>
12
12
  ```
13
13
 
14
+ If that adapter is absent, use the installed CLI:
15
+
16
+ ```bash
17
+ maggie memory context --project . --skill <current-skill>
18
+ ```
19
+
14
20
  Load the returned active preferences, conventions, lessons, and matching error
15
21
  history into the current decision context. Surface material rules and verify
16
22
  them against current project evidence. Memory never replaces inspection,
17
23
  approval, bootstrap, or production gates.
18
24
 
19
- If the command is unavailable, report that memory is unavailable and continue
20
- with the normal workflow. Do not invent or silently reconstruct memory.
25
+ The context response reports `status: "uninitialized"` when Maggie Memory is
26
+ available but the project has not initialized its store. In that case, explain
27
+ that `maggie init --scope project` initializes it; do not call memory
28
+ unavailable. Report unavailable only when neither the project adapter nor the
29
+ installed `maggie` CLI can run. Do not invent or silently reconstruct memory.
30
+
31
+ Context includes only active project-scope items for the current repository.
32
+ Include user/workspace entries only after a separate explicit opt-in with
33
+ `--include-shared`.
21
34
 
22
35
  ## After work
23
36
 
@@ -104,6 +104,13 @@ for the inspection contract and [`references/operational-model.md`](references/o
104
104
  for run artifacts and phase gates. If no browser tool is available, stop before
105
105
  editing and report the missing capability.
106
106
 
107
+ When using the CLI adapter, run its capability preflight first. A command such
108
+ as `/usr/bin/browse` that resolves to `xdg-open` is a desktop opener, not a
109
+ browser adapter, and must be reported as incompatible. Use the report and its
110
+ bounded fallback guidance to install or select an authorized adapter; do not
111
+ silently substitute a desktop opener or install a browser runtime without the
112
+ user's approval.
113
+
107
114
  ## Phase 0: Preflight and plan
108
115
 
109
116
  1. Parse and normalize all target URLs. Reject invalid, inaccessible, or