@yarkingulacti/agentic-scaffold 0.7.0 → 0.8.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 +63 -26
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.js +111 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/src/config.d.ts +70 -0
- package/dist/src/config.js +115 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/detect.d.ts +16 -0
- package/dist/src/detect.js +104 -0
- package/dist/src/detect.js.map +1 -0
- package/dist/src/fs-utils.d.ts +14 -0
- package/dist/src/fs-utils.js +86 -0
- package/dist/src/fs-utils.js.map +1 -0
- package/dist/src/prompts.d.ts +4 -0
- package/dist/src/prompts.js +46 -0
- package/dist/src/prompts.js.map +1 -0
- package/dist/src/scaffold.d.ts +2 -0
- package/dist/src/scaffold.js +136 -0
- package/dist/src/scaffold.js.map +1 -0
- package/dist/src/templates.d.ts +5 -0
- package/dist/src/templates.js +44 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/ui.d.ts +6 -0
- package/dist/src/ui.js +38 -0
- package/dist/src/ui.js.map +1 -0
- package/dist/src/unscaffold.d.ts +4 -0
- package/dist/src/unscaffold.js +75 -0
- package/dist/src/unscaffold.js.map +1 -0
- package/package.json +29 -8
- package/templates/docs/CODING_PRINCIPLES.md +1 -1
- package/templates/docs/agents/domain.md.hbs +21 -18
- package/templates/docs/agents/issue-tracker.md.hbs +4 -4
- package/templates/docs/agents/session-close.md.hbs +5 -5
- package/templates/docs/context/INDEX.md +1 -1
- package/templates/hooks/post-bugfix.md.hbs +3 -3
- package/templates/hooks/post-feature.md.hbs +4 -4
- package/templates/hooks/post-session.md.hbs +6 -6
- package/templates/hooks/pre-feature.md.hbs +3 -3
- package/templates/root/AGENTS.md.hbs +21 -21
- package/templates/root/BUSINESS_LOGIC.md.hbs +2 -2
- package/templates/root/CLAUDE.md.hbs +21 -21
- package/templates/scripts/memory_common.py.hbs +5 -5
- package/templates/skills/bugfix/SKILL.md +2 -2
- package/templates/skills/create-hook/SKILL.md +8 -8
- package/templates/skills/diagnose/SKILL.md +1 -1
- package/templates/skills/fill-docs/SKILL.md +8 -8
- package/templates/skills/implement/SKILL.md +6 -6
- package/templates/skills/issue/SKILL.md +2 -2
- package/templates/skills/monthly/SKILL.md +1 -1
- package/templates/skills/next/SKILL.md +28 -0
- package/templates/skills/status/SKILL.md +2 -2
- package/templates/skills/summary/SKILL.md +2 -2
- package/templates/skills/today/SKILL.md +4 -4
- package/templates/skills/weekly/SKILL.md +2 -2
- package/bin/index.js +0 -93
- package/src/detect.js +0 -96
- package/src/prompts.js +0 -45
- package/src/scaffold.js +0 -352
- package/src/ui.js +0 -44
package/README.md
CHANGED
|
@@ -64,34 +64,44 @@ npx @yarkingulacti/agentic-scaffold --skip-skills --skip-scripts --skip-hooks
|
|
|
64
64
|
|
|
65
65
|
# Pre-configure values
|
|
66
66
|
npx @yarkingulacti/agentic-scaffold --project-name "my-app" --issue-tracker github
|
|
67
|
+
|
|
68
|
+
# Remove all scaffolded files (asks for confirmation)
|
|
69
|
+
npx @yarkingulacti/agentic-scaffold un
|
|
70
|
+
|
|
71
|
+
# Remove without confirmation
|
|
72
|
+
npx @yarkingulacti/agentic-scaffold un --force
|
|
67
73
|
```
|
|
68
74
|
|
|
69
75
|
## What you get
|
|
70
76
|
|
|
71
77
|
```
|
|
72
78
|
project/
|
|
73
|
-
├── AGENTS.md
|
|
74
|
-
├── CLAUDE.md
|
|
75
|
-
|
|
76
|
-
├── .
|
|
77
|
-
├──
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
│
|
|
82
|
-
│
|
|
83
|
-
│
|
|
84
|
-
│ │
|
|
85
|
-
│ ├──
|
|
86
|
-
│ │ ├──
|
|
87
|
-
│ │ └──
|
|
88
|
-
│ ├──
|
|
89
|
-
│
|
|
90
|
-
|
|
91
|
-
├── .
|
|
92
|
-
|
|
93
|
-
├── .
|
|
94
|
-
|
|
79
|
+
├── AGENTS.md -> .agentic-scaffold/AGENTS.md # Symlink entry point
|
|
80
|
+
├── CLAUDE.md -> .agentic-scaffold/CLAUDE.md # Symlink entry point
|
|
81
|
+
└── .agentic-scaffold/ # Single wrapper directory
|
|
82
|
+
├── AGENTS.md # Agent config (entry point for AI agents)
|
|
83
|
+
├── CLAUDE.md # Mirror of AGENTS.md
|
|
84
|
+
├── BUSINESS_LOGIC.md # Shell — fill with your domain
|
|
85
|
+
├── .gitignore
|
|
86
|
+
├── docs/
|
|
87
|
+
│ ├── CODING_PRINCIPLES.md # Operating rules for code
|
|
88
|
+
│ ├── adr/TEMPLATE.md # Architecture Decision Record template
|
|
89
|
+
│ ├── agents/
|
|
90
|
+
│ │ ├── domain.md # How to consume domain docs
|
|
91
|
+
│ │ ├── session-close.md # Post-coding session workflow
|
|
92
|
+
│ │ ├── issue-tracker.md # Issue tracker conventions
|
|
93
|
+
│ │ └── triage-labels.md # Triage status vocabulary
|
|
94
|
+
│ ├── context/
|
|
95
|
+
│ │ ├── INDEX.md # Section index for CONTEXT.md
|
|
96
|
+
│ │ └── glossary.md # Ubiquitous language glossary
|
|
97
|
+
│ ├── engineering/README.md
|
|
98
|
+
│ └── product/README.md
|
|
99
|
+
├── .agents/
|
|
100
|
+
│ ├── skills/ # Agent skill definitions (22 skills)
|
|
101
|
+
│ └── hooks/ # Pre/post lifecycle hooks
|
|
102
|
+
├── scripts/ # Markdown memory indexing pipeline
|
|
103
|
+
├── .scratchpad/ # Local detailed planning
|
|
104
|
+
└── .history/ # Shipped work summaries
|
|
95
105
|
```
|
|
96
106
|
|
|
97
107
|
## Auto-detection
|
|
@@ -126,6 +136,19 @@ CLI flags.
|
|
|
126
136
|
- **`--skip-hooks` flag** — skip the hooks component group.
|
|
127
137
|
- **98 tests** — detection, scaffolding, CLI, and hooks tested end-to-end.
|
|
128
138
|
|
|
139
|
+
## New in v0.7.1
|
|
140
|
+
|
|
141
|
+
- **`unscaffold` command** — `npx @yarkingulacti/agentic-scaffold un` removes all scaffolded files and symlinks interactively; `--force` skips confirmation.
|
|
142
|
+
- **`next` skill** — new agent skill for planning and executing the next development step.
|
|
143
|
+
- **Template refinements** — improved task/issue descriptions, clearer checklists, refined AGENTS.md/CLAUDE.md formatting across all templates.
|
|
144
|
+
- **164 tests** — detection, scaffolding, CLI, unscaffold, and all hooks tested end-to-end.
|
|
145
|
+
|
|
146
|
+
## New in v0.6
|
|
147
|
+
|
|
148
|
+
- **Interactive mode redesign** — shows detected project profile before prompts, pre-fills prompts with detected values, and per-file conflict resolver that asks before overwriting existing files.
|
|
149
|
+
- **MEMORY.md golden rules** — feature branches mandatory for new features, every release gets a version tag.
|
|
150
|
+
- **Per-file conflict resolution** — `askOverwrite()` prompt lets you decide for each existing file during scaffolding.
|
|
151
|
+
|
|
129
152
|
## New in v0.5
|
|
130
153
|
|
|
131
154
|
- **`fill-docs` skill** — new agent skill that interviews you to complete placeholder content in BUSINESS_LOGIC.md, glossary, and other scaffolded docs.
|
|
@@ -154,12 +177,26 @@ CLI flags.
|
|
|
154
177
|
|
|
155
178
|
## After scaffolding
|
|
156
179
|
|
|
157
|
-
1. Fill in
|
|
180
|
+
1. Fill in `.agentic-scaffold/BUSINESS_LOGIC.md` with your product domain.
|
|
158
181
|
2. Run `npm install` / `pnpm install` for your project's actual dependencies.
|
|
159
182
|
3. `python3 -m venv .venv && pip install sqlite-vec` if you want vector memory.
|
|
160
|
-
4. Install the skills in your AI tool (e.g. opencode) — each `.agents/skills/*/SKILL.md` is self-contained.
|
|
161
|
-
5. Customize
|
|
162
|
-
6. Use the `fill-docs` skill (`.agents/skills/fill-docs/SKILL.md`) to complete scaffolded documentation.
|
|
183
|
+
4. Install the skills in your AI tool (e.g. opencode) — each `.agentic-scaffold/.agents/skills/*/SKILL.md` is self-contained.
|
|
184
|
+
5. Customize `.agentic-scaffold/docs/agents/triage-labels.md` to match your tracker's vocabulary.
|
|
185
|
+
6. Use the `fill-docs` skill (`.agentic-scaffold/.agents/skills/fill-docs/SKILL.md`) to complete scaffolded documentation.
|
|
186
|
+
|
|
187
|
+
## Unscaffold
|
|
188
|
+
|
|
189
|
+
Remove all scaffolded files in one command:
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Interactive (asks for confirmation)
|
|
193
|
+
npx @yarkingulacti/agentic-scaffold un
|
|
194
|
+
|
|
195
|
+
# Non-interactive
|
|
196
|
+
npx @yarkingulacti/agentic-scaffold un --force
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
This removes the entire `.agentic-scaffold/` directory and the root-level symlinks (AGENTS.md, CLAUDE.md). Your project files are left untouched.
|
|
163
200
|
|
|
164
201
|
## Open source
|
|
165
202
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import yargs from "yargs";
|
|
3
|
+
import { hideBin } from "yargs/helpers";
|
|
4
|
+
import { scaffold } from "../src/scaffold.js";
|
|
5
|
+
import { unscaffold } from "../src/unscaffold.js";
|
|
6
|
+
function scaffoldBuilder(y) {
|
|
7
|
+
return y
|
|
8
|
+
.epilogue("Tiers:\n" +
|
|
9
|
+
" Zero-config Run with no flags — auto-detect project, scaffold only\n" +
|
|
10
|
+
" what's missing. Never overwrites existing files.\n" +
|
|
11
|
+
" Flag mode Override auto-detection with --package-manager,\n" +
|
|
12
|
+
" --ci-provider, --ai-tools, etc. Add --force to overwrite.\n" +
|
|
13
|
+
" Interactive Run with -i / --interactive for step-by-step prompts.")
|
|
14
|
+
.example("$0", "Zero-config: auto-detect and scaffold missing files")
|
|
15
|
+
.example("$0 --force", "Force overwrite existing files")
|
|
16
|
+
.example("$0 --ci-provider github", "Override auto-detected CI provider")
|
|
17
|
+
.example("$0 --ai-tools opencode,cursor", "Generate configs for specific AI tools")
|
|
18
|
+
.example("$0 -i", "Interactive mode with prompts")
|
|
19
|
+
.option("interactive", {
|
|
20
|
+
alias: "i",
|
|
21
|
+
type: "boolean",
|
|
22
|
+
description: "Run in interactive mode with prompts",
|
|
23
|
+
default: false,
|
|
24
|
+
})
|
|
25
|
+
.option("target", {
|
|
26
|
+
alias: "t",
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "Target directory (default: current working directory)",
|
|
29
|
+
default: process.cwd(),
|
|
30
|
+
})
|
|
31
|
+
.option("only", {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "Comma-separated component groups to include: docs,scripts,skills,all",
|
|
34
|
+
default: "all",
|
|
35
|
+
})
|
|
36
|
+
.option("skip-skills", {
|
|
37
|
+
type: "boolean",
|
|
38
|
+
description: "Skip agent skill definitions",
|
|
39
|
+
})
|
|
40
|
+
.option("skip-hooks", {
|
|
41
|
+
type: "boolean",
|
|
42
|
+
description: "Skip agent lifecycle hook templates",
|
|
43
|
+
})
|
|
44
|
+
.option("skip-scripts", {
|
|
45
|
+
type: "boolean",
|
|
46
|
+
description: "Skip memory scripts",
|
|
47
|
+
default: false,
|
|
48
|
+
})
|
|
49
|
+
.option("skip-docs", {
|
|
50
|
+
type: "boolean",
|
|
51
|
+
description: "Skip docs folder",
|
|
52
|
+
default: false,
|
|
53
|
+
})
|
|
54
|
+
.option("project-name", {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "Project name (used in generated files)",
|
|
57
|
+
})
|
|
58
|
+
.option("issue-tracker", {
|
|
59
|
+
type: "string",
|
|
60
|
+
choices: ["linear", "github", "both"],
|
|
61
|
+
description: "Issue tracker type",
|
|
62
|
+
})
|
|
63
|
+
.option("force", {
|
|
64
|
+
alias: "f",
|
|
65
|
+
type: "boolean",
|
|
66
|
+
description: "Overwrite existing files",
|
|
67
|
+
default: false,
|
|
68
|
+
})
|
|
69
|
+
.option("package-manager", {
|
|
70
|
+
type: "string",
|
|
71
|
+
choices: ["npm", "yarn", "pnpm", "pip", "poetry", "go-mod", "cargo"],
|
|
72
|
+
description: "Package manager (overrides auto-detection)",
|
|
73
|
+
})
|
|
74
|
+
.option("ci-provider", {
|
|
75
|
+
type: "string",
|
|
76
|
+
choices: ["github", "gitlab", "circleci"],
|
|
77
|
+
description: "CI provider (overrides auto-detection)",
|
|
78
|
+
})
|
|
79
|
+
.option("ai-tools", {
|
|
80
|
+
type: "string",
|
|
81
|
+
description: "Comma-separated AI tools to configure: opencode,cursor,copilot",
|
|
82
|
+
})
|
|
83
|
+
.option("script-language", {
|
|
84
|
+
type: "string",
|
|
85
|
+
choices: ["python", "node", "docker"],
|
|
86
|
+
description: "Memory script language (overrides auto-detection)",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function unBuilder(y) {
|
|
90
|
+
return y
|
|
91
|
+
.option("target", {
|
|
92
|
+
alias: "t",
|
|
93
|
+
type: "string",
|
|
94
|
+
description: "Target directory (default: current working directory)",
|
|
95
|
+
default: process.cwd(),
|
|
96
|
+
})
|
|
97
|
+
.option("force", {
|
|
98
|
+
alias: "f",
|
|
99
|
+
type: "boolean",
|
|
100
|
+
description: "Remove without confirmation",
|
|
101
|
+
default: false,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const _argv = yargs(hideBin(process.argv))
|
|
105
|
+
.command(["$0", "scaffold"], "Scaffold agentic configuration into a project", scaffoldBuilder, (argv) => scaffold(argv))
|
|
106
|
+
.command("un", "Remove scaffolded files from a project", unBuilder, (argv) => unscaffold(argv))
|
|
107
|
+
.demandCommand(1, "Use --help to see available commands")
|
|
108
|
+
.help()
|
|
109
|
+
.parse();
|
|
110
|
+
_argv;
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare const DEFAULTS: {
|
|
2
|
+
projectDescription: string;
|
|
3
|
+
issueTracker: string;
|
|
4
|
+
scriptLanguage: string;
|
|
5
|
+
};
|
|
6
|
+
export interface ScaffoldArgs {
|
|
7
|
+
target?: string;
|
|
8
|
+
projectName?: string;
|
|
9
|
+
projectDescription?: string;
|
|
10
|
+
issueTracker?: string;
|
|
11
|
+
packageManager?: string;
|
|
12
|
+
ciProvider?: string;
|
|
13
|
+
aiTools?: string;
|
|
14
|
+
scriptLanguage?: string;
|
|
15
|
+
force?: boolean;
|
|
16
|
+
interactive?: boolean;
|
|
17
|
+
only?: string;
|
|
18
|
+
skipDocs?: boolean;
|
|
19
|
+
skipSkills?: boolean;
|
|
20
|
+
skipScripts?: boolean;
|
|
21
|
+
skipHooks?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ScaffoldConfig {
|
|
24
|
+
target: string;
|
|
25
|
+
scaffoldDir: string;
|
|
26
|
+
projectName: string;
|
|
27
|
+
projectDescription: string;
|
|
28
|
+
languages: string[];
|
|
29
|
+
issueTracker: string;
|
|
30
|
+
packageManager: string | null;
|
|
31
|
+
ciProvider: string | null;
|
|
32
|
+
aiTools: string[];
|
|
33
|
+
scriptLanguage: string;
|
|
34
|
+
force: boolean;
|
|
35
|
+
interactive: boolean;
|
|
36
|
+
include: Set<string>;
|
|
37
|
+
}
|
|
38
|
+
export interface TrackerDoc {
|
|
39
|
+
name: string;
|
|
40
|
+
description: string;
|
|
41
|
+
trackerDoc: string;
|
|
42
|
+
short: string;
|
|
43
|
+
statusTable: string;
|
|
44
|
+
envFile: string;
|
|
45
|
+
envTemplate: string;
|
|
46
|
+
}
|
|
47
|
+
export interface HandlebarsData {
|
|
48
|
+
projectName: string;
|
|
49
|
+
projectDescription: string;
|
|
50
|
+
scriptsDir: string;
|
|
51
|
+
issueTrackerName: string;
|
|
52
|
+
issueTrackerDescription: string;
|
|
53
|
+
issueTrackerShort: string;
|
|
54
|
+
statusTable: string;
|
|
55
|
+
trackerDoc: string;
|
|
56
|
+
envFile: string;
|
|
57
|
+
envTemplate: string;
|
|
58
|
+
packageManager: string | null;
|
|
59
|
+
ciProvider: string | null;
|
|
60
|
+
scriptLanguage: string;
|
|
61
|
+
scaffoldVersion: string;
|
|
62
|
+
incompleteFiles: IncompleteFile[];
|
|
63
|
+
}
|
|
64
|
+
export interface IncompleteFile {
|
|
65
|
+
file: string;
|
|
66
|
+
sections: string;
|
|
67
|
+
}
|
|
68
|
+
export declare function resolveConfig(argv: ScaffoldArgs): ScaffoldConfig;
|
|
69
|
+
export declare function buildHandlebars(config: ScaffoldConfig, version: string): HandlebarsData;
|
|
70
|
+
export declare function buildIncompleteFiles(config: ScaffoldConfig): IncompleteFile[];
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { detectProjectProfile } from "./detect.js";
|
|
3
|
+
export const DEFAULTS = {
|
|
4
|
+
projectDescription: "A project.",
|
|
5
|
+
issueTracker: "linear",
|
|
6
|
+
scriptLanguage: "python",
|
|
7
|
+
};
|
|
8
|
+
const ISSUE_TRACKER_DOCS = {
|
|
9
|
+
linear: {
|
|
10
|
+
name: "Linear",
|
|
11
|
+
description: "Short implementation records live in Linear. Local, detailed planning lives in `.agentic-scaffold/.scratchpad/<feature>/`. See `.agentic-scaffold/docs/agents/issue-tracker.md`.",
|
|
12
|
+
trackerDoc: "Linear",
|
|
13
|
+
short: "Short issue records live in Linear. Local detailed planning lives in `.agentic-scaffold/.scratchpad/`.",
|
|
14
|
+
statusTable: [
|
|
15
|
+
"| Label | Status string | Meaning |",
|
|
16
|
+
"|-------|--------------|---------|",
|
|
17
|
+
"| needs-triage | `needs-triage` | Maintainer needs to evaluate this issue |",
|
|
18
|
+
"| needs-info | `needs-info` | Waiting on reporter for more information |",
|
|
19
|
+
"| ready-for-agent | `ready-for-agent` | Fully specified, ready for an AI agent |",
|
|
20
|
+
"| ready-for-human | `ready-for-human` | Requires human implementation |",
|
|
21
|
+
"| wontfix | `wontfix` | Will not be actioned |",
|
|
22
|
+
].join("\n"),
|
|
23
|
+
envFile: ".env.linear\n.env.linear.local",
|
|
24
|
+
envTemplate: "LINEAR_TEAM_KEY=\nLINEAR_PROJECT_ID=",
|
|
25
|
+
},
|
|
26
|
+
github: {
|
|
27
|
+
name: "GitHub Issues",
|
|
28
|
+
description: "Short implementation records live in GitHub Issues. Local, detailed planning lives in `.agentic-scaffold/.scratchpad/<feature>/`. See `.agentic-scaffold/docs/agents/issue-tracker.md`.",
|
|
29
|
+
trackerDoc: "GitHub Issues",
|
|
30
|
+
short: "Short issue records live in GitHub Issues. Local detailed planning lives in `.scratchpad/`.",
|
|
31
|
+
statusTable: [
|
|
32
|
+
"| Label | Meaning |",
|
|
33
|
+
"|-------|---------|",
|
|
34
|
+
"| `needs-triage` | Maintainer needs to evaluate this issue |",
|
|
35
|
+
"| `needs-info` | Waiting on reporter for more information |",
|
|
36
|
+
"| `ready-for-agent` | Fully specified, ready for an AI agent |",
|
|
37
|
+
"| `ready-for-human` | Requires human implementation |",
|
|
38
|
+
"| `wontfix` | Will not be actioned |",
|
|
39
|
+
].join("\n"),
|
|
40
|
+
envFile: "",
|
|
41
|
+
envTemplate: "",
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
function resolveIncludes(argv) {
|
|
45
|
+
if (argv.only && argv.only !== "all") {
|
|
46
|
+
return new Set(argv.only.split(",").map((s) => s.trim()));
|
|
47
|
+
}
|
|
48
|
+
const set = new Set(["docs", "scripts", "skills", "hooks"]);
|
|
49
|
+
if (argv.skipDocs)
|
|
50
|
+
set.delete("docs");
|
|
51
|
+
if (argv.skipScripts)
|
|
52
|
+
set.delete("scripts");
|
|
53
|
+
if (argv.skipSkills)
|
|
54
|
+
set.delete("skills");
|
|
55
|
+
if (argv.skipHooks)
|
|
56
|
+
set.delete("hooks");
|
|
57
|
+
return set;
|
|
58
|
+
}
|
|
59
|
+
export function resolveConfig(argv) {
|
|
60
|
+
const target = argv.target || process.cwd();
|
|
61
|
+
const profile = detectProjectProfile(target);
|
|
62
|
+
return {
|
|
63
|
+
target,
|
|
64
|
+
scaffoldDir: join(target, ".agentic-scaffold"),
|
|
65
|
+
projectName: argv.projectName ?? profile.projectName ?? target.split("/").filter(Boolean).pop() ?? "project",
|
|
66
|
+
projectDescription: argv.projectDescription ?? DEFAULTS.projectDescription,
|
|
67
|
+
languages: profile.languages,
|
|
68
|
+
issueTracker: argv.issueTracker ?? profile.issueTracker ?? DEFAULTS.issueTracker,
|
|
69
|
+
packageManager: argv.packageManager ?? profile.packageManager ?? null,
|
|
70
|
+
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,
|
|
77
|
+
scriptLanguage: argv.scriptLanguage ?? profile.scriptLanguage ?? DEFAULTS.scriptLanguage,
|
|
78
|
+
force: argv.force ?? false,
|
|
79
|
+
interactive: argv.interactive ?? false,
|
|
80
|
+
include: resolveIncludes(argv),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export function buildHandlebars(config, version) {
|
|
84
|
+
const tracker = ISSUE_TRACKER_DOCS[config.issueTracker] || ISSUE_TRACKER_DOCS.linear;
|
|
85
|
+
return {
|
|
86
|
+
projectName: config.projectName,
|
|
87
|
+
projectDescription: config.projectDescription,
|
|
88
|
+
scriptsDir: ".agentic-scaffold/scripts",
|
|
89
|
+
issueTrackerName: tracker.name,
|
|
90
|
+
issueTrackerDescription: tracker.description,
|
|
91
|
+
issueTrackerShort: tracker.short,
|
|
92
|
+
statusTable: tracker.statusTable,
|
|
93
|
+
trackerDoc: tracker.trackerDoc,
|
|
94
|
+
envFile: tracker.envFile,
|
|
95
|
+
envTemplate: tracker.envTemplate,
|
|
96
|
+
packageManager: config.packageManager,
|
|
97
|
+
ciProvider: config.ciProvider,
|
|
98
|
+
scriptLanguage: config.scriptLanguage,
|
|
99
|
+
scaffoldVersion: version,
|
|
100
|
+
incompleteFiles: buildIncompleteFiles(config),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export function buildIncompleteFiles(config) {
|
|
104
|
+
const files = [
|
|
105
|
+
{
|
|
106
|
+
file: ".agentic-scaffold/BUSINESS_LOGIC.md",
|
|
107
|
+
sections: "Core Domain Concepts, Non-Negotiable Rules, Architecture Decisions",
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
if (config.include.has("docs")) {
|
|
111
|
+
files.push({ file: ".agentic-scaffold/docs/context/glossary.md", sections: "domain term definitions" }, { file: ".agentic-scaffold/docs/product/README.md", sections: "product spec descriptions" }, { file: ".agentic-scaffold/docs/engineering/README.md", sections: "implementation conventions" });
|
|
112
|
+
}
|
|
113
|
+
return files;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ProjectProfile {
|
|
2
|
+
projectName: string;
|
|
3
|
+
languages: string[];
|
|
4
|
+
packageManager: string | null;
|
|
5
|
+
ciProvider: string | null;
|
|
6
|
+
aiTools: string[];
|
|
7
|
+
issueTracker: string | null;
|
|
8
|
+
scriptLanguage: string | null;
|
|
9
|
+
hasDockerfile: boolean;
|
|
10
|
+
hasEnvExample: boolean;
|
|
11
|
+
hasContributing: boolean;
|
|
12
|
+
hasChangelog: boolean;
|
|
13
|
+
hasApiDocs: boolean;
|
|
14
|
+
hasMigrations: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function detectProjectProfile(targetDir: string): ProjectProfile;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export function detectProjectProfile(targetDir) {
|
|
4
|
+
const projectName = targetDir.split("/").filter(Boolean).pop() || "project";
|
|
5
|
+
return {
|
|
6
|
+
projectName,
|
|
7
|
+
languages: detectLanguages(targetDir),
|
|
8
|
+
packageManager: detectPackageManager(targetDir),
|
|
9
|
+
ciProvider: detectCIProvider(targetDir),
|
|
10
|
+
aiTools: detectAITools(targetDir),
|
|
11
|
+
issueTracker: detectIssueTracker(targetDir),
|
|
12
|
+
scriptLanguage: detectScriptLanguage(targetDir),
|
|
13
|
+
hasDockerfile: existsSync(join(targetDir, "Dockerfile")),
|
|
14
|
+
hasEnvExample: existsSync(join(targetDir, ".env.example")),
|
|
15
|
+
hasContributing: existsSync(join(targetDir, "CONTRIBUTING.md")),
|
|
16
|
+
hasChangelog: existsSync(join(targetDir, "CHANGELOG.md")),
|
|
17
|
+
hasApiDocs: existsSync(join(targetDir, "docs", "api")),
|
|
18
|
+
hasMigrations: migrationDirs.some((dir) => existsSync(join(targetDir, dir))),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const migrationDirs = ["migrations", "db/migrations", "prisma/migrations", "alembic"];
|
|
22
|
+
function detectLanguages(targetDir) {
|
|
23
|
+
const languages = [];
|
|
24
|
+
if (existsSync(join(targetDir, "package.json"))) {
|
|
25
|
+
try {
|
|
26
|
+
const pkg = JSON.parse(readFileSync(join(targetDir, "package.json"), "utf-8"));
|
|
27
|
+
const deps = pkg.devDependencies;
|
|
28
|
+
const prodDeps = pkg.dependencies;
|
|
29
|
+
if (deps?.typescript || prodDeps?.typescript) {
|
|
30
|
+
languages.push("ts");
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
languages.push("js");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
languages.push("js");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (existsSync(join(targetDir, "requirements.txt"))) {
|
|
41
|
+
languages.push("python");
|
|
42
|
+
}
|
|
43
|
+
if (existsSync(join(targetDir, "pyproject.toml"))) {
|
|
44
|
+
languages.push("python");
|
|
45
|
+
}
|
|
46
|
+
if (existsSync(join(targetDir, "go.mod"))) {
|
|
47
|
+
languages.push("go");
|
|
48
|
+
}
|
|
49
|
+
if (existsSync(join(targetDir, "Cargo.toml"))) {
|
|
50
|
+
languages.push("rust");
|
|
51
|
+
}
|
|
52
|
+
return languages;
|
|
53
|
+
}
|
|
54
|
+
function detectPackageManager(targetDir) {
|
|
55
|
+
if (existsSync(join(targetDir, "pnpm-lock.yaml")))
|
|
56
|
+
return "pnpm";
|
|
57
|
+
if (existsSync(join(targetDir, "yarn.lock")))
|
|
58
|
+
return "yarn";
|
|
59
|
+
if (existsSync(join(targetDir, "package-lock.json")))
|
|
60
|
+
return "npm";
|
|
61
|
+
if (existsSync(join(targetDir, "poetry.lock")))
|
|
62
|
+
return "poetry";
|
|
63
|
+
if (existsSync(join(targetDir, "Pipfile.lock")))
|
|
64
|
+
return "pip";
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
function detectCIProvider(targetDir) {
|
|
68
|
+
if (existsSync(join(targetDir, ".github", "workflows")))
|
|
69
|
+
return "github";
|
|
70
|
+
if (existsSync(join(targetDir, ".gitlab-ci.yml")))
|
|
71
|
+
return "gitlab";
|
|
72
|
+
if (existsSync(join(targetDir, ".circleci", "config.yml")))
|
|
73
|
+
return "circleci";
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function detectAITools(targetDir) {
|
|
77
|
+
const tools = [];
|
|
78
|
+
if (existsSync(join(targetDir, "opencode.json")))
|
|
79
|
+
tools.push("opencode");
|
|
80
|
+
if (existsSync(join(targetDir, ".cursorrules")))
|
|
81
|
+
tools.push("cursor");
|
|
82
|
+
if (existsSync(join(targetDir, ".copilot-instructions.md")))
|
|
83
|
+
tools.push("copilot");
|
|
84
|
+
if (existsSync(join(targetDir, ".windsurfrules")))
|
|
85
|
+
tools.push("windsurf");
|
|
86
|
+
if (existsSync(join(targetDir, ".clinerules")))
|
|
87
|
+
tools.push("cline");
|
|
88
|
+
return tools;
|
|
89
|
+
}
|
|
90
|
+
function detectIssueTracker(targetDir) {
|
|
91
|
+
if (existsSync(join(targetDir, ".github")))
|
|
92
|
+
return "github";
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function detectScriptLanguage(targetDir) {
|
|
96
|
+
if (existsSync(join(targetDir, "package.json")))
|
|
97
|
+
return "node";
|
|
98
|
+
if (existsSync(join(targetDir, "requirements.txt")))
|
|
99
|
+
return "python";
|
|
100
|
+
if (existsSync(join(targetDir, "pyproject.toml")))
|
|
101
|
+
return "python";
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface WriteOptions {
|
|
2
|
+
interactive?: boolean;
|
|
3
|
+
force?: boolean;
|
|
4
|
+
onProgress?: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function write(targetPath: string, content: string, options?: WriteOptions): Promise<string>;
|
|
7
|
+
export declare function copyFile(src: string, dest: string, options?: WriteOptions): Promise<string>;
|
|
8
|
+
export declare function copyStaticDir(srcDir: string, destDir: string, options?: WriteOptions): Promise<string[]>;
|
|
9
|
+
export declare function createSymlinks(target: string, _scaffoldDir: string): string[];
|
|
10
|
+
export interface DirEntry {
|
|
11
|
+
name: string;
|
|
12
|
+
full: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function walkDir(dir: string): DirEntry[];
|