@damian87/omp 0.1.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/.github/agents/architect.md +25 -0
- package/.github/agents/code-reviewer.md +25 -0
- package/.github/agents/designer.md +26 -0
- package/.github/agents/executor.md +24 -0
- package/.github/agents/planner.md +26 -0
- package/.github/agents/researcher.md +26 -0
- package/.github/agents/verifier.md +26 -0
- package/.github/copilot-instructions.md +20 -0
- package/.github/plugin/marketplace.json +30 -0
- package/.github/skills/caveman/SKILL.md +20 -0
- package/.github/skills/code-review/SKILL.md +22 -0
- package/.github/skills/codebase-research/SKILL.md +20 -0
- package/.github/skills/create-skill/SKILL.md +78 -0
- package/.github/skills/create-skill/references/best-practices.md +449 -0
- package/.github/skills/create-skill/references/examples.md +69 -0
- package/.github/skills/create-skill/references/progressive-disclosure.md +25 -0
- package/.github/skills/create-skill/references/skill-structure.md +55 -0
- package/.github/skills/debug/SKILL.md +22 -0
- package/.github/skills/grill-me/SKILL.md +16 -0
- package/.github/skills/jira-ticket/SKILL.md +21 -0
- package/.github/skills/omp-autopilot/SKILL.md +20 -0
- package/.github/skills/prototype/SKILL.md +21 -0
- package/.github/skills/ralph/SKILL.md +20 -0
- package/.github/skills/ralplan/SKILL.md +21 -0
- package/.github/skills/self-evolve/SKILL.md +157 -0
- package/.github/skills/tdd/SKILL.md +19 -0
- package/.github/skills/team/SKILL.md +20 -0
- package/.github/skills/ultraqa/SKILL.md +20 -0
- package/.github/skills/ultrawork/SKILL.md +20 -0
- package/.github/skills/verify/SKILL.md +20 -0
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/catalog/capabilities.json +729 -0
- package/catalog/skills-general.json +427 -0
- package/dist/src/catalog.d.ts +79 -0
- package/dist/src/catalog.js +113 -0
- package/dist/src/catalog.js.map +1 -0
- package/dist/src/cli.d.ts +9 -0
- package/dist/src/cli.js +475 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/copilot/config.d.ts +7 -0
- package/dist/src/copilot/config.js +24 -0
- package/dist/src/copilot/config.js.map +1 -0
- package/dist/src/copilot/doctor.d.ts +18 -0
- package/dist/src/copilot/doctor.js +85 -0
- package/dist/src/copilot/doctor.js.map +1 -0
- package/dist/src/copilot/launch.d.ts +14 -0
- package/dist/src/copilot/launch.js +64 -0
- package/dist/src/copilot/launch.js.map +1 -0
- package/dist/src/copilot/list.d.ts +17 -0
- package/dist/src/copilot/list.js +82 -0
- package/dist/src/copilot/list.js.map +1 -0
- package/dist/src/copilot/paths.d.ts +21 -0
- package/dist/src/copilot/paths.js +36 -0
- package/dist/src/copilot/paths.js.map +1 -0
- package/dist/src/copilot/setup.d.ts +20 -0
- package/dist/src/copilot/setup.js +90 -0
- package/dist/src/copilot/setup.js.map +1 -0
- package/dist/src/copilot/version.d.ts +13 -0
- package/dist/src/copilot/version.js +34 -0
- package/dist/src/copilot/version.js.map +1 -0
- package/dist/src/jira.d.ts +149 -0
- package/dist/src/jira.js +492 -0
- package/dist/src/jira.js.map +1 -0
- package/dist/src/lint.d.ts +11 -0
- package/dist/src/lint.js +85 -0
- package/dist/src/lint.js.map +1 -0
- package/dist/src/mcp/server.d.ts +10 -0
- package/dist/src/mcp/server.js +44 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/index.d.ts +9 -0
- package/dist/src/mcp/tools/index.js +15 -0
- package/dist/src/mcp/tools/index.js.map +1 -0
- package/dist/src/mcp/tools/notepad.d.ts +2 -0
- package/dist/src/mcp/tools/notepad.js +135 -0
- package/dist/src/mcp/tools/notepad.js.map +1 -0
- package/dist/src/mcp/tools/project-memory.d.ts +2 -0
- package/dist/src/mcp/tools/project-memory.js +91 -0
- package/dist/src/mcp/tools/project-memory.js.map +1 -0
- package/dist/src/mcp/tools/shared-memory.d.ts +2 -0
- package/dist/src/mcp/tools/shared-memory.js +148 -0
- package/dist/src/mcp/tools/shared-memory.js.map +1 -0
- package/dist/src/mcp/tools/state.d.ts +2 -0
- package/dist/src/mcp/tools/state.js +107 -0
- package/dist/src/mcp/tools/state.js.map +1 -0
- package/dist/src/mcp/tools/trace.d.ts +10 -0
- package/dist/src/mcp/tools/trace.js +102 -0
- package/dist/src/mcp/tools/trace.js.map +1 -0
- package/dist/src/mcp/types.d.ts +29 -0
- package/dist/src/mcp/types.js +7 -0
- package/dist/src/mcp/types.js.map +1 -0
- package/dist/src/mode-state/index.d.ts +4 -0
- package/dist/src/mode-state/index.js +5 -0
- package/dist/src/mode-state/index.js.map +1 -0
- package/dist/src/mode-state/paths.d.ts +5 -0
- package/dist/src/mode-state/paths.js +29 -0
- package/dist/src/mode-state/paths.js.map +1 -0
- package/dist/src/mode-state/ralph.d.ts +25 -0
- package/dist/src/mode-state/ralph.js +44 -0
- package/dist/src/mode-state/ralph.js.map +1 -0
- package/dist/src/mode-state/ultraqa.d.ts +26 -0
- package/dist/src/mode-state/ultraqa.js +51 -0
- package/dist/src/mode-state/ultraqa.js.map +1 -0
- package/dist/src/mode-state/ultrawork.d.ts +20 -0
- package/dist/src/mode-state/ultrawork.js +34 -0
- package/dist/src/mode-state/ultrawork.js.map +1 -0
- package/dist/src/project.d.ts +29 -0
- package/dist/src/project.js +101 -0
- package/dist/src/project.js.map +1 -0
- package/dist/src/skills.d.ts +17 -0
- package/dist/src/skills.js +61 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/sync.d.ts +6 -0
- package/dist/src/sync.js +27 -0
- package/dist/src/sync.js.map +1 -0
- package/dist/src/team/api.d.ts +20 -0
- package/dist/src/team/api.js +55 -0
- package/dist/src/team/api.js.map +1 -0
- package/dist/src/team/heartbeat.d.ts +4 -0
- package/dist/src/team/heartbeat.js +27 -0
- package/dist/src/team/heartbeat.js.map +1 -0
- package/dist/src/team/idle-nudge.d.ts +27 -0
- package/dist/src/team/idle-nudge.js +60 -0
- package/dist/src/team/idle-nudge.js.map +1 -0
- package/dist/src/team/inbox.d.ts +3 -0
- package/dist/src/team/inbox.js +16 -0
- package/dist/src/team/inbox.js.map +1 -0
- package/dist/src/team/index.d.ts +11 -0
- package/dist/src/team/index.js +12 -0
- package/dist/src/team/index.js.map +1 -0
- package/dist/src/team/outbox.d.ts +14 -0
- package/dist/src/team/outbox.js +82 -0
- package/dist/src/team/outbox.js.map +1 -0
- package/dist/src/team/runtime.d.ts +84 -0
- package/dist/src/team/runtime.js +243 -0
- package/dist/src/team/runtime.js.map +1 -0
- package/dist/src/team/state-paths.d.ts +31 -0
- package/dist/src/team/state-paths.js +54 -0
- package/dist/src/team/state-paths.js.map +1 -0
- package/dist/src/team/task-store.d.ts +41 -0
- package/dist/src/team/task-store.js +153 -0
- package/dist/src/team/task-store.js.map +1 -0
- package/dist/src/team/tmux.d.ts +26 -0
- package/dist/src/team/tmux.js +87 -0
- package/dist/src/team/tmux.js.map +1 -0
- package/dist/src/team/types.d.ts +45 -0
- package/dist/src/team/types.js +2 -0
- package/dist/src/team/types.js.map +1 -0
- package/dist/src/team/worker-bootstrap.d.ts +8 -0
- package/dist/src/team/worker-bootstrap.js +52 -0
- package/dist/src/team/worker-bootstrap.js.map +1 -0
- package/docs/copilot-distribution.md +100 -0
- package/docs/general-skills.md +76 -0
- package/docs/jira.md +64 -0
- package/docs/self-evolve.md +22 -0
- package/hooks/hooks.json +74 -0
- package/package.json +58 -0
- package/plugin.json +14 -0
- package/scripts/error.mjs +31 -0
- package/scripts/lib/hook-output.mjs +30 -0
- package/scripts/lib/stdin.mjs +29 -0
- package/scripts/post-tool-use.mjs +31 -0
- package/scripts/pre-tool-use.mjs +30 -0
- package/scripts/prompt-submit.mjs +66 -0
- package/scripts/session-end.mjs +29 -0
- package/scripts/session-start.mjs +33 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { resolveCopilotPaths } from "./paths.js";
|
|
5
|
+
function checkNodeVersion() {
|
|
6
|
+
const major = Number(process.version.replace(/^v/, "").split(".")[0]);
|
|
7
|
+
if (Number.isFinite(major) && major >= 20) {
|
|
8
|
+
return { name: "node-version", status: "pass", detail: process.version };
|
|
9
|
+
}
|
|
10
|
+
return { name: "node-version", status: "fail", detail: `node ${process.version} (need >=20)` };
|
|
11
|
+
}
|
|
12
|
+
function checkPluginManifest(paths) {
|
|
13
|
+
const manifest = join(paths.pluginRoot, "plugin.json");
|
|
14
|
+
if (!existsSync(manifest)) {
|
|
15
|
+
return { name: "plugin-manifest", status: "fail", detail: `missing: ${manifest}` };
|
|
16
|
+
}
|
|
17
|
+
return { name: "plugin-manifest", status: "pass", detail: manifest };
|
|
18
|
+
}
|
|
19
|
+
function checkInstructions(paths) {
|
|
20
|
+
if (existsSync(paths.copilotInstructions)) {
|
|
21
|
+
return { name: "copilot-instructions", status: "pass", detail: paths.copilotInstructions };
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
name: "copilot-instructions",
|
|
25
|
+
status: "warn",
|
|
26
|
+
detail: `missing (run \`omp setup\`): ${paths.copilotInstructions}`,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function checkSkillsDiscovery(paths) {
|
|
30
|
+
if (existsSync(paths.projectScopeSkills)) {
|
|
31
|
+
return { name: "skills-discovery", status: "pass", detail: paths.projectScopeSkills };
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
name: "skills-discovery",
|
|
35
|
+
status: "warn",
|
|
36
|
+
detail: `no skills directory: ${paths.projectScopeSkills}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function checkHooksManifest(paths) {
|
|
40
|
+
if (existsSync(paths.hooksManifest)) {
|
|
41
|
+
return { name: "hooks-manifest", status: "pass", detail: paths.hooksManifest };
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
name: "hooks-manifest",
|
|
45
|
+
status: "warn",
|
|
46
|
+
detail: `not present: ${paths.hooksManifest}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function checkCopilotCli(bin) {
|
|
50
|
+
try {
|
|
51
|
+
const result = spawnSync(bin, ["--version"], { encoding: "utf8", timeout: 3000 });
|
|
52
|
+
if (result.status === 0) {
|
|
53
|
+
const detail = (result.stdout || result.stderr || "present").trim().split("\n")[0] ?? "present";
|
|
54
|
+
return { name: "copilot-cli", status: "pass", detail };
|
|
55
|
+
}
|
|
56
|
+
return { name: "copilot-cli", status: "fail", detail: `${bin} --version exited ${result.status ?? "?"}` };
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { name: "copilot-cli", status: "fail", detail: `${bin} not found on PATH` };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function runDoctor(options = {}) {
|
|
63
|
+
const paths = resolveCopilotPaths(options);
|
|
64
|
+
const checks = [
|
|
65
|
+
checkNodeVersion(),
|
|
66
|
+
checkPluginManifest(paths),
|
|
67
|
+
checkInstructions(paths),
|
|
68
|
+
checkSkillsDiscovery(paths),
|
|
69
|
+
checkHooksManifest(paths),
|
|
70
|
+
];
|
|
71
|
+
if (!options.skipCopilot) {
|
|
72
|
+
checks.push(checkCopilotCli(options.copilotBin ?? "copilot"));
|
|
73
|
+
}
|
|
74
|
+
const ok = checks.every((c) => c.status !== "fail");
|
|
75
|
+
return { ok, checks, paths };
|
|
76
|
+
}
|
|
77
|
+
export function formatDoctor(report) {
|
|
78
|
+
const lines = [`omp doctor ${report.ok ? "OK" : "FAIL"}`];
|
|
79
|
+
for (const check of report.checks) {
|
|
80
|
+
const icon = check.status === "pass" ? "✓" : check.status === "warn" ? "!" : "✗";
|
|
81
|
+
lines.push(` ${icon} ${check.name}: ${check.detail}`);
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/copilot/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function normalizeCopilotLaunchArgs(args: string[]): string[];
|
|
2
|
+
export interface LaunchOptions {
|
|
3
|
+
args: string[];
|
|
4
|
+
bin?: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
env?: NodeJS.ProcessEnv;
|
|
7
|
+
}
|
|
8
|
+
export interface LaunchResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
exitCode: number;
|
|
11
|
+
bin: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function resolveCopilotBin(override?: string): string;
|
|
14
|
+
export declare function launchCopilot(options: LaunchOptions): Promise<LaunchResult>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
const MADMAX_FLAG = "--madmax";
|
|
3
|
+
const COPILOT_BYPASS_FLAG = "--yolo";
|
|
4
|
+
export function normalizeCopilotLaunchArgs(args) {
|
|
5
|
+
const sentinelIdx = args.indexOf("--");
|
|
6
|
+
const pre = sentinelIdx === -1 ? args : args.slice(0, sentinelIdx);
|
|
7
|
+
const tail = sentinelIdx === -1 ? [] : args.slice(sentinelIdx);
|
|
8
|
+
const out = [];
|
|
9
|
+
let bypassRequested = false;
|
|
10
|
+
let bypassEmitted = false;
|
|
11
|
+
for (const arg of pre) {
|
|
12
|
+
if (arg === MADMAX_FLAG) {
|
|
13
|
+
bypassRequested = true;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (arg === COPILOT_BYPASS_FLAG) {
|
|
17
|
+
bypassRequested = true;
|
|
18
|
+
if (bypassEmitted)
|
|
19
|
+
continue;
|
|
20
|
+
out.push(arg);
|
|
21
|
+
bypassEmitted = true;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
out.push(arg);
|
|
25
|
+
}
|
|
26
|
+
if (bypassRequested && !bypassEmitted) {
|
|
27
|
+
out.push(COPILOT_BYPASS_FLAG);
|
|
28
|
+
}
|
|
29
|
+
return [...out, ...tail];
|
|
30
|
+
}
|
|
31
|
+
export function resolveCopilotBin(override) {
|
|
32
|
+
if (override && override.length > 0)
|
|
33
|
+
return override;
|
|
34
|
+
const fromEnv = process.env.OMP_COPILOT_BIN ?? process.env.OMC_COPILOT_BIN;
|
|
35
|
+
if (fromEnv && fromEnv.length > 0)
|
|
36
|
+
return fromEnv;
|
|
37
|
+
return "copilot";
|
|
38
|
+
}
|
|
39
|
+
export async function launchCopilot(options) {
|
|
40
|
+
const bin = resolveCopilotBin(options.bin);
|
|
41
|
+
const args = normalizeCopilotLaunchArgs(options.args);
|
|
42
|
+
return new Promise((resolveFn) => {
|
|
43
|
+
let settled = false;
|
|
44
|
+
const child = spawn(bin, args, {
|
|
45
|
+
stdio: "inherit",
|
|
46
|
+
cwd: options.cwd ?? process.cwd(),
|
|
47
|
+
env: options.env ?? process.env,
|
|
48
|
+
});
|
|
49
|
+
child.on("error", () => {
|
|
50
|
+
if (settled)
|
|
51
|
+
return;
|
|
52
|
+
settled = true;
|
|
53
|
+
resolveFn({ ok: false, exitCode: 127, bin });
|
|
54
|
+
});
|
|
55
|
+
child.on("close", (code) => {
|
|
56
|
+
if (settled)
|
|
57
|
+
return;
|
|
58
|
+
settled = true;
|
|
59
|
+
const exitCode = typeof code === "number" ? code : 1;
|
|
60
|
+
resolveFn({ ok: exitCode === 0, exitCode, bin });
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/copilot/launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface CatalogedItem {
|
|
2
|
+
name: string;
|
|
3
|
+
kind: "skill" | "agent" | "capability";
|
|
4
|
+
description?: string;
|
|
5
|
+
path?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CombinedList {
|
|
8
|
+
skills: CatalogedItem[];
|
|
9
|
+
agents: CatalogedItem[];
|
|
10
|
+
capabilities: CatalogedItem[];
|
|
11
|
+
}
|
|
12
|
+
export interface ListOptions {
|
|
13
|
+
cwd?: string;
|
|
14
|
+
packageRoot?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function listAll(options?: ListOptions): Promise<CombinedList>;
|
|
17
|
+
export declare function formatList(list: CombinedList): string;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parseFrontmatter, resolveProjectPaths } from "../project.js";
|
|
4
|
+
function readSkillDir(dir) {
|
|
5
|
+
if (!existsSync(dir))
|
|
6
|
+
return [];
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
9
|
+
if (!entry.isDirectory())
|
|
10
|
+
continue;
|
|
11
|
+
const skillFile = join(dir, entry.name, "SKILL.md");
|
|
12
|
+
if (!existsSync(skillFile))
|
|
13
|
+
continue;
|
|
14
|
+
const fm = parseFrontmatter(readFileSync(skillFile, "utf8"));
|
|
15
|
+
out.push({
|
|
16
|
+
name: fm.name || entry.name,
|
|
17
|
+
kind: "skill",
|
|
18
|
+
description: fm.description,
|
|
19
|
+
path: skillFile,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
23
|
+
}
|
|
24
|
+
function readAgentDir(dir) {
|
|
25
|
+
if (!existsSync(dir))
|
|
26
|
+
return [];
|
|
27
|
+
const out = [];
|
|
28
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
29
|
+
if (!entry.isFile() || !entry.name.endsWith(".md"))
|
|
30
|
+
continue;
|
|
31
|
+
const filePath = join(dir, entry.name);
|
|
32
|
+
const fm = parseFrontmatter(readFileSync(filePath, "utf8"));
|
|
33
|
+
out.push({
|
|
34
|
+
name: fm.name || entry.name.replace(/\.md$/, ""),
|
|
35
|
+
kind: "agent",
|
|
36
|
+
description: fm.description,
|
|
37
|
+
path: filePath,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
41
|
+
}
|
|
42
|
+
async function readCapabilities() {
|
|
43
|
+
try {
|
|
44
|
+
const { loadCatalogBundle } = await import("../catalog.js");
|
|
45
|
+
const bundle = loadCatalogBundle();
|
|
46
|
+
return bundle.capabilities.capabilities
|
|
47
|
+
.filter((capability) => capability.phase1)
|
|
48
|
+
.map((capability) => ({
|
|
49
|
+
name: capability.id,
|
|
50
|
+
kind: "capability",
|
|
51
|
+
description: capability.summary,
|
|
52
|
+
}))
|
|
53
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function listAll(options = {}) {
|
|
60
|
+
const proj = resolveProjectPaths(options);
|
|
61
|
+
const skillsDir = join(proj.packageRoot, ".github", "skills");
|
|
62
|
+
const agentsDir = join(proj.packageRoot, ".github", "agents");
|
|
63
|
+
return {
|
|
64
|
+
skills: readSkillDir(skillsDir),
|
|
65
|
+
agents: readAgentDir(agentsDir),
|
|
66
|
+
capabilities: await readCapabilities(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function formatList(list) {
|
|
70
|
+
const lines = [];
|
|
71
|
+
lines.push(`Skills (${list.skills.length}):`);
|
|
72
|
+
for (const s of list.skills)
|
|
73
|
+
lines.push(` /${s.name}${s.description ? ` ${s.description}` : ""}`);
|
|
74
|
+
lines.push("", `Agents (${list.agents.length}):`);
|
|
75
|
+
for (const a of list.agents)
|
|
76
|
+
lines.push(` @${a.name}${a.description ? ` ${a.description}` : ""}`);
|
|
77
|
+
lines.push("", `Capabilities (${list.capabilities.length}):`);
|
|
78
|
+
for (const c of list.capabilities)
|
|
79
|
+
lines.push(` ${c.name}${c.description ? ` ${c.description}` : ""}`);
|
|
80
|
+
return lines.join("\n");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/copilot/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface CopilotPaths {
|
|
2
|
+
packageRoot: string;
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
pluginRoot: string;
|
|
5
|
+
stateDir: string;
|
|
6
|
+
hooksLogPath: string;
|
|
7
|
+
userScope: string;
|
|
8
|
+
projectScopeSkills: string;
|
|
9
|
+
projectScopeAgents: string;
|
|
10
|
+
copilotInstructions: string;
|
|
11
|
+
hooksManifest: string;
|
|
12
|
+
scriptsDir: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ResolveCopilotPathsOptions {
|
|
15
|
+
cwd?: string;
|
|
16
|
+
projectRoot?: string;
|
|
17
|
+
pluginRoot?: string;
|
|
18
|
+
importMetaUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function resolveCopilotPaths(options?: ResolveCopilotPathsOptions): CopilotPaths;
|
|
21
|
+
export declare function ensureStateDir(paths: CopilotPaths): void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { packageRootFromImportMeta, resolveProjectPaths } from "../project.js";
|
|
5
|
+
export function resolveCopilotPaths(options = {}) {
|
|
6
|
+
const proj = resolveProjectPaths({ cwd: options.cwd, packageRoot: options.projectRoot });
|
|
7
|
+
const projectRoot = proj.packageRoot;
|
|
8
|
+
const packageRoot = options.importMetaUrl
|
|
9
|
+
? packageRootFromImportMeta(options.importMetaUrl)
|
|
10
|
+
: projectRoot;
|
|
11
|
+
const envPluginRoot = process.env.OMP_PLUGIN_ROOT ?? process.env.OMC_PLUGIN_ROOT;
|
|
12
|
+
const pluginRoot = options.pluginRoot
|
|
13
|
+
? resolve(options.pluginRoot)
|
|
14
|
+
: envPluginRoot
|
|
15
|
+
? resolve(envPluginRoot)
|
|
16
|
+
: packageRoot;
|
|
17
|
+
const stateDir = join(projectRoot, ".omp", "state");
|
|
18
|
+
return {
|
|
19
|
+
packageRoot,
|
|
20
|
+
projectRoot,
|
|
21
|
+
pluginRoot,
|
|
22
|
+
stateDir,
|
|
23
|
+
hooksLogPath: join(stateDir, "hooks.log"),
|
|
24
|
+
userScope: join(homedir(), ".copilot"),
|
|
25
|
+
projectScopeSkills: join(projectRoot, ".github", "skills"),
|
|
26
|
+
projectScopeAgents: join(projectRoot, ".github", "agents"),
|
|
27
|
+
copilotInstructions: join(projectRoot, ".github", "copilot-instructions.md"),
|
|
28
|
+
hooksManifest: join(pluginRoot, "hooks", "hooks.json"),
|
|
29
|
+
scriptsDir: join(pluginRoot, "scripts"),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function ensureStateDir(paths) {
|
|
33
|
+
if (!existsSync(paths.stateDir))
|
|
34
|
+
mkdirSync(paths.stateDir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/copilot/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAuB/E,MAAM,UAAU,mBAAmB,CAAC,UAAsC,EAAE;IAC1E,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa;QACvC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,aAAa,CAAC;QAClD,CAAC,CAAC,WAAW,CAAC;IAChB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;QACnC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7B,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACxB,CAAC,CAAC,WAAW,CAAC;IAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO;QACL,WAAW;QACX,WAAW;QACX,UAAU;QACV,QAAQ;QACR,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC;QACtC,kBAAkB,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC1D,kBAAkB,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC1D,mBAAmB,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,yBAAyB,CAAC;QAC5E,aAAa,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC;QACtD,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAmB;IAChD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type CopilotPaths, type ResolveCopilotPathsOptions } from "./paths.js";
|
|
2
|
+
export interface SetupOptions extends ResolveCopilotPathsOptions {
|
|
3
|
+
dryRun?: boolean;
|
|
4
|
+
scope?: "project" | "user";
|
|
5
|
+
}
|
|
6
|
+
export type SetupActionKind = "copy" | "create" | "skip-exists" | "skip-source-missing";
|
|
7
|
+
export interface SetupAction {
|
|
8
|
+
source: string;
|
|
9
|
+
target: string;
|
|
10
|
+
kind: SetupActionKind;
|
|
11
|
+
}
|
|
12
|
+
export interface SetupResult {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
dryRun: boolean;
|
|
15
|
+
scope: "project" | "user";
|
|
16
|
+
actions: SetupAction[];
|
|
17
|
+
paths: CopilotPaths;
|
|
18
|
+
}
|
|
19
|
+
export declare function runSetup(options?: SetupOptions): SetupResult;
|
|
20
|
+
export declare function formatSetup(result: SetupResult): string;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join, relative } from "node:path";
|
|
3
|
+
import { resolveCopilotPaths } from "./paths.js";
|
|
4
|
+
const COPILOT_INSTRUCTIONS_TEMPLATE = `# oh-my-copilot
|
|
5
|
+
|
|
6
|
+
Default behaviours installed by \`omp setup\`. Override per project as needed.
|
|
7
|
+
|
|
8
|
+
## Approach
|
|
9
|
+
- Surface assumptions before coding.
|
|
10
|
+
- Prefer the simplest change that satisfies the request.
|
|
11
|
+
- Touch only what the task requires.
|
|
12
|
+
- Verify success with concrete checks: tests, output, behaviour.
|
|
13
|
+
|
|
14
|
+
## Validation
|
|
15
|
+
- Run tests for code you change.
|
|
16
|
+
- Read the diff before committing.
|
|
17
|
+
- If unsure about scope, ask.
|
|
18
|
+
`;
|
|
19
|
+
function copyDirRecursive(source, target, actions, dryRun) {
|
|
20
|
+
if (!existsSync(source)) {
|
|
21
|
+
actions.push({ source, target, kind: "skip-source-missing" });
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!dryRun && !existsSync(target))
|
|
25
|
+
mkdirSync(target, { recursive: true });
|
|
26
|
+
for (const entry of readdirSync(source, { withFileTypes: true })) {
|
|
27
|
+
const sPath = join(source, entry.name);
|
|
28
|
+
const tPath = join(target, entry.name);
|
|
29
|
+
if (entry.isDirectory()) {
|
|
30
|
+
copyDirRecursive(sPath, tPath, actions, dryRun);
|
|
31
|
+
}
|
|
32
|
+
else if (entry.isFile()) {
|
|
33
|
+
if (existsSync(tPath)) {
|
|
34
|
+
actions.push({ source: sPath, target: tPath, kind: "skip-exists" });
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (!dryRun) {
|
|
38
|
+
mkdirSync(dirname(tPath), { recursive: true });
|
|
39
|
+
copyFileSync(sPath, tPath);
|
|
40
|
+
}
|
|
41
|
+
actions.push({ source: sPath, target: tPath, kind: "copy" });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function ensureFile(target, content, actions, dryRun) {
|
|
46
|
+
if (existsSync(target)) {
|
|
47
|
+
actions.push({ source: "(template)", target, kind: "skip-exists" });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!dryRun) {
|
|
51
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
52
|
+
writeFileSync(target, content, "utf8");
|
|
53
|
+
}
|
|
54
|
+
actions.push({ source: "(template)", target, kind: "create" });
|
|
55
|
+
}
|
|
56
|
+
function ensureDir(target, actions, dryRun) {
|
|
57
|
+
if (existsSync(target)) {
|
|
58
|
+
actions.push({ source: "(dir)", target, kind: "skip-exists" });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (!dryRun)
|
|
62
|
+
mkdirSync(target, { recursive: true });
|
|
63
|
+
actions.push({ source: "(dir)", target, kind: "create" });
|
|
64
|
+
}
|
|
65
|
+
export function runSetup(options = {}) {
|
|
66
|
+
const paths = resolveCopilotPaths(options);
|
|
67
|
+
const dryRun = Boolean(options.dryRun);
|
|
68
|
+
const scope = options.scope ?? "project";
|
|
69
|
+
const actions = [];
|
|
70
|
+
const bundleSkills = join(paths.pluginRoot, ".github", "skills");
|
|
71
|
+
if (relative(bundleSkills, paths.projectScopeSkills) !== "") {
|
|
72
|
+
copyDirRecursive(bundleSkills, paths.projectScopeSkills, actions, dryRun);
|
|
73
|
+
}
|
|
74
|
+
const bundleAgents = join(paths.pluginRoot, ".github", "agents");
|
|
75
|
+
if (relative(bundleAgents, paths.projectScopeAgents) !== "") {
|
|
76
|
+
copyDirRecursive(bundleAgents, paths.projectScopeAgents, actions, dryRun);
|
|
77
|
+
}
|
|
78
|
+
ensureFile(paths.copilotInstructions, COPILOT_INSTRUCTIONS_TEMPLATE, actions, dryRun);
|
|
79
|
+
ensureDir(paths.stateDir, actions, dryRun);
|
|
80
|
+
return { ok: true, dryRun, scope, actions, paths };
|
|
81
|
+
}
|
|
82
|
+
export function formatSetup(result) {
|
|
83
|
+
const prefix = result.dryRun ? "DRY-RUN" : "PASS";
|
|
84
|
+
const lines = [`${prefix}: omp setup (scope=${result.scope})`];
|
|
85
|
+
for (const action of result.actions) {
|
|
86
|
+
lines.push(` [${action.kind}] ${action.target}`);
|
|
87
|
+
}
|
|
88
|
+
return lines.join("\n");
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/copilot/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface VersionInfo {
|
|
2
|
+
package: string;
|
|
3
|
+
node: string;
|
|
4
|
+
platform: string;
|
|
5
|
+
packageRoot: string;
|
|
6
|
+
}
|
|
7
|
+
export interface VersionOptions {
|
|
8
|
+
cwd?: string;
|
|
9
|
+
packageRoot?: string;
|
|
10
|
+
importMetaUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function getVersionInfo(options?: VersionOptions): VersionInfo;
|
|
13
|
+
export declare function formatVersionInfo(info: VersionInfo): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { packageRootFromImportMeta, resolveProjectPaths } from "../project.js";
|
|
4
|
+
export function getVersionInfo(options = {}) {
|
|
5
|
+
const root = options.importMetaUrl
|
|
6
|
+
? packageRootFromImportMeta(options.importMetaUrl)
|
|
7
|
+
: resolveProjectPaths({ cwd: options.cwd, packageRoot: options.packageRoot }).packageRoot;
|
|
8
|
+
const pkgPath = join(root, "package.json");
|
|
9
|
+
let pkgVersion = "unknown";
|
|
10
|
+
if (existsSync(pkgPath)) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
13
|
+
pkgVersion = parsed.version ?? "unknown";
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// keep "unknown" — manifest is unreadable
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
package: pkgVersion,
|
|
21
|
+
node: process.version,
|
|
22
|
+
platform: `${process.platform}-${process.arch}`,
|
|
23
|
+
packageRoot: root,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function formatVersionInfo(info) {
|
|
27
|
+
return [
|
|
28
|
+
`oh-my-copilot ${info.package}`,
|
|
29
|
+
`node ${info.node}`,
|
|
30
|
+
`platform ${info.platform}`,
|
|
31
|
+
`packageRoot ${info.packageRoot}`,
|
|
32
|
+
].join("\n");
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/copilot/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAe/E,MAAM,UAAU,cAAc,CAAC,UAA0B,EAAE;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa;QAChC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,aAAa,CAAC;QAClD,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC;IAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC3C,IAAI,UAAU,GAAG,SAAS,CAAC;IAC3B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;YACjF,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IACD,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,OAAO,CAAC,OAAO;QACrB,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE;QAC/C,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,OAAO;QACL,iBAAiB,IAAI,CAAC,OAAO,EAAE;QAC/B,QAAQ,IAAI,CAAC,IAAI,EAAE;QACnB,YAAY,IAAI,CAAC,QAAQ,EAAE;QAC3B,eAAe,IAAI,CAAC,WAAW,EAAE;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|