@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.
Files changed (46) hide show
  1. package/README.md +56 -4
  2. package/bin/maggie.js +11 -7
  3. package/bundled-references/blog-translation-ingestion.md +52 -0
  4. package/bundled-references/maggiedash-dashboard-ui.md +28 -0
  5. package/bundled-skills/maggie-blog/SKILL.md +28 -0
  6. package/bundled-skills/maggie-content-localization/SKILL.md +49 -0
  7. package/bundled-skills/maggie-dash/SKILL.md +52 -0
  8. package/bundled-skills/maggie-deployment/SKILL.md +17 -0
  9. package/bundled-skills/maggie-design/SKILL.md +11 -0
  10. package/bundled-skills/maggie-memory/SKILL.md +7 -0
  11. package/bundled-skills/maggie-ops/SKILL.md +27 -0
  12. package/bundled-skills/maggie-seo-geo/SKILL.md +95 -1
  13. package/bundled-skills/maggie-service-booking/SKILL.md +16 -0
  14. package/bundled-templates/maggiedash/README.md +4 -0
  15. package/bundled-templates/maggiedash/dashboard-ui-contract.json +31 -0
  16. package/bundled-tools/clis/maggie_analytics.py +14 -1
  17. package/bundled-tools/clis/maggie_blog.py +19 -1
  18. package/bundled-tools/clis/maggie_browser_audit.py +78 -0
  19. package/bundled-tools/clis/maggie_dash.py +101 -0
  20. package/bundled-tools/clis/maggie_deployment.py +43 -0
  21. package/bundled-tools/clis/maggie_feedback.py +16 -1
  22. package/bundled-tools/clis/maggie_localization.py +31 -0
  23. package/bundled-tools/clis/maggie_memory.py +4 -1
  24. package/bundled-tools/clis/maggie_ops.py +21 -1
  25. package/bundled-tools/clis/maggie_service_booking.py +6 -3
  26. package/bundled-tools/clis/maggie_sitemap.py +16 -2
  27. package/bundled-tools/clis/site_audit.py +93 -9
  28. package/bundled-tools/runtime/analytics_traffic.py +30 -0
  29. package/bundled-tools/runtime/browser_behavior.py +35 -0
  30. package/bundled-tools/runtime/browser_geometry.js +31 -0
  31. package/bundled-tools/runtime/content_localization.py +63 -1
  32. package/bundled-tools/runtime/dependency_lock.py +43 -0
  33. package/bundled-tools/runtime/integration_state.py +17 -0
  34. package/bundled-tools/runtime/localization_runner.py +113 -0
  35. package/bundled-tools/runtime/maggie_blog.py +66 -1
  36. package/bundled-tools/runtime/maggie_dash_store.py +150 -6
  37. package/bundled-tools/runtime/maggie_dash_ui.py +60 -0
  38. package/bundled-tools/runtime/maggie_memory.py +7 -2
  39. package/bundled-tools/runtime/maggie_sitemap.py +50 -4
  40. package/bundled-tools/runtime/route_imports.py +51 -0
  41. package/bundled-tools/runtime/seed_evidence.py +25 -0
  42. package/bundled-tools/runtime/service_variants.py +152 -0
  43. package/bundled-tools/runtime/site_baseline.py +60 -0
  44. package/package.json +1 -1
  45. package/references/blog-translation-ingestion.md +52 -0
  46. 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, validate, apply, rollback
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.6.9 update --project . --force
183
- npx @topy-ai/maggie@0.6.9 cleanup --project .
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 --confirm
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 --project PATH
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 ops audit --project PATH
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
- emit chunk 1 for empty enabled types, enforce absolute same-origin URLs, and
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.