cofounder-crew 0.1.11 → 0.1.13
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/README.md +198 -263
- package/dist/src/cli.js +949 -175
- package/dist/src/cli.js.map +1 -1
- package/dist/src/codex.d.ts +3 -1
- package/dist/src/codex.js +9 -6
- package/dist/src/codex.js.map +1 -1
- package/dist/src/codexConfig.d.ts +6 -2
- package/dist/src/codexConfig.js +98 -19
- package/dist/src/codexConfig.js.map +1 -1
- package/dist/src/init.js +5 -0
- package/dist/src/init.js.map +1 -1
- package/dist/src/manage.d.ts +64 -0
- package/dist/src/manage.js +355 -0
- package/dist/src/manage.js.map +1 -0
- package/dist/src/memberRuntime.d.ts +2 -0
- package/dist/src/memberRuntime.js +48 -6
- package/dist/src/memberRuntime.js.map +1 -1
- package/dist/src/runtime.js +9 -2
- package/dist/src/runtime.js.map +1 -1
- package/dist/src/setup.js +6 -3
- package/dist/src/setup.js.map +1 -1
- package/dist/src/skills.d.ts +22 -0
- package/dist/src/skills.js +283 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/templates.d.ts +1 -0
- package/dist/src/templates.js +27 -4
- package/dist/src/templates.js.map +1 -1
- package/dist/src/types.d.ts +11 -1
- package/docs/README.md +15 -0
- package/docs/cli.md +137 -0
- package/docs/configuration.md +200 -0
- package/docs/development.md +19 -0
- package/docs/examples.md +79 -0
- package/docs/faq.md +89 -0
- package/docs/prompts/bootstrap-codex.md +78 -0
- package/docs/releasing.md +23 -0
- package/docs/runtime.md +96 -0
- package/docs/updating.md +93 -0
- package/package.json +3 -2
package/dist/src/setup.js
CHANGED
|
@@ -15,11 +15,11 @@ export function formatCodexSetup(options = {}) {
|
|
|
15
15
|
|
|
16
16
|
Preferred from npm registry:
|
|
17
17
|
|
|
18
|
-
codex mcp add cofounder -- npx -y --package ${packageName} -- cofounder mcp
|
|
18
|
+
codex mcp add cofounder -- npx -y --package ${packageName} -- cofounder serve mcp
|
|
19
19
|
|
|
20
20
|
After npm link or global install:
|
|
21
21
|
|
|
22
|
-
codex mcp add cofounder -- cofounder mcp
|
|
22
|
+
codex mcp add cofounder -- cofounder serve mcp
|
|
23
23
|
|
|
24
24
|
Direct checkout fallback after npm run build:
|
|
25
25
|
|
|
@@ -33,8 +33,11 @@ Then open Codex from a configured project:
|
|
|
33
33
|
}
|
|
34
34
|
export async function installCodexMcp(options = {}) {
|
|
35
35
|
const packageName = options.packageName ?? DEFAULT_PUBLISHED_PACKAGE;
|
|
36
|
-
const args = ["mcp", "add", "cofounder", "--", "npx", "-y", "--package", packageName, "--", "cofounder", "mcp"];
|
|
36
|
+
const args = ["mcp", "add", "cofounder", "--", "npx", "-y", "--package", packageName, "--", "cofounder", "serve", "mcp"];
|
|
37
37
|
try {
|
|
38
|
+
await execFileAsync("codex", ["mcp", "remove", "cofounder"], {
|
|
39
|
+
maxBuffer: 10 * 1024 * 1024
|
|
40
|
+
}).catch(() => undefined);
|
|
38
41
|
await execFileAsync("codex", args, {
|
|
39
42
|
maxBuffer: 10 * 1024 * 1024
|
|
40
43
|
});
|
package/dist/src/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAM1D,MAAM,UAAU,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC;IACrE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;QAC9D,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,OAAO;;;;gDAIuC,WAAW;;;;;;;;oCAQvB,aAAa;;;;;;CAMhD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA6B,EAAE;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC;IACrE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAM1D,MAAM,UAAU,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC;IACrE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;QAC9D,CAAC,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,OAAO;;;;gDAIuC,WAAW;;;;;;;;oCAQvB,aAAa;;;;;;CAMhD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA6B,EAAE;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,yBAAyB,CAAC;IACrE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACzH,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE;YAC3D,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;QACH,OAAO,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,cAAc,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LoadedProject, MemberSettings } from "./types.js";
|
|
2
|
+
export type SkillMode = "inherit" | "none" | "allowlist" | "isolated";
|
|
3
|
+
export interface PreparedSkill {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
source: "from_project" | "from_main" | "team";
|
|
8
|
+
path: string;
|
|
9
|
+
materialized_path: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface PreparedSkills {
|
|
12
|
+
mode: SkillMode;
|
|
13
|
+
from_project: string[];
|
|
14
|
+
from_main: string[];
|
|
15
|
+
team: string[];
|
|
16
|
+
skills: PreparedSkill[];
|
|
17
|
+
disabled_project_skill_paths: string[];
|
|
18
|
+
requires_member_home: boolean;
|
|
19
|
+
agent_skill_root: string | null;
|
|
20
|
+
codex_skill_root: string | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function prepareSkills(project: LoadedProject, settings: MemberSettings, memberHomeAbsolutePath: string | null): Promise<PreparedSkills>;
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { cp, mkdir, readdir, readFile, rm, stat, symlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { CofounderError } from "./errors.js";
|
|
5
|
+
import { pathExists } from "./paths.js";
|
|
6
|
+
export async function prepareSkills(project, settings, memberHomeAbsolutePath) {
|
|
7
|
+
const mode = normalizeSkillMode(settings);
|
|
8
|
+
const fromProject = settings.skills?.from_project ?? [];
|
|
9
|
+
const fromMain = settings.skills?.from_main ?? [];
|
|
10
|
+
const team = settings.skills?.team ?? [];
|
|
11
|
+
validateSkillSettings(mode, fromProject, fromMain, team);
|
|
12
|
+
if (mode === "inherit") {
|
|
13
|
+
return {
|
|
14
|
+
mode,
|
|
15
|
+
from_project: [],
|
|
16
|
+
from_main: [],
|
|
17
|
+
team: [],
|
|
18
|
+
skills: [],
|
|
19
|
+
disabled_project_skill_paths: [],
|
|
20
|
+
requires_member_home: false,
|
|
21
|
+
agent_skill_root: null,
|
|
22
|
+
codex_skill_root: null
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (!memberHomeAbsolutePath) {
|
|
26
|
+
throw new CofounderError(`skills.mode = "${mode}" requires a member home directory`);
|
|
27
|
+
}
|
|
28
|
+
const [projectSkillScope, mainSkills, teamSkills] = await Promise.all([
|
|
29
|
+
loadProjectSkillScope(project, fromProject),
|
|
30
|
+
mode === "none" ? [] : loadMainSkills(project, settings, fromMain),
|
|
31
|
+
loadTeamSkills(project, team)
|
|
32
|
+
]);
|
|
33
|
+
const skills = [...projectSkillScope.skills, ...mainSkills, ...teamSkills];
|
|
34
|
+
const roots = await materializeSkills(project, memberHomeAbsolutePath, skills);
|
|
35
|
+
return {
|
|
36
|
+
mode,
|
|
37
|
+
from_project: fromProject,
|
|
38
|
+
from_main: fromMain,
|
|
39
|
+
team,
|
|
40
|
+
skills: skills.map((skill) => ({
|
|
41
|
+
...skill,
|
|
42
|
+
materialized_path: skill.source === "from_project"
|
|
43
|
+
? null
|
|
44
|
+
: path.relative(project.projectRoot, path.join(roots.agentSkillRoot, safeSkillFolderName(skill.id)))
|
|
45
|
+
})),
|
|
46
|
+
disabled_project_skill_paths: projectSkillScope.disabledSkillPaths,
|
|
47
|
+
requires_member_home: true,
|
|
48
|
+
agent_skill_root: path.relative(project.projectRoot, roots.agentSkillRoot),
|
|
49
|
+
codex_skill_root: path.relative(project.projectRoot, roots.codexSkillRoot)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function normalizeSkillMode(settings) {
|
|
53
|
+
if (!settings.skills?.mode &&
|
|
54
|
+
((settings.skills?.from_project?.length ?? 0) > 0 ||
|
|
55
|
+
(settings.skills?.from_main?.length ?? 0) > 0 ||
|
|
56
|
+
(settings.skills?.team?.length ?? 0) > 0)) {
|
|
57
|
+
return "isolated";
|
|
58
|
+
}
|
|
59
|
+
return settings.skills?.mode ?? "inherit";
|
|
60
|
+
}
|
|
61
|
+
function validateSkillSettings(mode, fromProject, fromMain, team) {
|
|
62
|
+
if (!["inherit", "none", "allowlist", "isolated"].includes(mode)) {
|
|
63
|
+
throw new CofounderError(`Unsupported skill mode: ${mode}`);
|
|
64
|
+
}
|
|
65
|
+
if ((mode === "inherit" || mode === "none") && (fromProject.length > 0 || fromMain.length > 0 || team.length > 0)) {
|
|
66
|
+
throw new CofounderError(`skills.from_project, skills.from_main, and skills.team can only be used when skills.mode = "isolated" or "allowlist"`);
|
|
67
|
+
}
|
|
68
|
+
for (const skill of [...fromProject, ...fromMain, ...team]) {
|
|
69
|
+
if (!/^[A-Za-z0-9_.:-]+$/.test(skill) || skill === "." || skill === "..") {
|
|
70
|
+
throw new CofounderError(`Unsupported skill id: ${skill}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function loadProjectSkillScope(project, requested) {
|
|
75
|
+
const candidates = await loadSkillCandidates(projectSkillRoots(project));
|
|
76
|
+
const selectedPaths = new Set();
|
|
77
|
+
const skills = requested.map((id) => {
|
|
78
|
+
const candidate = resolveSkillCandidate(candidates, id);
|
|
79
|
+
if (!candidate) {
|
|
80
|
+
throw new CofounderError(`Project skill not found: ${id}`);
|
|
81
|
+
}
|
|
82
|
+
selectedPaths.add(candidate.path);
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
name: candidate.name,
|
|
86
|
+
description: candidate.description,
|
|
87
|
+
source: "from_project",
|
|
88
|
+
path: candidate.path,
|
|
89
|
+
materialized_path: null
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
const disabledSkillPaths = uniqueSkillPaths(candidates)
|
|
93
|
+
.filter((skillPath) => !selectedPaths.has(skillPath));
|
|
94
|
+
return { skills, disabledSkillPaths };
|
|
95
|
+
}
|
|
96
|
+
async function loadMainSkills(project, settings, requested) {
|
|
97
|
+
if (requested.length === 0) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
const roots = (settings.skills?.roots ?? mainSkillRoots()).map((root) => resolveUserPath(root, project.projectRoot));
|
|
101
|
+
const candidates = await loadSkillCandidates(roots);
|
|
102
|
+
return requested.map((id) => {
|
|
103
|
+
const candidate = resolveSkillCandidate(candidates, id);
|
|
104
|
+
if (!candidate) {
|
|
105
|
+
throw new CofounderError(`Main skill not found: ${id}`);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
id,
|
|
109
|
+
name: candidate.name,
|
|
110
|
+
description: candidate.description,
|
|
111
|
+
source: "from_main",
|
|
112
|
+
path: candidate.path,
|
|
113
|
+
materialized_path: null
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async function loadSkillCandidates(roots) {
|
|
118
|
+
const candidates = new Map();
|
|
119
|
+
for (const root of roots) {
|
|
120
|
+
if (!(await pathExists(root))) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
for (const candidate of await findSkillCandidates(root)) {
|
|
124
|
+
candidates.set(candidate.id, candidate);
|
|
125
|
+
candidates.set(candidate.name, candidate);
|
|
126
|
+
candidates.set(path.basename(path.dirname(candidate.path)), candidate);
|
|
127
|
+
if (candidate.name.includes(":")) {
|
|
128
|
+
candidates.set(candidate.name.split(":").at(-1) ?? candidate.name, candidate);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return candidates;
|
|
133
|
+
}
|
|
134
|
+
function resolveSkillCandidate(candidates, id) {
|
|
135
|
+
return candidates.get(id) ?? candidates.get(id.split(":").at(-1) ?? id);
|
|
136
|
+
}
|
|
137
|
+
async function loadTeamSkills(project, requested) {
|
|
138
|
+
const skills = [];
|
|
139
|
+
for (const id of requested) {
|
|
140
|
+
const skillPath = path.join(project.configRoot, "skills", id, "SKILL.md");
|
|
141
|
+
if (!(await pathExists(skillPath))) {
|
|
142
|
+
throw new CofounderError(`Team skill not found: .cofounder/skills/${id}/SKILL.md`);
|
|
143
|
+
}
|
|
144
|
+
const metadata = await readSkillMetadata(skillPath);
|
|
145
|
+
skills.push({
|
|
146
|
+
id,
|
|
147
|
+
name: metadata.name || id,
|
|
148
|
+
description: metadata.description,
|
|
149
|
+
source: "team",
|
|
150
|
+
path: skillPath,
|
|
151
|
+
materialized_path: null
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return skills;
|
|
155
|
+
}
|
|
156
|
+
async function materializeSkills(project, memberHomeAbsolutePath, skills) {
|
|
157
|
+
const agentSkillRoot = path.join(memberHomeAbsolutePath, ".agents", "skills");
|
|
158
|
+
const codexSkillRoot = path.join(memberHomeAbsolutePath, "skills");
|
|
159
|
+
await resetDir(agentSkillRoot);
|
|
160
|
+
await resetDir(codexSkillRoot);
|
|
161
|
+
const seen = new Set();
|
|
162
|
+
for (const skill of skills) {
|
|
163
|
+
if (skill.source === "from_project") {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const folderName = safeSkillFolderName(skill.id);
|
|
167
|
+
if (seen.has(folderName)) {
|
|
168
|
+
throw new CofounderError(`Duplicate materialized skill folder: ${folderName}`);
|
|
169
|
+
}
|
|
170
|
+
seen.add(folderName);
|
|
171
|
+
const sourceDir = path.dirname(skill.path);
|
|
172
|
+
await linkSkillDirectory(sourceDir, path.join(agentSkillRoot, folderName));
|
|
173
|
+
await linkSkillDirectory(sourceDir, path.join(codexSkillRoot, folderName));
|
|
174
|
+
}
|
|
175
|
+
await writeSkillReadme(project, memberHomeAbsolutePath, skills);
|
|
176
|
+
return { agentSkillRoot, codexSkillRoot };
|
|
177
|
+
}
|
|
178
|
+
function uniqueSkillPaths(candidates) {
|
|
179
|
+
return Array.from(new Set(Array.from(candidates.values()).map((candidate) => candidate.path)));
|
|
180
|
+
}
|
|
181
|
+
async function resetDir(dir) {
|
|
182
|
+
await rm(dir, { recursive: true, force: true });
|
|
183
|
+
await mkdir(dir, { recursive: true });
|
|
184
|
+
}
|
|
185
|
+
async function linkSkillDirectory(sourceDir, targetDir) {
|
|
186
|
+
try {
|
|
187
|
+
await symlink(sourceDir, targetDir, "dir");
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function writeSkillReadme(project, memberHomeAbsolutePath, skills) {
|
|
194
|
+
const lines = [
|
|
195
|
+
"# Cofounder Skill Scope",
|
|
196
|
+
"",
|
|
197
|
+
"Generated by Cofounder for this member runtime.",
|
|
198
|
+
"Codex discovers these skills natively from this member home at startup.",
|
|
199
|
+
""
|
|
200
|
+
];
|
|
201
|
+
if (skills.length === 0) {
|
|
202
|
+
lines.push("No Cofounder-managed skills are assigned to this member.");
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
for (const skill of skills) {
|
|
206
|
+
lines.push(`- ${skill.id} (${skill.source}): ${path.relative(project.projectRoot, skill.path)}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const readmePath = path.join(memberHomeAbsolutePath, "skills.README.md");
|
|
210
|
+
await mkdir(path.dirname(readmePath), { recursive: true });
|
|
211
|
+
await writeFile(readmePath, `${lines.join("\n")}\n`, "utf8");
|
|
212
|
+
}
|
|
213
|
+
async function findSkillCandidates(root) {
|
|
214
|
+
const found = [];
|
|
215
|
+
await walk(root, async (filePath) => {
|
|
216
|
+
if (path.basename(filePath) !== "SKILL.md") {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const metadata = await readSkillMetadata(filePath);
|
|
220
|
+
found.push({
|
|
221
|
+
id: metadata.name || path.basename(path.dirname(filePath)),
|
|
222
|
+
name: metadata.name || path.basename(path.dirname(filePath)),
|
|
223
|
+
description: metadata.description,
|
|
224
|
+
path: filePath
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
return found;
|
|
228
|
+
}
|
|
229
|
+
async function walk(dir, onFile) {
|
|
230
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
231
|
+
for (const entry of entries) {
|
|
232
|
+
const filePath = path.join(dir, entry.name);
|
|
233
|
+
if (entry.isDirectory() || await isDirectorySymlink(filePath, entry.isSymbolicLink())) {
|
|
234
|
+
await walk(filePath, onFile);
|
|
235
|
+
}
|
|
236
|
+
else if (entry.isFile()) {
|
|
237
|
+
await onFile(filePath);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function isDirectorySymlink(filePath, isSymlink) {
|
|
242
|
+
if (!isSymlink) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
return (await stat(filePath)).isDirectory();
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
async function readSkillMetadata(skillPath) {
|
|
253
|
+
const raw = await readFile(skillPath, "utf8");
|
|
254
|
+
const frontmatter = /^---\s*\n([\s\S]*?)\n---/.exec(raw)?.[1] ?? raw.slice(0, 1200);
|
|
255
|
+
return {
|
|
256
|
+
name: frontmatter.match(/^name:\s*(.+)$/m)?.[1]?.trim() ?? "",
|
|
257
|
+
description: frontmatter.match(/^description:\s*(.+)$/m)?.[1]?.trim() ?? ""
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function projectSkillRoots(project) {
|
|
261
|
+
return [path.join(project.projectRoot, ".agents", "skills")];
|
|
262
|
+
}
|
|
263
|
+
function mainSkillRoots() {
|
|
264
|
+
return [
|
|
265
|
+
path.join(os.homedir(), ".agents", "skills"),
|
|
266
|
+
"/etc/codex/skills",
|
|
267
|
+
path.join(os.homedir(), ".codex", "skills"),
|
|
268
|
+
path.join(os.homedir(), ".codex", "plugins", "cache")
|
|
269
|
+
];
|
|
270
|
+
}
|
|
271
|
+
function safeSkillFolderName(value) {
|
|
272
|
+
return value.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
273
|
+
}
|
|
274
|
+
function resolveUserPath(filePath, baseDir) {
|
|
275
|
+
if (filePath === "~") {
|
|
276
|
+
return os.homedir();
|
|
277
|
+
}
|
|
278
|
+
if (filePath.startsWith("~/")) {
|
|
279
|
+
return path.join(os.homedir(), filePath.slice(2));
|
|
280
|
+
}
|
|
281
|
+
return path.isAbsolute(filePath) ? filePath : path.resolve(baseDir, filePath);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/src/templates.d.ts
CHANGED
package/dist/src/templates.js
CHANGED
|
@@ -30,6 +30,9 @@ function buildTemplate(name, description, teamId, teamName, backendWriteMode) {
|
|
|
30
30
|
codexInstructions: codexInstructions(),
|
|
31
31
|
projectInstructions: projectInstructions(),
|
|
32
32
|
teamYaml: teamYaml(teamId, teamName),
|
|
33
|
+
mcp: {
|
|
34
|
+
cofounder: cofounderMcp()
|
|
35
|
+
},
|
|
33
36
|
prompts: Object.fromEntries(members.map((member) => [member, memberPrompt(member)])),
|
|
34
37
|
settings: {
|
|
35
38
|
lead: memberSettings("lead", "direct"),
|
|
@@ -38,6 +41,14 @@ function buildTemplate(name, description, teamId, teamName, backendWriteMode) {
|
|
|
38
41
|
}
|
|
39
42
|
};
|
|
40
43
|
}
|
|
44
|
+
function cofounderMcp() {
|
|
45
|
+
return `command = "npx"
|
|
46
|
+
args = ["-y", "--package", "cofounder-crew", "--", "cofounder", "serve", "mcp"]
|
|
47
|
+
cwd = "{project_root}"
|
|
48
|
+
startup_timeout_sec = 20
|
|
49
|
+
tool_timeout_sec = 120
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
41
52
|
function codexInstructions() {
|
|
42
53
|
return `# Cofounder Crew
|
|
43
54
|
|
|
@@ -72,12 +83,16 @@ Cofounder configuration lives in plain files:
|
|
|
72
83
|
- .cofounder/team.yaml defines members, responsibilities, and delegation rules.
|
|
73
84
|
- .cofounder/project.md defines shared project instructions for delegated teammates.
|
|
74
85
|
- .cofounder/members/<member>/prompt.md defines each member's role instructions.
|
|
75
|
-
- .cofounder/members/<member>/settings.toml defines model, sandbox, MCP, memory, and write-mode settings.
|
|
86
|
+
- .cofounder/members/<member>/settings.toml defines model, sandbox, MCP, native Codex skills, memory, and write-mode settings.
|
|
87
|
+
- .cofounder/mcp/<server>.toml defines project-owned MCP servers that can be assigned to specific members.
|
|
88
|
+
- .cofounder/skills/<skill>/SKILL.md defines project-owned skills that Cofounder links into assigned members' runtime homes for native Codex skill loading.
|
|
89
|
+
- .agents/skills/<skill>/SKILL.md defines normal project skills visible to the primary Codex session; assign selected ones to members with skills.from_project.
|
|
76
90
|
- .cofounder/memory/ stores project and member memory notes.
|
|
77
91
|
- .cofounder/runs/ stores task records, logs, prompts, and results.
|
|
78
92
|
- .cofounder/.gitignore keeps generated runs, worktrees, and member runtime home files out of project diffs.
|
|
79
93
|
|
|
80
94
|
When the team needs to change, edit these files directly and keep the structure simple.
|
|
95
|
+
Do not simulate member skills by pasting SKILL.md paths into delegated task prompts; assign them in settings.toml so Codex discovers them at startup.
|
|
81
96
|
|
|
82
97
|
## If Cofounder Tools Are Missing
|
|
83
98
|
|
|
@@ -95,7 +110,7 @@ function projectInstructions() {
|
|
|
95
110
|
|
|
96
111
|
Cofounder did not find existing project rules to derive worker context from yet.
|
|
97
112
|
|
|
98
|
-
When AGENTS.md contains project rules, run \`cofounder sync
|
|
113
|
+
When AGENTS.md contains project rules, run \`cofounder context sync\` to refresh this file automatically with worker-safe context.
|
|
99
114
|
|
|
100
115
|
Worker-relevant project rules include:
|
|
101
116
|
|
|
@@ -207,7 +222,8 @@ Responsibilities:
|
|
|
207
222
|
}
|
|
208
223
|
function memberSettings(member, writeMode) {
|
|
209
224
|
const effort = member === "reviewer" ? "medium" : "high";
|
|
210
|
-
const mcpMode = member === "reviewer" ? "none" : "
|
|
225
|
+
const mcpMode = member === "reviewer" ? "none" : "isolated";
|
|
226
|
+
const mcpTeam = member === "reviewer" ? "[]" : "[\"cofounder\"]";
|
|
211
227
|
return `model = "gpt-5.5"
|
|
212
228
|
sandbox = "workspace-write"
|
|
213
229
|
approval = "never"
|
|
@@ -219,7 +235,14 @@ mode = "${writeMode}"
|
|
|
219
235
|
|
|
220
236
|
[mcp]
|
|
221
237
|
mode = "${mcpMode}"
|
|
222
|
-
|
|
238
|
+
from_main = []
|
|
239
|
+
team = ${mcpTeam}
|
|
240
|
+
|
|
241
|
+
[skills]
|
|
242
|
+
mode = "isolated"
|
|
243
|
+
from_project = []
|
|
244
|
+
from_main = []
|
|
245
|
+
team = []
|
|
223
246
|
|
|
224
247
|
[memory]
|
|
225
248
|
project = true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAqB7C,MAAM,CAAC,MAAM,8BAA8B,GAAG;;ocAEsZ,CAAC;AAErc,MAAM,cAAc,GAA0B,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAEtE,MAAM,UAAU,oBAAoB;IAClC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,SAAS;IACzD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,aAAa,CAAC,SAAS,EAAE,4DAA4D,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC7I,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC,UAAU,EAAE,oEAAoE,EAAE,UAAU,EAAE,uBAAuB,EAAE,UAAU,CAAC,CAAC;IAC1J,CAAC;IAED,MAAM,IAAI,cAAc,CAAC,qBAAqB,IAAI,2BAA2B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,aAAa,CACpB,IAAyB,EACzB,WAAmB,EACnB,MAAc,EACd,QAAgB,EAChB,gBAAuC;IAEvC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,OAAO;QACL,IAAI;QACJ,WAAW;QACX,OAAO;QACP,iBAAiB,EAAE,iBAAiB,EAAE;QACtC,mBAAmB,EAAE,mBAAmB,EAAE;QAC1C,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;QACpC,GAAG,EAAE;YACH,SAAS,EAAE,YAAY,EAAE;SAC1B;QACD,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpF,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;YACtC,OAAO,EAAE,cAAc,CAAC,SAAS,EAAE,gBAAgB,CAAC;YACpD,QAAQ,EAAE,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC;SAC/C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,OAAO;;;;;CAKR,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDR,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAChD,OAAO;;;QAGD,MAAM;UACJ,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDjB,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO;;;;;;;;;;;;CAYV,CAAC;IACA,CAAC;IAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;;;;;;;;;;;;CAYV,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;CAUR,CAAC;AACF,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,SAAgC;IACtE,MAAM,MAAM,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACjE,OAAO;;;sBAGa,MAAM;;;;UAIlB,SAAS;;;UAGT,OAAO;;SAER,OAAO;;;;;;;;;;;;;;;;;;CAkBf,CAAC;AACF,CAAC"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -44,11 +44,21 @@ export interface MemberSettings {
|
|
|
44
44
|
mode?: WorkMode;
|
|
45
45
|
};
|
|
46
46
|
mcp?: {
|
|
47
|
-
mode?: "inherit" | "none" | "allowlist";
|
|
47
|
+
mode?: "inherit" | "none" | "allowlist" | "isolated";
|
|
48
48
|
allow?: string[];
|
|
49
|
+
from_main?: string[];
|
|
50
|
+
team?: string[];
|
|
49
51
|
config_path?: string;
|
|
50
52
|
include_inline_env?: boolean;
|
|
51
53
|
};
|
|
54
|
+
skills?: {
|
|
55
|
+
mode?: "inherit" | "none" | "allowlist" | "isolated";
|
|
56
|
+
from_project?: string[];
|
|
57
|
+
from_main?: string[];
|
|
58
|
+
team?: string[];
|
|
59
|
+
roots?: string[];
|
|
60
|
+
max_bytes?: number;
|
|
61
|
+
};
|
|
52
62
|
memory?: {
|
|
53
63
|
project?: boolean;
|
|
54
64
|
member?: boolean;
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Cofounder Crew Docs
|
|
2
|
+
|
|
3
|
+
These docs cover the details that should not live in the main README.
|
|
4
|
+
|
|
5
|
+
| Topic | Link |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| Codex bootstrap prompt | [prompts/bootstrap-codex.md](prompts/bootstrap-codex.md) |
|
|
8
|
+
| Team configuration, AGENTS.md, context, MCP, and skills | [configuration.md](configuration.md) |
|
|
9
|
+
| CLI commands | [cli.md](cli.md) |
|
|
10
|
+
| Delegation runtime, worktrees, logs, and interrupts | [runtime.md](runtime.md) |
|
|
11
|
+
| Practical examples | [examples.md](examples.md) |
|
|
12
|
+
| FAQ | [faq.md](faq.md) |
|
|
13
|
+
| Updating an existing project | [updating.md](updating.md) |
|
|
14
|
+
| Local development | [development.md](development.md) |
|
|
15
|
+
| Maintainer release flow | [releasing.md](releasing.md) |
|
package/docs/cli.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# CLI
|
|
2
|
+
|
|
3
|
+
The CLI has two shapes:
|
|
4
|
+
|
|
5
|
+
- guided commands for humans
|
|
6
|
+
- deterministic commands for Codex, scripts, and CI
|
|
7
|
+
|
|
8
|
+
Run help:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
cofounder help
|
|
12
|
+
cofounder help member
|
|
13
|
+
cofounder help mcp
|
|
14
|
+
cofounder help skill
|
|
15
|
+
cofounder help task
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The default install is global:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install -g cofounder-crew@latest
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
If the global command is not available, prefix commands with:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx -y --package cofounder-crew -- cofounder
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Onboarding
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cofounder start
|
|
34
|
+
cofounder start --template worktree --setup-codex --yes
|
|
35
|
+
cofounder doctor
|
|
36
|
+
cofounder update --yes
|
|
37
|
+
cofounder pin
|
|
38
|
+
cofounder self update
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`start` initializes missing project files, checks the local setup, optionally installs the Codex MCP entry, and prints next steps.
|
|
42
|
+
|
|
43
|
+
`doctor` checks Node, npm, Codex, Git, `.cofounder/`, `AGENTS.md`, team config, runtime ignores, and the Codex MCP entry.
|
|
44
|
+
|
|
45
|
+
`update` repairs the Codex MCP entry by default and runs doctor for the current project. Use `--no-setup-codex` to skip MCP repair.
|
|
46
|
+
|
|
47
|
+
`pin` adds or updates `cofounder-crew` as a project-local dev dependency. This is optional and mainly useful when a repo wants to record a fixed Cofounder runtime.
|
|
48
|
+
|
|
49
|
+
`self update` updates the globally installed `cofounder` command.
|
|
50
|
+
|
|
51
|
+
## Team
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
cofounder team
|
|
55
|
+
cofounder member list
|
|
56
|
+
cofounder member show backend
|
|
57
|
+
cofounder member add designer --title "Product Designer" --model gpt-5.5 --write-mode worktree
|
|
58
|
+
cofounder member set designer --model gpt-5.5 --reasoning high --sandbox workspace-write
|
|
59
|
+
cofounder member remove designer
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## MCP
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
cofounder mcp list
|
|
66
|
+
cofounder mcp add pencil --url https://example.com/mcp --assign designer
|
|
67
|
+
cofounder mcp add local-tool --command node --arg ./mcp/server.js --cwd "{project_root}"
|
|
68
|
+
cofounder mcp assign github backend --source main
|
|
69
|
+
cofounder mcp remove pencil
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`--source team` assigns a project-owned MCP server from `.cofounder/mcp/`.
|
|
73
|
+
|
|
74
|
+
`--source main` assigns a selected MCP server from the primary Codex config.
|
|
75
|
+
|
|
76
|
+
## Skills
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cofounder skill list
|
|
80
|
+
cofounder skill add api-workflow --scope project --assign backend
|
|
81
|
+
cofounder skill add design-review --scope team --assign designer
|
|
82
|
+
cofounder skill assign uncodixfy designer --scope main
|
|
83
|
+
cofounder skill remove design-review --scope team --delete-files
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Skill scopes:
|
|
87
|
+
|
|
88
|
+
| Scope | Location |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| `project` | `.agents/skills/` |
|
|
91
|
+
| `team` | `.cofounder/skills/` |
|
|
92
|
+
| `main` | Existing user/global skill roots |
|
|
93
|
+
|
|
94
|
+
## Context
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
cofounder context show
|
|
98
|
+
cofounder context mode auto
|
|
99
|
+
cofounder context mode manual
|
|
100
|
+
cofounder context sync
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use `auto` for derived worker context from `AGENTS.md`. Use `manual` when `.cofounder/project.md` should be curated explicitly.
|
|
104
|
+
|
|
105
|
+
## Tasks
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
cofounder task run backend "inspect this repo"
|
|
109
|
+
cofounder task delegate backend "implement the focused change"
|
|
110
|
+
cofounder task list
|
|
111
|
+
cofounder task status <task_id>
|
|
112
|
+
cofounder task logs <task_id> --tail 80
|
|
113
|
+
cofounder task watch <task_id>
|
|
114
|
+
cofounder task result <task_id>
|
|
115
|
+
cofounder task diff <task_id>
|
|
116
|
+
cofounder task apply <task_id>
|
|
117
|
+
cofounder task cancel <task_id>
|
|
118
|
+
cofounder task interrupt <task_id> "new steering instructions"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
These are CLI fallbacks. The intended daily interface is Codex using the Cofounder MCP tools.
|
|
122
|
+
|
|
123
|
+
## Codex MCP
|
|
124
|
+
|
|
125
|
+
Install or repair the MCP entry:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
cofounder setup codex --install
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Print setup commands:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
cofounder setup codex
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Restart Codex after changing MCP configuration.
|