@adobe/data-ai 0.9.74
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/.claude-plugin/plugin.json +8 -0
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/bin/cli.mjs +161 -0
- package/package.json +39 -0
- package/skills/bar/SKILL.md +8 -0
- package/skills/foo/SKILL.md +8 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Adobe, Inc.
|
|
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,106 @@
|
|
|
1
|
+
# @adobe/data-ai
|
|
2
|
+
|
|
3
|
+
Cross-agent architecture skills for [`@adobe/data`](https://www.npmjs.com/package/@adobe/data). One skill bundle, authored once, distributed two ways.
|
|
4
|
+
|
|
5
|
+
Skills version in lockstep with the library: `@adobe/data-ai@x.y.z` describes `@adobe/data@x.y.z`.
|
|
6
|
+
|
|
7
|
+
## Install (any agent)
|
|
8
|
+
|
|
9
|
+
The installer copies the flat skill folders into whichever skill roots your project's agents scan. It is idempotent and version-stamped — commit the result, and re-run to refresh.
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npx @adobe/data-ai@latest install
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This writes:
|
|
16
|
+
|
|
17
|
+
| Root | Agent | Notes |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| `.claude/skills/<name>/` | Claude Code | No recursion — skills must be flat. |
|
|
20
|
+
| `.agents/skills/<name>/` | Cursor, Codex | Tool-neutral; other Agent-Skills agents pick these up. |
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
npx @adobe/data-ai@latest install --claude # only .claude/skills
|
|
26
|
+
npx @adobe/data-ai@latest install --agents # only .agents/skills (alias: --cursor)
|
|
27
|
+
npx @adobe/data-ai@latest install --global # into ~/.claude, ~/.agents
|
|
28
|
+
npx @adobe/data-ai@latest install --dir=./sub # into a specific base dir
|
|
29
|
+
npx @adobe/data-ai@latest list # show bundled skills
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Each root gets a `.data-ai.json` manifest recording which skills this package owns, so a re-run prunes skills we no longer ship without touching skills you added yourself.
|
|
33
|
+
|
|
34
|
+
## Install (Claude Code plugin)
|
|
35
|
+
|
|
36
|
+
Claude users can instead consume the skills as a native plugin from the `adobe/data` marketplace — no npm needed.
|
|
37
|
+
|
|
38
|
+
Interactive:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
/plugin marketplace add adobe/data
|
|
42
|
+
/plugin install adobe-data-ai@adobe-data-skills
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Or declaratively, so collaborators are prompted to auto-install on next launch — commit to your repo's `.claude/settings.json`:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"extraKnownMarketplaces": {
|
|
50
|
+
"adobe-data-skills": {
|
|
51
|
+
"source": { "source": "github", "repo": "adobe/data" }
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"enabledPlugins": {
|
|
55
|
+
"adobe-data-ai@adobe-data-skills": true
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The plugin cache is version-hashed and garbage-collected, so it is not a stable path to symlink against — prefer the `npx … install` copy model when you need a durable, cross-agent artifact.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
# Pragmatic Programming
|
|
65
|
+
|
|
66
|
+
## Target Audience
|
|
67
|
+
|
|
68
|
+
Software engineers who want to build high quality applications with a sustainable velocity.
|
|
69
|
+
|
|
70
|
+
## Goals
|
|
71
|
+
|
|
72
|
+
The goal of effective software engineers is to generate a high rate of value per unit time.
|
|
73
|
+
|
|
74
|
+
rate = value / time
|
|
75
|
+
|
|
76
|
+
We can improve the rate by either increasing value or decreasing time.
|
|
77
|
+
|
|
78
|
+
- Quality: Write better applications. ▲value
|
|
79
|
+
- Velocity: Write applications faster. ▼time
|
|
80
|
+
|
|
81
|
+
### Code Priorities
|
|
82
|
+
|
|
83
|
+
1. Correct: Does the job. This one is non-negotiable.
|
|
84
|
+
2. Clear: Easily understood by both humans and AI.
|
|
85
|
+
3. Changeable: Quickly and safely modified or extended.
|
|
86
|
+
|
|
87
|
+
There is occasionally some tension between clarity and changeability. More abstraction or generic parameters may make things more changeable at the cost of some clarity.
|
|
88
|
+
|
|
89
|
+
### Code Challenges
|
|
90
|
+
|
|
91
|
+
- Complexity: Undermines every single one of our code priorities.
|
|
92
|
+
|
|
93
|
+
Complexity is the limiting factor which defines the upper limit on how sophisticated of an application we are able to create and maintain at a practical velocity.
|
|
94
|
+
|
|
95
|
+
The difficulty of dealing with complexity tends to increase at a greater than linear rate, especially once the short term context window of a human or ai agent is exceeded.
|
|
96
|
+
|
|
97
|
+
### General Principles
|
|
98
|
+
|
|
99
|
+
- Separation of Concerns: If two concerns can be separated then do it.
|
|
100
|
+
- Avoid mutation: Immutable values are easier to reason about.
|
|
101
|
+
- Use Small files: Aim for less than 200 loc. Decompose if > 500 loc.
|
|
102
|
+
- Single concern per file: Export only a single declaration per file.
|
|
103
|
+
- Avoid object oriented classes: Combines data concerns with functions.
|
|
104
|
+
- Distinguish services from data: Services do things, data stores things.
|
|
105
|
+
- Use static typing: Finds errors earlier and guides both AI and humans.
|
|
106
|
+
- Avoid side effects: Pure functions are easier to comprehend and test.
|
package/bin/cli.mjs
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Installer for the @adobe/data-ai skill bundle.
|
|
3
|
+
//
|
|
4
|
+
// Copies the flat SKILL.md folders shipped in this package into whichever
|
|
5
|
+
// agent-skill roots the consuming project scans, so the same authored-once
|
|
6
|
+
// bundle works across Claude Code, Cursor, and Codex:
|
|
7
|
+
//
|
|
8
|
+
// .claude/skills/<name>/ Claude Code (no recursion — flat is required)
|
|
9
|
+
// .agents/skills/<name>/ Cursor, Codex (tool-neutral, future agents)
|
|
10
|
+
//
|
|
11
|
+
// The copy is durable and committable; re-run to refresh to a new version.
|
|
12
|
+
// Ownership is tracked per root in a `.data-ai.json` manifest so re-runs
|
|
13
|
+
// prune skills this package no longer ships without touching skills you added.
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
cpSync,
|
|
17
|
+
existsSync,
|
|
18
|
+
mkdirSync,
|
|
19
|
+
readFileSync,
|
|
20
|
+
readdirSync,
|
|
21
|
+
rmSync,
|
|
22
|
+
writeFileSync,
|
|
23
|
+
} from "node:fs";
|
|
24
|
+
import { homedir } from "node:os";
|
|
25
|
+
import { dirname, join, resolve } from "node:path";
|
|
26
|
+
import { fileURLToPath } from "node:url";
|
|
27
|
+
|
|
28
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
const pkgRoot = resolve(here, "..");
|
|
30
|
+
const skillsSrc = join(pkgRoot, "skills");
|
|
31
|
+
const pkg = JSON.parse(readFileSync(join(pkgRoot, "package.json"), "utf8"));
|
|
32
|
+
const { name: PKG_NAME, version: VERSION } = pkg;
|
|
33
|
+
|
|
34
|
+
// Each target agent's skills root, relative to a base directory.
|
|
35
|
+
const ROOTS = {
|
|
36
|
+
claude: (base) => join(base, ".claude", "skills"),
|
|
37
|
+
agents: (base) => join(base, ".agents", "skills"),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
function discoverSkills() {
|
|
41
|
+
if (!existsSync(skillsSrc)) return [];
|
|
42
|
+
return readdirSync(skillsSrc, { withFileTypes: true })
|
|
43
|
+
.filter((d) => d.isDirectory() && existsSync(join(skillsSrc, d.name, "SKILL.md")))
|
|
44
|
+
.map((d) => d.name)
|
|
45
|
+
.sort();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function installTo(rootDir, skills) {
|
|
49
|
+
mkdirSync(rootDir, { recursive: true });
|
|
50
|
+
const manifestPath = join(rootDir, ".data-ai.json");
|
|
51
|
+
|
|
52
|
+
// Prune skills we previously owned but no longer ship.
|
|
53
|
+
if (existsSync(manifestPath)) {
|
|
54
|
+
try {
|
|
55
|
+
const prev = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
56
|
+
for (const name of prev.skills ?? []) {
|
|
57
|
+
if (!skills.includes(name) && existsSync(join(rootDir, name))) {
|
|
58
|
+
rmSync(join(rootDir, name), { recursive: true, force: true });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
} catch {
|
|
62
|
+
// Unreadable manifest — ignore and re-stamp below.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
for (const name of skills) {
|
|
67
|
+
const dest = join(rootDir, name);
|
|
68
|
+
rmSync(dest, { recursive: true, force: true });
|
|
69
|
+
cpSync(join(skillsSrc, name), dest, { recursive: true });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
writeFileSync(
|
|
73
|
+
manifestPath,
|
|
74
|
+
JSON.stringify({ package: PKG_NAME, version: VERSION, skills }, null, 2) + "\n",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function parseArgs(argv) {
|
|
79
|
+
const positional = [];
|
|
80
|
+
const flags = new Set();
|
|
81
|
+
let dir = null;
|
|
82
|
+
for (const a of argv) {
|
|
83
|
+
if (a === "--global" || a === "-g") flags.add("global");
|
|
84
|
+
else if (a === "--claude") flags.add("claude");
|
|
85
|
+
else if (a === "--agents" || a === "--cursor") flags.add("agents");
|
|
86
|
+
else if (a === "--help" || a === "-h") flags.add("help");
|
|
87
|
+
else if (a.startsWith("--dir=")) dir = a.slice("--dir=".length);
|
|
88
|
+
else if (!a.startsWith("-")) positional.push(a);
|
|
89
|
+
}
|
|
90
|
+
return { cmd: positional[0] ?? "install", flags, dir };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const HELP = `${PKG_NAME} v${VERSION}
|
|
94
|
+
|
|
95
|
+
Install cross-agent architecture skills into the current project.
|
|
96
|
+
|
|
97
|
+
Usage:
|
|
98
|
+
npx ${PKG_NAME}@latest install [options]
|
|
99
|
+
npx ${PKG_NAME}@latest list
|
|
100
|
+
|
|
101
|
+
Commands:
|
|
102
|
+
install Copy skills into the project's agent-skill roots (default).
|
|
103
|
+
list Print the skills bundled in this package.
|
|
104
|
+
|
|
105
|
+
Options:
|
|
106
|
+
--claude Install only into .claude/skills/
|
|
107
|
+
--agents Install only into .agents/skills/ (Cursor, Codex)
|
|
108
|
+
--cursor Alias for --agents
|
|
109
|
+
--global, -g Install into your home directory (~/.claude, ~/.agents)
|
|
110
|
+
instead of the current project.
|
|
111
|
+
--dir=<path> Base directory to install into (default: cwd).
|
|
112
|
+
--help, -h Show this help.
|
|
113
|
+
|
|
114
|
+
With no target flag, installs into both .claude/skills and .agents/skills.
|
|
115
|
+
`;
|
|
116
|
+
|
|
117
|
+
function main() {
|
|
118
|
+
const { cmd, flags, dir } = parseArgs(process.argv.slice(2));
|
|
119
|
+
|
|
120
|
+
if (flags.has("help") || cmd === "help") {
|
|
121
|
+
process.stdout.write(HELP);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const skills = discoverSkills();
|
|
126
|
+
|
|
127
|
+
if (cmd === "list") {
|
|
128
|
+
process.stdout.write(`${PKG_NAME} v${VERSION} bundles ${skills.length} skill(s):\n`);
|
|
129
|
+
for (const s of skills) process.stdout.write(` - ${s}\n`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (cmd !== "install") {
|
|
134
|
+
process.stderr.write(`Unknown command: ${cmd}\n\n${HELP}`);
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (skills.length === 0) {
|
|
140
|
+
process.stderr.write(`No skills found in ${skillsSrc}\n`);
|
|
141
|
+
process.exitCode = 1;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const base = flags.has("global") ? homedir() : dir ? resolve(dir) : process.cwd();
|
|
146
|
+
|
|
147
|
+
const chosen = [];
|
|
148
|
+
if (flags.has("claude")) chosen.push("claude");
|
|
149
|
+
if (flags.has("agents")) chosen.push("agents");
|
|
150
|
+
if (chosen.length === 0) chosen.push("claude", "agents");
|
|
151
|
+
|
|
152
|
+
process.stdout.write(`Installing ${skills.length} skill(s) from ${PKG_NAME} v${VERSION}\n`);
|
|
153
|
+
for (const key of chosen) {
|
|
154
|
+
const rootDir = ROOTS[key](base);
|
|
155
|
+
installTo(rootDir, skills);
|
|
156
|
+
process.stdout.write(` ${rootDir}\n`);
|
|
157
|
+
}
|
|
158
|
+
process.stdout.write(`Skills: ${skills.join(", ")}\n`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@adobe/data-ai",
|
|
3
|
+
"version": "0.9.74",
|
|
4
|
+
"description": "Cross-agent architecture skills for @adobe/data — installable as a Claude Code plugin or copied into any Agent-Skills-compatible agent (Cursor, Codex).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"private": false,
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"registry": "https://registry.npmjs.org/",
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"data-ai": "bin/cli.mjs"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"skills",
|
|
16
|
+
"bin",
|
|
17
|
+
".claude-plugin",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"keywords": [
|
|
22
|
+
"adobe",
|
|
23
|
+
"data",
|
|
24
|
+
"agent-skills",
|
|
25
|
+
"claude-code",
|
|
26
|
+
"cursor",
|
|
27
|
+
"codex",
|
|
28
|
+
"skills"
|
|
29
|
+
],
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"vitest": "^1.6.0"
|
|
32
|
+
},
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "cp ../../LICENSE .",
|
|
36
|
+
"test": "vitest --run --passWithNoTests",
|
|
37
|
+
"publish-public": "pnpm build && pnpm publish --no-git-checks --access public"
|
|
38
|
+
}
|
|
39
|
+
}
|