@copado/agentia-cli 0.85.0-alpha.0 → 0.86.0-alpha.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/README.md +260 -176
- package/dist/commands/setup/skills/create.d.ts +15 -0
- package/dist/commands/setup/skills/create.js +64 -0
- package/dist/commands/setup/skills/create.js.map +1 -0
- package/dist/commands/setup/skills/update.d.ts +15 -0
- package/dist/commands/setup/skills/update.js +64 -0
- package/dist/commands/setup/skills/update.js.map +1 -0
- package/dist/lib/setup-skills.d.ts +67 -0
- package/dist/lib/setup-skills.js +251 -0
- package/dist/lib/setup-skills.js.map +1 -0
- package/oclif.manifest.json +159 -1
- package/package.json +8 -1
- package/templates/skills/agentia-ai/SKILL.md +34 -0
- package/templates/skills/agentia-ai/references/ai-agents.md +70 -0
- package/templates/skills/agentia-cicd/SKILL.md +41 -0
- package/templates/skills/agentia-cicd/references/data.md +65 -0
- package/templates/skills/agentia-cicd/references/environments-and-credentials.md +55 -0
- package/templates/skills/agentia-cicd/references/jobs.md +42 -0
- package/templates/skills/agentia-cicd/references/pipelines.md +63 -0
- package/templates/skills/agentia-cicd/references/promotions.md +58 -0
- package/templates/skills/agentia-cicd/references/work.md +84 -0
- package/templates/skills/agentia-testing/SKILL.md +34 -0
- package/templates/skills/agentia-testing/references/tests.md +65 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
2
|
+
import { type SetupSkillsResult } from '../../../lib/setup-skills.js';
|
|
3
|
+
export default class SetupSkillsCreate extends AgentiaCommand {
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static flags: {
|
|
7
|
+
ai: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
cicd: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
'no-prompt': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
target: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
testing: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<SetupSkillsResult>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
+
import { createInquirerSetupPrompts, isPromptCanceled } from '../../../lib/setup-prompts.js';
|
|
4
|
+
import { resolveSelectedSkillPacks, runSetupSkills, SETUP_SKILL_TARGETS, } from '../../../lib/setup-skills.js';
|
|
5
|
+
export default class SetupSkillsCreate extends AgentiaCommand {
|
|
6
|
+
static description = 'Create portable Markdown-only Agentia CLI skills in this project without overwriting managed files';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --cicd --target agents --no-prompt',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --testing --ai --target cursor --no-prompt',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --json',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
ai: Flags.boolean({
|
|
15
|
+
description: 'Create the Copado AI agent skill pack',
|
|
16
|
+
}),
|
|
17
|
+
cicd: Flags.boolean({
|
|
18
|
+
description: 'Create the Copado CICD skill pack',
|
|
19
|
+
}),
|
|
20
|
+
force: Flags.boolean({
|
|
21
|
+
default: false,
|
|
22
|
+
description: 'Replace conflicting unmanaged Agentia skill files',
|
|
23
|
+
}),
|
|
24
|
+
'no-prompt': Flags.boolean({
|
|
25
|
+
char: 'n',
|
|
26
|
+
default: false,
|
|
27
|
+
description: 'Skip interactive prompts; defaults the target to .agents/skills when --target is omitted',
|
|
28
|
+
}),
|
|
29
|
+
target: Flags.string({
|
|
30
|
+
description: 'Project skill root to write',
|
|
31
|
+
options: [...SETUP_SKILL_TARGETS],
|
|
32
|
+
}),
|
|
33
|
+
testing: Flags.boolean({
|
|
34
|
+
description: 'Create the Copado Robotic Testing skill pack',
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
async run() {
|
|
38
|
+
const { flags } = await this.parse(SetupSkillsCreate);
|
|
39
|
+
const noPrompt = flags['no-prompt'] || this.jsonEnabled();
|
|
40
|
+
try {
|
|
41
|
+
return await runSetupSkills({
|
|
42
|
+
force: flags.force,
|
|
43
|
+
log: (message) => {
|
|
44
|
+
this.display(() => {
|
|
45
|
+
this.log(message);
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
mode: 'create',
|
|
49
|
+
noPrompt,
|
|
50
|
+
packs: resolveSelectedSkillPacks(flags),
|
|
51
|
+
target: flags.target,
|
|
52
|
+
}, {
|
|
53
|
+
prompts: noPrompt ? undefined : createInquirerSetupPrompts(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (isPromptCanceled(error)) {
|
|
58
|
+
this.error('Setup skills create cancelled.', { exit: 1 });
|
|
59
|
+
}
|
|
60
|
+
this.error(error.message, { exit: 1 });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/setup/skills/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAC,0BAA0B,EAAE,gBAAgB,EAAC,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GAGpB,MAAM,8BAA8B,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,cAAc;IAC3D,MAAM,CAAU,WAAW,GACzB,oGAAoG,CAAA;IACtG,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,wEAAwE;QACxE,gFAAgF;QAChF,4CAA4C;KAC7C,CAAA;IACD,MAAM,CAAU,KAAK,GAAG;QACtB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;YAChB,WAAW,EAAE,uCAAuC;SACrD,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,mCAAmC;SACjD,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,mDAAmD;SACjE,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,0FAA0F;SACxG,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,CAAC,GAAG,mBAAmB,CAAC;SAClC,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,8CAA8C;SAC5D,CAAC;KACH,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAA;QAEzD,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CACzB;gBACE,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;wBAChB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBACnB,CAAC,CAAC,CAAA;gBACJ,CAAC;gBACD,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC;gBACvC,MAAM,EAAE,KAAK,CAAC,MAAsC;aACrD,EACD;gBACE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,EAAE;aAC7D,CACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,CAAC,CAAA;YACzD,CAAC;YAED,IAAI,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
2
|
+
import { type SetupSkillsResult } from '../../../lib/setup-skills.js';
|
|
3
|
+
export default class SetupSkillsUpdate extends AgentiaCommand {
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: string[];
|
|
6
|
+
static flags: {
|
|
7
|
+
ai: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
cicd: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
|
+
'no-prompt': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
target: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
testing: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<SetupSkillsResult>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import { AgentiaCommand } from '../../../lib/agentia-command.js';
|
|
3
|
+
import { createInquirerSetupPrompts, isPromptCanceled } from '../../../lib/setup-prompts.js';
|
|
4
|
+
import { resolveSelectedSkillPacks, runSetupSkills, SETUP_SKILL_TARGETS, } from '../../../lib/setup-skills.js';
|
|
5
|
+
export default class SetupSkillsUpdate extends AgentiaCommand {
|
|
6
|
+
static description = 'Update Agentia-managed Markdown skill files and restore missing files in this project';
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> <%= command.id %>',
|
|
9
|
+
'<%= config.bin %> <%= command.id %> --ai --target cursor --no-prompt',
|
|
10
|
+
'<%= config.bin %> <%= command.id %> --cicd --testing --target agents --no-prompt',
|
|
11
|
+
'<%= config.bin %> <%= command.id %> --force --json',
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
ai: Flags.boolean({
|
|
15
|
+
description: 'Update the Copado AI agent skill pack',
|
|
16
|
+
}),
|
|
17
|
+
cicd: Flags.boolean({
|
|
18
|
+
description: 'Update the Copado CICD skill pack',
|
|
19
|
+
}),
|
|
20
|
+
force: Flags.boolean({
|
|
21
|
+
default: false,
|
|
22
|
+
description: 'Replace conflicting unmanaged Agentia skill files',
|
|
23
|
+
}),
|
|
24
|
+
'no-prompt': Flags.boolean({
|
|
25
|
+
char: 'n',
|
|
26
|
+
default: false,
|
|
27
|
+
description: 'Skip interactive prompts; defaults the target to .agents/skills when --target is omitted',
|
|
28
|
+
}),
|
|
29
|
+
target: Flags.string({
|
|
30
|
+
description: 'Project skill root to write',
|
|
31
|
+
options: [...SETUP_SKILL_TARGETS],
|
|
32
|
+
}),
|
|
33
|
+
testing: Flags.boolean({
|
|
34
|
+
description: 'Update the Copado Robotic Testing skill pack',
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
async run() {
|
|
38
|
+
const { flags } = await this.parse(SetupSkillsUpdate);
|
|
39
|
+
const noPrompt = flags['no-prompt'] || this.jsonEnabled();
|
|
40
|
+
try {
|
|
41
|
+
return await runSetupSkills({
|
|
42
|
+
force: flags.force,
|
|
43
|
+
log: (message) => {
|
|
44
|
+
this.display(() => {
|
|
45
|
+
this.log(message);
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
mode: 'update',
|
|
49
|
+
noPrompt,
|
|
50
|
+
packs: resolveSelectedSkillPacks(flags),
|
|
51
|
+
target: flags.target,
|
|
52
|
+
}, {
|
|
53
|
+
prompts: noPrompt ? undefined : createInquirerSetupPrompts(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (isPromptCanceled(error)) {
|
|
58
|
+
this.error('Setup skills update cancelled.', { exit: 1 });
|
|
59
|
+
}
|
|
60
|
+
this.error(error.message, { exit: 1 });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/setup/skills/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAC,0BAA0B,EAAE,gBAAgB,EAAC,MAAM,+BAA+B,CAAA;AAC1F,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GAGpB,MAAM,8BAA8B,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,cAAc;IAC3D,MAAM,CAAU,WAAW,GACzB,uFAAuF,CAAA;IACzF,MAAM,CAAU,QAAQ,GAAG;QACzB,qCAAqC;QACrC,sEAAsE;QACtE,kFAAkF;QAClF,oDAAoD;KACrD,CAAA;IACD,MAAM,CAAU,KAAK,GAAG;QACtB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC;YAChB,WAAW,EAAE,uCAAuC;SACrD,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,mCAAmC;SACjD,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,mDAAmD;SACjE,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,0FAA0F;SACxG,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,6BAA6B;YAC1C,OAAO,EAAE,CAAC,GAAG,mBAAmB,CAAC;SAClC,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACrB,WAAW,EAAE,8CAA8C;SAC5D,CAAC;KACH,CAAA;IAEM,KAAK,CAAC,GAAG;QACd,MAAM,EAAC,KAAK,EAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAA;QAEzD,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CACzB;gBACE,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;wBAChB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBACnB,CAAC,CAAC,CAAA;gBACJ,CAAC;gBACD,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC;gBACvC,MAAM,EAAE,KAAK,CAAC,MAAsC;aACrD,EACD;gBACE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,EAAE;aAC7D,CACF,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,CAAC,CAAA;YACzD,CAAC;YAED,IAAI,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,EAAE,EAAC,IAAI,EAAE,CAAC,EAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type SetupActionStatus, type SetupDeps } from './project-setup.js';
|
|
2
|
+
import { type SetupPrompts } from './setup-prompts.js';
|
|
3
|
+
export declare const SETUP_SKILL_MANAGED_MARKER = "<!-- Agentia managed skill file: agentia setup skills -->";
|
|
4
|
+
export declare const SETUP_SKILL_PACKS: readonly ["cicd", "testing", "ai"];
|
|
5
|
+
export type SetupSkillPack = (typeof SETUP_SKILL_PACKS)[number];
|
|
6
|
+
export declare const SETUP_SKILL_TARGETS: readonly ["agents", "cursor", "claude"];
|
|
7
|
+
export type SetupSkillTarget = (typeof SETUP_SKILL_TARGETS)[number];
|
|
8
|
+
export type SetupSkillsMode = 'create' | 'update';
|
|
9
|
+
export type SetupSkillFileResult = {
|
|
10
|
+
path: string;
|
|
11
|
+
status: SetupActionStatus;
|
|
12
|
+
};
|
|
13
|
+
export type SetupSkillPackResult = {
|
|
14
|
+
files: SetupSkillFileResult[];
|
|
15
|
+
pack: SetupSkillPack;
|
|
16
|
+
path: string;
|
|
17
|
+
skill: string;
|
|
18
|
+
status: SetupActionStatus;
|
|
19
|
+
};
|
|
20
|
+
export type SetupSkillsResult = {
|
|
21
|
+
cwd: string;
|
|
22
|
+
git?: {
|
|
23
|
+
branch: string;
|
|
24
|
+
remoteUrl?: string;
|
|
25
|
+
root: string;
|
|
26
|
+
};
|
|
27
|
+
mode: SetupSkillsMode;
|
|
28
|
+
projectRoot: string;
|
|
29
|
+
skillRoot: string;
|
|
30
|
+
skills: SetupSkillPackResult[];
|
|
31
|
+
target: SetupSkillTarget;
|
|
32
|
+
};
|
|
33
|
+
export type SetupSkillsOptions = {
|
|
34
|
+
cwd?: string;
|
|
35
|
+
force?: boolean;
|
|
36
|
+
log?: (message: string) => void;
|
|
37
|
+
mode: SetupSkillsMode;
|
|
38
|
+
noPrompt?: boolean;
|
|
39
|
+
packs?: SetupSkillPack[];
|
|
40
|
+
target?: SetupSkillTarget;
|
|
41
|
+
};
|
|
42
|
+
export type SetupSkillTemplateFile = {
|
|
43
|
+
content: string;
|
|
44
|
+
pack: SetupSkillPack;
|
|
45
|
+
relativePath: string;
|
|
46
|
+
};
|
|
47
|
+
export type SetupSkillsDeps = SetupDeps & {
|
|
48
|
+
mkdir?: (dirPath: string, options: {
|
|
49
|
+
recursive: true;
|
|
50
|
+
}) => Promise<unknown>;
|
|
51
|
+
readTemplateFile?: (relativePath: string) => Promise<string>;
|
|
52
|
+
templates?: SetupSkillTemplateFile[];
|
|
53
|
+
};
|
|
54
|
+
export declare function setSetupSkillsDepsForTests(deps: SetupSkillsDeps | undefined): void;
|
|
55
|
+
export declare function resetSetupSkillsDepsForTests(): void;
|
|
56
|
+
export declare function formatSetupSkillPack(pack: SetupSkillPack): string;
|
|
57
|
+
export declare function isSetupSkillPack(value: string): value is SetupSkillPack;
|
|
58
|
+
export declare function isSetupSkillTarget(value: string): value is SetupSkillTarget;
|
|
59
|
+
export declare function resolveSelectedSkillPacks(flags: Partial<Record<SetupSkillPack, boolean>>): SetupSkillPack[];
|
|
60
|
+
export declare function skillRootDirectory(target: SetupSkillTarget): string;
|
|
61
|
+
export declare function skillDirectoryForPack(pack: SetupSkillPack): string;
|
|
62
|
+
export declare function resolveSetupSkillTarget(options: {
|
|
63
|
+
noPrompt?: boolean;
|
|
64
|
+
prompts?: SetupPrompts;
|
|
65
|
+
target?: SetupSkillTarget;
|
|
66
|
+
}): Promise<SetupSkillTarget>;
|
|
67
|
+
export declare function runSetupSkills(options: SetupSkillsOptions, depsOverrides?: SetupSkillsDeps): Promise<SetupSkillsResult>;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { resolveProjectContext } from './project-setup.js';
|
|
6
|
+
export const SETUP_SKILL_MANAGED_MARKER = '<!-- Agentia managed skill file: agentia setup skills -->';
|
|
7
|
+
export const SETUP_SKILL_PACKS = ['cicd', 'testing', 'ai'];
|
|
8
|
+
export const SETUP_SKILL_TARGETS = ['agents', 'cursor', 'claude'];
|
|
9
|
+
const DEFAULT_TARGET = 'agents';
|
|
10
|
+
const TARGET_DIRS = {
|
|
11
|
+
agents: '.agents/skills',
|
|
12
|
+
claude: '.claude/skills',
|
|
13
|
+
cursor: '.cursor/skills',
|
|
14
|
+
};
|
|
15
|
+
const PACK_SKILL_DIRS = {
|
|
16
|
+
ai: 'agentia-ai',
|
|
17
|
+
cicd: 'agentia-cicd',
|
|
18
|
+
testing: 'agentia-testing',
|
|
19
|
+
};
|
|
20
|
+
const TEMPLATE_MANIFEST = [
|
|
21
|
+
{ pack: 'cicd', path: 'agentia-cicd/SKILL.md' },
|
|
22
|
+
{ pack: 'cicd', path: 'agentia-cicd/references/work.md' },
|
|
23
|
+
{ pack: 'cicd', path: 'agentia-cicd/references/promotions.md' },
|
|
24
|
+
{ pack: 'cicd', path: 'agentia-cicd/references/jobs.md' },
|
|
25
|
+
{ pack: 'cicd', path: 'agentia-cicd/references/environments-and-credentials.md' },
|
|
26
|
+
{ pack: 'cicd', path: 'agentia-cicd/references/pipelines.md' },
|
|
27
|
+
{ pack: 'cicd', path: 'agentia-cicd/references/data.md' },
|
|
28
|
+
{ pack: 'testing', path: 'agentia-testing/SKILL.md' },
|
|
29
|
+
{ pack: 'testing', path: 'agentia-testing/references/tests.md' },
|
|
30
|
+
{ pack: 'ai', path: 'agentia-ai/SKILL.md' },
|
|
31
|
+
{ pack: 'ai', path: 'agentia-ai/references/ai-agents.md' },
|
|
32
|
+
];
|
|
33
|
+
let testDeps;
|
|
34
|
+
export function setSetupSkillsDepsForTests(deps) {
|
|
35
|
+
testDeps = deps;
|
|
36
|
+
}
|
|
37
|
+
export function resetSetupSkillsDepsForTests() {
|
|
38
|
+
testDeps = undefined;
|
|
39
|
+
}
|
|
40
|
+
function templatesRoot() {
|
|
41
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../templates/skills');
|
|
42
|
+
}
|
|
43
|
+
function resolveDeps(overrides = {}) {
|
|
44
|
+
const merged = { ...testDeps, ...overrides };
|
|
45
|
+
return {
|
|
46
|
+
existsSync: merged.existsSync ?? existsSync,
|
|
47
|
+
getCurrentBranch: merged.getCurrentBranch,
|
|
48
|
+
getGitRepoRoot: merged.getGitRepoRoot,
|
|
49
|
+
getRemoteUrl: merged.getRemoteUrl,
|
|
50
|
+
isInsideGitWorkTree: merged.isInsideGitWorkTree,
|
|
51
|
+
mkdir: merged.mkdir ?? ((dirPath, options) => mkdir(dirPath, options)),
|
|
52
|
+
prompts: merged.prompts,
|
|
53
|
+
readFile: merged.readFile ?? ((filePath, encoding) => readFile(filePath, encoding)),
|
|
54
|
+
readTemplateFile: merged.readTemplateFile ??
|
|
55
|
+
((relativePath) => readFile(path.join(templatesRoot(), relativePath), 'utf8')),
|
|
56
|
+
templates: merged.templates,
|
|
57
|
+
writeFile: merged.writeFile ?? ((filePath, contents, encoding) => writeFile(filePath, contents, encoding)),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function formatSetupSkillPack(pack) {
|
|
61
|
+
if (pack === 'cicd') {
|
|
62
|
+
return 'CICD';
|
|
63
|
+
}
|
|
64
|
+
if (pack === 'ai') {
|
|
65
|
+
return 'AI';
|
|
66
|
+
}
|
|
67
|
+
return 'Testing';
|
|
68
|
+
}
|
|
69
|
+
export function isSetupSkillPack(value) {
|
|
70
|
+
return SETUP_SKILL_PACKS.includes(value);
|
|
71
|
+
}
|
|
72
|
+
export function isSetupSkillTarget(value) {
|
|
73
|
+
return SETUP_SKILL_TARGETS.includes(value);
|
|
74
|
+
}
|
|
75
|
+
export function resolveSelectedSkillPacks(flags) {
|
|
76
|
+
const selected = SETUP_SKILL_PACKS.filter((pack) => flags[pack] === true);
|
|
77
|
+
return selected.length > 0 ? selected : [...SETUP_SKILL_PACKS];
|
|
78
|
+
}
|
|
79
|
+
export function skillRootDirectory(target) {
|
|
80
|
+
return TARGET_DIRS[target];
|
|
81
|
+
}
|
|
82
|
+
export function skillDirectoryForPack(pack) {
|
|
83
|
+
return PACK_SKILL_DIRS[pack];
|
|
84
|
+
}
|
|
85
|
+
export async function resolveSetupSkillTarget(options) {
|
|
86
|
+
const { noPrompt = false, prompts, target } = options;
|
|
87
|
+
if (target !== undefined) {
|
|
88
|
+
return target;
|
|
89
|
+
}
|
|
90
|
+
if (noPrompt || prompts === undefined) {
|
|
91
|
+
return DEFAULT_TARGET;
|
|
92
|
+
}
|
|
93
|
+
return prompts.select({
|
|
94
|
+
choices: [
|
|
95
|
+
{ name: '.agents/skills (portable Agent Skills)', value: 'agents' },
|
|
96
|
+
{ name: '.cursor/skills (Cursor project skills)', value: 'cursor' },
|
|
97
|
+
{ name: '.claude/skills (Claude compatibility)', value: 'claude' },
|
|
98
|
+
],
|
|
99
|
+
default: DEFAULT_TARGET,
|
|
100
|
+
message: 'Where should Agentia skills be created?',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async function loadTemplates(deps) {
|
|
104
|
+
if (deps.templates !== undefined) {
|
|
105
|
+
return deps.templates;
|
|
106
|
+
}
|
|
107
|
+
return Promise.all(TEMPLATE_MANIFEST.map(async (entry) => ({
|
|
108
|
+
content: await deps.readTemplateFile(entry.path),
|
|
109
|
+
pack: entry.pack,
|
|
110
|
+
relativePath: entry.path,
|
|
111
|
+
})));
|
|
112
|
+
}
|
|
113
|
+
function containsManagedMarker(content) {
|
|
114
|
+
return content.includes(SETUP_SKILL_MANAGED_MARKER);
|
|
115
|
+
}
|
|
116
|
+
function summarizeStatus(files) {
|
|
117
|
+
if (files.some((file) => file.status === 'updated')) {
|
|
118
|
+
return 'updated';
|
|
119
|
+
}
|
|
120
|
+
if (files.some((file) => file.status === 'created')) {
|
|
121
|
+
return 'created';
|
|
122
|
+
}
|
|
123
|
+
if (files.some((file) => file.status === 'failed')) {
|
|
124
|
+
return 'failed';
|
|
125
|
+
}
|
|
126
|
+
if (files.some((file) => file.status === 'skipped')) {
|
|
127
|
+
return 'skipped';
|
|
128
|
+
}
|
|
129
|
+
return 'unchanged';
|
|
130
|
+
}
|
|
131
|
+
function relativeTo(cwd, filePath) {
|
|
132
|
+
return path.relative(cwd, filePath) || path.basename(filePath);
|
|
133
|
+
}
|
|
134
|
+
async function planWrites(params) {
|
|
135
|
+
const { deps, force, mode, projectRoot, selectedPacks, skillRoot, templates } = params;
|
|
136
|
+
const selected = new Set(selectedPacks);
|
|
137
|
+
const planned = await Promise.all(templates
|
|
138
|
+
.filter((entry) => selected.has(entry.pack))
|
|
139
|
+
.map(async (template) => {
|
|
140
|
+
const fullPath = path.join(projectRoot, skillRoot, template.relativePath);
|
|
141
|
+
const exists = deps.existsSync(fullPath);
|
|
142
|
+
const skill = template.relativePath.split('/')[0] ?? skillDirectoryForPack(template.pack);
|
|
143
|
+
if (!exists) {
|
|
144
|
+
return {
|
|
145
|
+
planned: {
|
|
146
|
+
content: template.content,
|
|
147
|
+
fullPath,
|
|
148
|
+
pack: template.pack,
|
|
149
|
+
relativePath: template.relativePath,
|
|
150
|
+
skill,
|
|
151
|
+
status: 'created',
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const current = await deps.readFile(fullPath, 'utf8');
|
|
156
|
+
const managed = containsManagedMarker(current);
|
|
157
|
+
if (!managed && !force) {
|
|
158
|
+
return { conflict: fullPath };
|
|
159
|
+
}
|
|
160
|
+
if (mode === 'create' && managed) {
|
|
161
|
+
return {
|
|
162
|
+
planned: {
|
|
163
|
+
content: template.content,
|
|
164
|
+
fullPath,
|
|
165
|
+
pack: template.pack,
|
|
166
|
+
relativePath: template.relativePath,
|
|
167
|
+
skill,
|
|
168
|
+
status: 'unchanged',
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
planned: {
|
|
174
|
+
content: template.content,
|
|
175
|
+
fullPath,
|
|
176
|
+
pack: template.pack,
|
|
177
|
+
relativePath: template.relativePath,
|
|
178
|
+
skill,
|
|
179
|
+
status: 'updated',
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}));
|
|
183
|
+
const conflicts = planned.flatMap((item) => (item.conflict === undefined ? [] : [item.conflict]));
|
|
184
|
+
if (conflicts.length > 0) {
|
|
185
|
+
throw new Error([
|
|
186
|
+
'Refusing to overwrite existing skill files that are not managed by Agentia.',
|
|
187
|
+
'Re-run with --force to replace these files:',
|
|
188
|
+
...conflicts.map((filePath) => `- ${filePath}`),
|
|
189
|
+
].join('\n'));
|
|
190
|
+
}
|
|
191
|
+
return planned.flatMap((item) => (item.planned === undefined ? [] : [item.planned]));
|
|
192
|
+
}
|
|
193
|
+
export async function runSetupSkills(options, depsOverrides = {}) {
|
|
194
|
+
const deps = resolveDeps(depsOverrides);
|
|
195
|
+
const cwd = options.cwd ?? process.cwd();
|
|
196
|
+
const selectedPacks = options.packs ?? [...SETUP_SKILL_PACKS];
|
|
197
|
+
const target = await resolveSetupSkillTarget({
|
|
198
|
+
noPrompt: options.noPrompt,
|
|
199
|
+
prompts: deps.prompts,
|
|
200
|
+
target: options.target,
|
|
201
|
+
});
|
|
202
|
+
const context = await resolveProjectContext(cwd, deps);
|
|
203
|
+
const skillRoot = skillRootDirectory(target);
|
|
204
|
+
const templates = await loadTemplates(deps);
|
|
205
|
+
const planned = await planWrites({
|
|
206
|
+
deps,
|
|
207
|
+
force: options.force === true,
|
|
208
|
+
mode: options.mode,
|
|
209
|
+
projectRoot: context.projectRoot,
|
|
210
|
+
selectedPacks,
|
|
211
|
+
skillRoot,
|
|
212
|
+
templates,
|
|
213
|
+
});
|
|
214
|
+
await Promise.all(planned
|
|
215
|
+
.filter((item) => item.status !== 'unchanged')
|
|
216
|
+
.map(async (item) => {
|
|
217
|
+
await deps.mkdir(path.dirname(item.fullPath), { recursive: true });
|
|
218
|
+
const content = item.content.endsWith('\n') ? item.content : `${item.content}\n`;
|
|
219
|
+
await deps.writeFile(item.fullPath, content, 'utf8');
|
|
220
|
+
}));
|
|
221
|
+
const skills = selectedPacks.map((pack) => {
|
|
222
|
+
const skill = skillDirectoryForPack(pack);
|
|
223
|
+
const files = planned
|
|
224
|
+
.filter((item) => item.pack === pack)
|
|
225
|
+
.map((item) => ({
|
|
226
|
+
path: relativeTo(cwd, item.fullPath),
|
|
227
|
+
status: item.status,
|
|
228
|
+
}));
|
|
229
|
+
return {
|
|
230
|
+
files,
|
|
231
|
+
pack,
|
|
232
|
+
path: relativeTo(cwd, path.join(context.projectRoot, skillRoot, skill)),
|
|
233
|
+
skill,
|
|
234
|
+
status: summarizeStatus(files),
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
options.log?.(`Agentia skills ${options.mode === 'create' ? 'created' : 'updated'} in ${relativeTo(cwd, path.join(context.projectRoot, skillRoot))}.`);
|
|
238
|
+
for (const entry of skills) {
|
|
239
|
+
options.log?.(`${formatSetupSkillPack(entry.pack)} skill ${entry.status}: ${entry.path}`);
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
cwd,
|
|
243
|
+
git: context.git,
|
|
244
|
+
mode: options.mode,
|
|
245
|
+
projectRoot: context.projectRoot,
|
|
246
|
+
skillRoot: relativeTo(cwd, path.join(context.projectRoot, skillRoot)),
|
|
247
|
+
skills,
|
|
248
|
+
target,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=setup-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-skills.js","sourceRoot":"","sources":["../../src/lib/setup-skills.ts"],"names":[],"mappings":"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"}
|