@topy-ai/maggie 0.7.15 → 0.7.16

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 CHANGED
@@ -247,8 +247,8 @@ artifact schemas.
247
247
  Recommended upgrade sequence for the current release:
248
248
 
249
249
  ```bash
250
- npx @topy-ai/maggie@0.7.15 update --project . --force
251
- npx @topy-ai/maggie@0.7.15 cleanup --project .
250
+ npx @topy-ai/maggie@0.7.16 update --project . --force
251
+ npx @topy-ai/maggie@0.7.16 cleanup --project .
252
252
  ```
253
253
 
254
254
  Maintainers should pass npm credentials through the repository helper, never
@@ -258,7 +258,8 @@ as a command-line argument:
258
258
  node scripts/publish-npm.mjs --maggie-env-file ../.env
259
259
  ```
260
260
 
261
- The 0.7.15 workflow adds API contracts, blog review gates, sitemap freshness,
261
+ The 0.7.16 workflow tightens the review-gate exit code and adds retry-path
262
+ regression coverage. The 0.7.15 workflow added API contracts, blog review gates, sitemap freshness,
262
263
  change-driven IndexNow, and page-kind/source-coverage inventory. It also keeps
263
264
  the general `maggie-qa-workflow` skill and `maggie qa`
264
265
  CLI for scenario manifests, secret-free browser evidence metadata, test/fix/
package/README.zh-TW.md CHANGED
@@ -8,7 +8,7 @@ Codex、Claude Code 與相容的 coding agents。
8
8
  ## 安裝
9
9
 
10
10
  ```bash
11
- npx @topy-ai/maggie@0.7.15 init --agent all
11
+ npx @topy-ai/maggie@0.7.16 init --agent all
12
12
  npx @topy-ai/maggie doctor --project .
13
13
  ```
14
14
 
@@ -25,6 +25,7 @@ maggie doctor --project . --require-bootstrap --strict
25
25
  deployment、memory、feedback 和 MaggieDash。內容先 draft/review,外部寫入、
26
26
  publish 與 production deployment 需要明確確認。
27
27
 
28
+ 0.7.16 補強 review gate 的 CI exit code 與 IndexNow retry regression;
28
29
  0.7.15 也加入 API schema contract、blog review gate、sitemap freshness
29
30
  warning、change-driven IndexNow 與 page-kind/source-coverage inventory。
30
31
 
@@ -64,6 +64,8 @@ def main() -> int:
64
64
  print(json.dumps(result, indent=2, ensure_ascii=False))
65
65
  if args.command in {"ingest", "translate-pending"} and result.get("status") == "partial":
66
66
  return 1
67
+ if args.command == "check-gate":
68
+ return 0 if result.get("passed") else 1
67
69
  return 0 if args.command != "validate" or result.get("valid") else 1
68
70
 
69
71
 
@@ -122,7 +122,8 @@ def submit_plan(plan: dict[str, Any], state: dict[str, Any], endpoint: str) -> d
122
122
  if accepted:
123
123
  stamp = _iso(_now())
124
124
  entries.extend({"url": url, "statusCode": status_code, "acceptedAt": stamp, "batchId": hashlib.sha256((stamp + url).encode()).hexdigest()[:12]} for url in urls)
125
- state.update({"schemaVersion": SCHEMA, "submissions": entries})
125
+ if accepted:
126
+ state.update({"schemaVersion": SCHEMA, "submissions": entries})
126
127
  return {"schemaVersion": SCHEMA, "status": "accepted" if accepted else "retryable-failure" if retryable else "failed",
127
128
  "submitted": len(urls), "accepted": len(urls) if accepted else 0, "statusCode": status_code,
128
129
  "retryable": retryable, "failure": failure, "mutation": True}
@@ -130,7 +130,12 @@ def classify_inventory(value: object, *, require_page_kinds: bool = False, requi
130
130
  if path in seen:
131
131
  errors.append(f"duplicate inventory path: {path}")
132
132
  seen.add(path)
133
- explicit = str(page.get("rendererKind") or page.get("rendering") or page.get("kind") or page.get("classification") or "").casefold()
133
+ explicit_kind = str(page.get("kind") or "").casefold()
134
+ # `kind` was historically the renderer field, but the page-kind
135
+ # vocabulary is also accepted for compact host inventories. In that
136
+ # case infer the renderer from sections/source and keep the axes apart.
137
+ renderer_value = page.get("rendererKind") or page.get("rendering") or (None if explicit_kind in PAGE_KINDS else page.get("kind"))
138
+ explicit = str(renderer_value or page.get("classification") or "").casefold()
134
139
  if explicit in {"code", "code-rendered", "component", "source"}:
135
140
  kind = "code-rendered"
136
141
  elif explicit in {"band", "section", "sections"}:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topy-ai/maggie",
3
- "version": "0.7.15",
3
+ "version": "0.7.16",
4
4
  "description": "Install and manage Maggie Skills for AI coding agents",
5
5
  "license": "MIT",
6
6
  "type": "module",