@contentrain/skills 0.9.5 → 0.9.6
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentrain/skills",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.6",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "AI agent skills for Contentrain — workflow procedures, framework integration guides",
|
|
6
6
|
"type": "module",
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"tsdown": "^0.21.0",
|
|
62
62
|
"typescript": "^5.7.0",
|
|
63
63
|
"vitest": "^3.0.0",
|
|
64
|
-
"@contentrain/mcp": "3.
|
|
64
|
+
"@contentrain/mcp": "3.10.1",
|
|
65
65
|
"@contentrain/rules": "0.7.3",
|
|
66
|
-
"@contentrain/wp-import": "0.
|
|
66
|
+
"@contentrain/wp-import": "0.13.0"
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "tsdown src/index.ts --format esm,cjs --dts",
|
|
@@ -36,9 +36,11 @@ REST returns more than WXR (rendered HTML, media metadata, per-type discovery);
|
|
|
36
36
|
**Private or partial REST.** A site can answer `/wp-json` but hide drafts, private types and some fields. An Application Password lifts the run to `rest_auth`:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
npx contentrain import https://example.com --auth
|
|
39
|
+
CONTENTRAIN_WP_APP_PASSWORD="xxxx xxxx xxxx xxxx" npx contentrain import https://example.com --auth user
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
Ask the user to set the password in the environment (or run the command themselves for the hidden prompt). Never put `user:password` on the command line: it lands in shell history. A WXR import leaves author and commenter e-mail addresses out of the store; add `--include-emails` only when the user asks and the repository stays private.
|
|
43
|
+
|
|
42
44
|
Check first, so you tell the user what they will get rather than discovering it after:
|
|
43
45
|
|
|
44
46
|
```bash
|
|
@@ -76,7 +78,7 @@ Open `import-report.json` and tell the user what it says. These fields decide wh
|
|
|
76
78
|
| `title_fallback` | Entries that had no title | They exist but are unlabelled; worth a pass |
|
|
77
79
|
| `acf_fields` / `meta_fields` | Custom fields found and their inferred types | Verify the types match intent before content is edited |
|
|
78
80
|
|
|
79
|
-
**Known gap:** post bodies carry Gutenberg block
|
|
81
|
+
**Known gap:** post bodies carry shortcodes (`[gallery]`) verbatim: WordPress syntax, not portable content. Gutenberg block delimiters are stripped (the markup stays); self-closing server-rendered blocks (`wp:latest-posts`, `wp:block`) leave nothing and are counted in `blocks_dynamic_dropped`. Say so — do not present the import as clean markup when shortcodes remain.
|
|
80
82
|
|
|
81
83
|
### 4. Validate
|
|
82
84
|
|
|
@@ -76,7 +76,7 @@ Inferred types are a guess from one value. Check `meta_fields` and `acf_fields`
|
|
|
76
76
|
|
|
77
77
|
## What is not imported
|
|
78
78
|
|
|
79
|
-
Post types matching `attachment|nav_menu_item|wp_*|jp_*|pattern|revision|oembed_cache|customize_changeset|user_request|custom_css` are skipped and listed in `report.skipped_types`, and so are theme / page-builder internals that store design rather than content: GeneratePress elements (`gp_elements`, `gp-elements`), GenerateBlocks styles (`gblocks_*`, `gblocks-*`), Elementor templates (`elementor_library
|
|
79
|
+
Post types matching `attachment|nav_menu_item|wp_*|jp_*|pattern|revision|oembed_cache|customize_changeset|user_request|custom_css` are skipped and listed in `report.skipped_types`, and so are theme / page-builder internals that store design rather than content: GeneratePress elements (`gp_elements`, `gp-elements`), GenerateBlocks styles (`gblocks_*`, `gblocks-*`), Elementor templates (`elementor_library`) and form definitions (`wpcf7_contact_form`, `wpforms*`). Elementor landing pages (`e-landing-page`) are not internals: they are public pages at `/<slug>/`, so they import as `page` — into the `pages` model, with their slug, permalink (`link`) and meta, sharing the page address space (a clash gets the usual slug move). Over REST the type is listed only when it is `show_in_rest`; a site that hides it must be imported from a WXR export. Membership and other content-bearing CPTs stay; ACF field records stay too, since their cross-model parents are part of the lossless import. Attachments are not skipped content — they arrive as the `media` collection.
|
|
80
80
|
|
|
81
81
|
Also outside the import: themes, widgets, plugin settings, users' passwords and roles, and the media **files** themselves (only their metadata and URLs come across).
|
|
82
82
|
|
|
@@ -90,6 +90,6 @@ A relation whose target was not part of the import (a comment on a skipped post
|
|
|
90
90
|
|
|
91
91
|
## Known gaps
|
|
92
92
|
|
|
93
|
-
- **Gutenberg
|
|
93
|
+
- **Gutenberg block delimiters** (`<!-- wp:… -->`, `<!-- /wp:… -->`) are stripped from `body`; the markup inside every block stays. Self-closing, server-rendered blocks (`wp:latest-posts`, `wp:block`, `wp:query`) hold no markup and disappear: `blocks_dynamic_dropped` in the report counts them by name. **Shortcodes** (`[gallery]`) stay verbatim in `body`; converting them is a separate pass.
|
|
94
94
|
- **Media files** stay on the old host until moved.
|
|
95
95
|
- **Redirects** are not generated. `slug_rewritten` + `slug_fallback` in the report say how many URLs changed.
|