awesome-agents 0.1.8 → 0.1.9
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 +17 -0
- package/README.md +5 -0
- package/docs/product/profile-source-format.md +3 -0
- package/package.json +1 -1
- package/src/constants.js +1 -1
- package/src/installer.js +15 -2
- package/src/renderers.js +16 -1
- package/src/skills.js +46 -24
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
This file is maintained by `npm run changelog` and `npm run release`. Release entries are generated from git commit history.
|
|
4
4
|
|
|
5
|
+
## 0.1.9 - 2026-07-16
|
|
6
|
+
|
|
7
|
+
Changes since `v0.1.8`.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Add create-agent-profile skill (f5dcfe0)
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Expose agent-owned support to installed profiles (#12) (832094e)
|
|
16
|
+
- Name awesome-agents profiles directly (9640910)
|
|
17
|
+
- Remove agents nav link (3ad6bb3)
|
|
18
|
+
- Restore coral site accent (ba2ec5c)
|
|
19
|
+
- Refresh site agent directory (2268134)
|
|
20
|
+
- Make skill dependency resolution fault-tolerant instead of fatal (78aea64)
|
|
21
|
+
|
|
5
22
|
## 0.1.8 - 2026-07-08
|
|
6
23
|
|
|
7
24
|
Changes since `v0.1.6`.
|
package/README.md
CHANGED
|
@@ -86,6 +86,11 @@ installs or `~/.awesome-agents/installed.json` for global installs. `list`,
|
|
|
86
86
|
`remove`, and `update` use this registry and refuse to overwrite or delete files
|
|
87
87
|
that do not contain the generated marker unless `--force` is passed.
|
|
88
88
|
|
|
89
|
+
Agent-owned references and scripts are installed under
|
|
90
|
+
`~/.agents/homes/<profile>/`. Every installed harness profile receives the exact
|
|
91
|
+
agent-home and support-root paths in its operating context, so profile instructions
|
|
92
|
+
can refer to bundled resources by relative path without becoming harness-specific.
|
|
93
|
+
|
|
89
94
|
Run Codex profiles with:
|
|
90
95
|
|
|
91
96
|
```bash
|
|
@@ -72,6 +72,9 @@ Agent-owned scripts and references should be installed into
|
|
|
72
72
|
`~/.agents/homes/<profile>/references`.
|
|
73
73
|
Declared skills should be installed into
|
|
74
74
|
`~/.agents/homes/<profile>/skills/<skill>`.
|
|
75
|
+
Installed harness profiles receive the exact agent-home, references, and scripts
|
|
76
|
+
paths in their operating context. Source instructions should refer to these resources
|
|
77
|
+
by relative path instead of embedding a harness-specific or checkout-specific path.
|
|
75
78
|
|
|
76
79
|
Profile source files are intentionally under `agents/`, not `skills/`, because
|
|
77
80
|
the source format models agent profiles separately from loadable skills.
|
package/package.json
CHANGED
package/src/constants.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const PACKAGE_NAME = "awesome-agents";
|
|
2
|
-
export const PACKAGE_VERSION = "0.1.
|
|
2
|
+
export const PACKAGE_VERSION = "0.1.9";
|
|
3
3
|
export const DEFAULT_AGENT = "codex";
|
|
4
4
|
export const SUPPORTED_AGENTS = ["codex", "claude-code", "opencode", "goose", "tenex-edge"];
|
|
5
5
|
export const REGISTRY_DIRNAME = ".awesome-agents";
|
package/src/installer.js
CHANGED
|
@@ -36,10 +36,17 @@ export async function installFromSource(sourceSpec, options = {}) {
|
|
|
36
36
|
const installedAt = new Date().toISOString();
|
|
37
37
|
|
|
38
38
|
for (const profile of profiles) {
|
|
39
|
+
const agentHome = resolveAgentHome(profile, options);
|
|
39
40
|
const supportTargets = await installProfileSupport(profile, options);
|
|
41
|
+
const supportRoots = (profile.supportDirs ?? []).map((supportDir) => ({
|
|
42
|
+
kind: supportDir.kind,
|
|
43
|
+
path: path.join(agentHome, supportDir.kind)
|
|
44
|
+
}));
|
|
40
45
|
const installedSkills = await installProfileSkills(profile, materialized.path, options);
|
|
41
46
|
const renderProfile = {
|
|
42
47
|
...profile,
|
|
48
|
+
agentHome,
|
|
49
|
+
supportRoots,
|
|
43
50
|
installedSkills
|
|
44
51
|
};
|
|
45
52
|
for (const harness of harnesses) {
|
|
@@ -63,6 +70,8 @@ export async function installFromSource(sourceSpec, options = {}) {
|
|
|
63
70
|
target,
|
|
64
71
|
installedAt,
|
|
65
72
|
contentSha256: contentHash(content),
|
|
73
|
+
agentHome,
|
|
74
|
+
supportRoots,
|
|
66
75
|
supportTargets,
|
|
67
76
|
skillTargets: installedSkills.map((skill) => skill.path),
|
|
68
77
|
installedSkills,
|
|
@@ -253,8 +262,7 @@ async function installProfileSupport(profile, options = {}) {
|
|
|
253
262
|
return [];
|
|
254
263
|
}
|
|
255
264
|
|
|
256
|
-
const
|
|
257
|
-
const agentHome = path.join(home, ".agents", "homes", profile.slug);
|
|
265
|
+
const agentHome = resolveAgentHome(profile, options);
|
|
258
266
|
const targets = [];
|
|
259
267
|
|
|
260
268
|
for (const supportDir of profile.supportDirs) {
|
|
@@ -273,6 +281,11 @@ async function installProfileSupport(profile, options = {}) {
|
|
|
273
281
|
return targets;
|
|
274
282
|
}
|
|
275
283
|
|
|
284
|
+
function resolveAgentHome(profile, options = {}) {
|
|
285
|
+
const home = path.resolve(expandHome(options.home ?? os.homedir()));
|
|
286
|
+
return path.join(home, ".agents", "homes", profile.slug);
|
|
287
|
+
}
|
|
288
|
+
|
|
276
289
|
async function listFilesRecursive(root) {
|
|
277
290
|
const entries = await fs.readdir(root, { withFileTypes: true });
|
|
278
291
|
const files = [];
|
package/src/renderers.js
CHANGED
|
@@ -290,9 +290,24 @@ function buildInstructionBody(profile, adapter, harness) {
|
|
|
290
290
|
`- Installed for: \`${harness}\``,
|
|
291
291
|
"- When asked who you are, what agent is running, or what role you are acting as, answer with this identity and role.",
|
|
292
292
|
"- This profile is a reusable operational agent profile, not a skill or local machine setup.",
|
|
293
|
-
|
|
293
|
+
profile.agentHome
|
|
294
|
+
? `- Agent home: \`${profile.agentHome}\``
|
|
295
|
+
: "- This render-only output does not install an agent home or support material."
|
|
294
296
|
];
|
|
295
297
|
|
|
298
|
+
if (profile.supportRoots?.length) {
|
|
299
|
+
parts.push(
|
|
300
|
+
"",
|
|
301
|
+
"## Agent-Owned Support",
|
|
302
|
+
"",
|
|
303
|
+
"Use these installed resources when the operating procedure calls for them. Resolve relative support paths against these roots.",
|
|
304
|
+
""
|
|
305
|
+
);
|
|
306
|
+
for (const support of profile.supportRoots) {
|
|
307
|
+
parts.push(`- \`${support.kind}\`: \`${support.path}\``);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
296
311
|
if (profile.installedSkills?.length) {
|
|
297
312
|
const skillBase = path.join(path.dirname(profile.installedSkills[0].path), "<skill>");
|
|
298
313
|
parts.push(
|
package/src/skills.js
CHANGED
|
@@ -27,26 +27,38 @@ export async function installProfileSkills(profile, sourceRoot, options = {}) {
|
|
|
27
27
|
const installed = [];
|
|
28
28
|
|
|
29
29
|
for (const dependency of dependencies) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
await fs.cp(skill.path, target, {
|
|
37
|
-
recursive: true,
|
|
38
|
-
dereference: true,
|
|
39
|
-
preserveTimestamps: true
|
|
40
|
-
});
|
|
30
|
+
let resolved;
|
|
31
|
+
try {
|
|
32
|
+
resolved = await resolveSkillDependency(profile, dependency, sourceRoot, home, options);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.warn(`Skipping skill "${dependency.selector ?? dependency.source}" for profile "${profile.slug}": ${error.message}`);
|
|
35
|
+
continue;
|
|
41
36
|
}
|
|
42
37
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
const { skill, cleanup } = resolved;
|
|
39
|
+
try {
|
|
40
|
+
const target = path.join(home, ".agents", "homes", profile.slug, "skills", skill.installName);
|
|
41
|
+
|
|
42
|
+
if (!options.dryRun) {
|
|
43
|
+
await fs.rm(target, { recursive: true, force: true });
|
|
44
|
+
await fs.mkdir(path.dirname(target), { recursive: true });
|
|
45
|
+
await fs.cp(skill.path, target, {
|
|
46
|
+
recursive: true,
|
|
47
|
+
dereference: true,
|
|
48
|
+
preserveTimestamps: true
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
installed.push({
|
|
53
|
+
name: skill.installName,
|
|
54
|
+
declaredName: dependency.selector ?? dependency.source ?? skill.name,
|
|
55
|
+
source: skill.source,
|
|
56
|
+
sourceKind: skill.sourceKind,
|
|
57
|
+
path: target
|
|
58
|
+
});
|
|
59
|
+
} finally {
|
|
60
|
+
await cleanup();
|
|
61
|
+
}
|
|
50
62
|
}
|
|
51
63
|
|
|
52
64
|
return installed;
|
|
@@ -115,6 +127,8 @@ function looksLikeRemoteSource(value) {
|
|
|
115
127
|
return value.includes("/") || value.includes(":") || value.startsWith("~") || value.startsWith(".");
|
|
116
128
|
}
|
|
117
129
|
|
|
130
|
+
const NOOP_CLEANUP = async () => {};
|
|
131
|
+
|
|
118
132
|
async function resolveSkillDependency(profile, dependency, sourceRoot, home, options) {
|
|
119
133
|
if (dependency.source) {
|
|
120
134
|
const materialized = await materializeSource(dependency.source, {
|
|
@@ -122,13 +136,15 @@ async function resolveSkillDependency(profile, dependency, sourceRoot, home, opt
|
|
|
122
136
|
requireAgentProfileLayout: false
|
|
123
137
|
});
|
|
124
138
|
try {
|
|
125
|
-
|
|
139
|
+
const skill = await selectSkillFromRoot(materialized.path, dependency.selector, {
|
|
126
140
|
dependency,
|
|
127
141
|
source: materialized.source,
|
|
128
142
|
sourceKind: materialized.kind
|
|
129
143
|
});
|
|
130
|
-
|
|
144
|
+
return { skill, cleanup: materialized.cleanup };
|
|
145
|
+
} catch (error) {
|
|
131
146
|
await materialized.cleanup();
|
|
147
|
+
throw error;
|
|
132
148
|
}
|
|
133
149
|
}
|
|
134
150
|
|
|
@@ -138,7 +154,7 @@ async function resolveSkillDependency(profile, dependency, sourceRoot, home, opt
|
|
|
138
154
|
sourceKind: "profile-local"
|
|
139
155
|
});
|
|
140
156
|
if (profileSkill) {
|
|
141
|
-
return profileSkill;
|
|
157
|
+
return { skill: profileSkill, cleanup: NOOP_CLEANUP };
|
|
142
158
|
}
|
|
143
159
|
|
|
144
160
|
const sourceSkill = await findSkillInRoot(sourceRoot, dependency.selector, {
|
|
@@ -147,7 +163,7 @@ async function resolveSkillDependency(profile, dependency, sourceRoot, home, opt
|
|
|
147
163
|
sourceKind: "local-source"
|
|
148
164
|
});
|
|
149
165
|
if (sourceSkill) {
|
|
150
|
-
return sourceSkill;
|
|
166
|
+
return { skill: sourceSkill, cleanup: NOOP_CLEANUP };
|
|
151
167
|
}
|
|
152
168
|
|
|
153
169
|
const userSkillRoot = path.join(home, ".agents", "skills");
|
|
@@ -157,7 +173,7 @@ async function resolveSkillDependency(profile, dependency, sourceRoot, home, opt
|
|
|
157
173
|
sourceKind: "user-skills"
|
|
158
174
|
});
|
|
159
175
|
if (userSkill) {
|
|
160
|
-
return userSkill;
|
|
176
|
+
return { skill: userSkill, cleanup: NOOP_CLEANUP };
|
|
161
177
|
}
|
|
162
178
|
|
|
163
179
|
throw new Error(`Skill "${dependency.selector}" was not found in the profile source or ${userSkillRoot}.`);
|
|
@@ -246,7 +262,13 @@ async function discoverSkills(root) {
|
|
|
246
262
|
return true;
|
|
247
263
|
}
|
|
248
264
|
|
|
249
|
-
|
|
265
|
+
let skill;
|
|
266
|
+
try {
|
|
267
|
+
skill = await readSkill(skillDir, root);
|
|
268
|
+
} catch (error) {
|
|
269
|
+
console.warn(`Skipping unreadable skill at ${skillDir}: ${error.message}`);
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
250
272
|
if (seenNames.has(skill.installName)) {
|
|
251
273
|
return true;
|
|
252
274
|
}
|