@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.
Files changed (43) hide show
  1. package/dist/bin/index.js +37 -1
  2. package/dist/bin/index.js.map +1 -1
  3. package/dist/bin/validate-skills.d.ts +2 -0
  4. package/dist/bin/validate-skills.js +122 -0
  5. package/dist/bin/validate-skills.js.map +1 -0
  6. package/dist/src/config.d.ts +11 -0
  7. package/dist/src/config.js +42 -9
  8. package/dist/src/config.js.map +1 -1
  9. package/dist/src/prompts.d.ts +1 -0
  10. package/dist/src/prompts.js +21 -2
  11. package/dist/src/prompts.js.map +1 -1
  12. package/dist/src/scaffold.js +87 -26
  13. package/dist/src/scaffold.js.map +1 -1
  14. package/dist/src/templates.js +17 -0
  15. package/dist/src/templates.js.map +1 -1
  16. package/dist/src/ui.js +12 -7
  17. package/dist/src/ui.js.map +1 -1
  18. package/package.json +3 -2
  19. package/templates/ai-config/.copilot-instructions.md.hbs +35 -0
  20. package/templates/ai-config/.cursorrules.hbs +22 -0
  21. package/templates/ai-config/opencode.json.hbs +15 -0
  22. package/templates/ci/github/dependabot.yml.hbs +13 -0
  23. package/templates/ci/github/workflows/ci.yml.hbs +76 -0
  24. package/templates/ci/gitlab/.gitlab-ci.yml.hbs +64 -0
  25. package/templates/contribute/CONTRIBUTING.md.hbs +41 -0
  26. package/templates/contribute/PULL_REQUEST_TEMPLATE.md.hbs +18 -0
  27. package/templates/contribute/code-review.md.hbs +30 -0
  28. package/templates/docs/agents/ci.md.hbs +25 -0
  29. package/templates/docs/agents/migrations.md.hbs +57 -0
  30. package/templates/docs/engineering/dependencies.md.hbs +23 -0
  31. package/templates/docs/engineering/observability.md.hbs +32 -0
  32. package/templates/docs/engineering/security.md.hbs +31 -0
  33. package/templates/onboarding/ONBOARDING.md.hbs +59 -0
  34. package/templates/onboarding/setup.sh.hbs +24 -0
  35. package/templates/root/AGENTS.md.hbs +4 -0
  36. package/templates/root/CLAUDE.md.hbs +4 -0
  37. package/templates/scripts/cleanup-stale.sh.hbs +58 -0
  38. package/templates/scripts/migrations/README.md.hbs +33 -0
  39. package/templates/scripts/migrations/alembic/README.md +36 -0
  40. package/templates/scripts/migrations/node-pg-migrate/README.md +37 -0
  41. package/templates/scripts/migrations/prisma/README.md +36 -0
  42. package/templates/skills/implement/SKILL.md +4 -3
  43. 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 component groups to include: docs,scripts,skills,all",
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",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -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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"}
@@ -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;
@@ -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: "python",
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
- return new Set(argv.only.split(",").map((s) => s.trim()));
48
+ set = new Set(argv.only.split(",").map((s) => s.trim()));
47
49
  }
48
- const set = new Set(["docs", "scripts", "skills", "hooks"]);
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) {
@@ -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,QAAQ;CACzB,CAAC;AAuEF,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,SAAS,eAAe,CAAC,IAAkB;IACzC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACrC,OAAO,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;IAC5D,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,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,OAAO,GAAG,CAAC;AACb,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;YACnB,CAAC,CAAC,IAAI,CAAC,OAAO;iBACT,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,OAAO,CAAC,OAAO;QACnB,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,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;KAC9C,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"}
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"}
@@ -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[]>;
@@ -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
@@ -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,gCAAgC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC"}
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,uEAAuE,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAC3G,OAAO,OAAO;SACX,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAkB;IACjD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,UAAU,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,KAAK,EAAE,CAAC;IACV,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO;SAClB,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,QAAQ,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -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
- console.log(`\n${infoBox(rows)}`);
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
- console.log(`\n ${style.bold("Detected project profile:")}`);
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
- console.log(`\n${infoBox(rows)}`);
130
+ out(config, `\n${infoBox(rows)}`);
92
131
  if (config.dryRun) {
93
132
  const entries = listDryRunFiles(TEMPLATES_DIR, [...config.include]);
94
- console.log(`\n ${style.bold("Dry run — no files will be written:")}`);
95
- console.log(` ${style.cyan(String(entries.length))} files would be created\n`);
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
- console.log(` ${icon} ${entry.dest}`);
137
+ out(config, ` ${icon} ${entry.dest}`);
99
138
  }
100
- console.log(`\n ${style.dim("Symlinks that would be created:")}`);
101
- console.log(` AGENTS.md → .agentic-scaffold/AGENTS.md`);
102
- console.log(` CLAUDE.md → .agentic-scaffold/CLAUDE.md`);
103
- console.log(`\n ${summaryLine("Run without --dry-run to scaffold.", "done")}`);
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
- done++;
111
- process.stdout.write(`\r ${spinner(done)} ${progressBar(done, total)}`);
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
- results.push(...(await scaffoldScratchpad(config, tickOpts)));
124
- results.push(...(await scaffoldHistory(config, tickOpts)));
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
- process.stdout.write(`${"\r".padEnd(60)}\r`);
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
- console.log(` ${summaryLine(`Done! ${written} file${written !== 1 ? "s" : ""} scaffolded.`, "done")}`);
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
- console.log(` ${summaryLine(`${skipped} file${skipped !== 1 ? "s" : ""} skipped — already exist.`, "warn")}`);
133
- console.log(` ${style.dim("·")} ${style.dim("Run with --force to overwrite existing files.")}`);
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
- console.log(`\n ${style.dim("Documentation files that need completion:")}`);
198
+ out(config, `\n ${style.dim("Documentation files that need completion:")}`);
138
199
  for (const { file, sections } of incompleteFiles) {
139
- console.log(` ${style.bold(file)}`);
200
+ out(config, ` ${style.bold(file)}`);
140
201
  for (const section of sections.split(", ")) {
141
- console.log(` ${style.dim("→")} ${section} ${style.dim("(empty)")}`);
202
+ out(config, ` ${style.dim("→")} ${section} ${style.dim("(empty)")}`);
142
203
  }
143
204
  }
144
205
  if (config.include.has("skills")) {
145
- console.log(`\n ${style.dim("Agent skill available to help:")}`);
146
- console.log(` .agentic-scaffold/.agents/skills/fill-docs/SKILL.md`);
147
- console.log(` ${style.dim("Invoke it with your AI agent to fill in these files conversationally.")}`);
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
  }