@sulala/agent 0.1.13 → 0.1.15
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 +3 -3
- package/dashboard/dist/assets/index-DegBJNv6.css +1 -0
- package/dashboard/dist/assets/index-pVHpAj3h.js +83 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +21 -6
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/skill-generate.d.ts +1 -1
- package/dist/agent/skill-generate.d.ts.map +1 -1
- package/dist/agent/skill-generate.js +10 -3
- package/dist/agent/skill-generate.js.map +1 -1
- package/dist/agent/skill-install.d.ts +12 -1
- package/dist/agent/skill-install.d.ts.map +1 -1
- package/dist/agent/skill-install.js +130 -15
- package/dist/agent/skill-install.js.map +1 -1
- package/dist/agent/skills.d.ts +4 -3
- package/dist/agent/skills.d.ts.map +1 -1
- package/dist/agent/skills.js +53 -25
- package/dist/agent/skills.js.map +1 -1
- package/dist/agent/tool/spec-loader.d.ts +7 -0
- package/dist/agent/tool/spec-loader.d.ts.map +1 -0
- package/dist/agent/tool/spec-loader.js +540 -0
- package/dist/agent/tool/spec-loader.js.map +1 -0
- package/dist/agent/tools.d.ts.map +1 -1
- package/dist/agent/tools.integrations.test.js +4 -5
- package/dist/agent/tools.integrations.test.js.map +1 -1
- package/dist/agent/tools.js +144 -367
- package/dist/agent/tools.js.map +1 -1
- package/dist/ai/orchestrator.d.ts.map +1 -1
- package/dist/ai/orchestrator.js +82 -17
- package/dist/ai/orchestrator.js.map +1 -1
- package/dist/cli.d.ts +4 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -9
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -5
- package/dist/config.js.map +1 -1
- package/dist/db/index.d.ts +14 -7
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +108 -30
- package/dist/db/index.js.map +1 -1
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +141 -15
- package/dist/gateway/server.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/onboard-env.d.ts +1 -1
- package/dist/onboard-env.d.ts.map +1 -1
- package/dist/onboard-env.js +2 -0
- package/dist/onboard-env.js.map +1 -1
- package/dist/types.d.ts +5 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +1 -2
- package/dist/watcher/index.js.map +1 -1
- package/package.json +4 -5
- package/src/index.ts +1 -1
- package/context/00-rules.md +0 -1
- package/context/airtable.md +0 -35
- package/context/apple-notes.md +0 -99
- package/context/asana.md +0 -37
- package/context/bluesky.md +0 -46
- package/context/calendar.md +0 -63
- package/context/country-info.md +0 -13
- package/context/create-skill.md +0 -128
- package/context/discord.md +0 -30
- package/context/docs.md +0 -29
- package/context/drive.md +0 -49
- package/context/dropbox.md +0 -39
- package/context/facebook.md +0 -47
- package/context/fetch-form-api.md +0 -16
- package/context/figma.md +0 -30
- package/context/files.md +0 -30
- package/context/git.md +0 -37
- package/context/github.md +0 -58
- package/context/gmail.md +0 -52
- package/context/google.md +0 -28
- package/context/hellohub.md +0 -29
- package/context/jira.md +0 -46
- package/context/linear.md +0 -40
- package/context/news.md +0 -64
- package/context/notion.md +0 -45
- package/context/portal-integrations.md +0 -42
- package/context/post-to-x.md +0 -50
- package/context/sheets.md +0 -47
- package/context/slack.md +0 -48
- package/context/slides.md +0 -35
- package/context/stripe.md +0 -38
- package/context/tes.md +0 -7
- package/context/test.md +0 -7
- package/context/weather.md +0 -32
- package/context/zoom.md +0 -28
- package/dashboard/dist/assets/index-BTx-9jCj.css +0 -1
- package/dashboard/dist/assets/index-B_QGQ8c_.js +0 -83
- package/registry/apple-notes.md +0 -99
- package/registry/bluesky.md +0 -34
- package/registry/files.md +0 -30
- package/registry/git.md +0 -37
- package/registry/news.md +0 -64
- package/registry/skills-registry.json +0 -46
- package/registry/weather.md +0 -32
package/registry/apple-notes.md
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: apple-notes
|
|
3
|
-
description: Manage Apple Notes via the `memo` CLI on macOS. Use when the user asks to add a note, list notes, search notes, or manage note folders.
|
|
4
|
-
homepage: https://github.com/antoniorodr/memo
|
|
5
|
-
metadata:
|
|
6
|
-
{
|
|
7
|
-
"sulala":
|
|
8
|
-
{
|
|
9
|
-
"emoji": "📝",
|
|
10
|
-
"os": ["darwin"],
|
|
11
|
-
"requires": { "bins": ["memo"] },
|
|
12
|
-
"install":
|
|
13
|
-
[
|
|
14
|
-
{
|
|
15
|
-
"id": "brew",
|
|
16
|
-
"kind": "brew",
|
|
17
|
-
"formula": "antoniorodr/memo/memo",
|
|
18
|
-
"bins": ["memo"],
|
|
19
|
-
"label": "Install memo via Homebrew",
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
},
|
|
23
|
-
}
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
# Apple Notes CLI
|
|
27
|
-
|
|
28
|
-
Use `memo notes` to manage Apple Notes directly from the terminal. Create, view, edit, delete, search, move notes between folders, and export to HTML/Markdown.
|
|
29
|
-
|
|
30
|
-
Setup
|
|
31
|
-
|
|
32
|
-
- Install (Homebrew): `brew tap antoniorodr/memo && brew install antoniorodr/memo/memo`
|
|
33
|
-
- Manual (pip): `pip install .` (after cloning the repo)
|
|
34
|
-
- macOS-only; if prompted, grant Automation access to Notes.app.
|
|
35
|
-
|
|
36
|
-
View Notes
|
|
37
|
-
|
|
38
|
-
- List all notes: `memo notes`
|
|
39
|
-
- Filter by folder: `memo notes -f "Folder Name"`
|
|
40
|
-
- Search notes (fuzzy): `memo notes -s "query"`
|
|
41
|
-
|
|
42
|
-
Create Notes
|
|
43
|
-
|
|
44
|
-
- **Add a note (prefer AppleScript):** For "add a note titled X", use **run_command** with `binary: "osascript"` and the AppleScript in the section below. Do not use memo for non-interactive add.
|
|
45
|
-
- Add via memo (interactive only): `memo notes -a -f "FolderName"` — **requires** `-f` (folder). Opens the user's editor; memo does **not** accept title or body as arguments. Use only as fallback if osascript is unavailable.
|
|
46
|
-
|
|
47
|
-
Edit Notes
|
|
48
|
-
|
|
49
|
-
- Edit existing note: `memo notes -e`
|
|
50
|
-
- Interactive selection of note to edit.
|
|
51
|
-
|
|
52
|
-
Delete Notes
|
|
53
|
-
|
|
54
|
-
- Delete a note: `memo notes -d`
|
|
55
|
-
- Interactive selection of note to delete.
|
|
56
|
-
|
|
57
|
-
Move Notes
|
|
58
|
-
|
|
59
|
-
- Move note to folder: `memo notes -m`
|
|
60
|
-
- Interactive selection of note and destination folder.
|
|
61
|
-
|
|
62
|
-
Export Notes
|
|
63
|
-
|
|
64
|
-
- Export to HTML/Markdown: `memo notes -ex`
|
|
65
|
-
- Exports selected note; uses Mistune for markdown processing.
|
|
66
|
-
|
|
67
|
-
Limitations
|
|
68
|
-
|
|
69
|
-
- Cannot edit notes containing images or attachments.
|
|
70
|
-
- Interactive prompts may require terminal access.
|
|
71
|
-
|
|
72
|
-
Notes
|
|
73
|
-
|
|
74
|
-
- macOS-only.
|
|
75
|
-
- Requires Apple Notes.app to be accessible.
|
|
76
|
-
- For automation, grant permissions in System Settings > Privacy & Security > Automation.
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## When the user asks you to add a note
|
|
81
|
-
|
|
82
|
-
Your goal is to get the note into Apple Notes. Use **run_command** only (no skill-specific tools). Add osascript and memo to ALLOWED_BINARIES.
|
|
83
|
-
|
|
84
|
-
**Prefer AppleScript for "add a note titled X".** Use the osascript one-liner below so the agent creates the note in one shot instead of trying memo (which is interactive and does not accept title as an argument).
|
|
85
|
-
|
|
86
|
-
1. **Adding a note directly (macOS)**
|
|
87
|
-
- Use **run_command** with `binary: "osascript"` and one `-e` argument containing this AppleScript. Replace TITLE and BODY with the user's note title and optional body; escape any double-quote in TITLE or BODY as backslash-quote (`\"`).
|
|
88
|
-
- Script (use `\n` for newlines in the string you pass):
|
|
89
|
-
`tell application "Notes"\ntell account "iCloud"\ntell folder "Notes"\nmake new note with properties {name:"TITLE", body:"BODY"}\nend tell\nend tell\nend tell`
|
|
90
|
-
- Example for "add apple note called buy saisai": args = `["-e", "tell application \"Notes\"\ntell account \"iCloud\"\ntell folder \"Notes\"\nmake new note with properties {name:\"buy saisai\", body:\"\"}\nend tell\nend tell\nend tell"]`
|
|
91
|
-
- On success, confirm: "Done — I added an Apple Note titled \"…\"."
|
|
92
|
-
- If osascript is not in ALLOWED_BINARIES or the command errors: give the user the note text and steps to run `memo notes -a -f "Notes"` in the terminal and paste the content when the editor opens.
|
|
93
|
-
|
|
94
|
-
2. **List and search**
|
|
95
|
-
- **run_command** with `binary: "memo"`, `args: ["notes"]` for list; `args: ["notes", "-s", "query"]` for search.
|
|
96
|
-
|
|
97
|
-
3. **Do not**
|
|
98
|
-
- Do not use run_command with memo `["notes", "-a", "title"]`; memo rejects extra arguments.
|
|
99
|
-
- Do not leave the user without a path to success: either add via osascript (run_command) or give text + steps for memo notes -a, or explain why (e.g. add osascript to ALLOWED_BINARIES).
|
package/registry/bluesky.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: bluesky
|
|
3
|
-
description: Post to Bluesky (AT Protocol). Use when the user asks to post to Bluesky or share content on Bluesky. Uses Portal OAuth connection via integrations.
|
|
4
|
-
homepage: https://bsky.app
|
|
5
|
-
metadata:
|
|
6
|
-
{
|
|
7
|
-
"sulala": {
|
|
8
|
-
"emoji": "🦋",
|
|
9
|
-
"requires": { "bins": ["curl"] }
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Bluesky Posting
|
|
15
|
-
|
|
16
|
-
Post to Bluesky via the AT Protocol. Uses the **Portal OAuth connection** (integrations). User connects Bluesky in the Portal; no app password needed.
|
|
17
|
-
|
|
18
|
-
## How to post
|
|
19
|
-
|
|
20
|
-
1. **list_integrations_connections** with `provider: "bluesky"` → get `connection_id`.
|
|
21
|
-
2. **bluesky_post** with that `connection_id` and the post text (max 300 characters).
|
|
22
|
-
|
|
23
|
-
Use **bluesky_post**; do not use run_command (curl) for Bluesky.
|
|
24
|
-
|
|
25
|
-
## When to use
|
|
26
|
-
|
|
27
|
-
- "Post this to Bluesky"
|
|
28
|
-
- "Share [content] on Bluesky"
|
|
29
|
-
- "Post news from [URL] to Bluesky"
|
|
30
|
-
|
|
31
|
-
## Requirements
|
|
32
|
-
|
|
33
|
-
- **PORTAL_GATEWAY_URL** and **PORTAL_API_KEY** (from Portal → API Keys).
|
|
34
|
-
- User must have connected Bluesky in the Portal (Connections).
|
package/registry/files.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: files
|
|
3
|
-
description: Basic file operations via run_command. Use when the user asks to list files, show file contents, search within files, or inspect directories.
|
|
4
|
-
metadata:
|
|
5
|
-
{
|
|
6
|
-
"sulala": {
|
|
7
|
-
"requires": { "bins": [] }
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# File operations
|
|
13
|
-
|
|
14
|
-
Use **run_command** with common shell tools to read and inspect files. Add required binaries to ALLOWED_BINARIES (e.g. ls, cat, head, tail, wc, grep, find).
|
|
15
|
-
|
|
16
|
-
## List files
|
|
17
|
-
|
|
18
|
-
- `ls` — list directory contents
|
|
19
|
-
- `ls -la` — long format with hidden files
|
|
20
|
-
|
|
21
|
-
## Read files
|
|
22
|
-
|
|
23
|
-
- `cat path/to/file` — output entire file
|
|
24
|
-
- `head -n 20 path/to/file` — first 20 lines
|
|
25
|
-
- `tail -n 50 path/to/file` — last 50 lines
|
|
26
|
-
|
|
27
|
-
## Search
|
|
28
|
-
|
|
29
|
-
- `grep -r "pattern" path/` — search in files recursively
|
|
30
|
-
- `find path -name "*.md"` — find files by name
|
package/registry/git.md
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: git
|
|
3
|
-
description: Basic Git operations via run_command. Use when the user asks to check status, diff, log, branch, or perform simple git commands.
|
|
4
|
-
metadata:
|
|
5
|
-
{
|
|
6
|
-
"sulala": {
|
|
7
|
-
"requires": { "bins": ["git"] }
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Git operations
|
|
13
|
-
|
|
14
|
-
Use **run_command** with `binary: "git"` and appropriate args. Add `git` to ALLOWED_BINARIES.
|
|
15
|
-
|
|
16
|
-
## Status and diff
|
|
17
|
-
|
|
18
|
-
- `git status`
|
|
19
|
-
- `git diff`
|
|
20
|
-
- `git diff --staged`
|
|
21
|
-
- `git log -n 10 --oneline`
|
|
22
|
-
|
|
23
|
-
## Branches
|
|
24
|
-
|
|
25
|
-
- `git branch`
|
|
26
|
-
- `git branch -a`
|
|
27
|
-
- `git checkout -b new-branch`
|
|
28
|
-
|
|
29
|
-
## Info
|
|
30
|
-
|
|
31
|
-
- `git show HEAD:path/to/file` — show file at HEAD
|
|
32
|
-
- `git rev-parse --abbrev-ref HEAD` — current branch name
|
|
33
|
-
|
|
34
|
-
## Limits
|
|
35
|
-
|
|
36
|
-
- Do not run destructive commands (reset --hard, push --force) without explicit user confirmation.
|
|
37
|
-
- Prefer read-only commands when the user only asks to inspect.
|
package/registry/news.md
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: news
|
|
3
|
-
description: Fetch news and articles via the Perigon API. Use when the user asks for news, headlines, or articles on a topic.
|
|
4
|
-
homepage: https://www.perigon.io
|
|
5
|
-
metadata:
|
|
6
|
-
{
|
|
7
|
-
"sulala": {
|
|
8
|
-
"emoji": "📰",
|
|
9
|
-
"requires": { "bins": ["curl"], "env": ["PERIGON_API_KEY"] }
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# News (Perigon API)
|
|
15
|
-
|
|
16
|
-
Use **run_command** with `curl` to fetch articles from the Perigon API. Add `curl` to ALLOWED_BINARIES.
|
|
17
|
-
|
|
18
|
-
Requires `PERIGON_API_KEY`. Set it in `.env` or in the skill config (dashboard Skills page). Config key in `skills.entries.news` is `PERIGON_API_KEY`.
|
|
19
|
-
|
|
20
|
-
**IMPORTANT:** Use `binary: "sh"` and `args: ["-c", "curl ..."]` so `$PERIGON_API_KEY` expands, or pass the key in the URL when calling curl.
|
|
21
|
-
|
|
22
|
-
## When to Use
|
|
23
|
-
|
|
24
|
-
- "Get me the latest news"
|
|
25
|
-
- "Headlines about [topic]"
|
|
26
|
-
- "Find articles on [subject]"
|
|
27
|
-
|
|
28
|
-
## API
|
|
29
|
-
|
|
30
|
-
Base URL: `https://api.perigon.io/v1`
|
|
31
|
-
|
|
32
|
-
### All articles (recent)
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
curl -s -X GET "https://api.perigon.io/v1/articles/all?apiKey=$PERIGON_API_KEY" -H "Content-Type: application/json"
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### With query (topic, keyword)
|
|
39
|
-
|
|
40
|
-
Append `&q=keyword` to the URL. Example:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
curl -s -X GET "https://api.perigon.io/v1/articles/all?apiKey=$PERIGON_API_KEY&q=climate" -H "Content-Type: application/json"
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### Reading key from config
|
|
47
|
-
|
|
48
|
-
If `PERIGON_API_KEY` is not set in the environment, read from Sulala config:
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
CONFIG_PATH="${SULALA_CONFIG_PATH:-$HOME/.sulala/config.json}"
|
|
52
|
-
PERIGON_API_KEY=$(cat "$CONFIG_PATH" 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); e=d.get('skills',{}).get('entries',{}).get('news',{}); print(e.get('PERIGON_API_KEY',''))" 2>/dev/null)
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Then use `$PERIGON_API_KEY` in the curl URL.
|
|
56
|
-
|
|
57
|
-
## Response
|
|
58
|
-
|
|
59
|
-
Returns JSON with an array of articles (title, description, url, source, published date, etc.). Parse with `python3 -c "import sys,json; d=json.load(sys.stdin); ..."` to summarize or filter for the user.
|
|
60
|
-
|
|
61
|
-
## Notes
|
|
62
|
-
|
|
63
|
-
- Get an API key at https://www.perigon.io
|
|
64
|
-
- Add `api.perigon.io` to ALLOWED_CURL_HOSTS if you restrict curl by host.
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"skills": [
|
|
3
|
-
{
|
|
4
|
-
"slug": "apple-notes",
|
|
5
|
-
"name": "apple-notes",
|
|
6
|
-
"description": "Manage Apple Notes via the memo CLI on macOS. Use when the user asks to add a note, list notes, search notes, or manage note folders.",
|
|
7
|
-
"version": "1.0.0"
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"slug": "files",
|
|
11
|
-
"name": "files",
|
|
12
|
-
"description": "Basic file operations via run_command. Use when the user asks to list files, show file contents, search within files, or inspect directories.",
|
|
13
|
-
"version": "1.0.0"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"slug": "git",
|
|
17
|
-
"name": "git",
|
|
18
|
-
"description": "Basic Git operations via run_command. Use when the user asks to check status, diff, log, branch, or perform simple git commands.",
|
|
19
|
-
"version": "1.0.0"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"slug": "weather",
|
|
23
|
-
"name": "weather",
|
|
24
|
-
"description": "Get current weather and forecasts (no API key required). Uses Open-Meteo.",
|
|
25
|
-
"version": "1.0.0"
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
"slug": "bluesky",
|
|
29
|
-
"name": "bluesky",
|
|
30
|
-
"description": "Post to Bluesky (AT Protocol). Use when the user asks to post a tweet/thread to Bluesky, share content on Bluesky, or post news from a URL.",
|
|
31
|
-
"version": "1.0.0"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"slug": "news",
|
|
35
|
-
"name": "news",
|
|
36
|
-
"description": "Fetch news and articles via the Perigon API. Use when the user asks for news, headlines, or articles on a topic.",
|
|
37
|
-
"version": "1.0.0"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"slug": "portal-integrations",
|
|
41
|
-
"name": "portal-integrations",
|
|
42
|
-
"description": "Use connected apps (Gmail, Calendar, Zoom, Slack, GitHub, etc.) via the Portal. List connections with list_integrations_connections, then use connection_id in provider tools.",
|
|
43
|
-
"version": "1.0.0"
|
|
44
|
-
}
|
|
45
|
-
]
|
|
46
|
-
}
|
package/registry/weather.md
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: weather
|
|
3
|
-
description: Get current weather and forecasts (no API key required).
|
|
4
|
-
homepage: https://open-meteo.com/en/docs
|
|
5
|
-
metadata:
|
|
6
|
-
{
|
|
7
|
-
"sulala": {
|
|
8
|
-
"emoji": "🌤️",
|
|
9
|
-
"requires": { "bins": ["curl"] }
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# Weather
|
|
15
|
-
|
|
16
|
-
Use **run_command** with `curl` to fetch weather from Open-Meteo (free, no API key). Add `curl` to ALLOWED_BINARIES.
|
|
17
|
-
|
|
18
|
-
## Open-Meteo
|
|
19
|
-
|
|
20
|
-
Geocoding (city → lat, lon):
|
|
21
|
-
```bash
|
|
22
|
-
curl -s "https://geocoding-api.open-meteo.com/v1/search?name=London&count=1"
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Current weather (use lat, lon from geocoding):
|
|
26
|
-
```bash
|
|
27
|
-
curl -s "https://api.open-meteo.com/v1/forecast?latitude=51.5&longitude=-0.12¤t_weather=true"
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Returns JSON with temp, windspeed, weathercode, etc.
|
|
31
|
-
|
|
32
|
-
Docs: https://open-meteo.com/en/docs
|