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.
Files changed (33) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +30 -0
  3. package/CHANGELOG.md +18 -0
  4. package/LICENSE +21 -0
  5. package/README.md +132 -0
  6. package/bin/data-vizard.js +361 -1
  7. package/package.json +32 -10
  8. package/plugins/data-vizard/.claude-plugin/plugin.json +20 -0
  9. package/plugins/data-vizard/.codex-plugin/plugin.json +43 -0
  10. package/plugins/data-vizard/README.md +187 -0
  11. package/plugins/data-vizard/assets/icon.png +0 -0
  12. package/plugins/data-vizard/assets/logo-dark.png +0 -0
  13. package/plugins/data-vizard/assets/logo.png +0 -0
  14. package/plugins/data-vizard/assets/screenshot-output.png +0 -0
  15. package/plugins/data-vizard/assets/screenshot-workflow.png +0 -0
  16. package/plugins/data-vizard/assets/wizard-chart-logo-source.png +0 -0
  17. package/plugins/data-vizard/skills/data-analyst/SKILL.md +63 -0
  18. package/plugins/data-vizard/skills/data-analyst/agents/openai.yaml +4 -0
  19. package/plugins/data-vizard/skills/data-analyst/references/analysis-playbook.md +30 -0
  20. package/plugins/data-vizard/skills/data-curator/SKILL.md +67 -0
  21. package/plugins/data-vizard/skills/data-curator/agents/openai.yaml +4 -0
  22. package/plugins/data-vizard/skills/data-curator/references/dataset-intake-checklist.md +34 -0
  23. package/plugins/data-vizard/skills/data-vizard/SKILL.md +137 -0
  24. package/plugins/data-vizard/skills/data-vizard/agents/openai.yaml +4 -0
  25. package/plugins/data-vizard/skills/data-vizard/references/workflow-map.md +60 -0
  26. package/plugins/data-vizard/skills/designer/SKILL.md +107 -0
  27. package/plugins/data-vizard/skills/designer/agents/openai.yaml +4 -0
  28. package/plugins/data-vizard/skills/designer/assets/html-starter/index.html +95 -0
  29. package/plugins/data-vizard/skills/designer/references/style-directions.md +40 -0
  30. package/plugins/data-vizard/skills/narrator/SKILL.md +62 -0
  31. package/plugins/data-vizard/skills/narrator/agents/openai.yaml +4 -0
  32. package/plugins/data-vizard/skills/narrator/references/anti-ai-tropes.md +43 -0
  33. 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
+ ![Data Vizard workflow](plugins/data-vizard/assets/screenshot-workflow.png)
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
+ ![Data Vizard output example](plugins/data-vizard/assets/screenshot-output.png)
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.
@@ -1,2 +1,362 @@
1
1
  #!/usr/bin/env node
2
- console.log("Data Vizard installer coming soon.");
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.0.1",
4
- "description": "Data Vizard installer",
5
- "main": "index.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
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
- "keywords": [],
10
- "author": "",
11
- "license": "ISC",
12
- "type": "commonjs",
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": "./bin/data-vizard.js"
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
+ }