@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.
- package/README-zh-TW.md +15 -2
- package/README.md +55 -3
- package/bin/maggie.js +22 -4
- package/bundled-contracts/google-integrations/capability-report-v2.schema.json +76 -0
- package/bundled-contracts/google-integrations/external-write-readback-v1.schema.json +36 -0
- package/bundled-contracts/maggie-deployment/deployer-delegation-v1.schema.json +20 -0
- package/bundled-contracts/maggie-deployment/release-profile-v1.schema.json +34 -0
- package/bundled-contracts/maggie-design/browser-capability-v1.schema.json +33 -0
- package/bundled-contracts/maggie-feedback/evidence-bundle-v1.schema.json +38 -0
- package/bundled-references/browser-inspection.md +17 -0
- package/bundled-references/google-integrations-runbook.md +8 -1
- package/bundled-references/memory-hook.md +18 -5
- package/bundled-skills/maggie-clone/SKILL.md +7 -0
- package/bundled-skills/maggie-deployment/SKILL.md +55 -15
- package/bundled-skills/maggie-feedback/SKILL.md +26 -1
- package/bundled-skills/maggie-memory/SKILL.md +10 -1
- package/bundled-skills/maggie-ops/SKILL.md +22 -0
- package/bundled-skills/maggie-seo-geo/SKILL.md +4 -1
- package/bundled-tools/clis/maggie_analytics.py +8 -0
- package/bundled-tools/clis/maggie_browser_audit.py +13 -2
- package/bundled-tools/clis/maggie_deployment.py +214 -6
- package/bundled-tools/clis/maggie_feedback.py +116 -1
- package/bundled-tools/clis/maggie_memory.py +10 -3
- package/bundled-tools/clis/maggie_ops.py +33 -0
- package/bundled-tools/clis/maggie_release.py +124 -19
- package/bundled-tools/runtime/browser_capability.py +143 -0
- package/bundled-tools/runtime/external_write.py +122 -0
- package/bundled-tools/runtime/google_capabilities.py +37 -5
- package/bundled-tools/runtime/maggie_memory.py +17 -2
- package/package.json +1 -1
- package/references/browser-inspection.md +17 -0
- package/references/google-integrations-runbook.md +8 -1
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
635
|
-
npx @topy-ai/maggie@0.7.
|
|
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." : "
|
|
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 =
|
|
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-
|
|
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
|
|
4
|
-
|
|
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
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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
|