@yarkingulacti/agentic-scaffold 0.9.0 → 0.11.2
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/dist/bin/index.js +37 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bin/validate-skills.d.ts +2 -0
- package/dist/bin/validate-skills.js +122 -0
- package/dist/bin/validate-skills.js.map +1 -0
- package/dist/src/config.d.ts +11 -0
- package/dist/src/config.js +42 -9
- package/dist/src/config.js.map +1 -1
- package/dist/src/prompts.d.ts +1 -0
- package/dist/src/prompts.js +21 -2
- package/dist/src/prompts.js.map +1 -1
- package/dist/src/scaffold.js +87 -26
- package/dist/src/scaffold.js.map +1 -1
- package/dist/src/templates.js +17 -0
- package/dist/src/templates.js.map +1 -1
- package/dist/src/ui.js +12 -7
- package/dist/src/ui.js.map +1 -1
- package/package.json +3 -2
- package/templates/ai-config/.copilot-instructions.md.hbs +35 -0
- package/templates/ai-config/.cursorrules.hbs +22 -0
- package/templates/ai-config/opencode.json.hbs +15 -0
- package/templates/ci/github/dependabot.yml.hbs +13 -0
- package/templates/ci/github/workflows/ci.yml.hbs +76 -0
- package/templates/ci/gitlab/.gitlab-ci.yml.hbs +64 -0
- package/templates/contribute/CONTRIBUTING.md.hbs +41 -0
- package/templates/contribute/PULL_REQUEST_TEMPLATE.md.hbs +18 -0
- package/templates/contribute/code-review.md.hbs +30 -0
- package/templates/docs/agents/ci.md.hbs +25 -0
- package/templates/docs/agents/migrations.md.hbs +57 -0
- package/templates/docs/engineering/dependencies.md.hbs +23 -0
- package/templates/docs/engineering/observability.md.hbs +32 -0
- package/templates/docs/engineering/security.md.hbs +31 -0
- package/templates/onboarding/ONBOARDING.md.hbs +59 -0
- package/templates/onboarding/setup.sh.hbs +24 -0
- package/templates/root/AGENTS.md.hbs +4 -0
- package/templates/root/CLAUDE.md.hbs +4 -0
- package/templates/scripts/cleanup-stale.sh.hbs +58 -0
- package/templates/scripts/migrations/README.md.hbs +33 -0
- package/templates/scripts/migrations/alembic/README.md +36 -0
- package/templates/scripts/migrations/node-pg-migrate/README.md +37 -0
- package/templates/scripts/migrations/prisma/README.md +36 -0
- package/templates/skills/implement/SKILL.md +4 -3
- package/templates/skills/rollback-drill/SKILL.md +30 -0
package/dist/bin/index.js
CHANGED
|
@@ -14,9 +14,17 @@ function scaffoldBuilder(y) {
|
|
|
14
14
|
.example("$0", "Zero-config: auto-detect and scaffold missing files")
|
|
15
15
|
.example("$0 --force", "Force overwrite existing files")
|
|
16
16
|
.example("$0 --ci-provider github", "Override auto-detected CI provider")
|
|
17
|
+
.example("$0 --extras ci,onboarding", "Only scaffold CI and onboarding extras")
|
|
18
|
+
.example("$0 --ai-tools all", "Generate configs for all known AI tools")
|
|
17
19
|
.example("$0 --ai-tools opencode,cursor", "Generate configs for specific AI tools")
|
|
18
20
|
.example("$0 -i", "Interactive mode with prompts")
|
|
19
21
|
.example("$0 -n", "Dry-run: preview files without writing")
|
|
22
|
+
.example("$0 --json", "Output results as JSON")
|
|
23
|
+
.option("json", {
|
|
24
|
+
type: "boolean",
|
|
25
|
+
description: "Output results as JSON to stdout, progress to stderr",
|
|
26
|
+
default: false,
|
|
27
|
+
})
|
|
20
28
|
.option("dry-run", {
|
|
21
29
|
alias: "n",
|
|
22
30
|
type: "boolean",
|
|
@@ -37,8 +45,12 @@ function scaffoldBuilder(y) {
|
|
|
37
45
|
})
|
|
38
46
|
.option("only", {
|
|
39
47
|
type: "string",
|
|
40
|
-
description: "Comma-separated
|
|
48
|
+
description: "Comma-separated core groups to include: docs,scripts,skills,hooks,all",
|
|
41
49
|
default: "all",
|
|
50
|
+
})
|
|
51
|
+
.option("extras", {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "Comma-separated extras groups: ci,contribute,ai-config,onboarding,all",
|
|
42
54
|
})
|
|
43
55
|
.option("skip-skills", {
|
|
44
56
|
type: "boolean",
|
|
@@ -57,6 +69,30 @@ function scaffoldBuilder(y) {
|
|
|
57
69
|
type: "boolean",
|
|
58
70
|
description: "Skip docs folder",
|
|
59
71
|
default: false,
|
|
72
|
+
})
|
|
73
|
+
.option("skip-ci", {
|
|
74
|
+
type: "boolean",
|
|
75
|
+
description: "Skip CI/CD configuration templates",
|
|
76
|
+
})
|
|
77
|
+
.option("skip-contribute", {
|
|
78
|
+
type: "boolean",
|
|
79
|
+
description: "Skip contribution guide templates",
|
|
80
|
+
})
|
|
81
|
+
.option("skip-ai-config", {
|
|
82
|
+
type: "boolean",
|
|
83
|
+
description: "Skip AI tool configuration templates",
|
|
84
|
+
})
|
|
85
|
+
.option("skip-onboarding", {
|
|
86
|
+
type: "boolean",
|
|
87
|
+
description: "Skip onboarding guide templates",
|
|
88
|
+
})
|
|
89
|
+
.option("skip-history", {
|
|
90
|
+
type: "boolean",
|
|
91
|
+
description: "Skip .history directory",
|
|
92
|
+
})
|
|
93
|
+
.option("skip-scratchpad", {
|
|
94
|
+
type: "boolean",
|
|
95
|
+
description: "Skip .scratchpad directory",
|
|
60
96
|
})
|
|
61
97
|
.option("project-name", {
|
|
62
98
|
type: "string",
|
package/dist/bin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,SAAS,eAAe,CAAC,CAA2B;IAClD,OAAO,CAAC;SACL,QAAQ,CACP,UAAU;QACR,0EAA0E;QAC1E,oEAAoE;QACpE,mEAAmE;QACnE,6EAA6E;QAC7E,uEAAuE,CAC1E;SACA,OAAO,CAAC,IAAI,EAAE,qDAAqD,CAAC;SACpE,OAAO,CAAC,YAAY,EAAE,gCAAgC,CAAC;SACvD,OAAO,CAAC,yBAAyB,EAAE,oCAAoC,CAAC;SACxE,OAAO,CAAC,+BAA+B,EAAE,wCAAwC,CAAC;SAClF,OAAO,CAAC,OAAO,EAAE,+BAA+B,CAAC;SACjD,OAAO,CAAC,OAAO,EAAE,wCAAwC,CAAC;SAC1D,MAAM,CAAC,SAAS,EAAE;QACjB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8DAA8D;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC;SACD,MAAM,CAAC,aAAa,EAAE;QACrB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,KAAK;KACf,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uDAAuD;QACpE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;KACvB,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const SKILLS_DIR = join(import.meta.dirname, "..", "templates", "skills");
|
|
5
|
+
const SCHEMA = {
|
|
6
|
+
name: { required: true, type: "string", pattern: "^[a-z][a-z0-9-]*$" },
|
|
7
|
+
description: { required: true, type: "string" },
|
|
8
|
+
};
|
|
9
|
+
function parseFrontmatter(content) {
|
|
10
|
+
const lines = content.split("\n");
|
|
11
|
+
if (lines[0]?.trim() !== "---")
|
|
12
|
+
return null;
|
|
13
|
+
const end = lines.indexOf("---", 1);
|
|
14
|
+
if (end === -1)
|
|
15
|
+
return null;
|
|
16
|
+
const fm = {};
|
|
17
|
+
const fmLines = lines.slice(1, end);
|
|
18
|
+
let currentKey = null;
|
|
19
|
+
let currentValue = [];
|
|
20
|
+
for (const line of fmLines) {
|
|
21
|
+
const match = line.match(/^(\w[\w-]*):\s*(.*)$/);
|
|
22
|
+
if (match) {
|
|
23
|
+
if (currentKey) {
|
|
24
|
+
fm[currentKey] = currentValue.join("\n").trim();
|
|
25
|
+
}
|
|
26
|
+
currentKey = match[1];
|
|
27
|
+
const val = match[2].trim();
|
|
28
|
+
if (val === ">") {
|
|
29
|
+
currentValue = [];
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
currentValue = [val];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (currentKey && line.startsWith(" ")) {
|
|
36
|
+
currentValue.push(line.trim());
|
|
37
|
+
}
|
|
38
|
+
else if (currentKey && line.startsWith("\t")) {
|
|
39
|
+
currentValue.push(line.trim());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (currentKey) {
|
|
43
|
+
fm[currentKey] = currentValue.join("\n").trim();
|
|
44
|
+
}
|
|
45
|
+
return Object.keys(fm).length > 0 ? fm : null;
|
|
46
|
+
}
|
|
47
|
+
function validateSkill(skillDir, skillName) {
|
|
48
|
+
const errors = [];
|
|
49
|
+
const skillPath = join(skillDir, skillName, "SKILL.md");
|
|
50
|
+
if (!existsSync(skillPath)) {
|
|
51
|
+
errors.push({ skill: skillName, field: "file", message: "SKILL.md not found" });
|
|
52
|
+
return errors;
|
|
53
|
+
}
|
|
54
|
+
const content = readFileSync(skillPath, "utf-8");
|
|
55
|
+
const fm = parseFrontmatter(content);
|
|
56
|
+
if (!fm) {
|
|
57
|
+
errors.push({ skill: skillName, field: "frontmatter", message: "No YAML frontmatter found" });
|
|
58
|
+
return errors;
|
|
59
|
+
}
|
|
60
|
+
for (const [field, rule] of Object.entries(SCHEMA)) {
|
|
61
|
+
if (rule.required && !fm[field]) {
|
|
62
|
+
errors.push({ skill: skillName, field, message: `Required field "${field}" is missing` });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (fm[field] === undefined)
|
|
66
|
+
continue;
|
|
67
|
+
if (rule.type === "string" && typeof fm[field] !== "string") {
|
|
68
|
+
errors.push({ skill: skillName, field, message: `Field "${field}" must be a string` });
|
|
69
|
+
}
|
|
70
|
+
if (rule.pattern && fm[field]) {
|
|
71
|
+
const re = new RegExp(rule.pattern);
|
|
72
|
+
if (!re.test(fm[field])) {
|
|
73
|
+
errors.push({
|
|
74
|
+
skill: skillName,
|
|
75
|
+
field,
|
|
76
|
+
message: `Field "${field}" does not match pattern ${rule.pattern}: "${fm[field]}"`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return errors;
|
|
82
|
+
}
|
|
83
|
+
function main() {
|
|
84
|
+
if (!existsSync(SKILLS_DIR)) {
|
|
85
|
+
console.log("Skills directory not found");
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
const entries = readdirSync(SKILLS_DIR, { withFileTypes: true });
|
|
89
|
+
const skills = entries
|
|
90
|
+
.filter((e) => e.isDirectory())
|
|
91
|
+
.map((e) => e.name)
|
|
92
|
+
.sort();
|
|
93
|
+
const allErrors = [];
|
|
94
|
+
let hasFrontmatter = 0;
|
|
95
|
+
let noFrontmatter = 0;
|
|
96
|
+
for (const skill of skills) {
|
|
97
|
+
const errors = validateSkill(SKILLS_DIR, skill);
|
|
98
|
+
if (errors.length > 0) {
|
|
99
|
+
const isMissingFrontmatter = errors.some((e) => e.field === "frontmatter");
|
|
100
|
+
if (isMissingFrontmatter) {
|
|
101
|
+
noFrontmatter++;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
allErrors.push(...errors);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
hasFrontmatter++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (allErrors.length > 0) {
|
|
112
|
+
console.error(`Skill frontmatter validation errors:`);
|
|
113
|
+
for (const err of allErrors) {
|
|
114
|
+
console.error(` ${err.skill}: ${err.field} — ${err.message}`);
|
|
115
|
+
}
|
|
116
|
+
console.log(`\n${skills.length} skills: ${hasFrontmatter} with valid frontmatter, ${noFrontmatter} without frontmatter, ${allErrors.length} errors`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
console.log(`${skills.length} skills validated: ${hasFrontmatter} with frontmatter, ${noFrontmatter} without frontmatter. All OK.`);
|
|
120
|
+
}
|
|
121
|
+
main();
|
|
122
|
+
//# sourceMappingURL=validate-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-skills.js","sourceRoot":"","sources":["../../bin/validate-skills.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -12,14 +12,22 @@ export interface ScaffoldArgs {
|
|
|
12
12
|
ciProvider?: string;
|
|
13
13
|
aiTools?: string;
|
|
14
14
|
scriptLanguage?: string;
|
|
15
|
+
extras?: string;
|
|
15
16
|
force?: boolean;
|
|
16
17
|
interactive?: boolean;
|
|
17
18
|
dryRun?: boolean;
|
|
19
|
+
json?: boolean;
|
|
18
20
|
only?: string;
|
|
19
21
|
skipDocs?: boolean;
|
|
20
22
|
skipSkills?: boolean;
|
|
21
23
|
skipScripts?: boolean;
|
|
22
24
|
skipHooks?: boolean;
|
|
25
|
+
skipCi?: boolean;
|
|
26
|
+
skipContribute?: boolean;
|
|
27
|
+
skipAiConfig?: boolean;
|
|
28
|
+
skipOnboarding?: boolean;
|
|
29
|
+
skipHistory?: boolean;
|
|
30
|
+
skipScratchpad?: boolean;
|
|
23
31
|
}
|
|
24
32
|
export interface ScaffoldConfig {
|
|
25
33
|
target: string;
|
|
@@ -35,6 +43,7 @@ export interface ScaffoldConfig {
|
|
|
35
43
|
force: boolean;
|
|
36
44
|
interactive: boolean;
|
|
37
45
|
dryRun: boolean;
|
|
46
|
+
json: boolean;
|
|
38
47
|
include: Set<string>;
|
|
39
48
|
}
|
|
40
49
|
export interface TrackerDoc {
|
|
@@ -62,6 +71,8 @@ export interface HandlebarsData {
|
|
|
62
71
|
scriptLanguage: string;
|
|
63
72
|
scaffoldVersion: string;
|
|
64
73
|
incompleteFiles: IncompleteFile[];
|
|
74
|
+
includeScripts: boolean;
|
|
75
|
+
includeHooks: boolean;
|
|
65
76
|
}
|
|
66
77
|
export interface IncompleteFile {
|
|
67
78
|
file: string;
|
package/dist/src/config.js
CHANGED
|
@@ -3,7 +3,7 @@ import { detectProjectProfile } from "./detect.js";
|
|
|
3
3
|
export const DEFAULTS = {
|
|
4
4
|
projectDescription: "A project.",
|
|
5
5
|
issueTracker: "linear",
|
|
6
|
-
scriptLanguage: "
|
|
6
|
+
scriptLanguage: "node",
|
|
7
7
|
};
|
|
8
8
|
const ISSUE_TRACKER_DOCS = {
|
|
9
9
|
linear: {
|
|
@@ -41,11 +41,24 @@ const ISSUE_TRACKER_DOCS = {
|
|
|
41
41
|
envTemplate: "",
|
|
42
42
|
},
|
|
43
43
|
};
|
|
44
|
+
const EXTRAS_GROUPS = ["ci", "contribute", "ai-config", "onboarding"];
|
|
44
45
|
function resolveIncludes(argv) {
|
|
46
|
+
let set = new Set(["docs", "scripts", "skills", "hooks"]);
|
|
45
47
|
if (argv.only && argv.only !== "all") {
|
|
46
|
-
|
|
48
|
+
set = new Set(argv.only.split(",").map((s) => s.trim()));
|
|
47
49
|
}
|
|
48
|
-
const
|
|
50
|
+
const extras = argv.extras
|
|
51
|
+
? argv.extras
|
|
52
|
+
.split(",")
|
|
53
|
+
.map((s) => s.trim())
|
|
54
|
+
.filter(Boolean)
|
|
55
|
+
: EXTRAS_GROUPS;
|
|
56
|
+
for (const e of extras) {
|
|
57
|
+
if (e !== "all")
|
|
58
|
+
set.add(e);
|
|
59
|
+
}
|
|
60
|
+
set.add("history");
|
|
61
|
+
set.add("scratchpad");
|
|
49
62
|
if (argv.skipDocs)
|
|
50
63
|
set.delete("docs");
|
|
51
64
|
if (argv.skipScripts)
|
|
@@ -54,8 +67,30 @@ function resolveIncludes(argv) {
|
|
|
54
67
|
set.delete("skills");
|
|
55
68
|
if (argv.skipHooks)
|
|
56
69
|
set.delete("hooks");
|
|
70
|
+
if (argv.skipCi)
|
|
71
|
+
set.delete("ci");
|
|
72
|
+
if (argv.skipContribute)
|
|
73
|
+
set.delete("contribute");
|
|
74
|
+
if (argv.skipAiConfig)
|
|
75
|
+
set.delete("ai-config");
|
|
76
|
+
if (argv.skipOnboarding)
|
|
77
|
+
set.delete("onboarding");
|
|
78
|
+
if (argv.skipHistory)
|
|
79
|
+
set.delete("history");
|
|
80
|
+
if (argv.skipScratchpad)
|
|
81
|
+
set.delete("scratchpad");
|
|
57
82
|
return set;
|
|
58
83
|
}
|
|
84
|
+
const ALL_AI_TOOLS = ["opencode", "cursor", "copilot", "windsurf", "cline"];
|
|
85
|
+
function resolveAiTools(value) {
|
|
86
|
+
const tools = value
|
|
87
|
+
.split(",")
|
|
88
|
+
.map((s) => s.trim())
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
if (tools.includes("all"))
|
|
91
|
+
return [...ALL_AI_TOOLS];
|
|
92
|
+
return tools;
|
|
93
|
+
}
|
|
59
94
|
export function resolveConfig(argv) {
|
|
60
95
|
const target = argv.target || process.cwd();
|
|
61
96
|
const profile = detectProjectProfile(target);
|
|
@@ -68,16 +103,12 @@ export function resolveConfig(argv) {
|
|
|
68
103
|
issueTracker: argv.issueTracker ?? profile.issueTracker ?? DEFAULTS.issueTracker,
|
|
69
104
|
packageManager: argv.packageManager ?? profile.packageManager ?? null,
|
|
70
105
|
ciProvider: argv.ciProvider ?? profile.ciProvider ?? null,
|
|
71
|
-
aiTools: argv.aiTools
|
|
72
|
-
? argv.aiTools
|
|
73
|
-
.split(",")
|
|
74
|
-
.map((s) => s.trim())
|
|
75
|
-
.filter(Boolean)
|
|
76
|
-
: profile.aiTools,
|
|
106
|
+
aiTools: argv.aiTools ? resolveAiTools(argv.aiTools) : profile.aiTools,
|
|
77
107
|
scriptLanguage: argv.scriptLanguage ?? profile.scriptLanguage ?? DEFAULTS.scriptLanguage,
|
|
78
108
|
force: argv.force ?? false,
|
|
79
109
|
interactive: argv.interactive ?? false,
|
|
80
110
|
dryRun: argv.dryRun ?? false,
|
|
111
|
+
json: argv.json ?? false,
|
|
81
112
|
include: resolveIncludes(argv),
|
|
82
113
|
};
|
|
83
114
|
}
|
|
@@ -99,6 +130,8 @@ export function buildHandlebars(config, version) {
|
|
|
99
130
|
scriptLanguage: config.scriptLanguage,
|
|
100
131
|
scaffoldVersion: version,
|
|
101
132
|
incompleteFiles: buildIncompleteFiles(config),
|
|
133
|
+
includeScripts: config.include.has("scripts"),
|
|
134
|
+
includeHooks: config.include.has("hooks"),
|
|
102
135
|
};
|
|
103
136
|
}
|
|
104
137
|
export function buildIncompleteFiles(config) {
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,kBAAkB,EAAE,YAAY;IAChC,YAAY,EAAE,QAAQ;IACtB,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,kBAAkB,EAAE,YAAY;IAChC,YAAY,EAAE,QAAQ;IACtB,cAAc,EAAE,MAAM;CACvB,CAAC;AAkFF,MAAM,kBAAkB,GAA+B;IACrD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EACT,kLAAkL;QACpL,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,wGAAwG;QAC/G,WAAW,EAAE;YACX,qCAAqC;YACrC,oCAAoC;YACpC,6EAA6E;YAC7E,8EAA8E;YAC9E,kFAAkF;YAClF,yEAAyE;YACzE,0DAA0D;SAC3D,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,sCAAsC;KACpD;IACD,MAAM,EAAE;QACN,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,yLAAyL;QAC3L,UAAU,EAAE,eAAe;QAC3B,KAAK,EAAE,6FAA6F;QACpG,WAAW,EAAE;YACX,qBAAqB;YACrB,qBAAqB;YACrB,8DAA8D;YAC9D,+DAA+D;YAC/D,gEAAgE;YAChE,uDAAuD;YACvD,2CAA2C;SAC5C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE;KAChB;CACF,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAEtE,SAAS,eAAe,CAAC,IAAkB;IACzC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACrC,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;QACxB,CAAC,CAAC,IAAI,CAAC,MAAM;aACR,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,aAAa,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtB,IAAI,IAAI,CAAC,QAAQ;QAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,WAAW;QAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU;QAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,SAAS;QAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,cAAc;QAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,YAAY;QAAE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,cAAc;QAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,WAAW;QAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,cAAc;QAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAE5E,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAkB;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO;QACL,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC;QAC9C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS;QAC5G,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB;QAC1E,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;QAChF,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,IAAI,IAAI;QACrE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,IAAI,IAAI;QACzD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO;QACtE,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc;QACxF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;QAC1B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;QACtC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAsB,EAAE,OAAe;IACrE,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC;IACrF,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,UAAU,EAAE,2BAA2B;QACvC,gBAAgB,EAAE,OAAO,CAAC,IAAI;QAC9B,uBAAuB,EAAE,OAAO,CAAC,WAAW;QAC5C,iBAAiB,EAAE,OAAO,CAAC,KAAK;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,eAAe,EAAE,OAAO;QACxB,eAAe,EAAE,oBAAoB,CAAC,MAAM,CAAC;QAC7C,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC7C,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,KAAK,GAAqB;QAC9B;YACE,IAAI,EAAE,qCAAqC;YAC3C,QAAQ,EAAE,oEAAoE;SAC/E;KACF,CAAC;IACF,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,EAAE,IAAI,EAAE,4CAA4C,EAAE,QAAQ,EAAE,yBAAyB,EAAE,EAC3F,EAAE,IAAI,EAAE,0CAA0C,EAAE,QAAQ,EAAE,2BAA2B,EAAE,EAC3F,EAAE,IAAI,EAAE,8CAA8C,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/src/prompts.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export declare function askProjectName(defaultName: string): Promise<string>;
|
|
|
2
2
|
export declare function askIssueTracker(detectedValue: string | null): Promise<string>;
|
|
3
3
|
export declare function askOverwrite(filePath: string): Promise<boolean>;
|
|
4
4
|
export declare function askComponents(): Promise<string[]>;
|
|
5
|
+
export declare function askAITools(detected: string[]): Promise<string[]>;
|
package/dist/src/prompts.js
CHANGED
|
@@ -32,15 +32,34 @@ export async function askOverwrite(filePath) {
|
|
|
32
32
|
export async function askComponents() {
|
|
33
33
|
const r = rl();
|
|
34
34
|
console.log("\nComponent groups to include (comma-separated):");
|
|
35
|
-
console.log(" docs, scripts, skills, hooks");
|
|
35
|
+
console.log(" docs, scripts, skills, hooks, ci, ai-config, contribute, onboarding");
|
|
36
36
|
const answer = await r.question("All [default]: ");
|
|
37
37
|
r.close();
|
|
38
38
|
const trimmed = answer.trim().toLowerCase();
|
|
39
39
|
if (!trimmed)
|
|
40
|
-
return ["docs", "scripts", "skills", "hooks"];
|
|
40
|
+
return ["docs", "scripts", "skills", "hooks", "ci", "ai-config", "contribute", "onboarding"];
|
|
41
41
|
return trimmed
|
|
42
42
|
.split(",")
|
|
43
43
|
.map((s) => s.trim())
|
|
44
44
|
.filter(Boolean);
|
|
45
45
|
}
|
|
46
|
+
export async function askAITools(detected) {
|
|
47
|
+
const r = rl();
|
|
48
|
+
const allTools = ["opencode", "cursor", "copilot", "windsurf", "cline"];
|
|
49
|
+
const defaultStr = detected.length > 0 ? detected.join(",") : "all";
|
|
50
|
+
console.log("\nAI tool configs to generate (comma-separated):");
|
|
51
|
+
console.log(" opencode, cursor, copilot, windsurf, cline, all");
|
|
52
|
+
const answer = await r.question(`Tools [${defaultStr}]: `);
|
|
53
|
+
r.close();
|
|
54
|
+
const trimmed = answer.trim().toLowerCase();
|
|
55
|
+
if (!trimmed)
|
|
56
|
+
return detected.length > 0 ? detected : allTools;
|
|
57
|
+
const tools = trimmed
|
|
58
|
+
.split(",")
|
|
59
|
+
.map((s) => s.trim())
|
|
60
|
+
.filter(Boolean);
|
|
61
|
+
if (tools.includes("all"))
|
|
62
|
+
return [...allTools];
|
|
63
|
+
return tools;
|
|
64
|
+
}
|
|
46
65
|
//# sourceMappingURL=prompts.js.map
|
package/dist/src/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAE9C,SAAS,EAAE;IACT,OAAO,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,iBAAiB,WAAW,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAA4B;IAChE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,MAAM,aAAa,GAAG,aAAa,IAAI,QAAQ,CAAC;IAChD,MAAM,UAAU,GAA2B,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACnF,MAAM,cAAc,GAAG,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,cAAc,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,MAAM,GAAG,GAA2B,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAClF,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,aAAa,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,qCAAqC,CAAC,CAAC;IACpF,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/src/scaffold.js
CHANGED
|
@@ -3,12 +3,20 @@ import { dirname, join } from "node:path";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { buildHandlebars, buildIncompleteFiles, resolveConfig } from "./config.js";
|
|
5
5
|
import { copyStaticDir, createSymlinks, writeManifest } from "./fs-utils.js";
|
|
6
|
-
import { askComponents, askIssueTracker, askProjectName } from "./prompts.js";
|
|
6
|
+
import { askAITools, askComponents, askIssueTracker, askProjectName } from "./prompts.js";
|
|
7
7
|
import { countTemplateFiles, listDryRunFiles, renderDir } from "./templates.js";
|
|
8
8
|
import { infoBox, progressBar, spinner, style, summaryLine } from "./ui.js";
|
|
9
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
10
|
const TEMPLATES_DIR = join(__dirname, "..", "templates");
|
|
11
11
|
const PKG = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
12
|
+
function out(config, ...args) {
|
|
13
|
+
if (config.json) {
|
|
14
|
+
process.stderr.write(`${args.join(" ")}\n`);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
console.log(...args);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
12
20
|
function showDetectedProfile(config) {
|
|
13
21
|
const rows = [
|
|
14
22
|
["Project", style.cyan(config.projectName)],
|
|
@@ -19,7 +27,7 @@ function showDetectedProfile(config) {
|
|
|
19
27
|
["Tracker", config.issueTracker ? style.cyan(config.issueTracker) : style.dim("none")],
|
|
20
28
|
["Script lang", config.scriptLanguage ? style.cyan(config.scriptLanguage) : style.dim("none")],
|
|
21
29
|
];
|
|
22
|
-
|
|
30
|
+
out(config, `\n${infoBox(rows)}`);
|
|
23
31
|
}
|
|
24
32
|
function scaffoldDir(config) {
|
|
25
33
|
return config.scaffoldDir;
|
|
@@ -53,6 +61,36 @@ async function scaffoldHooks(config, hbData, extraOpts = {}) {
|
|
|
53
61
|
const hooksDest = join(scaffoldDir(config), ".agents", "hooks");
|
|
54
62
|
return renderDir(hooksSrc, hooksDest, hbData, { force: config.force, interactive: config.interactive, ...extraOpts });
|
|
55
63
|
}
|
|
64
|
+
const CI_PROVIDER_MAP = {
|
|
65
|
+
github: { src: "github", dest: ".github" },
|
|
66
|
+
gitlab: { src: "gitlab", dest: "." },
|
|
67
|
+
circleci: { src: "circleci", dest: ".circleci" },
|
|
68
|
+
};
|
|
69
|
+
async function scaffoldCi(config, hbData, extraOpts = {}) {
|
|
70
|
+
if (!config.ciProvider)
|
|
71
|
+
return [];
|
|
72
|
+
const provider = CI_PROVIDER_MAP[config.ciProvider];
|
|
73
|
+
if (!provider)
|
|
74
|
+
return [];
|
|
75
|
+
const ciSrc = join(TEMPLATES_DIR, "ci", provider.src);
|
|
76
|
+
const ciDest = join(config.target, provider.dest);
|
|
77
|
+
return renderDir(ciSrc, ciDest, hbData, { force: config.force, interactive: config.interactive, ...extraOpts });
|
|
78
|
+
}
|
|
79
|
+
async function scaffoldContribute(config, hbData, extraOpts = {}) {
|
|
80
|
+
const src = join(TEMPLATES_DIR, "contribute");
|
|
81
|
+
const dest = join(scaffoldDir(config), "contribute");
|
|
82
|
+
return renderDir(src, dest, hbData, { force: config.force, interactive: config.interactive, ...extraOpts });
|
|
83
|
+
}
|
|
84
|
+
async function scaffoldAiConfig(config, hbData, extraOpts = {}) {
|
|
85
|
+
const src = join(TEMPLATES_DIR, "ai-config");
|
|
86
|
+
const dest = config.target;
|
|
87
|
+
return renderDir(src, dest, hbData, { force: config.force, interactive: config.interactive, ...extraOpts });
|
|
88
|
+
}
|
|
89
|
+
async function scaffoldOnboarding(config, hbData, extraOpts = {}) {
|
|
90
|
+
const src = join(TEMPLATES_DIR, "onboarding");
|
|
91
|
+
const dest = join(scaffoldDir(config), "onboarding");
|
|
92
|
+
return renderDir(src, dest, hbData, { force: config.force, interactive: config.interactive, ...extraOpts });
|
|
93
|
+
}
|
|
56
94
|
async function scaffoldScratchpad(config, extraOpts = {}) {
|
|
57
95
|
const src = join(TEMPLATES_DIR, "scratchpad");
|
|
58
96
|
const dest = join(scaffoldDir(config), ".scratchpad");
|
|
@@ -66,10 +104,11 @@ async function scaffoldHistory(config, extraOpts = {}) {
|
|
|
66
104
|
export async function scaffold(argv) {
|
|
67
105
|
const config = resolveConfig(argv);
|
|
68
106
|
if (config.interactive) {
|
|
69
|
-
|
|
107
|
+
out(config, `\n ${style.bold("Detected project profile:")}`);
|
|
70
108
|
showDetectedProfile(config);
|
|
71
109
|
config.projectName = await askProjectName(config.projectName);
|
|
72
110
|
config.issueTracker = await askIssueTracker(config.issueTracker);
|
|
111
|
+
config.aiTools = await askAITools(config.aiTools);
|
|
73
112
|
const components = await askComponents();
|
|
74
113
|
config.include = new Set(components);
|
|
75
114
|
}
|
|
@@ -88,27 +127,32 @@ export async function scaffold(argv) {
|
|
|
88
127
|
["Tracker", style.dim(config.issueTracker)],
|
|
89
128
|
["Include", [...config.include].join(" + ") || style.dim("(none)")],
|
|
90
129
|
];
|
|
91
|
-
|
|
130
|
+
out(config, `\n${infoBox(rows)}`);
|
|
92
131
|
if (config.dryRun) {
|
|
93
132
|
const entries = listDryRunFiles(TEMPLATES_DIR, [...config.include]);
|
|
94
|
-
|
|
95
|
-
|
|
133
|
+
out(config, `\n ${style.bold("Dry run — no files will be written:")}`);
|
|
134
|
+
out(config, ` ${style.cyan(String(entries.length))} files would be created\n`);
|
|
96
135
|
for (const entry of entries) {
|
|
97
136
|
const icon = entry.type === "dir" ? style.dim("📁") : "📄";
|
|
98
|
-
|
|
137
|
+
out(config, ` ${icon} ${entry.dest}`);
|
|
99
138
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
139
|
+
out(config, `\n ${style.dim("Symlinks that would be created:")}`);
|
|
140
|
+
out(config, ` AGENTS.md → .agentic-scaffold/AGENTS.md`);
|
|
141
|
+
out(config, ` CLAUDE.md → .agentic-scaffold/CLAUDE.md`);
|
|
142
|
+
out(config, `\n ${summaryLine("Run without --dry-run to scaffold.", "done")}`);
|
|
104
143
|
return;
|
|
105
144
|
}
|
|
106
145
|
const total = countTemplateFiles(TEMPLATES_DIR, [...config.include]);
|
|
107
146
|
let done = 0;
|
|
108
147
|
const tickOpts = {
|
|
109
148
|
onProgress: () => {
|
|
110
|
-
|
|
111
|
-
|
|
149
|
+
if (!config.json) {
|
|
150
|
+
done++;
|
|
151
|
+
process.stdout.write(`\r ${spinner(done)} ${progressBar(done, total)}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
done++;
|
|
155
|
+
}
|
|
112
156
|
},
|
|
113
157
|
};
|
|
114
158
|
const results = [...(await scaffoldRoot(config, hbData, tickOpts))];
|
|
@@ -120,31 +164,48 @@ export async function scaffold(argv) {
|
|
|
120
164
|
results.push(...(await scaffoldSkills(config, tickOpts)));
|
|
121
165
|
if (config.include.has("hooks"))
|
|
122
166
|
results.push(...(await scaffoldHooks(config, hbData, tickOpts)));
|
|
123
|
-
|
|
124
|
-
|
|
167
|
+
if (config.include.has("ci"))
|
|
168
|
+
results.push(...(await scaffoldCi(config, hbData, tickOpts)));
|
|
169
|
+
if (config.include.has("contribute"))
|
|
170
|
+
results.push(...(await scaffoldContribute(config, hbData, tickOpts)));
|
|
171
|
+
if (config.include.has("ai-config"))
|
|
172
|
+
results.push(...(await scaffoldAiConfig(config, hbData, tickOpts)));
|
|
173
|
+
if (config.include.has("onboarding"))
|
|
174
|
+
results.push(...(await scaffoldOnboarding(config, hbData, tickOpts)));
|
|
175
|
+
if (config.include.has("history"))
|
|
176
|
+
results.push(...(await scaffoldHistory(config, tickOpts)));
|
|
177
|
+
if (config.include.has("scratchpad"))
|
|
178
|
+
results.push(...(await scaffoldScratchpad(config, tickOpts)));
|
|
125
179
|
results.push(...(await createSymlinks(config.target, config.scaffoldDir)));
|
|
126
180
|
writeManifest(config.scaffoldDir, PKG.version);
|
|
127
|
-
|
|
181
|
+
if (!config.json) {
|
|
182
|
+
process.stdout.write(`${"\r".padEnd(60)}\r`);
|
|
183
|
+
}
|
|
128
184
|
const written = results.filter((r) => r === "written").length;
|
|
129
185
|
const skipped = results.filter((r) => r === "skipped-existing").length;
|
|
130
|
-
|
|
186
|
+
const incompleteFiles = buildIncompleteFiles(config);
|
|
187
|
+
if (config.json) {
|
|
188
|
+
const jsonResult = { written, skipped, incompleteFiles };
|
|
189
|
+
process.stdout.write(`${JSON.stringify(jsonResult)}\n`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
out(config, ` ${summaryLine(`Done! ${written} file${written !== 1 ? "s" : ""} scaffolded.`, "done")}`);
|
|
131
193
|
if (skipped > 0) {
|
|
132
|
-
|
|
133
|
-
|
|
194
|
+
out(config, ` ${summaryLine(`${skipped} file${skipped !== 1 ? "s" : ""} skipped — already exist.`, "warn")}`);
|
|
195
|
+
out(config, ` ${style.dim("·")} ${style.dim("Run with --force to overwrite existing files.")}`);
|
|
134
196
|
}
|
|
135
|
-
const incompleteFiles = buildIncompleteFiles(config);
|
|
136
197
|
if (incompleteFiles.length > 0) {
|
|
137
|
-
|
|
198
|
+
out(config, `\n ${style.dim("Documentation files that need completion:")}`);
|
|
138
199
|
for (const { file, sections } of incompleteFiles) {
|
|
139
|
-
|
|
200
|
+
out(config, ` ${style.bold(file)}`);
|
|
140
201
|
for (const section of sections.split(", ")) {
|
|
141
|
-
|
|
202
|
+
out(config, ` ${style.dim("→")} ${section} ${style.dim("(empty)")}`);
|
|
142
203
|
}
|
|
143
204
|
}
|
|
144
205
|
if (config.include.has("skills")) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
206
|
+
out(config, `\n ${style.dim("Agent skill available to help:")}`);
|
|
207
|
+
out(config, ` .agentic-scaffold/.agents/skills/fill-docs/SKILL.md`);
|
|
208
|
+
out(config, ` ${style.dim("Invoke it with your AI agent to fill in these files conversationally.")}`);
|
|
148
209
|
}
|
|
149
210
|
}
|
|
150
211
|
}
|