@schneiderjoseph/devia 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 +23 -0
- package/package.json +1 -1
- package/skills/devia/SKILL.md +3 -0
- package/src/commands/skills.mjs +75 -0
- package/templates/agents/AGENTS.md +2 -1
- package/templates/agents/CLAUDE.md +2 -1
- package/templates/agents/cursor.mdc +1 -1
- package/templates/agents/windsurfrules.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0 — 2026-09-09
|
|
4
|
+
|
|
5
|
+
The standard is unchanged: `VERSION` stays at 0.1.0 and no adopter needs `devia sync`. This
|
|
6
|
+
release is the CLI only.
|
|
7
|
+
|
|
8
|
+
### The skill, once for every project
|
|
9
|
+
|
|
10
|
+
- `devia skills install --global` installs the skill pack in the agent's own configuration
|
|
11
|
+
directory instead of one repository, so the contract applies everywhere. Claude Code is
|
|
12
|
+
supported (`~/.claude/skills/devia/SKILL.md`, or `CLAUDE_CONFIG_DIR` when set); Cursor,
|
|
13
|
+
Copilot and Windsurf report `SKIP` with the reason, because devia will not guess a path
|
|
14
|
+
inside someone's home directory
|
|
15
|
+
- It is the only command that writes outside `--root`: off by default, every path printed, an
|
|
16
|
+
edited file kept without `--force` (`04_PERMISSIONS.md`, `10_NEVER_ALWAYS.md`)
|
|
17
|
+
|
|
18
|
+
### Bootstrap, fixed
|
|
19
|
+
|
|
20
|
+
- The skill and every agent adapter told an agent to run `npx devia init`. Since the package is
|
|
21
|
+
scoped, that resolves to nothing in a repository that has not installed devia: `404 devia@*`.
|
|
22
|
+
They now say `npm i -D @schneiderjoseph/devia && npx devia init`, which is what a cold start
|
|
23
|
+
actually needs. Found while installing the skill system-wide, where the cold start is the
|
|
24
|
+
normal case rather than the exception
|
|
25
|
+
|
|
3
26
|
## 0.1.0 — 2026-09-03
|
|
4
27
|
|
|
5
28
|
First release. Devia consolidates three bodies of work into one maintained standard plus a
|
package/package.json
CHANGED
package/skills/devia/SKILL.md
CHANGED
|
@@ -21,9 +21,12 @@ ls .devia
|
|
|
21
21
|
**No `.devia/`** → initialise before writing any code:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
+
npm i -D @schneiderjoseph/devia # the package is scoped, the command is not
|
|
24
25
|
npx devia init
|
|
25
26
|
```
|
|
26
27
|
|
|
28
|
+
Install first: `npx devia` only resolves once the package is a dependency of the project.
|
|
29
|
+
|
|
27
30
|
Then fill `.devia/00_OVERVIEW.md` from what the repository actually contains — stack, modules,
|
|
28
31
|
where the truth lives. Read the code to fill it; do not invent it. This is not paperwork: it is
|
|
29
32
|
the difference between a task and a guess (`AGT-002`).
|
package/src/commands/skills.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import os from "node:os";
|
|
1
2
|
import path from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
2
4
|
import { packageRoot, exists, read, writeFile } from "../lib/fs.mjs";
|
|
3
5
|
import { color, heading, status, line } from "../lib/ui.mjs";
|
|
4
6
|
|
|
@@ -36,6 +38,62 @@ export function installAdapters(root, { force = false, agents = Object.keys(ADAP
|
|
|
36
38
|
return { written, kept };
|
|
37
39
|
}
|
|
38
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Where an agent keeps skills for every project, not one.
|
|
43
|
+
*
|
|
44
|
+
* Only agents whose user-level location devia can actually determine are listed. The rest are
|
|
45
|
+
* reported as SKIP with the reason: guessing a path in someone's home directory and writing to
|
|
46
|
+
* it is exactly the kind of confident wrong answer this tool exists to prevent.
|
|
47
|
+
*/
|
|
48
|
+
function globalSkillTargets() {
|
|
49
|
+
const home = os.homedir();
|
|
50
|
+
const claudeDir = process.env.CLAUDE_CONFIG_DIR
|
|
51
|
+
? path.resolve(process.env.CLAUDE_CONFIG_DIR)
|
|
52
|
+
: path.join(home, ".claude");
|
|
53
|
+
return {
|
|
54
|
+
claude: {
|
|
55
|
+
target: path.join(claudeDir, "skills", "devia", "SKILL.md"),
|
|
56
|
+
},
|
|
57
|
+
cursor: {
|
|
58
|
+
reason: "no user-level skill directory — use the per-project .cursor/rules/devia.mdc",
|
|
59
|
+
},
|
|
60
|
+
copilot: {
|
|
61
|
+
reason: "instructions are per-repository — .github/copilot-instructions.md",
|
|
62
|
+
},
|
|
63
|
+
windsurf: {
|
|
64
|
+
reason: "rules are per-repository — .windsurfrules",
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Install the skill once for every project. This is the only path that writes outside `--root`,
|
|
71
|
+
* it happens only behind `--global`, and it prints every path it touches (04_PERMISSIONS.md).
|
|
72
|
+
*/
|
|
73
|
+
export function installGlobalSkill({ force = false } = {}) {
|
|
74
|
+
const skill = read(path.join(packageRoot, "skills", "devia", "SKILL.md"));
|
|
75
|
+
const written = [];
|
|
76
|
+
const kept = [];
|
|
77
|
+
const skipped = [];
|
|
78
|
+
for (const [key, entry] of Object.entries(globalSkillTargets())) {
|
|
79
|
+
if (!entry.target) {
|
|
80
|
+
skipped.push([key, entry.reason]);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (skill === null) {
|
|
84
|
+
skipped.push([key, "skill pack missing from the installed package"]);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (exists(entry.target) && !force) {
|
|
88
|
+
kept.push([key, entry.target]);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
writeFile(entry.target, skill);
|
|
92
|
+
written.push([key, entry.target]);
|
|
93
|
+
}
|
|
94
|
+
return { written, kept, skipped };
|
|
95
|
+
}
|
|
96
|
+
|
|
39
97
|
export function installSkill(root, { force = false, agents = Object.keys(SKILL_TARGETS) } = {}) {
|
|
40
98
|
const skill = read(path.join(packageRoot, "skills", "devia", "SKILL.md"));
|
|
41
99
|
const written = [];
|
|
@@ -64,12 +122,29 @@ ${color.bold("devia skills")} — the same contract for every coding agent
|
|
|
64
122
|
|
|
65
123
|
devia skills list
|
|
66
124
|
devia skills install [--agent all|${Object.keys(ADAPTERS).join("|")}] [--force] [--skill]
|
|
125
|
+
devia skills install --global [--force]
|
|
67
126
|
|
|
68
127
|
--skill also install skills/devia/SKILL.md for Cursor and Claude Code
|
|
128
|
+
--global install the skill for every project, in the agent's own configuration
|
|
129
|
+
directory. The only command that writes outside --root; it prints
|
|
130
|
+
every path it touches
|
|
69
131
|
`.trim());
|
|
70
132
|
return flags.help ? 0 : 2;
|
|
71
133
|
}
|
|
72
134
|
|
|
135
|
+
if (flags.global) {
|
|
136
|
+
const res = installGlobalSkill({ force: Boolean(flags.force) });
|
|
137
|
+
heading("devia skills install --global");
|
|
138
|
+
for (const [key, target] of res.written) status("PASS", key, target);
|
|
139
|
+
for (const [key, target] of res.kept) status("SKIP", `${key} — already there`, target);
|
|
140
|
+
for (const [key, reason] of res.skipped) status("SKIP", key, reason);
|
|
141
|
+
line("");
|
|
142
|
+
line(color.dim(" The skill is now available in every project. It still expects each"));
|
|
143
|
+
line(color.dim(" repository to carry its own .devia/ — the skill says how to create one."));
|
|
144
|
+
line("");
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
|
|
73
148
|
if (action === "list") {
|
|
74
149
|
heading("Adapters");
|
|
75
150
|
for (const [key, [, target]] of Object.entries(ADAPTERS)) {
|
|
@@ -10,7 +10,8 @@ This repository uses **devia**: a standard plus a living project memory in `.dev
|
|
|
10
10
|
4. Read the memory file for the surface you are touching — see
|
|
11
11
|
[`.devia/14_INDEX.md`](.devia/14_INDEX.md)
|
|
12
12
|
|
|
13
|
-
If `.devia/` is missing, run `npx devia init
|
|
13
|
+
If `.devia/` is missing, run `npm i -D @schneiderjoseph/devia && npx devia init`, then fill
|
|
14
|
+
`00_OVERVIEW.md` before writing code.
|
|
14
15
|
|
|
15
16
|
## While working
|
|
16
17
|
|
|
@@ -10,7 +10,8 @@ work, updated with every change.
|
|
|
10
10
|
3. `.devia/00_OVERVIEW.md` — what this project is
|
|
11
11
|
4. The memory file for the surface you are touching (`.devia/14_INDEX.md`)
|
|
12
12
|
|
|
13
|
-
No `.devia/`? Run `npx devia init
|
|
13
|
+
No `.devia/`? Run `npm i -D @schneiderjoseph/devia && npx devia init`, then fill
|
|
14
|
+
`00_OVERVIEW.md` before writing code.
|
|
14
15
|
|
|
15
16
|
## Rules that override default behaviour
|
|
16
17
|
|
|
@@ -7,7 +7,7 @@ This repository runs on devia. `.devia/` is the project memory and it is not opt
|
|
|
7
7
|
|
|
8
8
|
1. Before the first edit, read `.devia/AGENTS.md`, `.devia/10_NEVER_ALWAYS.md`,
|
|
9
9
|
`.devia/00_OVERVIEW.md`, and the memory file for the surface you are touching
|
|
10
|
-
(`.devia/14_INDEX.md`). If `.devia/` does not exist, run `npx devia init` first (AGT-001,
|
|
10
|
+
(`.devia/14_INDEX.md`). If `.devia/` does not exist, run `npm i -D @schneiderjoseph/devia && npx devia init` first (AGT-001,
|
|
11
11
|
AGT-002).
|
|
12
12
|
2. Never invent an endpoint, field, config key or business rule. Unknown goes to
|
|
13
13
|
`.devia/11_GAPS.md` or to the human — never into the code as a quiet default (AGT-004,
|
|
@@ -4,7 +4,7 @@ This repository runs on devia. `.devia/` is the project memory.
|
|
|
4
4
|
|
|
5
5
|
1. Read `.devia/AGENTS.md`, `.devia/10_NEVER_ALWAYS.md`, `.devia/00_OVERVIEW.md` and the memory
|
|
6
6
|
file for the surface you are touching before editing anything. No `.devia/`? Run
|
|
7
|
-
`npx devia init` first.
|
|
7
|
+
`npm i -D @schneiderjoseph/devia && npx devia init` first.
|
|
8
8
|
2. Never invent an endpoint, field, config key or business rule — record the unknown in
|
|
9
9
|
`.devia/11_GAPS.md` or ask.
|
|
10
10
|
3. Decided but not built goes to `.devia/12_DEBT.md`; never delete a line you did not discharge.
|