@topy-ai/maggie 0.6.9 → 0.7.1
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 +56 -4
- package/bin/maggie.js +11 -7
- package/bundled-references/blog-translation-ingestion.md +52 -0
- package/bundled-references/maggiedash-dashboard-ui.md +28 -0
- package/bundled-skills/maggie-blog/SKILL.md +28 -0
- package/bundled-skills/maggie-content-localization/SKILL.md +49 -0
- package/bundled-skills/maggie-dash/SKILL.md +52 -0
- package/bundled-skills/maggie-deployment/SKILL.md +17 -0
- package/bundled-skills/maggie-design/SKILL.md +11 -0
- package/bundled-skills/maggie-memory/SKILL.md +7 -0
- package/bundled-skills/maggie-ops/SKILL.md +27 -0
- package/bundled-skills/maggie-seo-geo/SKILL.md +95 -1
- package/bundled-skills/maggie-service-booking/SKILL.md +16 -0
- package/bundled-templates/maggiedash/README.md +4 -0
- package/bundled-templates/maggiedash/dashboard-ui-contract.json +31 -0
- package/bundled-tools/clis/maggie_analytics.py +14 -1
- package/bundled-tools/clis/maggie_blog.py +19 -1
- package/bundled-tools/clis/maggie_browser_audit.py +78 -0
- package/bundled-tools/clis/maggie_dash.py +101 -0
- package/bundled-tools/clis/maggie_deployment.py +43 -0
- package/bundled-tools/clis/maggie_feedback.py +16 -1
- package/bundled-tools/clis/maggie_localization.py +31 -0
- package/bundled-tools/clis/maggie_memory.py +4 -1
- package/bundled-tools/clis/maggie_ops.py +21 -1
- package/bundled-tools/clis/maggie_service_booking.py +6 -3
- package/bundled-tools/clis/maggie_sitemap.py +16 -2
- package/bundled-tools/clis/site_audit.py +93 -9
- package/bundled-tools/runtime/analytics_traffic.py +30 -0
- package/bundled-tools/runtime/browser_behavior.py +35 -0
- package/bundled-tools/runtime/browser_geometry.js +31 -0
- package/bundled-tools/runtime/content_localization.py +63 -1
- package/bundled-tools/runtime/dependency_lock.py +43 -0
- package/bundled-tools/runtime/integration_state.py +17 -0
- package/bundled-tools/runtime/localization_runner.py +113 -0
- package/bundled-tools/runtime/maggie_blog.py +66 -1
- package/bundled-tools/runtime/maggie_dash_store.py +150 -6
- package/bundled-tools/runtime/maggie_dash_ui.py +60 -0
- package/bundled-tools/runtime/maggie_memory.py +7 -2
- package/bundled-tools/runtime/maggie_sitemap.py +50 -4
- package/bundled-tools/runtime/route_imports.py +51 -0
- package/bundled-tools/runtime/seed_evidence.py +25 -0
- package/bundled-tools/runtime/service_variants.py +152 -0
- package/bundled-tools/runtime/site_baseline.py +60 -0
- package/package.json +1 -1
- package/references/blog-translation-ingestion.md +52 -0
- package/references/maggiedash-dashboard-ui.md +28 -0
package/README.md
CHANGED
|
@@ -14,6 +14,16 @@ persistent project memory.
|
|
|
14
14
|
|
|
15
15
|
## Install
|
|
16
16
|
|
|
17
|
+
`site-audit --crawl --save-baseline FILE --reviewer NAME` records a reviewed
|
|
18
|
+
site contract; `site-audit --crawl --baseline FILE` fails on URL, metadata,
|
|
19
|
+
HTML structure or copy changes.
|
|
20
|
+
Complete sitemap coverage is required and existing baselines cannot be
|
|
21
|
+
overwritten. This does not verify browser layout or source-only changes.
|
|
22
|
+
|
|
23
|
+
`localization generate` invokes a trusted project-supplied provider process
|
|
24
|
+
with explicit `--confirm`, resumable draft batches and no automatic publishing.
|
|
25
|
+
See the installed localization skill for the adapter protocol and examples.
|
|
26
|
+
|
|
17
27
|
```bash
|
|
18
28
|
npx @topy-ai/maggie init --agent codex
|
|
19
29
|
```
|
|
@@ -78,8 +88,9 @@ The CLI provides the installer plus durable workflow commands:
|
|
|
78
88
|
maggie init | install | update | remove | list | doctor
|
|
79
89
|
maggie cleanup --project . [--confirm]
|
|
80
90
|
maggie bootstrap interview | phase ...
|
|
81
|
-
maggie dash init | status | migrate
|
|
91
|
+
maggie dash init | status | migrate | cms ...
|
|
82
92
|
maggie dash transition ... # explicit content approval transition
|
|
93
|
+
maggie dash variant ... # service variant create/review/preview/publish
|
|
83
94
|
maggie clone ... # authorized homepage capture
|
|
84
95
|
maggie design ... # authorized interior-page design
|
|
85
96
|
maggie clone-to-template ... # URL → validated marketplace template
|
|
@@ -90,7 +101,7 @@ maggie localization ... # plan, validate, review, publish, stale
|
|
|
90
101
|
maggie service ... # import, sync, generate, validate
|
|
91
102
|
maggie seo performance ... # sampled PageSpeed/CWV report and baseline
|
|
92
103
|
maggie seo images ... # inventory, variants, confirmation, validate
|
|
93
|
-
maggie seo sitemap ... # typed plan,
|
|
104
|
+
maggie seo sitemap ... # typed/semantic plan, agent-files, apply, rollback
|
|
94
105
|
maggie deployment | migration | release | analytics | schedule
|
|
95
106
|
maggie deployment canary --asset URL=SHA256 --render-report report.json
|
|
96
107
|
maggie design icon-inventory --source-dir src --runtime assets/icons.css
|
|
@@ -179,10 +190,25 @@ artifact schemas.
|
|
|
179
190
|
Recommended upgrade sequence for the current release:
|
|
180
191
|
|
|
181
192
|
```bash
|
|
182
|
-
npx @topy-ai/maggie@0.
|
|
183
|
-
npx @topy-ai/maggie@0.
|
|
193
|
+
npx @topy-ai/maggie@0.7.1 update --project . --force
|
|
194
|
+
npx @topy-ai/maggie@0.7.1 cleanup --project .
|
|
184
195
|
```
|
|
185
196
|
|
|
197
|
+
Maintainers should pass npm credentials through the repository helper, never
|
|
198
|
+
as a command-line argument:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
node scripts/publish-npm.mjs --maggie-env-file ../.env
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
The 0.7.1 workflow adds audited MaggieDash CMS operations (`cms revisions`,
|
|
205
|
+
`trash`, `restore`, `schedule`, `duplicate`, `redirect`, and signed
|
|
206
|
+
`preview`), import-authoritative service matching, shared translation indexes,
|
|
207
|
+
sanitized seed manifests, lockfile/analytics traffic checks, semantic sitemap
|
|
208
|
+
validation, locale-aware `llms.txt`/`sitemap.md`/`insights.md` generation,
|
|
209
|
+
explicit integration states, and deployment Origin/infrastructure/data
|
|
210
|
+
rollback gates.
|
|
211
|
+
|
|
186
212
|
## MaggieDash lifecycle
|
|
187
213
|
|
|
188
214
|
For a new project, establish the local content and approval foundation before
|
|
@@ -419,6 +445,32 @@ Blog imports are idempotent and draft-first. Published slugs remain stable;
|
|
|
419
445
|
public feeds exclude drafts, and `maggie blog rollback --confirm` restores the
|
|
420
446
|
latest local content backup.
|
|
421
447
|
|
|
448
|
+
In the working tree, opt-in blog translation uses `autoTranslateEnabled` and
|
|
449
|
+
`translationLocales` in `.maggie/blog/settings.json`. Process or retry persisted
|
|
450
|
+
posts without a new pull:
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
maggie blog translate-pending --project . \
|
|
454
|
+
--adapter-command '["python3", "scripts/translation-provider.py"]' --confirm
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
The project supplies the trusted provider script. Completed locale/revision
|
|
458
|
+
tasks are skipped; failed work returns nonzero. Title, excerpt, body, topic
|
|
459
|
+
labels and supplied image alt text remain draft/non-indexable. Run one worker
|
|
460
|
+
per project; existing host HTTP schedulers require separate integration.
|
|
461
|
+
|
|
462
|
+
Browser behavior validation uses the shared gstack browser:
|
|
463
|
+
|
|
464
|
+
```bash
|
|
465
|
+
maggie browser-audit https://example.com \
|
|
466
|
+
--browse "$HOME/.codex/skills/gstack/browse/dist/browse" \
|
|
467
|
+
--output .maggie/browser-audit --required main --sticky header \
|
|
468
|
+
--viewport 390x844 --viewport 768x1024
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
It captures scroll/geometry samples and screenshots, then fails on hidden
|
|
472
|
+
required elements, horizontal overflow or invalid sticky positioning.
|
|
473
|
+
|
|
422
474
|
List every installed skill and command:
|
|
423
475
|
|
|
424
476
|
```bash
|
package/bin/maggie.js
CHANGED
|
@@ -65,7 +65,7 @@ Usage:
|
|
|
65
65
|
maggie list
|
|
66
66
|
maggie doctor [--project PATH]
|
|
67
67
|
maggie bootstrap interview [project]
|
|
68
|
-
maggie dash init --project PATH
|
|
68
|
+
maggie dash init|status|migrate|transition|variant|cms --project PATH [options]
|
|
69
69
|
maggie dash status --project PATH
|
|
70
70
|
maggie dash migrate --project PATH --confirm
|
|
71
71
|
maggie content FILE --source PROVIDER --project PATH --confirm
|
|
@@ -92,7 +92,7 @@ Usage:
|
|
|
92
92
|
maggie design author --project PATH --route /about --purpose TEXT --audience TEXT --confirm
|
|
93
93
|
maggie auth reference --project PATH --confirm
|
|
94
94
|
maggie auth check --project PATH [--production]
|
|
95
|
-
maggie blog init|inspect|ingest|validate|publish|sitemap|settings|rollback
|
|
95
|
+
maggie blog init|inspect|ingest|validate|publish|sitemap|settings|rollback|integration-state
|
|
96
96
|
maggie design status <job-id>
|
|
97
97
|
maggie service import <provider-url> --project PATH
|
|
98
98
|
maggie service sync <provider-url> --project PATH
|
|
@@ -106,15 +106,18 @@ Usage:
|
|
|
106
106
|
maggie deployment canary --project PATH --asset URL=SHA256 --render-report report.json --output docs/deployment-canary.json
|
|
107
107
|
maggie migration --project PATH --environment staging
|
|
108
108
|
maggie schedule PATH/.maggie/schedule.json --project PATH
|
|
109
|
-
maggie analytics --project PATH --environment staging
|
|
109
|
+
maggie analytics [traffic-audit|release-gate] --project PATH --environment staging
|
|
110
110
|
maggie release PATH --environment staging --target vps-with-cloudflare-dns
|
|
111
111
|
maggie api lifecycle --project PATH [--execute --allow-quota]
|
|
112
112
|
maggie memory <init|list|search|context|add|record-error|transition|export> --project PATH
|
|
113
|
-
maggie localization <plan|preview|validate|review|publish|stale|glossary> [options]
|
|
114
|
-
maggie seo performance|images|sitemap [options]
|
|
113
|
+
maggie localization <extract|plan|generate|preview|validate|review|publish|stale|glossary> [options]
|
|
114
|
+
maggie seo performance|images|sitemap [options] (sitemap supports strict validate and agent-files)
|
|
115
115
|
maggie feedback <collect|preview|submit|list> [options]
|
|
116
116
|
maggie site-audit URL [--crawl] [--languages en-GB,es-MX,ja-JP] [--check-hreflang]
|
|
117
|
-
maggie
|
|
117
|
+
maggie site-audit URL --crawl --save-baseline FILE --reviewer NAME
|
|
118
|
+
maggie site-audit URL --crawl --baseline FILE
|
|
119
|
+
maggie browser-audit URL --browse PATH --output DIR --required SELECTOR [--sticky SELECTOR]
|
|
120
|
+
maggie ops audit|preflight|verify|lockfiles|seed-manifest --project PATH
|
|
118
121
|
maggie ops preflight --project PATH --write
|
|
119
122
|
|
|
120
123
|
Examples:
|
|
@@ -287,7 +290,7 @@ function service(args) {
|
|
|
287
290
|
const root = projectRoot(args);
|
|
288
291
|
const script = join(root, "tools", "clis", "maggie_service_booking.py");
|
|
289
292
|
if (!existsSync(script)) throw new Error(`service booking CLI is missing: ${script}`);
|
|
290
|
-
const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root });
|
|
293
|
+
const result = spawnSync("python3", [script, ...args], { stdio: "inherit", cwd: root, env: { ...process.env, MAGGIE_VERSION: PACKAGE_VERSION } });
|
|
291
294
|
if (result.error) throw result.error;
|
|
292
295
|
process.exitCode = result.status ?? 1;
|
|
293
296
|
}
|
|
@@ -390,6 +393,7 @@ try {
|
|
|
390
393
|
else if (command === "localization") workflowCli("maggie_localization.py", args);
|
|
391
394
|
else if (command === "feedback") workflowCli("maggie_feedback.py", args);
|
|
392
395
|
else if (command === "site-audit") workflowCli("site_audit.py", args);
|
|
396
|
+
else if (command === "browser-audit") workflowCli("maggie_browser_audit.py", args);
|
|
393
397
|
else if (command === "dash") workflowCli("maggie_dash.py", args);
|
|
394
398
|
else if (command === "content") workflowCli("maggie_content.py", args);
|
|
395
399
|
else if (command === "init" || command === "install") install(args);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Blog translation ingestion contract
|
|
2
|
+
|
|
3
|
+
## Entry points and ownership
|
|
4
|
+
|
|
5
|
+
List every ingest entry point before enabling automatic translation: manual
|
|
6
|
+
CLI, admin HTTP action, scheduled tick, webhook and backfill. Each must use
|
|
7
|
+
the same post-persistence scheduling function. Record the caller and source
|
|
8
|
+
revision in the run evidence. A hook in a standalone script is insufficient
|
|
9
|
+
evidence for a scheduled HTTP path.
|
|
10
|
+
|
|
11
|
+
The packaged Python BlogStore reconciles durable translation tasks after source
|
|
12
|
+
persistence when `autoTranslateEnabled` is true and `translationLocales` contains
|
|
13
|
+
supported locale tags. The same reconciliation runs before translation retries,
|
|
14
|
+
so an interruption between source persistence and scheduling is recoverable.
|
|
15
|
+
Tasks are under `.maggie/blog/translations/`; content changes create new task
|
|
16
|
+
identities, and only current identities are processed. Old drafts are retained
|
|
17
|
+
for inspection, not eligible for automatic publication.
|
|
18
|
+
|
|
19
|
+
Run `maggie blog translate-pending --project . --adapter-command
|
|
20
|
+
'["python3", "scripts/translation-provider.py"]' --confirm` to generate drafts
|
|
21
|
+
from saved sources without re-pulling. The project supplies a trusted adapter
|
|
22
|
+
using the localization provider protocol. It receives title, excerpt, body,
|
|
23
|
+
topic labels and supplied image alt text. Completed tasks are skipped; failures
|
|
24
|
+
return partial/nonzero and store only an error category. Use one worker per
|
|
25
|
+
project. Host database/API schedulers must explicitly integrate this boundary;
|
|
26
|
+
installing the skill does not patch an existing host ingestion implementation.
|
|
27
|
+
|
|
28
|
+
## Durable work
|
|
29
|
+
|
|
30
|
+
After source persistence, enqueue translation work using an idempotency key
|
|
31
|
+
of project, content ID, source revision, target locale and operation. The
|
|
32
|
+
source write and scheduling intent must commit together or use a reconciliation
|
|
33
|
+
pass that detects missing intents. A repeat pull must retry pending/failed
|
|
34
|
+
translation without purchasing another upstream pull or duplicating completed
|
|
35
|
+
work. A changed source revision invalidates earlier translation work.
|
|
36
|
+
|
|
37
|
+
Track pending, running, succeeded and failed states with attempt count and
|
|
38
|
+
safe error category. A run with failed required translations is partial, not
|
|
39
|
+
completed. Missing credentials or provider availability must be visible;
|
|
40
|
+
never print credentials or provider payloads in the report. Keep translated
|
|
41
|
+
content draft and non-indexable until its validation and review pass.
|
|
42
|
+
|
|
43
|
+
## Acceptance evidence
|
|
44
|
+
|
|
45
|
+
Exercise the actual CLI and scheduled HTTP entry points against fixture
|
|
46
|
+
providers. With translation enabled, both must schedule identical work for
|
|
47
|
+
the same source revision. With translation disabled, neither schedules work.
|
|
48
|
+
Test provider failure, process interruption, retry without re-pull, duplicate
|
|
49
|
+
delivery, changed source revision, multiple target locales, media alt text and
|
|
50
|
+
topic labels. Assert persisted target output and queue state, not merely the
|
|
51
|
+
presence of a translate function name. Browser preview must show the target
|
|
52
|
+
locale before publication is claimed complete.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# MaggieDash dashboard UI contract
|
|
2
|
+
|
|
3
|
+
MaggieDash workspaces use the lightweight contract in
|
|
4
|
+
`templates/maggiedash/dashboard-ui-contract.json`. It is provider-neutral and
|
|
5
|
+
describes the dashboard chrome, not a framework-specific component library.
|
|
6
|
+
|
|
7
|
+
The reference is the users workspace: one `WorkspaceBar`, one sidebar/content
|
|
8
|
+
navigation relationship, and one `ContentTabs` row. A route must not render a
|
|
9
|
+
second horizontal navigation, duplicate its sidebar, or hide duplicate markup
|
|
10
|
+
with CSS. `WorkspaceCard` owns card framing; page routes own content.
|
|
11
|
+
|
|
12
|
+
`ContentTabs` accepts only the props it renders (`tabs`, `active`, `actions`,
|
|
13
|
+
and `children`). It does not accept a page `title` or `description`. If a page
|
|
14
|
+
needs a heading or description, render a dedicated page header or use
|
|
15
|
+
`WorkspaceBar` explicitly. This keeps component APIs honest and prevents
|
|
16
|
+
dead-copy drift.
|
|
17
|
+
|
|
18
|
+
Validate a host implementation with:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
maggie dash ui validate --contract templates/maggiedash/dashboard-ui-contract.json \
|
|
22
|
+
--source src/components/WorkspaceBar.tsx \
|
|
23
|
+
--source src/components/WorkspaceCard.tsx \
|
|
24
|
+
--source src/components/ContentTabs.tsx
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The check is static evidence. It does not replace an authenticated browser
|
|
28
|
+
review of the rendered dashboard at desktop and mobile sizes.
|
|
@@ -11,6 +11,22 @@ project lessons, never raw provider credentials or temporary content facts.
|
|
|
11
11
|
|
|
12
12
|
# Maggie Blog
|
|
13
13
|
|
|
14
|
+
## Automatic translation across ingest paths
|
|
15
|
+
|
|
16
|
+
Follow the [translation ingestion contract](../../references/blog-translation-ingestion.md)
|
|
17
|
+
when adding host auto-translation. Inventory manual CLI, admin API and scheduler
|
|
18
|
+
entry points and connect each to the same durable translation scheduling step.
|
|
19
|
+
Verify the actual scheduled path with a fixture provider and failure/retry
|
|
20
|
+
tests. An enabled setting or successful manual run does not prove scheduled
|
|
21
|
+
translation works. Packaged BlogStore reconciles translation tasks when settings
|
|
22
|
+
enable `autoTranslateEnabled` with supported `translationLocales`. Run
|
|
23
|
+
`maggie blog translate-pending --project . --adapter-command
|
|
24
|
+
'["python3", "scripts/translation-provider.py"]' --confirm` with a trusted
|
|
25
|
+
project-supplied adapter to process saved posts without re-pulling. Completed
|
|
26
|
+
locale/revision tasks are skipped; failed tasks retry from checkpoints. Run one
|
|
27
|
+
worker per project. Outputs stay draft and non-indexable. Existing host HTTP
|
|
28
|
+
and scheduler integrations still need separate implementation and tests.
|
|
29
|
+
|
|
14
30
|
Use the stable CLI to initialize a local blog contract, ingest versioned local
|
|
15
31
|
content, validate lifecycle invariants, publish with an actor and reason, and
|
|
16
32
|
generate route/feed artifacts. Read the host framework and database contract
|
|
@@ -44,3 +60,15 @@ maggie design init --project . --surface blog \
|
|
|
44
60
|
|
|
45
61
|
The blog skill supplies route/data semantics; `maggie-design` supplies the
|
|
46
62
|
host-native components and responsive visual review.
|
|
63
|
+
|
|
64
|
+
Optional Search Console/AI visibility integrations must report state rather
|
|
65
|
+
than returning an ambiguous empty success payload. Use:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
maggie blog integration-state # not-configured
|
|
69
|
+
maggie blog integration-state --configured --consent-required # awaiting-consent
|
|
70
|
+
maggie blog integration-state --configured --authorized # ready
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Provider adapters should preserve the same `not-configured`,
|
|
74
|
+
`awaiting-consent`, `awaiting-authorization`, `ready`, and `error` semantics.
|
|
@@ -7,6 +7,46 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# Maggie Content Localization
|
|
9
9
|
|
|
10
|
+
## Generation responsibility and operation contract
|
|
11
|
+
|
|
12
|
+
`plan` records `generationContract.mode`, `preserveMeaning`,
|
|
13
|
+
`allowStructuralRewrite`, and `marketAdaptation`. Rewrite permits structural
|
|
14
|
+
changes; translate and polish preserve meaning; localise enables market
|
|
15
|
+
adaptation. A host generation adapter or the authoring agent must apply these
|
|
16
|
+
instructions when producing copy. Planning does not invoke a model or generate
|
|
17
|
+
translations. Validation currently checks mode consistency and rewrite
|
|
18
|
+
permission, not whether prose was actually restructured. Review the produced
|
|
19
|
+
copy against the requested operation before approval.
|
|
20
|
+
|
|
21
|
+
### Resumable draft generation
|
|
22
|
+
|
|
23
|
+
After extracting source strings and planning a job with `--source`, run:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
maggie localization generate .maggie/localization/<job>.json \
|
|
27
|
+
--project . --source .maggie/localization/source.json \
|
|
28
|
+
--output .maggie/localization/generation/<job>.json \
|
|
29
|
+
--adapter-command '["python3", "scripts/translation-provider.py"]' --confirm
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The adapter script is project-supplied, not bundled. Only execute a trusted
|
|
33
|
+
adapter: it receives source text and may call a paid external provider.
|
|
34
|
+
The JSON argv array executes without a shell, relative to `--project`.
|
|
35
|
+
Its stdin is a `maggie-provider-request.v1` object with `strings` and `contract`
|
|
36
|
+
(job identity, source revision, languages, locale, market and operation).
|
|
37
|
+
Its stdout must contain only a JSON object mapping every supplied string ID
|
|
38
|
+
to nonempty translated text. Exit nonzero on provider failure; provider logs
|
|
39
|
+
are suppressed from CLI errors to avoid exposing content or credentials.
|
|
40
|
+
|
|
41
|
+
`--character-budget` defaults to 8000 source characters per batch (a single
|
|
42
|
+
larger string remains intact); `--timeout` defaults to 120 seconds per call.
|
|
43
|
+
Malformed output splits batches until individual strings; provider failures
|
|
44
|
+
save completed batches for retry. Rerun with the same output to resume; changed
|
|
45
|
+
source or operation requires a new output. Run only one process per output.
|
|
46
|
+
The output is a draft checkpoint, not an approved translation: this command
|
|
47
|
+
does not edit project files, update the job, publish, or prove semantic quality.
|
|
48
|
+
Host ingestion integration and operation-quality verification remain under #28.
|
|
49
|
+
|
|
10
50
|
Localization job filenames are derived from content identity, but content IDs
|
|
11
51
|
are data, not paths. The CLI sanitizes separators and adds a short identity
|
|
12
52
|
hash when needed, so IDs such as `site.example/static-pages` always produce a
|
|
@@ -76,3 +116,12 @@ styles, SVG, and dynamic expressions. Supplying source and render reports to
|
|
|
76
116
|
remains backward-compatible without those artifacts. See
|
|
77
117
|
[`docs/localization-extraction-render-prd.md`](../../docs/localization-extraction-render-prd.md)
|
|
78
118
|
for the artifact contract and limitations.
|
|
119
|
+
|
|
120
|
+
Use the shared translation index and route predicates from
|
|
121
|
+
`tools/runtime/content_localization.py`. A host must not keep a second wording
|
|
122
|
+
dictionary beside its translation registry: conflicting `(contentId, locale)`
|
|
123
|
+
records fail closed. Use `is_translated_path()` for both exact routes and
|
|
124
|
+
prefix routes, and do not let locale middleware capture root `.txt`, `.md`,
|
|
125
|
+
`.xml`, or `.json` assets. If a framework rewrites a localized request,
|
|
126
|
+
dedupe instrumentation with `rewrite_once(request_key, seen)` so one request
|
|
127
|
+
does not count twice.
|
|
@@ -33,6 +33,37 @@ Valid transitions and statuses are owned by the MaggieDash storage contract;
|
|
|
33
33
|
do not edit the database directly. A transition is an auditable state change,
|
|
34
34
|
not a publish shortcut.
|
|
35
35
|
|
|
36
|
+
## Service variants
|
|
37
|
+
|
|
38
|
+
Service variants use `.maggie/service-variants.json` so location, event and
|
|
39
|
+
holiday pages retain service identity and canonical ownership:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
maggie dash variant create --project . --service-id massage \
|
|
43
|
+
--variant-id massage-london --variant-type location --locale en-GB --market uk \
|
|
44
|
+
--slug location/london --title "Massage in London" \
|
|
45
|
+
--facts '[{"key":"availability","value":"Weekdays"}]' \
|
|
46
|
+
--source-revision source-1 --confirm
|
|
47
|
+
maggie dash variant review --project . --variant-id massage-london \
|
|
48
|
+
--actor editor --reason "facts checked" --confirm
|
|
49
|
+
maggie dash variant preview --project . --variant-id massage-london \
|
|
50
|
+
--actor reviewer --reason "rendered QA" --preview-url http://localhost/preview --confirm
|
|
51
|
+
maggie dash variant publish --project . --variant-id massage-london \
|
|
52
|
+
--actor owner --reason "approved" --confirm
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The lifecycle is draft → review → approved → preview/published. Records carry
|
|
56
|
+
locale, market, source revision, provenance, canonical relationship, cluster
|
|
57
|
+
links, hreflang, facts and layout family. Translated variants cannot publish
|
|
58
|
+
before their canonical source. Slugs use `location/<slug>`, `event/<slug>`, or
|
|
59
|
+
`holiday/<slug>`; collisions fail. `variant slug-plan` creates a reviewed
|
|
60
|
+
redirect with owner approval before an indexed URL changes. `variant validate`
|
|
61
|
+
checks facts, canonical relation, source similarity and layout metadata.
|
|
62
|
+
With `--render-report report.json`, it additionally requires schema
|
|
63
|
+
`maggie-service-variant-render.v1`, a passing report, and matching layout
|
|
64
|
+
family, locale and canonical URL. Metadata validation alone is not a rendering
|
|
65
|
+
claim.
|
|
66
|
+
|
|
36
67
|
All mutating commands require `--confirm`. The default development adapter is
|
|
37
68
|
SQLite; production adapters must satisfy the same versioned contracts.
|
|
38
69
|
|
|
@@ -43,3 +74,24 @@ not part of this skill.
|
|
|
43
74
|
Before and after a meaningful run, load and record confirmed project
|
|
44
75
|
preferences or repaired pitfalls with
|
|
45
76
|
[the shared memory hook](../../references/memory-hook.md).
|
|
77
|
+
|
|
78
|
+
CMS operations are explicit and auditable:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
maggie dash cms revisions --project . --project-id local-project --document-id <id> --confirm
|
|
82
|
+
maggie dash cms trash --project . --project-id local-project --document-id <id> --reason "remove from editor" --confirm
|
|
83
|
+
maggie dash cms restore --project . --project-id local-project --document-id <id> --reason "restore" --confirm
|
|
84
|
+
maggie dash cms schedule --project . --project-id local-project --document-id <id> \
|
|
85
|
+
--publish-at 2026-09-20T10:00:00Z --reason "approved release" --confirm
|
|
86
|
+
maggie dash cms duplicate --project . --project-id local-project --document-id <id> \
|
|
87
|
+
--new-id <new-id> --new-slug <new-slug> --reason "create draft" --confirm
|
|
88
|
+
maggie dash cms redirect --project . --project-id local-project --from-path /old --to-path /new \
|
|
89
|
+
--reason "canonical slug change" --confirm
|
|
90
|
+
maggie dash cms preview --project . --project-id local-project --document-id <id> \
|
|
91
|
+
--secret "$MAGGIE_PREVIEW_SECRET" --confirm
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Content writes create immutable revision snapshots. Trash is reversible and
|
|
95
|
+
does not destroy the document. Scheduling is accepted only for approved
|
|
96
|
+
content and requires a timezone. Preview tokens are short-lived HMAC-signed
|
|
97
|
+
tokens; never place the secret in source control or generated reports.
|
|
@@ -210,3 +210,20 @@ Follow the shared [Maggie Decision Loop](../../references/decision-loop.md) for
|
|
|
210
210
|
6. Require explicit final confirmation before any mutation or external write.
|
|
211
211
|
|
|
212
212
|
If a decision is not relevant, record it as `skipped` with a reason. Do not silently assume a missing choice, and do not treat an existing output as permission to skip required work.
|
|
213
|
+
|
|
214
|
+
For scheduled POST jobs, validate the request contract before installation:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
maggie deployment --validate-request --method POST \
|
|
218
|
+
--origin https://example.test --has-auth
|
|
219
|
+
maggie deployment --verify-infra --service fresha \
|
|
220
|
+
--units-dir .maggie/deployment/schedules
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The deployment scheduler must send an explicit Origin and configured auth
|
|
224
|
+
contract; a missing Origin must not be mistaken for an application auth
|
|
225
|
+
failure. Infrastructure verification accepts a declared service/timer pair or
|
|
226
|
+
both units being enabled in systemd. Data-dependent releases additionally
|
|
227
|
+
require `rollback.backupId` and `rollback.restoreCommand` in
|
|
228
|
+
`.maggie/deployment/data-release.json`, because switching code alone does not
|
|
229
|
+
restore incompatible data.
|
|
@@ -7,6 +7,17 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# Maggie Design
|
|
9
9
|
|
|
10
|
+
## In-place route evidence
|
|
11
|
+
|
|
12
|
+
`maggie design in-place --project . --route /example` resolves local source
|
|
13
|
+
files and falls back to a discovered `[...slug]`/`[[...slug]]` file. That
|
|
14
|
+
fallback is currently a source candidate, not proof that the concrete URL is
|
|
15
|
+
served. Verify the route's HTTP response, content identity and framework route
|
|
16
|
+
mapping before editing a shared catch-all. Next app-router catch-alls whose
|
|
17
|
+
file is named `page.tsx` are not covered by this filename fallback. Capture
|
|
18
|
+
responsive and interaction evidence separately; a plan in phase `ready` is
|
|
19
|
+
not a successful browser test.
|
|
20
|
+
|
|
10
21
|
## Source-to-runtime icon inventory
|
|
11
22
|
|
|
12
23
|
Before release, inventory icon names in source and compare them with the
|
|
@@ -38,6 +38,13 @@ truth, content state, or audit log.
|
|
|
38
38
|
|
|
39
39
|
## Commands
|
|
40
40
|
|
|
41
|
+
`add` defaults to `candidate` and reports that the item is excluded from
|
|
42
|
+
`search` and `context`. Inspect it with `maggie memory list --status candidate
|
|
43
|
+
--project .`; after review, run `maggie memory transition --project . <kind>
|
|
44
|
+
<id> active`. Explicit status listing supports query and skill filters while
|
|
45
|
+
preserving project scope. Expired active items remain inspectable through
|
|
46
|
+
explicit status listing but are excluded from normal context.
|
|
47
|
+
|
|
41
48
|
```bash
|
|
42
49
|
maggie memory init --project .
|
|
43
50
|
maggie memory context --project . --skill maggie-clone
|
|
@@ -7,6 +7,19 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# Maggie Ops
|
|
9
9
|
|
|
10
|
+
Before release, run the lockfile guard when a project has more than one package
|
|
11
|
+
manager:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
maggie ops lockfiles --project .
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
It compares direct package and optional dependency names in `package.json`
|
|
18
|
+
with `package-lock.json`, reports the presence of `pnpm-lock.yaml`, and fails
|
|
19
|
+
when npm CI cannot install a declared package. It does not rewrite either
|
|
20
|
+
lockfile; regenerate and commit both through the project's chosen package
|
|
21
|
+
manager workflow.
|
|
22
|
+
|
|
10
23
|
## Automatic memory hook
|
|
11
24
|
|
|
12
25
|
Follow [Maggie Memory Hook](../../references/memory-hook.md) at invocation and completion.
|
|
@@ -195,3 +208,17 @@ Follow the shared [Maggie Decision Loop](../../references/decision-loop.md) for
|
|
|
195
208
|
6. Require explicit final confirmation before any mutation or external write.
|
|
196
209
|
|
|
197
210
|
If a decision is not relevant, record it as `skipped` with a reason. Do not silently assume a missing choice, and do not treat an existing output as permission to skip required work.
|
|
211
|
+
|
|
212
|
+
Before data-dependent checks, validate an explicit sanitized fixture manifest:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
maggie ops seed-manifest --project . --manifest .maggie/seed-manifest.json
|
|
216
|
+
maggie ops lockfiles --project .
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
The seed manifest must be opt-in, sanitized, and contain non-empty fixtures;
|
|
220
|
+
an empty dev database is not evidence that an operational check passed.
|
|
221
|
+
Known Maggie/toolchain traffic can be measured without polluting first-party
|
|
222
|
+
analytics using `maggie analytics traffic-audit --events events.json`. The
|
|
223
|
+
classifier excludes only explicit tool/test markers and never infers identity
|
|
224
|
+
from IP or private fields.
|
|
@@ -7,6 +7,85 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# Maggie SEO and GEO
|
|
9
9
|
|
|
10
|
+
## Static audit and sitemap evidence
|
|
11
|
+
|
|
12
|
+
Run `maggie site-audit https://example.com --crawl --json` for sitemap-listed
|
|
13
|
+
pages. Homepage checks expose `robots_directive` and `robots_conflict`.
|
|
14
|
+
Crawl entries expose `robots` (no restrictive meta found) and
|
|
15
|
+
`robots_conflict` (a contradiction exists). Missing robots meta is allowed;
|
|
16
|
+
noindex/none/nofollow or contradictory index/follow directives fail the gate.
|
|
17
|
+
Crawled pages also inspect X-Robots-Tag headers, including bot-prefixed noindex.
|
|
18
|
+
Static audit success
|
|
19
|
+
does not establish Google indexing, scroll behavior, responsive visibility,
|
|
20
|
+
or translation quality. Record those as unverified without separate evidence.
|
|
21
|
+
|
|
22
|
+
Crawl reports include `summary.byLocaleTemplate` with total, passed, failed
|
|
23
|
+
and failed URLs per declared locale and template. Regions/scripts remain
|
|
24
|
+
distinct (for example en-GB versus en-US). A template is identified only when
|
|
25
|
+
the page has exactly one distinct `data-template` value; absent or ambiguous
|
|
26
|
+
markup is `unknown`, not an inferred route family. Static report evidence marks
|
|
27
|
+
`rendered` and `behavioral` as `not_run`; these groups do not prove responsive
|
|
28
|
+
or scroll behavior. Fetch failures remain visible in the unknown group.
|
|
29
|
+
|
|
30
|
+
Sitemap planning accepts TSV columns: content type, absolute URL, optional
|
|
31
|
+
lastmod, optional JSON object mapping locale tags to alternate URLs, such as
|
|
32
|
+
`{"en-GB":"https://example.com/post","zh-Hant":"https://example.com/zh/post"}`.
|
|
33
|
+
It emits `lastmod` and `xhtml:link rel="alternate"`. Supply truthful content
|
|
34
|
+
change dates; omit unknown dates. Alternates must currently use the approved
|
|
35
|
+
origin. Reciprocal locale coverage and date semantics require separate review.
|
|
36
|
+
`lastmod` must come from a recorded content-change event or source revision;
|
|
37
|
+
never derive it from `updated_at`, pull time, sync time, or deployment time.
|
|
38
|
+
If the change date is unknown, omit `lastmod`. An empty content-type does not
|
|
39
|
+
need a sitemap chunk in the sitemap index; serving an empty endpoint and
|
|
40
|
+
advertising it are separate decisions.
|
|
41
|
+
|
|
42
|
+
## Freeze and compare a reviewed site
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
maggie site-audit https://example.com --crawl --json \
|
|
46
|
+
--save-baseline docs/seo-baseline-v1.json --reviewer maintainer
|
|
47
|
+
maggie site-audit https://example.com --crawl --json \
|
|
48
|
+
--baseline docs/seo-baseline-v1.json --output .maggie/seo-comparison.json
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Only save after reviewing the launched site. Creation requires a passing,
|
|
52
|
+
complete sitemap crawl and never overwrites an existing file. Comparison exits
|
|
53
|
+
nonzero for added/removed URLs, changed metadata, response directives/redirect
|
|
54
|
+
targets, structured data, images, DOM structure or text. Text and structure
|
|
55
|
+
hashes catch served translation reversions and template swaps even when section
|
|
56
|
+
counts match. Reports list changed fields, not raw copy.
|
|
57
|
+
|
|
58
|
+
A crawl exceeding `--max-pages` fails instead of silently sampling; raise the
|
|
59
|
+
limit to cover the sitemap. Oversized responses fail instead of truncating.
|
|
60
|
+
For intentional changes, review the diff and create a new versioned baseline
|
|
61
|
+
with a reviewer. Commit the approved change and new contract together; never
|
|
62
|
+
automatically replace the baseline following failure. Dynamic dates, class
|
|
63
|
+
names and copy can produce legitimate differences requiring review.
|
|
64
|
+
|
|
65
|
+
This covers server-rendered sitemap pages, not CSS rendering, JavaScript-only
|
|
66
|
+
content, database translation keys or browser interactions. A source key change
|
|
67
|
+
is detected here only when it changes served content. Baselines contain site
|
|
68
|
+
metadata; do not publish private project contracts without permission.
|
|
69
|
+
|
|
70
|
+
## Browser behavior evidence
|
|
71
|
+
|
|
72
|
+
For a local or deployed page, run the browser audit with the shared gstack
|
|
73
|
+
`browse` binary:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
maggie browser-audit https://example.com --browse "$HOME/.codex/skills/gstack/browse/dist/browse" \
|
|
77
|
+
--output .maggie/browser-audit --required "main" \
|
|
78
|
+
--required "nav" --sticky "header" --viewport 390x844 --viewport 768x1024
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The command captures three real scroll positions per viewport, DOM geometry,
|
|
82
|
+
horizontal overflow, required-element visibility, sticky/fixed top-inset
|
|
83
|
+
behavior and a screenshot. It exits nonzero for missing/hidden elements, mixed
|
|
84
|
+
viewport samples, no scroll advance, overflow or sticky geometry failure. It
|
|
85
|
+
does not claim keyboard accessibility, network asset correctness or semantic
|
|
86
|
+
content quality unless those checks run separately. Use the installed browser
|
|
87
|
+
path explicitly when Bun is not in PATH.
|
|
88
|
+
|
|
10
89
|
## Automatic memory hook
|
|
11
90
|
|
|
12
91
|
Follow [Maggie Memory Hook](../../references/memory-hook.md) at invocation and completion.
|
|
@@ -48,7 +127,7 @@ maggie seo sitemap rollback --backup-manifest .maggie-sitemap-backups/<plan>/bac
|
|
|
48
127
|
|
|
49
128
|
Only confirmed image variants may enter `srcset`; `apply` requires an explicit
|
|
50
129
|
confirmation and host adapter. Sitemap plans keep content types separate,
|
|
51
|
-
|
|
130
|
+
omit empty chunks from the sitemap index, enforce absolute same-origin URLs, and
|
|
52
131
|
record redirects for removed sitemap files. Read the [image and sitemap PRD](https://github.com/TOPY-AI-LTD/ai-cmo-skills/blob/main/docs/image-sitemap-structure-prd.md)
|
|
53
132
|
for adapter and rollback rules.
|
|
54
133
|
|
|
@@ -133,3 +212,18 @@ Follow the shared [Maggie Decision Loop](../../references/decision-loop.md) for
|
|
|
133
212
|
6. Require explicit final confirmation before any mutation or external write.
|
|
134
213
|
|
|
135
214
|
If a decision is not relevant, record it as `skipped` with a reason. Do not silently assume a missing choice, and do not treat an existing output as permission to skip required work.
|
|
215
|
+
|
|
216
|
+
Use semantic validation when route evidence is available:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
maggie seo sitemap validate --plan .maggie/sitemap-plan.json --strict-semantic
|
|
220
|
+
maggie seo sitemap agent-files --origin https://example.test \
|
|
221
|
+
--routes-file .maggie/routes.tsv --locale fr-FR --output-dir public/fr
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Strict validation checks searchable content evidence, indexability, self
|
|
225
|
+
canonical ownership and truthful `lastmod` provenance. `lastmod` may only be
|
|
226
|
+
backed by a content-change/source-revision event; operational sync, pull,
|
|
227
|
+
deploy, or `updated_at` timestamps are rejected. The agent-file command emits
|
|
228
|
+
locale-aware `llms.txt`, `sitemap.md`, and `insights.md` from the same route
|
|
229
|
+
inventory; non-indexable routes are omitted.
|
|
@@ -7,6 +7,22 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# Maggie Service Booking
|
|
9
9
|
|
|
10
|
+
Route matching evidence must come from the route source's actual import
|
|
11
|
+
statements. The shared resolver in `tools/runtime/route_imports.py` resolves
|
|
12
|
+
relative imports and records a component fingerprint; it never selects a
|
|
13
|
+
same-basename sibling as a fallback. Missing imports are evidence requiring
|
|
14
|
+
review, not permission to guess.
|
|
15
|
+
|
|
16
|
+
## Reviewed page relationships
|
|
17
|
+
|
|
18
|
+
Reviewed page selection preserves existing `supporting` relations, including
|
|
19
|
+
routes absent from the current source scan. It does not automatically create
|
|
20
|
+
supporting relations for all suggested candidates. Inspect each service's
|
|
21
|
+
`pages` after selection and validate the rendered links. The current selection
|
|
22
|
+
path writes `canonical` for selected pages; multiple selections can violate
|
|
23
|
+
the one-canonical invariant. Resolve roles and run validation before publishing.
|
|
24
|
+
Variant role assignment and layout/URL conventions remain tracked in issue #27.
|
|
25
|
+
|
|
10
26
|
## Automatic memory hook
|
|
11
27
|
|
|
12
28
|
Follow [Maggie Memory Hook](../../references/memory-hook.md) at invocation and completion.
|
|
@@ -7,3 +7,7 @@ own framework conventions for rendering.
|
|
|
7
7
|
The package includes only these lightweight contracts. Large marketplace
|
|
8
8
|
previews and template media remain separately distributable through the
|
|
9
9
|
marketplace repository.
|
|
10
|
+
|
|
11
|
+
Dashboard routes should adopt `dashboard-ui-contract.json` and validate their
|
|
12
|
+
actual host components with `maggie dash ui validate`. The contract provides
|
|
13
|
+
the shared workspace chrome and rejects components that declare dead props.
|