@topy-ai/maggie 0.7.54 → 0.7.56

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 (104) hide show
  1. package/README-zh-TW.md +25 -23
  2. package/README.md +93 -71
  3. package/bin/maggie.js +14 -2
  4. package/bundled-contracts/maggie-assistant-tools/booking-receptionist-example-v1.json +18 -2
  5. package/bundled-contracts/maggie-assistant-tools/report-v1.schema.json +43 -0
  6. package/bundled-contracts/maggie-assistant-tools/tool-registry-example-v1.json +249 -11
  7. package/bundled-contracts/maggie-assistant-tools/tool-registry-v1.schema.json +175 -0
  8. package/bundled-contracts/maggie-deployment/readiness-v1.schema.json +2 -1
  9. package/bundled-contracts/maggie-ops/agent-routines-v1.schema.json +48 -0
  10. package/bundled-contracts/maggie-security/finding-example-v1.json +89 -0
  11. package/bundled-contracts/maggie-security/finding-v1.schema.json +63 -0
  12. package/bundled-contracts/maggie-security/findings-set-example-v1.json +148 -0
  13. package/bundled-contracts/maggie-security/findings-set-v1.schema.json +32 -0
  14. package/bundled-contracts/maggie-security/protect-plan-v1.schema.json +28 -0
  15. package/bundled-contracts/maggie-security/report-v1.schema.json +29 -0
  16. package/bundled-contracts/maggie-security/stack-example-v1.json +66 -0
  17. package/bundled-contracts/maggie-security/stack-upload-v1.schema.json +22 -0
  18. package/bundled-contracts/maggie-security/stack-v1.schema.json +37 -0
  19. package/bundled-contracts/maggie-security/tools-lock-v1.schema.json +36 -0
  20. package/bundled-skills/catalog.json +5 -1
  21. package/bundled-skills/maggie-assistant-tools/SKILL.md +34 -1
  22. package/bundled-skills/maggie-assistant-tools/references/report-inbox.md +45 -0
  23. package/bundled-skills/maggie-assistant-tools/references/unattended-agents.md +70 -0
  24. package/bundled-skills/maggie-blog/SKILL.md +9 -2
  25. package/bundled-skills/maggie-booking/SKILL.md +1 -1
  26. package/bundled-skills/maggie-dash/SKILL.md +9 -0
  27. package/bundled-skills/maggie-deployment/SKILL.md +77 -1
  28. package/bundled-skills/maggie-deployment/references/vps.md +5 -0
  29. package/bundled-skills/maggie-marketplace/SKILL.md +21 -1
  30. package/bundled-skills/maggie-ops/SKILL.md +28 -0
  31. package/bundled-skills/maggie-ops/references/agents-repository.md +108 -0
  32. package/bundled-skills/maggie-ops/references/ops-autopilot.md +65 -0
  33. package/bundled-skills/maggie-ops/references/routine-mode.md +92 -0
  34. package/bundled-skills/maggie-security/SKILL.md +172 -0
  35. package/bundled-skills/maggie-security/agents/openai.yaml +4 -0
  36. package/bundled-skills/maggie-security/data/LICENSE-NOTICE.md +24 -0
  37. package/bundled-skills/maggie-security/data/asvs-map.json +209 -0
  38. package/bundled-skills/maggie-security/data/fail2ban/filter.d/maggie-wordpress.conf +6 -0
  39. package/bundled-skills/maggie-security/data/semgrep/LICENSE-NOTICE.md +5 -0
  40. package/bundled-skills/maggie-security/data/semgrep/VERSION +1 -0
  41. package/bundled-skills/maggie-security/data/semgrep/rules/dockerfile.yaml +14 -0
  42. package/bundled-skills/maggie-security/data/semgrep/rules/generic.yaml +26 -0
  43. package/bundled-skills/maggie-security/data/semgrep/rules/js.yaml +216 -0
  44. package/bundled-skills/maggie-security/data/semgrep/rules/php-debug-ok.yaml +17 -0
  45. package/bundled-skills/maggie-security/data/semgrep/rules/php-debug.yaml +17 -0
  46. package/bundled-skills/maggie-security/data/semgrep/rules/php.yaml +101 -0
  47. package/bundled-skills/maggie-security/data/semgrep/tests/dockerfile.dockerfile +10 -0
  48. package/bundled-skills/maggie-security/data/semgrep/tests/generic.astro +11 -0
  49. package/bundled-skills/maggie-security/data/semgrep/tests/generic.conf +11 -0
  50. package/bundled-skills/maggie-security/data/semgrep/tests/js.jsx +95 -0
  51. package/bundled-skills/maggie-security/data/semgrep/tests/php-debug-ok.php +5 -0
  52. package/bundled-skills/maggie-security/data/semgrep/tests/php-debug.php +3 -0
  53. package/bundled-skills/maggie-security/data/semgrep/tests/php.php +55 -0
  54. package/bundled-skills/maggie-security/evals/evals.json +97 -0
  55. package/bundled-skills/maggie-security/references/commands.md +111 -0
  56. package/bundled-skills/maggie-security/references/cve-response.md +24 -0
  57. package/bundled-skills/maggie-security/references/explaining-findings.md +57 -0
  58. package/bundled-skills/maggie-security/references/findings.md +39 -0
  59. package/bundled-skills/maggie-security/references/ownership-and-consent.md +29 -0
  60. package/bundled-skills/maggie-security/references/site-types.md +22 -0
  61. package/bundled-skills/maggie-security/references/tools-and-licences.md +16 -0
  62. package/bundled-skills/maggie-security/references/workflows.md +23 -0
  63. package/bundled-skills/maggie-security/registry/security-tools.registry.json +628 -0
  64. package/bundled-skills/maggie-security/routines.example.json +27 -0
  65. package/bundled-skills/maggie-seo-geo/SKILL.md +9 -1
  66. package/bundled-skills/maggie-social-share/SKILL.md +20 -0
  67. package/bundled-tools/clis/maggie.py +63 -3
  68. package/bundled-tools/clis/maggie_assistant_tools.py +225 -1
  69. package/bundled-tools/clis/maggie_deployment_readiness.py +17 -2
  70. package/bundled-tools/clis/maggie_host_runtime.py +458 -0
  71. package/bundled-tools/clis/maggie_live_urls.py +11 -2
  72. package/bundled-tools/clis/maggie_ops.py +2 -0
  73. package/bundled-tools/clis/maggie_ops_routines.py +352 -0
  74. package/bundled-tools/clis/maggie_query_ideas.py +154 -0
  75. package/bundled-tools/clis/maggie_security.py +342 -0
  76. package/bundled-tools/clis/maggie_security_agent.py +326 -0
  77. package/bundled-tools/clis/maggie_security_code.py +650 -0
  78. package/bundled-tools/clis/maggie_security_core.py +1512 -0
  79. package/bundled-tools/clis/maggie_security_deps.py +560 -0
  80. package/bundled-tools/clis/maggie_security_health.py +415 -0
  81. package/bundled-tools/clis/maggie_security_host.py +511 -0
  82. package/bundled-tools/clis/maggie_security_hosted.py +115 -0
  83. package/bundled-tools/clis/maggie_security_intel.py +1294 -0
  84. package/bundled-tools/clis/maggie_security_inventory.py +1023 -0
  85. package/bundled-tools/clis/maggie_security_logs.py +777 -0
  86. package/bundled-tools/clis/maggie_security_mcp.py +473 -0
  87. package/bundled-tools/clis/maggie_security_mirror.py +122 -0
  88. package/bundled-tools/clis/maggie_security_protect.py +519 -0
  89. package/bundled-tools/clis/maggie_security_report.py +506 -0
  90. package/bundled-tools/clis/maggie_security_standards.py +214 -0
  91. package/bundled-tools/clis/maggie_security_versions.py +381 -0
  92. package/bundled-tools/clis/maggie_security_web.py +936 -0
  93. package/bundled-tools/clis/maggie_skill_catalog.py +16 -2
  94. package/bundled-tools/clis/maggie_social_share.py +101 -1
  95. package/bundled-tools/clis/maggie_version_sources.py +93 -0
  96. package/bundled-tools/clis/security_data/eol-snapshot.json +1 -0
  97. package/bundled-tools/clis/security_data/gitleaks-rules.json +3812 -0
  98. package/bundled-tools/clis/security_data/maltrail-lists.json +1 -0
  99. package/bundled-tools/clis/security_data/public-suffix-icann.txt +7374 -0
  100. package/bundled-tools/clis/security_data/retire-extractors.json +695 -0
  101. package/bundled-tools/clis/security_data/sigma-web.json +6514 -0
  102. package/bundled-tools/clis/security_data/tools.lock.json +358 -0
  103. package/bundled-tools/integrations/maggie-api-pull.md +28 -1
  104. package/package.json +1 -1
@@ -0,0 +1,358 @@
1
+ {
2
+ "schema": "maggie-security-tools-lock.v1",
3
+ "updated": "2026-10-24",
4
+ "tools": {
5
+ "osv-scanner": {
6
+ "version": "2.6.0",
7
+ "licence": "Apache-2.0",
8
+ "class": "bundle-ok",
9
+ "homepage": "https://github.com/google/osv-scanner",
10
+ "version_args": [
11
+ "--version"
12
+ ],
13
+ "assets": {
14
+ "linux-amd64": {
15
+ "url": "https://github.com/google/osv-scanner/releases/download/v2.6.0/osv-scanner_linux_amd64",
16
+ "sha256": "ca69b3d3cd08f889a49dc0a383122f71cc528b83803671df5fd874d97485b108",
17
+ "archive": "none"
18
+ },
19
+ "linux-arm64": {
20
+ "url": "https://github.com/google/osv-scanner/releases/download/v2.6.0/osv-scanner_linux_arm64",
21
+ "sha256": "2c71403eb443d05891c4f268c3ad771cf4f16e5443463fd7851ef8f454d3c7e4",
22
+ "archive": "none"
23
+ },
24
+ "darwin-arm64": {
25
+ "url": "https://github.com/google/osv-scanner/releases/download/v2.6.0/osv-scanner_darwin_arm64",
26
+ "sha256": "98c460dcd37de25819babd757d04542045b6243113e209edcd4d89fedb0256b4",
27
+ "archive": "none"
28
+ },
29
+ "darwin-amd64": {
30
+ "url": "https://github.com/google/osv-scanner/releases/download/v2.6.0/osv-scanner_darwin_amd64",
31
+ "sha256": "60c5296637e977b28eeda5c7f13573e447659a632922737f94d11fa7e30ad6ca",
32
+ "archive": "none"
33
+ }
34
+ },
35
+ "required_flags": [],
36
+ "forbidden_flags": [
37
+ "fix",
38
+ "--experimental-call-analysis"
39
+ ],
40
+ "notes": "sha256 from upstream osv-scanner_SHA256SUMS (v2.6.0, published 2026-09-14; v2.7.0 skipped by the 14-day cooldown)."
41
+ },
42
+ "gitleaks": {
43
+ "version": "8.30.1",
44
+ "licence": "MIT",
45
+ "class": "bundle-ok",
46
+ "homepage": "https://github.com/gitleaks/gitleaks",
47
+ "version_args": [
48
+ "version"
49
+ ],
50
+ "assets": {
51
+ "linux-amd64": {
52
+ "url": "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz",
53
+ "sha256": "551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb",
54
+ "archive": "tar.gz",
55
+ "member": "gitleaks"
56
+ },
57
+ "linux-arm64": {
58
+ "url": "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_arm64.tar.gz",
59
+ "sha256": "e4a487ee7ccd7d3a7f7ec08657610aa3606637dab924210b3aee62570fb4b080",
60
+ "archive": "tar.gz",
61
+ "member": "gitleaks"
62
+ },
63
+ "darwin-arm64": {
64
+ "url": "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_darwin_arm64.tar.gz",
65
+ "sha256": "b40ab0ae55c505963e365f271a8d3846efbc170aa17f2607f13df610a9aeb6a5",
66
+ "archive": "tar.gz",
67
+ "member": "gitleaks"
68
+ },
69
+ "darwin-amd64": {
70
+ "url": "https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_darwin_x64.tar.gz",
71
+ "sha256": "dfe101a4db2255fc85120ac7f3d25e4342c3c20cf749f2c20a18081af1952709",
72
+ "archive": "tar.gz",
73
+ "member": "gitleaks"
74
+ }
75
+ },
76
+ "required_flags": [
77
+ "--no-banner",
78
+ "--redact"
79
+ ],
80
+ "forbidden_flags": [],
81
+ "notes": "sha256 from upstream gitleaks_8.30.1_checksums.txt. --redact keeps values out of its report."
82
+ },
83
+ "retire": {
84
+ "version": "5.3.0",
85
+ "licence": "Apache-2.0",
86
+ "class": "bundle-ok",
87
+ "homepage": "https://github.com/RetireJS/retire.js",
88
+ "binary": "retire",
89
+ "version_args": [
90
+ "--version"
91
+ ],
92
+ "required_flags": [],
93
+ "forbidden_flags": [],
94
+ "notes": "npm package; run with: npx --yes retire@5.3.0. No standalone binary."
95
+ },
96
+ "nuclei": {
97
+ "version": "3.4.10",
98
+ "licence": "MIT",
99
+ "class": "bundle-ok",
100
+ "homepage": "https://github.com/projectdiscovery/nuclei",
101
+ "version_args": [
102
+ "-version"
103
+ ],
104
+ "assets": {
105
+ "linux-amd64": {
106
+ "url": "https://github.com/projectdiscovery/nuclei/releases/download/v3.4.10/nuclei_3.4.10_linux_amd64.zip",
107
+ "sha256": "UNPINNED",
108
+ "archive": "zip",
109
+ "member": "nuclei"
110
+ }
111
+ },
112
+ "required_flags": [
113
+ "-ni",
114
+ "-duc",
115
+ "-omit-raw",
116
+ "-silent"
117
+ ],
118
+ "forbidden_flags": [
119
+ "-ai",
120
+ "-llm",
121
+ "-dashboard",
122
+ "-pd",
123
+ "-pdu",
124
+ "-auth",
125
+ "-team-id",
126
+ "-interactsh-server",
127
+ "-iserver",
128
+ "-cloud-upload"
129
+ ],
130
+ "notes": "-ni disables OAST (interactsh) traffic to third parties; -duc disables update checks."
131
+ },
132
+ "httpx": {
133
+ "version": "1.7.1",
134
+ "licence": "MIT",
135
+ "class": "bundle-ok",
136
+ "homepage": "https://github.com/projectdiscovery/httpx",
137
+ "assets": {
138
+ "linux-amd64": {
139
+ "url": "https://github.com/projectdiscovery/httpx/releases/download/v1.7.1/httpx_1.7.1_linux_amd64.zip",
140
+ "sha256": "UNPINNED",
141
+ "archive": "zip",
142
+ "member": "httpx"
143
+ }
144
+ },
145
+ "required_flags": [
146
+ "-duc",
147
+ "-silent"
148
+ ],
149
+ "forbidden_flags": [
150
+ "-pd",
151
+ "-dashboard",
152
+ "-auth"
153
+ ]
154
+ },
155
+ "semgrep": {
156
+ "version": "1.180.0",
157
+ "licence": "LGPL-2.1",
158
+ "class": "external-only",
159
+ "homepage": "https://github.com/semgrep/semgrep",
160
+ "version_args": [
161
+ "--version"
162
+ ],
163
+ "required_flags": [
164
+ "--metrics=off",
165
+ "--disable-version-check"
166
+ ],
167
+ "forbidden_flags": [
168
+ "--config=auto",
169
+ "--config=p/",
170
+ "--config=r/",
171
+ "login",
172
+ "ci",
173
+ "publish",
174
+ "--pro"
175
+ ],
176
+ "env": {
177
+ "SEMGREP_SEND_METRICS": "off"
178
+ },
179
+ "notes": "LGPL-2.1: installed by the person (pipx install semgrep==1.180.0); Maggie calls it as a separate process with --metrics=off and only the packaged Maggie rule pack or local rule folders.",
180
+ "flags_after_subcommand": true
181
+ },
182
+ "testssl.sh": {
183
+ "version": "3.2.1",
184
+ "licence": "GPL-2.0",
185
+ "class": "external-only",
186
+ "homepage": "https://github.com/testssl/testssl.sh",
187
+ "binary": "testssl.sh",
188
+ "required_flags": [
189
+ "--quiet"
190
+ ],
191
+ "forbidden_flags": [
192
+ "--phone-out"
193
+ ],
194
+ "notes": "GPL: download from upstream yourself; Maggie calls it as a separate process."
195
+ },
196
+ "lynis": {
197
+ "version": "3.1.5",
198
+ "licence": "GPL-3.0",
199
+ "class": "external-only",
200
+ "homepage": "https://github.com/CISOfy/lynis",
201
+ "required_flags": [],
202
+ "forbidden_flags": [
203
+ "--upload"
204
+ ],
205
+ "notes": "GPL: run from the upstream tarball on the host; never vendored."
206
+ },
207
+ "goaccess": {
208
+ "version": "1.9.4",
209
+ "licence": "MIT",
210
+ "class": "external-only",
211
+ "homepage": "https://github.com/allinurl/goaccess",
212
+ "required_flags": [],
213
+ "forbidden_flags": [
214
+ "--real-time-html",
215
+ "--daemonize"
216
+ ],
217
+ "notes": "Install with the OS package manager (apt install goaccess)."
218
+ },
219
+ "lnav": {
220
+ "version": "0.13.2",
221
+ "licence": "BSD-2-Clause",
222
+ "class": "external-only",
223
+ "homepage": "https://github.com/tstack/lnav",
224
+ "required_flags": [
225
+ "-n"
226
+ ],
227
+ "forbidden_flags": []
228
+ },
229
+ "syft": {
230
+ "version": "1.33.0",
231
+ "licence": "Apache-2.0",
232
+ "class": "bundle-ok",
233
+ "homepage": "https://github.com/anchore/syft",
234
+ "assets": {
235
+ "linux-amd64": {
236
+ "url": "https://github.com/anchore/syft/releases/download/v1.33.0/syft_1.33.0_linux_amd64.tar.gz",
237
+ "sha256": "UNPINNED",
238
+ "archive": "tar.gz",
239
+ "member": "syft"
240
+ }
241
+ },
242
+ "required_flags": [],
243
+ "forbidden_flags": [],
244
+ "env": {
245
+ "SYFT_CHECK_FOR_APP_UPDATE": "false"
246
+ }
247
+ },
248
+ "grype": {
249
+ "version": "0.100.0",
250
+ "licence": "Apache-2.0",
251
+ "class": "bundle-ok",
252
+ "homepage": "https://github.com/anchore/grype",
253
+ "assets": {
254
+ "linux-amd64": {
255
+ "url": "https://github.com/anchore/grype/releases/download/v0.100.0/grype_0.100.0_linux_amd64.tar.gz",
256
+ "sha256": "UNPINNED",
257
+ "archive": "tar.gz",
258
+ "member": "grype"
259
+ }
260
+ },
261
+ "required_flags": [],
262
+ "forbidden_flags": [],
263
+ "env": {
264
+ "GRYPE_CHECK_FOR_APP_UPDATE": "false"
265
+ }
266
+ },
267
+ "trivy": {
268
+ "version": "0.67.2",
269
+ "licence": "Apache-2.0",
270
+ "class": "bundle-ok",
271
+ "homepage": "https://github.com/aquasecurity/trivy",
272
+ "assets": {
273
+ "linux-amd64": {
274
+ "url": "https://github.com/aquasecurity/trivy/releases/download/v0.67.2/trivy_0.67.2_Linux-64bit.tar.gz",
275
+ "sha256": "UNPINNED",
276
+ "archive": "tar.gz",
277
+ "member": "trivy"
278
+ }
279
+ },
280
+ "required_flags": [
281
+ "--quiet"
282
+ ],
283
+ "forbidden_flags": [
284
+ "--server"
285
+ ]
286
+ },
287
+ "dockle": {
288
+ "version": "0.4.15",
289
+ "licence": "Apache-2.0",
290
+ "class": "bundle-ok",
291
+ "homepage": "https://github.com/goodwithtech/dockle",
292
+ "required_flags": [],
293
+ "forbidden_flags": []
294
+ },
295
+ "gatus": {
296
+ "version": "5.26.0",
297
+ "licence": "Apache-2.0",
298
+ "class": "bundle-ok",
299
+ "homepage": "https://github.com/TwiN/gatus",
300
+ "required_flags": [],
301
+ "forbidden_flags": [],
302
+ "notes": "Deployed as a container by uptime-deploy; not run locally."
303
+ },
304
+ "skillspector": {
305
+ "version": "2.12.0",
306
+ "licence": "Apache-2.0",
307
+ "class": "external-only",
308
+ "homepage": "https://github.com/NVIDIA/SkillSpector",
309
+ "required_flags": [
310
+ "--no-llm"
311
+ ],
312
+ "forbidden_flags": [
313
+ "--llm",
314
+ "--semantic",
315
+ "--provider"
316
+ ],
317
+ "binary": "skillspector",
318
+ "flags_after_subcommand": true,
319
+ "notes": "Apache-2.0, Python 3.12+: install it yourself with `pipx install --python python3.12 skillspector==2.12.0` (or `uv tool install skillspector==2.12.0`). Maggie forces --no-llm."
320
+ },
321
+ "bumblebee": {
322
+ "version": "0.1.0",
323
+ "licence": "MIT",
324
+ "class": "bundle-ok",
325
+ "homepage": "https://github.com/perplexityai/bumblebee",
326
+ "required_flags": [],
327
+ "forbidden_flags": []
328
+ },
329
+ "npq": {
330
+ "version": "3.8.0",
331
+ "licence": "Apache-2.0",
332
+ "class": "bundle-ok",
333
+ "homepage": "https://github.com/lirantal/npq",
334
+ "required_flags": [
335
+ "--dry-run"
336
+ ],
337
+ "forbidden_flags": [],
338
+ "notes": "npm package; run with npx --yes npq@3.8.0 --dry-run."
339
+ },
340
+ "trufflehog": {
341
+ "version": "n/a",
342
+ "licence": "AGPL-3.0",
343
+ "class": "reference-only",
344
+ "homepage": "https://github.com/trufflesecurity/trufflehog",
345
+ "notes": "Design reference only; gitleaks is the secrets scanner."
346
+ },
347
+ "maggie-waf-replay": {
348
+ "version": "0.1.0",
349
+ "licence": "MIT (Coraza and OWASP CRS: Apache-2.0)",
350
+ "class": "bundle-ok",
351
+ "binary": "maggie-waf-replay",
352
+ "homepage": "tools/go/waf-replay",
353
+ "required_flags": [],
354
+ "forbidden_flags": [],
355
+ "notes": "Built from tools/go/waf-replay (go build -trimpath). Release CI is to publish per-platform assets with sha256 here; until then build it yourself and put it on PATH."
356
+ }
357
+ }
358
+ }
@@ -89,13 +89,40 @@ back to an older stored URL, which after a platform move answers 404. So:
89
89
  `maggie blog live-urls match --sitemap https://example.com/sitemap.xml --write --report-body .maggie/live-urls-report.json`,
90
90
  then send that body with `maggie api report-state --body-file … --execute`.
91
91
 
92
- Matching is **additive**: a post that already has a live URL keeps it, and a
92
+ Every post without a live URL is a candidate, including one already tracked
93
+ with an empty value; when the record has no slug, the last path segment of its
94
+ delivered address is used. Matching is **additive**: a post that already has a live URL keeps it, and a
93
95
  post this run did not find is left as it was — never marked unmatched — so the
94
96
  match can run daily without retiring earlier matches. When translated copies
95
97
  share the slug (`/blog/x`, `/zh-hans/blog/x`), the URL **without a locale
96
98
  segment** wins. The same two rules apply to the platform's own sitemap
97
99
  matching for API Pull destinations.
98
100
 
101
+ ## Rewrites on pull sites
102
+
103
+ A pull site receives rewrites the same way it receives posts: `GET /updates`
104
+ on the same schedule as `/posts` (one rewrite per call, charged like a post;
105
+ the answer is `{delivered, updates: [...]}`). Without this path a rewrite
106
+ requested for a pulled post never reaches the site. Each rewrite is applied to
107
+ the post it is for, never stored as a new post:
108
+
109
+ 1. Find the post by `source_content_id` (the id `/posts` delivered it under),
110
+ else by its slug or address, previous slugs included.
111
+ 2. Replace only the body. Title, slug, status, topics and the live URL stay as
112
+ the site has them.
113
+ 3. Keep the replaced body (and its checksum) so the rewrite can be undone.
114
+ 4. A rewrite with `publication_status: "draft"` is held for review, and one
115
+ with no matching post here is kept as `unmatched`; neither is applied.
116
+ 5. Translations of a rewritten post are stale: queue them again.
117
+ 6. Report the outcome with `POST /content-tracking/report-state`.
118
+
119
+ `maggie api lifecycle --execute --allow-quota --pull-updates` does steps 1, 2,
120
+ 4 locally: the rewrite lands on the original record in
121
+ `.maggie/ai-cmo-lifecycle.json` (`rewrite_pending`, a `rewrites` history with
122
+ the previous checksum), held ones are listed without changing the body, and
123
+ unmatched ones go to `rewrites_unmatched`. A later `/posts` re-delivery keeps
124
+ the record's live URL and rewrite history.
125
+
99
126
  ## Project context synchronization
100
127
 
101
128
  `GET /project-context` returns sanitized, read-only context scoped by the API
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topy-ai/maggie",
3
- "version": "0.7.54",
3
+ "version": "0.7.56",
4
4
  "description": "Install and manage Maggie Skills for AI coding agents",
5
5
  "license": "MIT",
6
6
  "type": "module",