data-vizard 0.0.1 → 0.1.1
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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +30 -0
- package/CHANGELOG.md +18 -0
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/bin/data-vizard.js +361 -1
- package/package.json +32 -10
- package/plugins/data-vizard/.claude-plugin/plugin.json +20 -0
- package/plugins/data-vizard/.codex-plugin/plugin.json +43 -0
- package/plugins/data-vizard/README.md +187 -0
- package/plugins/data-vizard/assets/icon.png +0 -0
- package/plugins/data-vizard/assets/logo-dark.png +0 -0
- package/plugins/data-vizard/assets/logo.png +0 -0
- package/plugins/data-vizard/assets/screenshot-output.png +0 -0
- package/plugins/data-vizard/assets/screenshot-workflow.png +0 -0
- package/plugins/data-vizard/assets/wizard-chart-logo-source.png +0 -0
- package/plugins/data-vizard/skills/data-analyst/SKILL.md +63 -0
- package/plugins/data-vizard/skills/data-analyst/agents/openai.yaml +4 -0
- package/plugins/data-vizard/skills/data-analyst/references/analysis-playbook.md +30 -0
- package/plugins/data-vizard/skills/data-curator/SKILL.md +67 -0
- package/plugins/data-vizard/skills/data-curator/agents/openai.yaml +4 -0
- package/plugins/data-vizard/skills/data-curator/references/dataset-intake-checklist.md +34 -0
- package/plugins/data-vizard/skills/data-vizard/SKILL.md +137 -0
- package/plugins/data-vizard/skills/data-vizard/agents/openai.yaml +4 -0
- package/plugins/data-vizard/skills/data-vizard/references/workflow-map.md +60 -0
- package/plugins/data-vizard/skills/designer/SKILL.md +107 -0
- package/plugins/data-vizard/skills/designer/agents/openai.yaml +4 -0
- package/plugins/data-vizard/skills/designer/assets/html-starter/index.html +95 -0
- package/plugins/data-vizard/skills/designer/references/style-directions.md +40 -0
- package/plugins/data-vizard/skills/narrator/SKILL.md +62 -0
- package/plugins/data-vizard/skills/narrator/agents/openai.yaml +4 -0
- package/plugins/data-vizard/skills/narrator/references/anti-ai-tropes.md +43 -0
- package/plugins/data-vizard/skills/narrator/references/story-structures.md +29 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "data-vizard",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Data Vizard"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "data-vizard",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./plugins/data-vizard"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "data-vizard",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Trine"
|
|
5
|
+
},
|
|
6
|
+
"description": "Data Vizard agent workflow plugins.",
|
|
7
|
+
"version": "0.1.1",
|
|
8
|
+
"plugins": [
|
|
9
|
+
{
|
|
10
|
+
"name": "data-vizard",
|
|
11
|
+
"source": "./plugins/data-vizard",
|
|
12
|
+
"displayName": "Data Vizard",
|
|
13
|
+
"description": "Guide data visualization projects from dataset intake to analysis, narrative, design, and HTML story output.",
|
|
14
|
+
"version": "0.1.1",
|
|
15
|
+
"author": {
|
|
16
|
+
"name": "Trine"
|
|
17
|
+
},
|
|
18
|
+
"repository": "https://github.com/inosaint/data-vizard",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"keywords": [
|
|
21
|
+
"data-visualization",
|
|
22
|
+
"storytelling",
|
|
23
|
+
"csv",
|
|
24
|
+
"analysis",
|
|
25
|
+
"html"
|
|
26
|
+
],
|
|
27
|
+
"category": "Productivity"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Data Vizard will be documented here.
|
|
4
|
+
|
|
5
|
+
## 0.1.1 - 2026-06-30
|
|
6
|
+
|
|
7
|
+
- Added Codex plugin-directory visual assets with a consistent wizard-and-chart logo.
|
|
8
|
+
- Wired `composerIcon`, `logo`, `logoDark`, and screenshot metadata into the Codex plugin manifest.
|
|
9
|
+
- Made the npm installer bin executable for cleaner package execution.
|
|
10
|
+
- Expanded the root and plugin READMEs with compatibility, privacy, verification, update, and release guidance.
|
|
11
|
+
- Added a reproducible script for regenerating plugin visual assets.
|
|
12
|
+
|
|
13
|
+
## 0.1.0 - 2026-06-30
|
|
14
|
+
|
|
15
|
+
- Published the first npm installer for the Data Vizard agent workflow plugin.
|
|
16
|
+
- Bundled Codex and Claude Code marketplace manifests.
|
|
17
|
+
- Included five workflow skills: orchestrator, curator, analyst, narrator, and designer.
|
|
18
|
+
- Added release guidance for npm install testing, Codex marketplace testing, and Claude Code compatibility checks.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Trine
|
|
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
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Data Vizard
|
|
2
|
+
|
|
3
|
+
Data Vizard is an agent plugin for building data visualization stories with a staged workflow. It guides a project from data intake to curation, exploratory analysis, narrative framing, visual design, and a final HTML artifact while keeping user decisions explicit.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Install the published package with npm, pnpm, or Bun:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx data-vizard install
|
|
13
|
+
pnpm dlx data-vizard install
|
|
14
|
+
bunx data-vizard install
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The installer copies the bundled plugin into a stable local marketplace at `~/.data-vizard/marketplace`, writes Codex and Claude Code marketplace files, and attempts to install `data-vizard@data-vizard` when those CLIs are available.
|
|
18
|
+
|
|
19
|
+
## Quickstart
|
|
20
|
+
|
|
21
|
+
After installing, start a new Codex thread or Claude Code session so the plugin skills are loaded.
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Codex: Use $data-vizard:data-vizard to build a visualization from this CSV.
|
|
25
|
+
Claude Code: /data-vizard:data-vizard Build a visualization from this CSV.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
You can also call a role skill directly:
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
$data-vizard:data-curator
|
|
32
|
+
$data-vizard:data-analyst
|
|
33
|
+
$data-vizard:narrator
|
|
34
|
+
$data-vizard:designer
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
## Compatibility
|
|
40
|
+
|
|
41
|
+
| Host | Status | Install path | Notes |
|
|
42
|
+
| --- | --- | --- | --- |
|
|
43
|
+
| Codex app and CLI | Supported | `.agents/plugins/marketplace.json` plus `.codex-plugin/plugin.json` | Local and workspace plugins can appear in the Codex plugin directory through marketplaces or workspace sharing. The public OpenAI-curated directory is not a self-serve npm publishing target. |
|
|
44
|
+
| Claude Code | Supported | `.claude-plugin/marketplace.json` plus `.claude-plugin/plugin.json` | Validate with `claude plugin validate` and install with `claude plugin install data-vizard@data-vizard`. |
|
|
45
|
+
| npm | Supported | `bin/data-vizard.js` installer | The package ships the plugin, marketplace files, README, and changelog. |
|
|
46
|
+
|
|
47
|
+
## Verify
|
|
48
|
+
|
|
49
|
+
Local package checks:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
NPM_CONFIG_CACHE=/tmp/data-vizard-npm-cache npm pack --dry-run --json
|
|
53
|
+
node bin/data-vizard.js install --dry-run --root /tmp/data-vizard-local-smoke
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Published-package smoke test:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
cd /tmp
|
|
60
|
+
NPM_CONFIG_CACHE=/tmp/data-vizard-npm-cache npx --yes data-vizard@0.1.1 --version
|
|
61
|
+
NPM_CONFIG_CACHE=/tmp/data-vizard-npm-cache npx --yes data-vizard@0.1.1 install --dry-run --root /tmp/data-vizard-published-smoke
|
|
62
|
+
NPM_CONFIG_CACHE=/tmp/data-vizard-npm-cache npx --yes data-vizard@0.1.1 install --root /tmp/data-vizard-published-stage --no-codex --no-claude
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Full install verification:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npx --yes data-vizard@0.1.1 install
|
|
69
|
+
codex plugin list --available --json
|
|
70
|
+
claude plugin list
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Claude Code compatibility check:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
claude plugin validate plugins/data-vizard
|
|
77
|
+
claude plugin marketplace add /tmp/data-vizard-published-stage
|
|
78
|
+
claude plugin install data-vizard@data-vizard --scope local
|
|
79
|
+
claude plugin list
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Update Or Remove
|
|
83
|
+
|
|
84
|
+
Update from npm:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npx data-vizard@latest install
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Remove installed plugins:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
codex plugin remove data-vizard@data-vizard
|
|
94
|
+
claude plugin uninstall data-vizard@data-vizard
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
After updating or removing a plugin, start a new Codex thread or Claude Code session.
|
|
98
|
+
|
|
99
|
+
## Privacy And Data
|
|
100
|
+
|
|
101
|
+
Data Vizard works on files and datasets you provide in the active workspace. The plugin itself does not add a server, background sync, analytics, or external app connector. Host-level model, tool, network, approval, and file-access settings still apply in Codex and Claude Code.
|
|
102
|
+
|
|
103
|
+
For sensitive datasets, review source rights before importing data, avoid committing private raw files, and keep project caveats close to any published visualization.
|
|
104
|
+
|
|
105
|
+
## Development Install From Clone
|
|
106
|
+
|
|
107
|
+
Normal installs should use npm. This clone-based path is only for development before a version is published:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
codex plugin marketplace add "$(pwd)"
|
|
111
|
+
codex plugin add data-vizard@data-vizard
|
|
112
|
+
|
|
113
|
+
claude plugin marketplace add "$(pwd)"
|
|
114
|
+
claude plugin install data-vizard@data-vizard
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The plugin source lives in `plugins/data-vizard/`. See `plugins/data-vizard/README.md` for role details, usage notes, update flow, and troubleshooting.
|
|
118
|
+
|
|
119
|
+
## Package Contents
|
|
120
|
+
|
|
121
|
+
- `bin/data-vizard.js` - npm installer CLI.
|
|
122
|
+
- `plugins/data-vizard/` - Packaged plugin source for Codex and Claude Code.
|
|
123
|
+
- `plugins/data-vizard/assets/` - Plugin icon, logo, and screenshots.
|
|
124
|
+
- `CHANGELOG.md` - Release history.
|
|
125
|
+
|
|
126
|
+
## Release Checklist
|
|
127
|
+
|
|
128
|
+
- Keep `package.json`, `plugins/data-vizard/.codex-plugin/plugin.json`, `.claude-plugin/marketplace.json`, and `plugins/data-vizard/.claude-plugin/plugin.json` versions aligned.
|
|
129
|
+
- Regenerate plugin assets with `python3 scripts/generate_plugin_assets.py`; pass `--source /path/to/logo.png` when replacing the canonical logo.
|
|
130
|
+
- Run npm pack and installer dry-run checks before publishing.
|
|
131
|
+
- Run Codex and Claude Code install checks in a fresh terminal or CI job.
|
|
132
|
+
- Update `CHANGELOG.md` for every release.
|
package/bin/data-vizard.js
CHANGED
|
@@ -1,2 +1,362 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
const fs = require("node:fs");
|
|
4
|
+
const os = require("node:os");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
const { spawnSync } = require("node:child_process");
|
|
7
|
+
|
|
8
|
+
const PACKAGE_ROOT = path.resolve(__dirname, "..");
|
|
9
|
+
const PLUGIN_NAME = "data-vizard";
|
|
10
|
+
const MARKETPLACE_NAME = "data-vizard";
|
|
11
|
+
const DISPLAY_NAME = "Data Vizard";
|
|
12
|
+
|
|
13
|
+
function main() {
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const command = args[0];
|
|
16
|
+
|
|
17
|
+
if (!command || command === "--help" || command === "-h") {
|
|
18
|
+
printHelp();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (command === "--version" || command === "-v") {
|
|
23
|
+
console.log(readPackageJson().version);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (command === "install") {
|
|
28
|
+
install(args.slice(1));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
console.error(`Unknown command: ${command}`);
|
|
33
|
+
printHelp();
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function printHelp() {
|
|
38
|
+
console.log(`Data Vizard
|
|
39
|
+
|
|
40
|
+
Usage:
|
|
41
|
+
data-vizard install [options]
|
|
42
|
+
|
|
43
|
+
Options:
|
|
44
|
+
--root <path> Stable marketplace root to write. Default: ~/.data-vizard/marketplace
|
|
45
|
+
--no-codex Stage files but skip Codex CLI registration/install.
|
|
46
|
+
--no-claude Stage files but skip Claude Code CLI registration/install.
|
|
47
|
+
--dry-run Print planned actions without writing files or running CLIs.
|
|
48
|
+
-h, --help Show this help.
|
|
49
|
+
-v, --version Show package version.
|
|
50
|
+
`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function install(args) {
|
|
54
|
+
const options = parseInstallOptions(args);
|
|
55
|
+
const packageJson = readPackageJson();
|
|
56
|
+
const marketplaceRoot = path.resolve(
|
|
57
|
+
expandHome(options.root || path.join(os.homedir(), ".data-vizard", "marketplace")),
|
|
58
|
+
);
|
|
59
|
+
const sourcePluginDir = path.join(PACKAGE_ROOT, "plugins", PLUGIN_NAME);
|
|
60
|
+
const targetPluginDir = path.join(marketplaceRoot, "plugins", PLUGIN_NAME);
|
|
61
|
+
|
|
62
|
+
if (!fs.existsSync(sourcePluginDir)) {
|
|
63
|
+
throw new Error(`Bundled plugin not found at ${sourcePluginDir}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const codexMarketplacePath = path.join(marketplaceRoot, ".agents", "plugins", "marketplace.json");
|
|
67
|
+
const claudeMarketplacePath = path.join(marketplaceRoot, ".claude-plugin", "marketplace.json");
|
|
68
|
+
|
|
69
|
+
console.log(`${DISPLAY_NAME} installer ${packageJson.version}`);
|
|
70
|
+
console.log(`Marketplace root: ${marketplaceRoot}`);
|
|
71
|
+
|
|
72
|
+
if (options.dryRun) {
|
|
73
|
+
console.log(`Would copy ${sourcePluginDir} -> ${targetPluginDir}`);
|
|
74
|
+
console.log(`Would write ${codexMarketplacePath}`);
|
|
75
|
+
console.log(`Would write ${claudeMarketplacePath}`);
|
|
76
|
+
} else {
|
|
77
|
+
copyPlugin(sourcePluginDir, targetPluginDir);
|
|
78
|
+
writeJson(codexMarketplacePath, createCodexMarketplace());
|
|
79
|
+
writeJson(claudeMarketplacePath, createClaudeMarketplace(packageJson.version));
|
|
80
|
+
console.log("Staged Data Vizard marketplace files.");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const stagedOnly = options.noCodex && options.noClaude;
|
|
84
|
+
if (!options.noCodex) {
|
|
85
|
+
installCodex(marketplaceRoot, options.dryRun);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!options.noClaude) {
|
|
89
|
+
installClaude(marketplaceRoot, options.dryRun);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (stagedOnly) {
|
|
93
|
+
printManualCommands(marketplaceRoot);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log("");
|
|
97
|
+
console.log("Start a new Codex thread and use $data-vizard:data-vizard.");
|
|
98
|
+
console.log("Start a new Claude Code session and use /data-vizard:data-vizard.");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function parseInstallOptions(args) {
|
|
102
|
+
const options = {
|
|
103
|
+
root: null,
|
|
104
|
+
noCodex: false,
|
|
105
|
+
noClaude: false,
|
|
106
|
+
dryRun: false,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
110
|
+
const arg = args[index];
|
|
111
|
+
|
|
112
|
+
if (arg === "--root") {
|
|
113
|
+
const value = args[index + 1];
|
|
114
|
+
if (!value) {
|
|
115
|
+
throw new Error("--root requires a path");
|
|
116
|
+
}
|
|
117
|
+
options.root = value;
|
|
118
|
+
index += 1;
|
|
119
|
+
} else if (arg === "--no-codex") {
|
|
120
|
+
options.noCodex = true;
|
|
121
|
+
} else if (arg === "--no-claude") {
|
|
122
|
+
options.noClaude = true;
|
|
123
|
+
} else if (arg === "--dry-run") {
|
|
124
|
+
options.dryRun = true;
|
|
125
|
+
} else if (arg === "--help" || arg === "-h") {
|
|
126
|
+
printHelp();
|
|
127
|
+
process.exit(0);
|
|
128
|
+
} else {
|
|
129
|
+
throw new Error(`Unknown install option: ${arg}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return options;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function copyPlugin(sourcePluginDir, targetPluginDir) {
|
|
137
|
+
fs.rmSync(targetPluginDir, { recursive: true, force: true });
|
|
138
|
+
fs.mkdirSync(path.dirname(targetPluginDir), { recursive: true });
|
|
139
|
+
fs.cpSync(sourcePluginDir, targetPluginDir, {
|
|
140
|
+
recursive: true,
|
|
141
|
+
dereference: true,
|
|
142
|
+
filter: (source) => !source.includes(`${path.sep}.DS_Store`),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function createCodexMarketplace() {
|
|
147
|
+
return {
|
|
148
|
+
name: MARKETPLACE_NAME,
|
|
149
|
+
interface: {
|
|
150
|
+
displayName: DISPLAY_NAME,
|
|
151
|
+
},
|
|
152
|
+
plugins: [
|
|
153
|
+
{
|
|
154
|
+
name: PLUGIN_NAME,
|
|
155
|
+
source: {
|
|
156
|
+
source: "local",
|
|
157
|
+
path: `./plugins/${PLUGIN_NAME}`,
|
|
158
|
+
},
|
|
159
|
+
policy: {
|
|
160
|
+
installation: "AVAILABLE",
|
|
161
|
+
authentication: "ON_INSTALL",
|
|
162
|
+
},
|
|
163
|
+
category: "Productivity",
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function createClaudeMarketplace(version) {
|
|
170
|
+
return {
|
|
171
|
+
name: MARKETPLACE_NAME,
|
|
172
|
+
owner: {
|
|
173
|
+
name: "Trine",
|
|
174
|
+
},
|
|
175
|
+
description: "Data Vizard agent workflow plugins.",
|
|
176
|
+
version,
|
|
177
|
+
plugins: [
|
|
178
|
+
{
|
|
179
|
+
name: PLUGIN_NAME,
|
|
180
|
+
source: `./plugins/${PLUGIN_NAME}`,
|
|
181
|
+
displayName: DISPLAY_NAME,
|
|
182
|
+
description:
|
|
183
|
+
"Guide data visualization projects from dataset intake to analysis, narrative, design, and HTML story output.",
|
|
184
|
+
version,
|
|
185
|
+
author: {
|
|
186
|
+
name: "Trine",
|
|
187
|
+
},
|
|
188
|
+
repository: "https://github.com/inosaint/data-vizard",
|
|
189
|
+
license: "MIT",
|
|
190
|
+
keywords: ["data-visualization", "storytelling", "csv", "analysis", "html"],
|
|
191
|
+
category: "Productivity",
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function installCodex(marketplaceRoot, dryRun) {
|
|
198
|
+
console.log("");
|
|
199
|
+
console.log("Codex");
|
|
200
|
+
|
|
201
|
+
const addArgs = ["plugin", "marketplace", "add", marketplaceRoot];
|
|
202
|
+
const installArgs = ["plugin", "add", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`];
|
|
203
|
+
|
|
204
|
+
if (dryRun) {
|
|
205
|
+
console.log(`Would run: codex ${addArgs.map(shellQuote).join(" ")}`);
|
|
206
|
+
console.log(`Would run: codex ${installArgs.join(" ")}`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (!commandExists("codex")) {
|
|
211
|
+
console.log("Codex CLI was not found on PATH.");
|
|
212
|
+
printCodexCommands(marketplaceRoot);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const add = run("codex", addArgs);
|
|
217
|
+
if (!add.ok) {
|
|
218
|
+
console.warn("Could not register the Codex marketplace automatically.");
|
|
219
|
+
printCommandOutput(add);
|
|
220
|
+
console.warn("Continuing in case the marketplace was already registered.");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const pluginInstall = run("codex", installArgs);
|
|
224
|
+
if (pluginInstall.ok) {
|
|
225
|
+
console.log("Installed data-vizard@data-vizard in Codex.");
|
|
226
|
+
} else {
|
|
227
|
+
console.warn("Could not install the Codex plugin automatically.");
|
|
228
|
+
printCommandOutput(pluginInstall);
|
|
229
|
+
printCodexCommands(marketplaceRoot);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function installClaude(marketplaceRoot, dryRun) {
|
|
234
|
+
console.log("");
|
|
235
|
+
console.log("Claude Code");
|
|
236
|
+
|
|
237
|
+
const marketplaceArgs = ["plugin", "marketplace", "add", marketplaceRoot];
|
|
238
|
+
const installArgs = ["plugin", "install", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`];
|
|
239
|
+
|
|
240
|
+
if (dryRun) {
|
|
241
|
+
console.log(`Would run: claude ${marketplaceArgs.map(shellQuote).join(" ")}`);
|
|
242
|
+
console.log(`Would run: claude ${installArgs.join(" ")}`);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (!commandExists("claude")) {
|
|
247
|
+
console.log("Claude Code CLI was not found on PATH.");
|
|
248
|
+
printClaudeCommands(marketplaceRoot);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const add = run("claude", marketplaceArgs);
|
|
253
|
+
if (!add.ok) {
|
|
254
|
+
console.warn("Could not register the Claude Code marketplace automatically.");
|
|
255
|
+
printCommandOutput(add);
|
|
256
|
+
console.warn("Continuing in case the marketplace was already registered.");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const pluginInstall = run("claude", installArgs);
|
|
260
|
+
if (pluginInstall.ok) {
|
|
261
|
+
console.log("Installed data-vizard@data-vizard in Claude Code.");
|
|
262
|
+
} else {
|
|
263
|
+
console.warn("Could not install the Claude Code plugin automatically.");
|
|
264
|
+
printCommandOutput(pluginInstall);
|
|
265
|
+
printClaudeCommands(marketplaceRoot);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function printManualCommands(marketplaceRoot) {
|
|
270
|
+
printCodexCommands(marketplaceRoot);
|
|
271
|
+
printClaudeCommands(marketplaceRoot);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function printCodexCommands(marketplaceRoot) {
|
|
275
|
+
console.log("");
|
|
276
|
+
console.log("To finish Codex installation manually:");
|
|
277
|
+
console.log(` codex plugin marketplace add ${shellQuote(marketplaceRoot)}`);
|
|
278
|
+
console.log(` codex plugin add ${PLUGIN_NAME}@${MARKETPLACE_NAME}`);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function printClaudeCommands(marketplaceRoot) {
|
|
282
|
+
console.log("");
|
|
283
|
+
console.log("To finish Claude Code installation manually:");
|
|
284
|
+
console.log(` claude plugin marketplace add ${shellQuote(marketplaceRoot)}`);
|
|
285
|
+
console.log(` claude plugin install ${PLUGIN_NAME}@${MARKETPLACE_NAME}`);
|
|
286
|
+
console.log("");
|
|
287
|
+
console.log("Or inside an interactive Claude Code session:");
|
|
288
|
+
console.log(` /plugin marketplace add ${marketplaceRoot}`);
|
|
289
|
+
console.log(` /plugin install ${PLUGIN_NAME}@${MARKETPLACE_NAME}`);
|
|
290
|
+
console.log(" /reload-plugins");
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function commandExists(command) {
|
|
294
|
+
const result = spawnSync(command, ["--version"], { encoding: "utf8" });
|
|
295
|
+
return !(result.error && result.error.code === "ENOENT");
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function run(command, args) {
|
|
299
|
+
const result = spawnSync(command, args, { encoding: "utf8" });
|
|
300
|
+
return {
|
|
301
|
+
ok: !result.error && result.status === 0,
|
|
302
|
+
status: result.status,
|
|
303
|
+
error: result.error,
|
|
304
|
+
stdout: result.stdout,
|
|
305
|
+
stderr: result.stderr,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function printCommandOutput(result) {
|
|
310
|
+
if (result.error) {
|
|
311
|
+
console.warn(` ${result.error.message}`);
|
|
312
|
+
}
|
|
313
|
+
if (result.stderr && result.stderr.trim()) {
|
|
314
|
+
console.warn(indent(result.stderr.trim()));
|
|
315
|
+
}
|
|
316
|
+
if (result.stdout && result.stdout.trim()) {
|
|
317
|
+
console.warn(indent(result.stdout.trim()));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function writeJson(filePath, value) {
|
|
322
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
323
|
+
fs.writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function readPackageJson() {
|
|
327
|
+
return JSON.parse(fs.readFileSync(path.join(PACKAGE_ROOT, "package.json"), "utf8"));
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function expandHome(inputPath) {
|
|
331
|
+
if (inputPath === "~") {
|
|
332
|
+
return os.homedir();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (inputPath.startsWith(`~${path.sep}`)) {
|
|
336
|
+
return path.join(os.homedir(), inputPath.slice(2));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return inputPath;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function shellQuote(value) {
|
|
343
|
+
if (/^[A-Za-z0-9_./:@%+=,-]+$/.test(value)) {
|
|
344
|
+
return value;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function indent(value) {
|
|
351
|
+
return value
|
|
352
|
+
.split("\n")
|
|
353
|
+
.map((line) => ` ${line}`)
|
|
354
|
+
.join("\n");
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
try {
|
|
358
|
+
main();
|
|
359
|
+
} catch (error) {
|
|
360
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
361
|
+
process.exitCode = 1;
|
|
362
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "data-vizard",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Data Vizard
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Installer for the Data Vizard agent workflow plugin.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Trine"
|
|
8
8
|
},
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
"homepage": "https://github.com/inosaint/data-vizard#readme",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/inosaint/data-vizard.git"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/inosaint/data-vizard/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"agent-skills",
|
|
19
|
+
"claude-code",
|
|
20
|
+
"codex",
|
|
21
|
+
"data-visualization",
|
|
22
|
+
"plugin"
|
|
23
|
+
],
|
|
13
24
|
"bin": {
|
|
14
|
-
"data-vizard": "
|
|
25
|
+
"data-vizard": "bin/data-vizard.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"bin/",
|
|
29
|
+
"plugins/data-vizard/",
|
|
30
|
+
".agents/plugins/marketplace.json",
|
|
31
|
+
".claude-plugin/marketplace.json",
|
|
32
|
+
"CHANGELOG.md",
|
|
33
|
+
"README.md"
|
|
34
|
+
],
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18"
|
|
15
37
|
}
|
|
16
38
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "data-vizard",
|
|
3
|
+
"displayName": "Data Vizard",
|
|
4
|
+
"version": "0.1.1",
|
|
5
|
+
"description": "Guide data visualization projects from dataset intake to analysis, narrative, design, and HTML story output.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Trine",
|
|
8
|
+
"url": "https://github.com/inosaint"
|
|
9
|
+
},
|
|
10
|
+
"repository": "https://github.com/inosaint/data-vizard",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"data-visualization",
|
|
14
|
+
"storytelling",
|
|
15
|
+
"csv",
|
|
16
|
+
"analysis",
|
|
17
|
+
"html"
|
|
18
|
+
],
|
|
19
|
+
"skills": "./skills/"
|
|
20
|
+
}
|