@emaxe/oa 0.1.0 → 0.2.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.
- package/CHANGELOG.md +31 -0
- package/CHANGELOG.ru.md +31 -0
- package/LICENSE +21 -0
- package/README.md +151 -19
- package/README.ru.md +166 -0
- package/dist/__tests__/inferKind.test.js +27 -0
- package/dist/__tests__/inferKind.test.js.map +1 -0
- package/dist/__tests__/scopes.test.js +14 -0
- package/dist/__tests__/scopes.test.js.map +1 -0
- package/dist/commands/artifacts.js +1 -1
- package/dist/commands/artifacts.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +20 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the `@emaxe/oa` package will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
**[English](CHANGELOG.md)** | **[Русский](CHANGELOG.ru.md)**
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## [0.2.0] - 2026-09-11
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- **OAuth Device Flow**: Added `oa login` command enabling interactive device authentication with code verification and browser activation.
|
|
16
|
+
- **Verification Command**: Added `oa whoami` command to check current credentials, active server, organization, and token expiration.
|
|
17
|
+
- **Enhanced Share Options**: Added `--password` and `--expires` flags to `oa push` and `oa share` for secure, time-limited artifact sharing.
|
|
18
|
+
- **Automatic Format Detection**: Automatic inference of artifact kind (`html`, `markdown`, `mermaid`, `svg`) based on file extension.
|
|
19
|
+
- **Artifact Management**: Added `oa rm` and `oa unshare` commands.
|
|
20
|
+
- **Bilingual Documentation**: Added English and Russian READMEs and Changelogs.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **Package Name**: Renamed npm package to [`@emaxe/oa`](https://www.npmjs.com/package/@emaxe/oa).
|
|
24
|
+
- **Global Flag**: Ensured all commands support `--json` for scripting and agent pipeline compatibility.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## [0.1.0] - 2026-09-10
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
- Initial CLI release supporting artifact push, list, and get operations.
|
package/CHANGELOG.ru.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# История изменений (Changelog)
|
|
2
|
+
|
|
3
|
+
Все заметные изменения пакета `@emaxe/oa` документируются в этом файле.
|
|
4
|
+
|
|
5
|
+
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/),
|
|
6
|
+
и проект придерживается [Семантического версионирования](https://semver.org/lang/ru/).
|
|
7
|
+
|
|
8
|
+
**[English](CHANGELOG.md)** | **[Русский](CHANGELOG.ru.md)**
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## [0.2.0] - 2026-09-11
|
|
13
|
+
|
|
14
|
+
### Добавлено
|
|
15
|
+
- **OAuth Device Flow**: Добавлена команда `oa login` для интерактивной авторизации устройства через браузер с короткими кодами активации.
|
|
16
|
+
- **Команда проверки статуса**: Добавлена команда `oa whoami` для проверки действующих ключей, адреса сервера, организации и срока действия токена.
|
|
17
|
+
- **Расширенные опции шеринга**: Поддержка параметров `--password` и `--expires` в командах `oa push` и `oa share` для создания защищенных паролем и временных ссылок.
|
|
18
|
+
- **Автоопределение типа файла**: Автоматическое определение формата артефакта (`html`, `markdown`, `mermaid`, `svg`) по расширению файла.
|
|
19
|
+
- **Управление артефактами**: Добавлены команды удаления артефакта `oa rm` и отзыва ссылки `oa unshare`.
|
|
20
|
+
- **Двуязычная документация**: Добавлены русская и английская версии README и истории изменений.
|
|
21
|
+
|
|
22
|
+
### Изменено
|
|
23
|
+
- **Имя пакета**: Пакет переименован в [`@emaxe/oa`](https://www.npmjs.com/package/@emaxe/oa) в реестре npm.
|
|
24
|
+
- **Флаг JSON**: Все команды поддерживают флаг `--json` для интеграции в скрипты и пайплайны агентов.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## [0.1.0] - 2026-09-10
|
|
29
|
+
|
|
30
|
+
### Добавлено
|
|
31
|
+
- Начальный релиз CLI с поддержкой команд `push`, `list` и `get`.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 emaxe
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,34 +1,166 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @emaxe/oa
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
<p align="left">
|
|
4
|
+
<a href="https://www.npmjs.com/package/@emaxe/oa"><img src="https://img.shields.io/npm/v/@emaxe/oa.svg?color=blue&logo=npm" alt="npm version"></a>
|
|
5
|
+
<a href="https://www.npmjs.com/package/@emaxe/oa"><img src="https://img.shields.io/npm/dm/@emaxe/oa.svg?color=blue&logo=npm" alt="npm downloads"></a>
|
|
6
|
+
<a href="https://github.com/emaxe/open-artifacts"><img src="https://img.shields.io/badge/GitHub-emaxe%2Fopen--artifacts-blue?logo=github" alt="GitHub Repository"></a>
|
|
7
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
|
|
8
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg?logo=node.js" alt="Node.js"></a>
|
|
9
|
+
<a href="https://skills.sh/emaxe/open-artifacts"><img src="https://skills.sh/b/emaxe/open-artifacts" alt="skills.sh"></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
**[English](README.md)** | **[Русский](README.ru.md)** | **[Changelog](CHANGELOG.md)** | **[История изменений](CHANGELOG.ru.md)**
|
|
13
|
+
|
|
14
|
+
Official CLI for [Open Artifacts](https://github.com/emaxe/open-artifacts) — a self-hosted, open-source alternative to Claude Artifacts. Publish HTML applications, Markdown documents, Mermaid diagrams, or vector SVG files from your terminal, scripts, or AI agent sessions and get back an interactive, shareable preview URL.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### Topics & Tags
|
|
19
|
+
`ai-agents` • `artifacts` • `claude-artifacts` • `claude` • `mcp` • `model-context-protocol` • `self-hosted` • `cli` • `open-artifacts` • `developer-tools`
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
6
24
|
|
|
7
25
|
```bash
|
|
26
|
+
# Global installation (recommended):
|
|
8
27
|
npm install -g @emaxe/oa
|
|
28
|
+
|
|
29
|
+
# Or run directly without installing:
|
|
30
|
+
npx @emaxe/oa --help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
### 1. Authenticate
|
|
38
|
+
|
|
39
|
+
Connect to your Open Artifacts server using the interactive OAuth Device Flow:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
oa login --server https://artifacts.your-company.com
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The CLI outputs a short code (e.g. `ABCD-1234`) and an activation link. Open the link in your browser, select your organization, and approve access. Credentials are saved locally to `~/.config/open-artifacts/credentials.json` (`600` permissions).
|
|
46
|
+
|
|
47
|
+
Verify your session at any time:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
oa whoami
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. Publish Content
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Publish an HTML file and get a public shareable URL:
|
|
57
|
+
oa push report.html --title "Quarterly Financials" --share
|
|
58
|
+
|
|
59
|
+
# Publish a Markdown summary:
|
|
60
|
+
oa push summary.md --title "Meeting Minutes" --share
|
|
61
|
+
|
|
62
|
+
# Render a Mermaid flowchart:
|
|
63
|
+
oa push architecture.mmd --title "Service Architecture" --share
|
|
64
|
+
|
|
65
|
+
# Upload an SVG vector graphic:
|
|
66
|
+
oa push diagram.svg --title "Database Schema" --share
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Command Reference
|
|
72
|
+
|
|
73
|
+
### `oa login`
|
|
74
|
+
Authorizes the CLI with an Open Artifacts server using the OAuth device flow.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
oa login [options]
|
|
78
|
+
--server <url> Open Artifacts server URL (default: "http://localhost:3000")
|
|
79
|
+
--name <name> Agent or client name to register
|
|
80
|
+
--scopes <scopes> Comma-separated list of scopes (default: "artifacts:read,artifacts:write,shares:write")
|
|
9
81
|
```
|
|
10
82
|
|
|
11
|
-
|
|
83
|
+
### `oa whoami`
|
|
84
|
+
Displays current credentials, server endpoint, organization ID, and token expiration.
|
|
85
|
+
|
|
86
|
+
### `oa push <file>`
|
|
87
|
+
Creates a new artifact or updates an existing one from a local file.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
oa push <file> [options]
|
|
91
|
+
--title <title> Artifact title (defaults to filename)
|
|
92
|
+
--kind <kind> Content type: html | markdown | mermaid | svg (auto-detected if omitted)
|
|
93
|
+
--id <id> Update an existing artifact instead of creating a new one
|
|
94
|
+
--share Automatically generate a public share link
|
|
95
|
+
--password <pass> Protect the share link with a password (implies --share)
|
|
96
|
+
--expires <ttl> Share expiration: 1h, 1d, 7d, 30d (implies --share)
|
|
97
|
+
--message <msg> Version commit message
|
|
98
|
+
--json Output result as JSON
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### `oa list`
|
|
102
|
+
Lists all artifacts in your active organization.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
oa list [--json]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### `oa get <artifact-id>`
|
|
109
|
+
Retrieves artifact metadata or downloads raw content to a file.
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
oa get <artifact-id> [-o output-file] [--json]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### `oa rm <artifact-id>`
|
|
116
|
+
Soft-deletes an artifact.
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
oa rm <artifact-id> [--json]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### `oa share <artifact-id>`
|
|
123
|
+
Generates a new shareable link for an existing artifact.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
oa share <artifact-id> [options]
|
|
127
|
+
--password <pass> Password protect the link
|
|
128
|
+
--expires <ttl> Link expiration duration (e.g. 1h, 1d, 7d, 30d)
|
|
129
|
+
--json Output share metadata as JSON
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### `oa unshare <share-id>`
|
|
133
|
+
Revokes an active share link immediately.
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
oa unshare <share-id> [--json]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Non-Interactive & CI Environments
|
|
142
|
+
|
|
143
|
+
For CI/CD pipelines, headless scripts, or background agent environments, you can bypass the device flow by setting environment variables:
|
|
12
144
|
|
|
13
145
|
```bash
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
oa list # see what you've published
|
|
17
|
-
oa get <artifact-id> -o report.html # fetch content back
|
|
18
|
-
oa share <artifact-id> --password "..." --expires 7d # a password-protected, expiring link
|
|
146
|
+
export OA_SERVER="https://artifacts.your-company.com"
|
|
147
|
+
export OA_TOKEN="oa_live_xxxxxxxxxxxxxxxxxxxxxxxx"
|
|
19
148
|
```
|
|
20
149
|
|
|
21
|
-
|
|
22
|
-
|
|
150
|
+
Generate agent API tokens directly in the Open Artifacts web dashboard under **Team > Agents**.
|
|
151
|
+
|
|
152
|
+
---
|
|
23
153
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
154
|
+
## AI Agent Integration
|
|
155
|
+
|
|
156
|
+
This CLI is designed to be invoked by LLM coding agents (Claude Code, Cursor, Windsurf, Codex, Antigravity, OpenCode). You can install the pre-configured skill via [skills.sh](https://skills.sh/emaxe/open-artifacts):
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npx skills add emaxe/open-artifacts
|
|
160
|
+
```
|
|
27
161
|
|
|
28
|
-
|
|
29
|
-
[main repository](https://github.com/emaxe/open-artifacts) for how to self-host one via Docker
|
|
30
|
-
Compose.
|
|
162
|
+
---
|
|
31
163
|
|
|
32
164
|
## License
|
|
33
165
|
|
|
34
|
-
MIT
|
|
166
|
+
MIT © [emaxe](https://github.com/emaxe)
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# @emaxe/oa
|
|
2
|
+
|
|
3
|
+
<p align="left">
|
|
4
|
+
<a href="https://www.npmjs.com/package/@emaxe/oa"><img src="https://img.shields.io/npm/v/@emaxe/oa.svg?color=blue&logo=npm" alt="npm version"></a>
|
|
5
|
+
<a href="https://www.npmjs.com/package/@emaxe/oa"><img src="https://img.shields.io/npm/dm/@emaxe/oa.svg?color=blue&logo=npm" alt="npm downloads"></a>
|
|
6
|
+
<a href="https://github.com/emaxe/open-artifacts"><img src="https://img.shields.io/badge/GitHub-emaxe%2Fopen--artifacts-blue?logo=github" alt="GitHub Repository"></a>
|
|
7
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
|
|
8
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg?logo=node.js" alt="Node.js"></a>
|
|
9
|
+
<a href="https://skills.sh/emaxe/open-artifacts"><img src="https://skills.sh/b/emaxe/open-artifacts" alt="skills.sh"></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
**[English](README.md)** | **[Русский](README.ru.md)** | **[Changelog](CHANGELOG.md)** | **[История изменений](CHANGELOG.ru.md)**
|
|
13
|
+
|
|
14
|
+
Официальная консольная утилита (CLI) для [Open Artifacts](https://github.com/emaxe/open-artifacts) — открытой альтернативы Claude Artifacts. Позволяет публиковать веб-приложения на HTML, документы Markdown, диаграммы Mermaid или векторную графику SVG из терминала, скриптов или диалогов с AI-агентами, получая в ответ интерактивную публичную ссылку.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### Топики и теги
|
|
19
|
+
`ai-agents` • `artifacts` • `claude-artifacts` • `claude` • `mcp` • `model-context-protocol` • `self-hosted` • `cli` • `open-artifacts` • `developer-tools`
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Установка
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Глобальная установка (рекомендуется):
|
|
27
|
+
npm install -g @emaxe/oa
|
|
28
|
+
|
|
29
|
+
# Или запуск без установки:
|
|
30
|
+
npx @emaxe/oa --help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Быстрый старт
|
|
36
|
+
|
|
37
|
+
### 1. Авторизация
|
|
38
|
+
|
|
39
|
+
Подключитесь к вашему серверу Open Artifacts через удобный интерактивный OAuth Device Flow:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
oa login --server https://artifacts.your-company.com
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Утилита сгенерирует короткий код подтверждения (например, `ABCD-1234`) и ссылку на страницу активации. Перейдите по ссылке, выберите организацию и разрешите доступ. Токен сохранится локально в `~/.config/open-artifacts/credentials.json` с правами `600`.
|
|
46
|
+
|
|
47
|
+
Проверить статус сессии в любой момент:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
oa whoami
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2. Публикация файлов
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Опубликовать HTML-страницу и получить публичную ссылку:
|
|
57
|
+
oa push report.html --title "Финансовый отчет" --share
|
|
58
|
+
|
|
59
|
+
# Опубликовать документ Markdown:
|
|
60
|
+
oa push summary.md --title "Протокол встречи" --share
|
|
61
|
+
|
|
62
|
+
# Отрендерить диаграмму Mermaid:
|
|
63
|
+
oa push architecture.mmd --title "Архитектура сервиса" --share
|
|
64
|
+
|
|
65
|
+
# Загрузить векторный файл SVG:
|
|
66
|
+
oa push diagram.svg --title "Схема базы данных" --share
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Справочник команд
|
|
72
|
+
|
|
73
|
+
### `oa login`
|
|
74
|
+
Авторизация CLI на сервере Open Artifacts по протоколу OAuth Device Flow.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
oa login [options]
|
|
78
|
+
--server <url> URL сервера Open Artifacts (по умолчанию: "http://localhost:3000")
|
|
79
|
+
--name <name> Имя регистрируемого агента
|
|
80
|
+
--scopes <scopes> Список запрашиваемых прав через запятую (по умолчанию: "artifacts:read,artifacts:write,shares:write")
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### `oa whoami`
|
|
84
|
+
Показывает текущие учетные данные, адрес сервера, идентификатор организации и статус токена.
|
|
85
|
+
|
|
86
|
+
### `oa push <file>`
|
|
87
|
+
Создает новый артефакт или обновляет существующий из локального файла.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
oa push <file> [options]
|
|
91
|
+
--title <title> Название артефакта (по умолчанию: имя файла)
|
|
92
|
+
--kind <kind> Тип контента: html | markdown | mermaid | svg (определяется автоматически)
|
|
93
|
+
--id <id> ID существующего артефакта для создания новой версии
|
|
94
|
+
--share Сразу сгенерировать публичную ссылку
|
|
95
|
+
--password <pass> Защитить ссылку паролем (включает --share)
|
|
96
|
+
--expires <ttl> Срок действия ссылки: 1h, 1d, 7d, 30d (включает --share)
|
|
97
|
+
--message <msg> Сообщение версии
|
|
98
|
+
--json Вывод результата в формате JSON
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### `oa list`
|
|
102
|
+
Выводит список всех артефактов в текущей организации.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
oa list [--json]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### `oa get <artifact-id>`
|
|
109
|
+
Показывает информацию об артефакте или скачивает его содержимое в файл.
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
oa get <artifact-id> [-o output-file] [--json]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### `oa rm <artifact-id>`
|
|
116
|
+
Удаляет артефакт в архив.
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
oa rm <artifact-id> [--json]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### `oa share <artifact-id>`
|
|
123
|
+
Создает ссылку для совместного доступа к артефакту.
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
oa share <artifact-id> [options]
|
|
127
|
+
--password <pass> Защитить ссылку паролем
|
|
128
|
+
--expires <ttl> Срок действия ссылки (например: 1h, 1d, 7d, 30d)
|
|
129
|
+
--json Вывод информации о ссылке в формате JSON
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### `oa unshare <share-id>`
|
|
133
|
+
Мгновенно отзывает выданную ссылку.
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
oa unshare <share-id> [--json]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Использование в CI/CD и неинтерактивных средах
|
|
142
|
+
|
|
143
|
+
Для автоматических пайплайнов или фоновых скриптов можно передать параметры через переменные окружения, минуя Device Flow:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
export OA_SERVER="https://artifacts.your-company.com"
|
|
147
|
+
export OA_TOKEN="oa_live_xxxxxxxxxxxxxxxxxxxxxxxx"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Токены агентов создаются в панели управления Open Artifacts в разделе **Команда > Агенты**.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Интеграция с AI-агентами
|
|
155
|
+
|
|
156
|
+
Утилита оптимизирована для взаимодействия с современными AI-агентами (Claude Code, Cursor, Windsurf, Codex, Antigravity, OpenCode). Установите готовый скилл через [skills.sh](https://skills.sh/emaxe/open-artifacts):
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npx skills add emaxe/open-artifacts
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Лицензия
|
|
165
|
+
|
|
166
|
+
MIT © [emaxe](https://github.com/emaxe)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { inferKind } from "../commands/artifacts.js";
|
|
3
|
+
describe("inferKind", () => {
|
|
4
|
+
it("recognizes markdown extensions", () => {
|
|
5
|
+
expect(inferKind("report.md")).toBe("markdown");
|
|
6
|
+
expect(inferKind("report.markdown")).toBe("markdown");
|
|
7
|
+
});
|
|
8
|
+
it("recognizes svg", () => {
|
|
9
|
+
expect(inferKind("logo.svg")).toBe("svg");
|
|
10
|
+
});
|
|
11
|
+
it("recognizes mermaid extensions", () => {
|
|
12
|
+
expect(inferKind("diagram.mmd")).toBe("mermaid");
|
|
13
|
+
expect(inferKind("diagram.mermaid")).toBe("mermaid");
|
|
14
|
+
});
|
|
15
|
+
it("defaults to html for .html and unrecognized extensions", () => {
|
|
16
|
+
expect(inferKind("page.html")).toBe("html");
|
|
17
|
+
expect(inferKind("notes.txt")).toBe("html");
|
|
18
|
+
expect(inferKind("no-extension")).toBe("html");
|
|
19
|
+
});
|
|
20
|
+
it("is case-insensitive", () => {
|
|
21
|
+
expect(inferKind("REPORT.MD")).toBe("markdown");
|
|
22
|
+
});
|
|
23
|
+
it("only looks at the extension, ignoring directories in the path", () => {
|
|
24
|
+
expect(inferKind("/tmp/my.markdown.folder/report.svg")).toBe("svg");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=inferKind.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inferKind.test.js","sourceRoot":"","sources":["../../src/__tests__/inferKind.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { API_KEY_SCOPES, isValidScope } from "../scopes.js";
|
|
3
|
+
describe("isValidScope", () => {
|
|
4
|
+
it("accepts every known scope", () => {
|
|
5
|
+
for (const scope of API_KEY_SCOPES) {
|
|
6
|
+
expect(isValidScope(scope)).toBe(true);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
it("rejects unknown scopes", () => {
|
|
10
|
+
expect(isValidScope("artifacts:admin")).toBe(false);
|
|
11
|
+
expect(isValidScope("")).toBe(false);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=scopes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scopes.test.js","sourceRoot":"","sources":["../../src/__tests__/scopes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5D,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { extname, basename } from "node:path";
|
|
3
3
|
import { requireCredentials } from "../config.js";
|
|
4
4
|
import { makeClient, CliApiError } from "../client.js";
|
|
5
|
-
function inferKind(filePath) {
|
|
5
|
+
export function inferKind(filePath) {
|
|
6
6
|
const ext = extname(filePath).toLowerCase();
|
|
7
7
|
if (ext === ".md" || ext === ".markdown")
|
|
8
8
|
return "markdown";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAUvD,
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { login } from "./commands/login.js";
|
|
|
5
5
|
import { listCommand, pushCommand, getCommand, rmCommand } from "./commands/artifacts.js";
|
|
6
6
|
import { shareCommand, unshareCommand, whoamiCommand } from "./commands/share.js";
|
|
7
7
|
const program = new Command();
|
|
8
|
-
program.name("oa").description("CLI for Open Artifacts — self-hosted artifact hosting for AI agents").version("0.
|
|
8
|
+
program.name("oa").description("CLI for Open Artifacts — self-hosted artifact hosting for AI agents").version("0.2.0");
|
|
9
9
|
program
|
|
10
10
|
.command("login")
|
|
11
11
|
.description("Authorize this device via OAuth device flow and save credentials")
|
package/package.json
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@emaxe/oa",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI for Open Artifacts — publish HTML/Markdown/Mermaid/SVG content to a self-hosted artifact host and get back a shareable link.",
|
|
5
|
-
"keywords": [
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai-agents",
|
|
7
|
+
"artifacts",
|
|
8
|
+
"claude-artifacts",
|
|
9
|
+
"claude",
|
|
10
|
+
"mcp",
|
|
11
|
+
"model-context-protocol",
|
|
12
|
+
"self-hosted",
|
|
13
|
+
"cli",
|
|
14
|
+
"open-artifacts",
|
|
15
|
+
"developer-tools"
|
|
16
|
+
],
|
|
6
17
|
"license": "MIT",
|
|
7
|
-
"author": "",
|
|
18
|
+
"author": "emaxe",
|
|
8
19
|
"homepage": "https://github.com/emaxe/open-artifacts#readme",
|
|
9
20
|
"repository": {
|
|
10
21
|
"type": "git",
|
|
@@ -19,7 +30,12 @@
|
|
|
19
30
|
"node": ">=20"
|
|
20
31
|
},
|
|
21
32
|
"files": [
|
|
22
|
-
"dist"
|
|
33
|
+
"dist",
|
|
34
|
+
"README.md",
|
|
35
|
+
"README.ru.md",
|
|
36
|
+
"CHANGELOG.md",
|
|
37
|
+
"CHANGELOG.ru.md",
|
|
38
|
+
"LICENSE"
|
|
23
39
|
],
|
|
24
40
|
"bin": {
|
|
25
41
|
"oa": "dist/index.js"
|