@jahia/agentic 0.2.0 → 0.3.0

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 (101) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +28 -0
  3. package/dist/claude/.claude/skills/jahia/SKILL.md +18 -10
  4. package/dist/claude/.claude/skills/jahia-content/SKILL.md +102 -84
  5. package/dist/claude/.claude/skills/jahia-content-create-content/SKILL.md +255 -280
  6. package/dist/claude/.claude/skills/jahia-content-explore-structure/SKILL.md +187 -96
  7. package/dist/claude/.claude/skills/jahia-content-media-upload/SKILL.md +197 -0
  8. package/dist/claude/.claude/skills/jahia-content-move-content/SKILL.md +160 -165
  9. package/dist/claude/.claude/skills/jahia-content-organize/SKILL.md +209 -0
  10. package/dist/claude/.claude/skills/jahia-content-publish/SKILL.md +181 -0
  11. package/dist/claude/.claude/skills/jahia-content-query-content/SKILL.md +122 -92
  12. package/dist/claude/.claude/skills/jahia-content-translate-content/SKILL.md +154 -225
  13. package/dist/claude/.claude/skills/jahia-dev-cypress/SKILL.md +150 -330
  14. package/dist/claude/.claude/skills/jahia-dev-query-content/SKILL.md +93 -296
  15. package/dist/claude/.claude/skills/jahia-jcr-sql2/SKILL.md +258 -0
  16. package/dist/claude/CLAUDE.md +1 -7
  17. package/dist/codex/.agents/skills/jahia/SKILL.md +18 -10
  18. package/dist/codex/.agents/skills/jahia-content/SKILL.md +102 -84
  19. package/dist/codex/.agents/skills/jahia-content-create-content/SKILL.md +255 -280
  20. package/dist/codex/.agents/skills/jahia-content-explore-structure/SKILL.md +187 -96
  21. package/dist/codex/.agents/skills/jahia-content-media-upload/SKILL.md +197 -0
  22. package/dist/codex/.agents/skills/jahia-content-move-content/SKILL.md +160 -165
  23. package/dist/codex/.agents/skills/jahia-content-organize/SKILL.md +209 -0
  24. package/dist/codex/.agents/skills/jahia-content-publish/SKILL.md +181 -0
  25. package/dist/codex/.agents/skills/jahia-content-query-content/SKILL.md +122 -92
  26. package/dist/codex/.agents/skills/jahia-content-translate-content/SKILL.md +154 -225
  27. package/dist/codex/.agents/skills/jahia-dev-cypress/SKILL.md +150 -330
  28. package/dist/codex/.agents/skills/jahia-dev-query-content/SKILL.md +93 -296
  29. package/dist/codex/.agents/skills/jahia-jcr-sql2/SKILL.md +258 -0
  30. package/dist/codex/AGENTS.md +2 -4
  31. package/dist/copilot/.agents/skills/jahia/SKILL.md +18 -10
  32. package/dist/copilot/.agents/skills/jahia-content/SKILL.md +102 -84
  33. package/dist/copilot/.agents/skills/jahia-content-create-content/SKILL.md +255 -280
  34. package/dist/copilot/.agents/skills/jahia-content-explore-structure/SKILL.md +187 -96
  35. package/dist/copilot/.agents/skills/jahia-content-media-upload/SKILL.md +197 -0
  36. package/dist/copilot/.agents/skills/jahia-content-move-content/SKILL.md +160 -165
  37. package/dist/copilot/.agents/skills/jahia-content-organize/SKILL.md +209 -0
  38. package/dist/copilot/.agents/skills/jahia-content-publish/SKILL.md +181 -0
  39. package/dist/copilot/.agents/skills/jahia-content-query-content/SKILL.md +122 -92
  40. package/dist/copilot/.agents/skills/jahia-content-translate-content/SKILL.md +154 -225
  41. package/dist/copilot/.agents/skills/jahia-dev-cypress/SKILL.md +150 -330
  42. package/dist/copilot/.agents/skills/jahia-dev-query-content/SKILL.md +93 -296
  43. package/dist/copilot/.agents/skills/jahia-jcr-sql2/SKILL.md +258 -0
  44. package/dist/copilot/AGENTS.md +2 -4
  45. package/dist/cursor/.agents/skills/jahia/SKILL.md +18 -10
  46. package/dist/cursor/.agents/skills/jahia-content/SKILL.md +102 -84
  47. package/dist/cursor/.agents/skills/jahia-content-create-content/SKILL.md +255 -280
  48. package/dist/cursor/.agents/skills/jahia-content-explore-structure/SKILL.md +187 -96
  49. package/dist/cursor/.agents/skills/jahia-content-media-upload/SKILL.md +197 -0
  50. package/dist/cursor/.agents/skills/jahia-content-move-content/SKILL.md +160 -165
  51. package/dist/cursor/.agents/skills/jahia-content-organize/SKILL.md +209 -0
  52. package/dist/cursor/.agents/skills/jahia-content-publish/SKILL.md +181 -0
  53. package/dist/cursor/.agents/skills/jahia-content-query-content/SKILL.md +122 -92
  54. package/dist/cursor/.agents/skills/jahia-content-translate-content/SKILL.md +154 -225
  55. package/dist/cursor/.agents/skills/jahia-dev-cypress/SKILL.md +150 -330
  56. package/dist/cursor/.agents/skills/jahia-dev-query-content/SKILL.md +93 -296
  57. package/dist/cursor/.agents/skills/jahia-jcr-sql2/SKILL.md +258 -0
  58. package/dist/gemini/.agents/skills/jahia/SKILL.md +18 -10
  59. package/dist/gemini/.agents/skills/jahia-content/SKILL.md +102 -84
  60. package/dist/gemini/.agents/skills/jahia-content-create-content/SKILL.md +255 -280
  61. package/dist/gemini/.agents/skills/jahia-content-explore-structure/SKILL.md +187 -96
  62. package/dist/gemini/.agents/skills/jahia-content-media-upload/SKILL.md +197 -0
  63. package/dist/gemini/.agents/skills/jahia-content-move-content/SKILL.md +160 -165
  64. package/dist/gemini/.agents/skills/jahia-content-organize/SKILL.md +209 -0
  65. package/dist/gemini/.agents/skills/jahia-content-publish/SKILL.md +181 -0
  66. package/dist/gemini/.agents/skills/jahia-content-query-content/SKILL.md +122 -92
  67. package/dist/gemini/.agents/skills/jahia-content-translate-content/SKILL.md +154 -225
  68. package/dist/gemini/.agents/skills/jahia-dev-cypress/SKILL.md +150 -330
  69. package/dist/gemini/.agents/skills/jahia-dev-query-content/SKILL.md +93 -296
  70. package/dist/gemini/.agents/skills/jahia-jcr-sql2/SKILL.md +258 -0
  71. package/dist/gemini/AGENTS.md +2 -4
  72. package/dist/gemini/GEMINI.md +2 -2
  73. package/dist/opencode/.agents/skills/jahia/SKILL.md +18 -10
  74. package/dist/opencode/.agents/skills/jahia-content/SKILL.md +102 -84
  75. package/dist/opencode/.agents/skills/jahia-content-create-content/SKILL.md +255 -280
  76. package/dist/opencode/.agents/skills/jahia-content-explore-structure/SKILL.md +187 -96
  77. package/dist/opencode/.agents/skills/jahia-content-media-upload/SKILL.md +197 -0
  78. package/dist/opencode/.agents/skills/jahia-content-move-content/SKILL.md +160 -165
  79. package/dist/opencode/.agents/skills/jahia-content-organize/SKILL.md +209 -0
  80. package/dist/opencode/.agents/skills/jahia-content-publish/SKILL.md +181 -0
  81. package/dist/opencode/.agents/skills/jahia-content-query-content/SKILL.md +122 -92
  82. package/dist/opencode/.agents/skills/jahia-content-translate-content/SKILL.md +154 -225
  83. package/dist/opencode/.agents/skills/jahia-dev-cypress/SKILL.md +150 -330
  84. package/dist/opencode/.agents/skills/jahia-dev-query-content/SKILL.md +93 -296
  85. package/dist/opencode/.agents/skills/jahia-jcr-sql2/SKILL.md +258 -0
  86. package/dist/opencode/AGENTS.md +2 -4
  87. package/dist/windsurf/.windsurf/skills/jahia/SKILL.md +18 -10
  88. package/dist/windsurf/.windsurf/skills/jahia-content/SKILL.md +102 -84
  89. package/dist/windsurf/.windsurf/skills/jahia-content-create-content/SKILL.md +255 -280
  90. package/dist/windsurf/.windsurf/skills/jahia-content-explore-structure/SKILL.md +187 -96
  91. package/dist/windsurf/.windsurf/skills/jahia-content-media-upload/SKILL.md +197 -0
  92. package/dist/windsurf/.windsurf/skills/jahia-content-move-content/SKILL.md +160 -165
  93. package/dist/windsurf/.windsurf/skills/jahia-content-organize/SKILL.md +209 -0
  94. package/dist/windsurf/.windsurf/skills/jahia-content-publish/SKILL.md +181 -0
  95. package/dist/windsurf/.windsurf/skills/jahia-content-query-content/SKILL.md +122 -92
  96. package/dist/windsurf/.windsurf/skills/jahia-content-translate-content/SKILL.md +154 -225
  97. package/dist/windsurf/.windsurf/skills/jahia-dev-cypress/SKILL.md +150 -330
  98. package/dist/windsurf/.windsurf/skills/jahia-dev-query-content/SKILL.md +93 -296
  99. package/dist/windsurf/.windsurf/skills/jahia-jcr-sql2/SKILL.md +258 -0
  100. package/dist/windsurf/AGENTS.md +2 -4
  101. package/package.json +3 -3
@@ -0,0 +1,181 @@
1
+ ---
2
+ name: jahia-content-publish
3
+ description: Publishes and unpublishes Jahia content via MCP tools. Use when asked to make edits live, remove content from live, or check whether a page or subtree is ready for publication.
4
+ ---
5
+
6
+ # Skill: jahia-content-publish
7
+
8
+ Handles publication workflows using MCP tools via the `jahia` MCP server.
9
+
10
+ > **Never call Jahia's GraphQL API directly.** Use only MCP tools. If a capability is missing, report it — do not work around with curl/GraphQL.
11
+
12
+ ---
13
+
14
+ ## Core concepts
15
+
16
+ - **EDIT workspace** — where authors create and modify draft content
17
+ - **LIVE workspace** — what public visitors see
18
+ - **Publication is language-scoped** — you publish specific language versions
19
+ - **Publishing a parent can include its subtree**
20
+ - **Workflow may apply** — `publication.publish` may start approval instead of publishing directly
21
+
22
+ ---
23
+
24
+ ## Step 1 — Check publication status
25
+
26
+ ```
27
+ tool: publication.status
28
+ args: {
29
+ "path": "/sites/SITE_KEY/home/about",
30
+ "language": "en",
31
+ "subNodes": true,
32
+ "references": true
33
+ }
34
+ ```
35
+
36
+ This tells you:
37
+ - whether the node or subtree is already published
38
+ - whether descendants are modified or unpublished
39
+ - whether references may block publication
40
+ - whether the current user can publish
41
+
42
+ ---
43
+
44
+ ## Step 2 — Publish
45
+
46
+ ```
47
+ tool: publication.publish
48
+ args: {
49
+ "path": "/sites/SITE_KEY/home/about",
50
+ "languages": ["en", "fr"]
51
+ }
52
+ ```
53
+
54
+ Possible outcomes:
55
+ - direct publish to LIVE
56
+ - workflow started for approval
57
+
58
+ ---
59
+
60
+ ## Step 3 — If approval workflow starts, complete it
61
+
62
+ List pending tasks:
63
+
64
+ ```
65
+ tool: workflow.tasks
66
+ args: {}
67
+ ```
68
+
69
+ Approve:
70
+
71
+ ```
72
+ tool: workflow.complete
73
+ args: {
74
+ "taskId": "TASK_ID",
75
+ "outcome": "accept",
76
+ "comment": "Approved — reviewed and ready"
77
+ }
78
+ ```
79
+
80
+ Reject:
81
+
82
+ ```
83
+ tool: workflow.complete
84
+ args: {
85
+ "taskId": "TASK_ID",
86
+ "outcome": "reject",
87
+ "comment": "Needs revision"
88
+ }
89
+ ```
90
+
91
+ ---
92
+
93
+ ## Step 4 — Unpublish
94
+
95
+ Remove content from LIVE while keeping EDIT:
96
+
97
+ ```
98
+ tool: publication.unpublish
99
+ args: {
100
+ "path": "/sites/SITE_KEY/home/about/main/outdated-section",
101
+ "languages": ["en"]
102
+ }
103
+ ```
104
+
105
+ ---
106
+
107
+ ## Common publication patterns
108
+
109
+ ### Publish a newly created page and its content
110
+
111
+ ```
112
+ tool: publication.publish
113
+ args: {
114
+ "path": "/sites/SITE_KEY/home/new-page",
115
+ "languages": ["en"]
116
+ }
117
+ ```
118
+
119
+ ### Publish translated content
120
+
121
+ ```
122
+ tool: publication.publish
123
+ args: {
124
+ "path": "/sites/SITE_KEY/home/about",
125
+ "languages": ["fr"]
126
+ }
127
+ ```
128
+
129
+ ### Publish a deletion after `content.markForDeletion`
130
+
131
+ ```
132
+ tool: publication.publish
133
+ args: {
134
+ "path": "/sites/SITE_KEY/home/old-page",
135
+ "languages": ["en"]
136
+ }
137
+ ```
138
+
139
+ ### Check whether a subtree is ready
140
+
141
+ ```
142
+ tool: publication.status
143
+ args: {
144
+ "path": "/sites/SITE_KEY/home",
145
+ "language": "en",
146
+ "subNodes": true,
147
+ "references": true
148
+ }
149
+ ```
150
+
151
+ ---
152
+
153
+ ## Key rules
154
+
155
+ | Rule | Detail |
156
+ |------|--------|
157
+ | Always specify languages | Publication is language-scoped |
158
+ | Publish is subtree-aware | Publishing a page includes its content areas and descendants |
159
+ | Workflow is automatic | `publication.publish` decides whether it can publish directly |
160
+ | References matter | Use `references: true` in status checks when media or linked content is involved |
161
+ | Mark-for-deletion needs publish | The deletion becomes live only after publication |
162
+
163
+ ---
164
+
165
+ ## Common errors
166
+
167
+ | Error | Cause | Fix |
168
+ |-------|-------|-----|
169
+ | `NODE_NOT_FOUND` | The path does not exist in EDIT | Verify with `content.get` |
170
+ | `NO_PUBLISH_PERMISSION` | User lacks publishing rights | Check the user's roles |
171
+ | Workflow started but content is still not live | Approval is still pending | Complete the task via `workflow.tasks` and `workflow.complete` |
172
+ | `MANDATORY_LANGUAGE_UNPUBLISHABLE` | Required language content is missing | Add the missing translation first |
173
+
174
+ ---
175
+
176
+ ## Related skills
177
+
178
+ - `/jahia-content-create-content` — create pages and content before publishing them
179
+ - `/jahia-content-translate-content` — translate content before publishing new locales
180
+ - `/jahia-content-organize` — publish after moves, copies, reorders, or deletions
181
+
@@ -1,29 +1,20 @@
1
1
  ---
2
2
  name: jahia-content-query-content
3
- description: Queries JCR content from a running Jahia instance via the GraphQL API. Use when asked to list, inspect, or retrieve content nodes, check what content exists, or audit a site's content.
3
+ description: Queries JCR content from a running Jahia instance via MCP tools. Use when asked to list, inspect, or retrieve content nodes, check what content exists, or audit a site's content.
4
4
  ---
5
5
 
6
6
  # Skill: jahia-content-query-content
7
7
 
8
- Retrieves JCR content from a running Jahia instance using the GraphQL JCR query API.
8
+ Retrieves JCR content from a running Jahia instance using MCP tools (via the `jahia` MCP server).
9
+
10
+ > **Never call Jahia's GraphQL API directly.** Use only MCP tools. If a capability is missing, report it — do not work around with curl/GraphQL.
9
11
 
10
12
  ---
11
13
 
12
14
  ## Prerequisites
13
15
 
14
- - Jahia running at `http://localhost:8080`
15
- - Credentials: `root` / `root1234` (default)
16
- - GraphQL endpoint: `http://localhost:8080/modules/graphql`
17
-
18
- **Auth pattern — always use both flags:**
19
- ```bash
20
- curl -u root:root1234 \
21
- -H "Content-Type: application/json" \
22
- -H "Origin: http://localhost:8080" \
23
- ...
24
- ```
25
-
26
- > ⚠️ The `Origin: http://localhost:8080` header is **required**. Requests without it return `Permission denied` even with correct credentials.
16
+ - MCP server `jahia` connected with a valid API token
17
+ - Know the target **siteKey** (call `site.list` if unsure)
27
18
 
28
19
  ---
29
20
 
@@ -31,99 +22,145 @@ curl -u root:root1234 \
31
22
 
32
23
  ### 1 — Get a node by path
33
24
 
34
- ```bash
35
- curl -s -u root:root1234 \
36
- -H "Content-Type: application/json" \
37
- -H "Origin: http://localhost:8080" \
38
- -X POST http://localhost:8080/modules/graphql \
39
- -d '{
40
- "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles\") { children { nodes { name path primaryNodeType { name } } } } } }"
41
- }'
25
+ ```
26
+ tool: content.get
27
+ args: { "path": "/sites/mySite/home/about/main/intro-text" }
28
+ ```
29
+
30
+ Returns all readable properties, mixins, and metadata. Also accepts `uuid`.
31
+
32
+ ### 2 — List children of a node
33
+
34
+ ```
35
+ tool: content.list
36
+ args: {
37
+ "parentPath": "/sites/mySite/home/about/main",
38
+ "limit": 50
39
+ }
40
+ ```
41
+
42
+ Optional: `childNodeType` to filter, `projectProperties` to include specific properties.
43
+
44
+ ### 3 — Search by node type
45
+
46
+ ```
47
+ tool: content.search
48
+ args: {
49
+ "siteKey": "mySite",
50
+ "nodeType": "mymodule:article",
51
+ "locale": "en",
52
+ "sortBy": "jcr:created",
53
+ "order": "desc",
54
+ "limit": 10
55
+ }
42
56
  ```
43
57
 
44
- ### 2Query by node type (JCR-SQL2)
58
+ ### 4Full-text search
45
59
 
46
- ```bash
47
- curl -s -u root:root1234 \
48
- -H "Content-Type: application/json" \
49
- -H "Origin: http://localhost:8080" \
50
- -X POST http://localhost:8080/modules/graphql \
51
- -d '{
52
- "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [namespace:typeName] WHERE ISDESCENDANTNODE(\u0027/sites/mySite\u0027) ORDER BY [jcr:created] DESC\", queryLanguage: SQL2) { nodes { name path uuid } } } }"
53
- }'
60
+ ```
61
+ tool: content.search
62
+ args: {
63
+ "siteKey": "mySite",
64
+ "nodeType": "jmix:droppableContent",
65
+ "locale": "en",
66
+ "fullText": "insurance",
67
+ "sortBy": "_score",
68
+ "order": "desc"
69
+ }
54
70
  ```
55
71
 
56
- ### 3Read node properties (including i18n)
72
+ ### 5Filter by property value
57
73
 
58
- ```bash
59
- curl -s -u root:root1234 \
60
- -H "Content-Type: application/json" \
61
- -H "Origin: http://localhost:8080" \
62
- -X POST http://localhost:8080/modules/graphql \
63
- -d '{
64
- "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles/my-article\") { name uuid properties(language: \"en\") { name value } } } }"
65
- }'
74
+ ```
75
+ tool: content.search
76
+ args: {
77
+ "siteKey": "mySite",
78
+ "nodeType": "mymodule:article",
79
+ "locale": "en",
80
+ "properties": [
81
+ { "name": "jcr:createdBy", "op": "eq", "value": "root" }
82
+ ]
83
+ }
66
84
  ```
67
85
 
68
- > ⚠️ **i18n properties require `language:` in the `properties()` call.** Without it, i18n properties are returned empty.
86
+ Operators: `eq`, `like`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`
69
87
 
70
- ### 4Filter by property value
88
+ ### 6List all sites
71
89
 
72
- ```bash
73
- curl -s -u root:root1234 \
74
- -H "Content-Type: application/json" \
75
- -H "Origin: http://localhost:8080" \
76
- -X POST http://localhost:8080/modules/graphql \
77
- -d '{
78
- "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [namespace:article] WHERE [product] = \u0027jahia\u0027 AND ISDESCENDANTNODE(\u0027/sites/mySite\u0027)\", queryLanguage: SQL2) { nodes { name path } } } }"
79
- }'
90
+ ```
91
+ tool: site.list
80
92
  ```
81
93
 
82
- ### 5 — List all sites
94
+ ### 7 — List all pages
83
95
 
84
- ```bash
85
- curl -s -u root:root1234 \
86
- -H "Content-Type: application/json" \
87
- -H "Origin: http://localhost:8080" \
88
- -X POST http://localhost:8080/modules/graphql \
89
- -d '{
90
- "query": "{ jcr { nodesByQuery(query: \"SELECT * FROM [jnt:virtualsite] WHERE ISCHILDNODE(\u0027/sites\u0027)\", queryLanguage: SQL2) { nodes { name path } } } }"
91
- }'
96
+ ```
97
+ tool: page.list
98
+ args: { "siteKey": "mySite" }
92
99
  ```
93
100
 
94
- ### 6 Check publication status
101
+ Supports: `templateName`, `titleContains`, `createdAfter`, `modifiedAfter`, `sortBy`, `order`.
95
102
 
96
- ```bash
97
- curl -s -u root:root1234 \
98
- -H "Content-Type: application/json" \
99
- -H "Origin: http://localhost:8080" \
100
- -X POST http://localhost:8080/modules/graphql \
101
- -d '{
102
- "query": "{ jcr { nodeByPath(path: \"/sites/mySite/contents/articles/my-article\") { name aggregatedPublicationInfo(language: \"en\") { publicationStatus } } } }"
103
- }'
103
+ ### 8 — Check publication status
104
+
105
+ ```
106
+ tool: publication.status
107
+ args: {
108
+ "path": "/sites/mySite/home/about",
109
+ "language": "en",
110
+ "subNodes": true
111
+ }
104
112
  ```
105
113
 
106
- Publication status values: `PUBLISHED`, `MODIFIED`, `NOT_PUBLISHED`, `UNPUBLISHED`, `MARKED_FOR_DELETION`
114
+ Returns publication status, lock/WIP flags, and permission info.
107
115
 
108
116
  ---
109
117
 
110
- ## JCR-SQL2 quick reference
118
+ ## content.search parameter reference
111
119
 
112
- ```sql
113
- -- All nodes of a type under a path
114
- SELECT * FROM [ns:typeName] WHERE ISDESCENDANTNODE('/sites/mySite')
120
+ **Required:**
121
+ - `siteKey` scopes search under `/sites/<siteKey>`
122
+ - `nodeType` JCR type (e.g. `jnt:page`, `jnt:file`, `jmix:droppableContent`)
115
123
 
116
- -- Direct children only
117
- SELECT * FROM [ns:typeName] WHERE ISCHILDNODE('/sites/mySite/contents/articles')
124
+ **Optional:**
125
+ - `locale` locale for i18n property resolution (e.g. `"en"`)
126
+ - `fullText` — full-text expression (phrase `"..."`, OR, exclusion `-term`)
127
+ - `fullTextField` — scope full-text to one property
128
+ - `basePath` — restrict to a subtree
129
+ - `properties` — array of property filters (AND-combined)
130
+ - `projectProperties` — properties to include in results
131
+ - `sortBy` — property name (default: `"jcr:lastModified"`) or `"_score"` with fullText
132
+ - `order` — `"asc"` or `"desc"` (default: `"desc"`)
133
+ - `offset` — skip N results (default: 0)
134
+ - `limit` — max results 1–100 (default: 20)
118
135
 
119
- -- Filter by property
120
- SELECT * FROM [ns:typeName] WHERE [propName] = 'value'
136
+ ---
121
137
 
122
- -- Order by date (newest first)
123
- SELECT * FROM [ns:typeName] WHERE ISDESCENDANTNODE('/sites/mySite') ORDER BY [jcr:created] DESC
138
+ ## Common search patterns
124
139
 
125
- -- Limit results (pass limit/offset as query params)
126
- -- nodesByQuery(query: "...", queryLanguage: SQL2, limit: 10, offset: 0)
140
+ Last 5 created contents:
141
+ ```
142
+ tool: content.search
143
+ args: {
144
+ "siteKey": "mySite",
145
+ "nodeType": "jmix:droppableContent",
146
+ "locale": "en",
147
+ "sortBy": "jcr:created",
148
+ "order": "desc",
149
+ "limit": 5
150
+ }
151
+ ```
152
+
153
+ Recently modified pages:
154
+ ```
155
+ tool: content.search
156
+ args: {
157
+ "siteKey": "mySite",
158
+ "nodeType": "jnt:page",
159
+ "locale": "en",
160
+ "sortBy": "jcr:lastModified",
161
+ "order": "desc",
162
+ "limit": 10
163
+ }
127
164
  ```
128
165
 
129
166
  ---
@@ -132,13 +169,6 @@ SELECT * FROM [ns:typeName] WHERE ISDESCENDANTNODE('/sites/mySite') ORDER BY [jc
132
169
 
133
170
  | Error | Cause | Fix |
134
171
  |-------|-------|-----|
135
- | `Permission denied` | Missing `Origin` header | Add `-H "Origin: http://localhost:8080"` |
136
- | i18n properties returned empty | `language:` not specified | Add `language: "en"` to `properties()` call |
137
- | Node not found | Wrong path or node doesn't exist | Verify path with `nodeByPath(path: "/sites")` first |
138
-
139
- ---
140
-
141
- ## References
142
-
143
- - Jahia GraphQL API: `http://localhost:8080/modules/graphql` (open in browser for interactive playground)
144
- - JCR-SQL2 language spec: https://docs.adobe.com/content/docs/en/spec/jcr/2.0/6_Query.html
172
+ | `PATH_NOT_FOUND` | Node doesn't exist at given path | Verify path with `content.list` on parent |
173
+ | No results returned | Wrong `nodeType` or `siteKey` | Check available types with `site.types` |
174
+ | Missing i18n properties | `locale` not passed | Always include `locale` for i18n content |