@kiwidata/grimoire 0.1.2 → 0.1.4
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/AGENTS.md +56 -4
- package/README.md +29 -2
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/check.js +3 -3
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/configure.d.ts +3 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +19 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/map.d.ts.map +1 -1
- package/dist/commands/map.js +10 -11
- package/dist/commands/map.js.map +1 -1
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +32 -43
- package/dist/core/archive.js.map +1 -1
- package/dist/core/check.d.ts.map +1 -1
- package/dist/core/check.js +115 -104
- package/dist/core/check.js.map +1 -1
- package/dist/core/ci.d.ts.map +1 -1
- package/dist/core/ci.js +50 -69
- package/dist/core/ci.js.map +1 -1
- package/dist/core/configure.d.ts +14 -0
- package/dist/core/configure.d.ts.map +1 -0
- package/dist/core/configure.js +434 -0
- package/dist/core/configure.js.map +1 -0
- package/dist/core/detect.d.ts.map +1 -1
- package/dist/core/detect.js +153 -26
- package/dist/core/detect.js.map +1 -1
- package/dist/core/diff.d.ts.map +1 -1
- package/dist/core/diff.js +62 -93
- package/dist/core/diff.js.map +1 -1
- package/dist/core/doc-style.d.ts +0 -4
- package/dist/core/doc-style.d.ts.map +1 -1
- package/dist/core/doc-style.js +28 -23
- package/dist/core/doc-style.js.map +1 -1
- package/dist/core/docs.js +106 -100
- package/dist/core/docs.js.map +1 -1
- package/dist/core/health.js +55 -77
- package/dist/core/health.js.map +1 -1
- package/dist/core/hooks.d.ts +0 -3
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/hooks.js +0 -11
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/init.d.ts +2 -0
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +230 -406
- package/dist/core/init.js.map +1 -1
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +55 -65
- package/dist/core/list.js.map +1 -1
- package/dist/core/log.d.ts.map +1 -1
- package/dist/core/log.js +23 -33
- package/dist/core/log.js.map +1 -1
- package/dist/core/map.d.ts +15 -2
- package/dist/core/map.d.ts.map +1 -1
- package/dist/core/map.js +257 -194
- package/dist/core/map.js.map +1 -1
- package/dist/core/shared-setup.d.ts +0 -40
- package/dist/core/shared-setup.d.ts.map +1 -1
- package/dist/core/shared-setup.js +87 -52
- package/dist/core/shared-setup.js.map +1 -1
- package/dist/core/status.d.ts.map +1 -1
- package/dist/core/status.js +42 -52
- package/dist/core/status.js.map +1 -1
- package/dist/core/test-quality.d.ts +0 -8
- package/dist/core/test-quality.d.ts.map +1 -1
- package/dist/core/test-quality.js +24 -30
- package/dist/core/test-quality.js.map +1 -1
- package/dist/core/trace.d.ts.map +1 -1
- package/dist/core/trace.js +31 -41
- package/dist/core/trace.js.map +1 -1
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +61 -11
- package/dist/core/update.js.map +1 -1
- package/dist/core/validate.d.ts +1 -4
- package/dist/core/validate.d.ts.map +1 -1
- package/dist/core/validate.js +126 -148
- package/dist/core/validate.js.map +1 -1
- package/dist/utils/config.d.ts +15 -5
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +63 -42
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/fs.d.ts +0 -12
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +0 -12
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/paths.d.ts +0 -6
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +0 -6
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/spawn.d.ts +0 -3
- package/dist/utils/spawn.d.ts.map +1 -1
- package/dist/utils/spawn.js +0 -3
- package/dist/utils/spawn.js.map +1 -1
- package/package.json +1 -1
- package/skills/grimoire-apply/SKILL.md +84 -16
- package/skills/grimoire-audit/SKILL.md +21 -1
- package/skills/grimoire-bug/SKILL.md +48 -9
- package/skills/grimoire-commit/SKILL.md +2 -1
- package/skills/grimoire-design/SKILL.md +259 -0
- package/skills/grimoire-design-consult/SKILL.md +200 -0
- package/skills/grimoire-discover/SKILL.md +65 -2
- package/skills/grimoire-draft/SKILL.md +85 -2
- package/skills/grimoire-plan/SKILL.md +61 -18
- package/skills/grimoire-pr/SKILL.md +4 -6
- package/skills/grimoire-pr-review/SKILL.md +45 -114
- package/skills/grimoire-precommit-review/SKILL.md +205 -0
- package/skills/grimoire-refactor/SKILL.md +5 -5
- package/skills/grimoire-review/SKILL.md +74 -147
- package/skills/grimoire-verify/SKILL.md +33 -0
- package/skills/references/adversarial-personas.md +225 -0
- package/skills/references/brand-tokens-format.md +186 -0
- package/skills/references/code-quality.md +140 -0
- package/skills/references/design-heuristics.md +138 -0
- package/skills/references/design-input-formats.md +190 -0
- package/skills/references/pattern-guard.md +180 -0
- package/skills/references/refactor-scan-categories.md +152 -0
- package/skills/references/review-personas.md +405 -0
- package/skills/references/security-compliance.md +22 -1
- package/skills/references/visual-fidelity.md +206 -0
- package/templates/brand-tokens-example.json +13 -0
- package/templates/brand-voice-example.md +22 -0
- package/templates/design-tool-setup-stub.md +59 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { writeFile, readFile, copyFile } from "node:fs/promises";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { stringify as yamlStringify } from "yaml";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
import { fileExists } from "../utils/fs.js";
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const PACKAGE_ROOT = join(__dirname, "..", "..");
|
|
9
|
+
export const SECTION_LABELS = {
|
|
10
|
+
tools: "Tools (doc generator, comment style, dead code finder)",
|
|
11
|
+
compliance: "Compliance (frameworks, dep audit, secret scanning)",
|
|
12
|
+
design: "Design (design tool, brand guidelines)",
|
|
13
|
+
llm: "AI agents (thinking/coding model)",
|
|
14
|
+
trackers: "Bug trackers",
|
|
15
|
+
testing: "Testing tools",
|
|
16
|
+
};
|
|
17
|
+
const ALL_SECTIONS = [
|
|
18
|
+
"tools",
|
|
19
|
+
"compliance",
|
|
20
|
+
"design",
|
|
21
|
+
"llm",
|
|
22
|
+
"trackers",
|
|
23
|
+
"testing",
|
|
24
|
+
];
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Moved MCP configs
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
const BUG_TRACKER_MCP = {
|
|
29
|
+
jira: {
|
|
30
|
+
display: "Atlassian (Jira + Confluence)",
|
|
31
|
+
url: "https://mcp.atlassian.com/v1/sse",
|
|
32
|
+
transport: "sse",
|
|
33
|
+
},
|
|
34
|
+
linear: {
|
|
35
|
+
display: "Linear",
|
|
36
|
+
url: "https://mcp.linear.app/mcp",
|
|
37
|
+
transport: "http",
|
|
38
|
+
},
|
|
39
|
+
github: {
|
|
40
|
+
display: "GitHub Issues",
|
|
41
|
+
command: "npx",
|
|
42
|
+
args: ["-y", "@modelcontextprotocol/server-github"],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
const TESTING_TOOL_MCP = {
|
|
46
|
+
playwright: {
|
|
47
|
+
display: "Playwright",
|
|
48
|
+
command: "npx",
|
|
49
|
+
args: ["-y", "@playwright/mcp@latest"],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const DESIGN_TOOL_MCP = {
|
|
53
|
+
figma: {
|
|
54
|
+
display: "Figma Dev Mode",
|
|
55
|
+
mcpName: "figma-dev-mode",
|
|
56
|
+
command: "npx",
|
|
57
|
+
args: ["-y", "figma-developer-mcp@latest"],
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Private helpers
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
const HEX_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
64
|
+
async function askHex(rl, label) {
|
|
65
|
+
while (true) {
|
|
66
|
+
const answer = (await rl.question(` ${label} (hex, e.g., #0066ff): `)).trim();
|
|
67
|
+
if (HEX_PATTERN.test(answer))
|
|
68
|
+
return answer;
|
|
69
|
+
console.log(chalk.yellow(` Invalid hex color "${answer}". Use #RGB or #RRGGBB.`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function findExistingTokens(root) {
|
|
73
|
+
for (const candidate of ["tokens.json", "design-tokens.json"]) {
|
|
74
|
+
const path = join(root, candidate);
|
|
75
|
+
if (await fileExists(path))
|
|
76
|
+
return path;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
function buildBrandTokens(input) {
|
|
81
|
+
const tokens = {
|
|
82
|
+
color: {
|
|
83
|
+
primary: { $value: input.primary, $type: "color" },
|
|
84
|
+
secondary: { $value: input.secondary, $type: "color" },
|
|
85
|
+
accent: { $value: input.accent, $type: "color" },
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
if (input.fontFamily) {
|
|
89
|
+
tokens.font = {
|
|
90
|
+
family: { base: { $value: input.fontFamily, $type: "fontFamily" } },
|
|
91
|
+
...(input.fontSize
|
|
92
|
+
? {
|
|
93
|
+
size: {
|
|
94
|
+
base: { $value: `${input.fontSize}px`, $type: "dimension" },
|
|
95
|
+
},
|
|
96
|
+
}
|
|
97
|
+
: {}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (input.spacing) {
|
|
101
|
+
tokens.spacing = {
|
|
102
|
+
base: { $value: `${input.spacing}px`, $type: "dimension" },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (input.logo || input.favicon) {
|
|
106
|
+
tokens.asset = {
|
|
107
|
+
...(input.logo ? { logo: { $value: input.logo, $type: "asset" } } : {}),
|
|
108
|
+
...(input.favicon
|
|
109
|
+
? { favicon: { $value: input.favicon, $type: "asset" } }
|
|
110
|
+
: {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return tokens;
|
|
114
|
+
}
|
|
115
|
+
function renderVoiceFile(voiceDo, voiceDont) {
|
|
116
|
+
return [
|
|
117
|
+
"# Brand Voice & Tone",
|
|
118
|
+
"",
|
|
119
|
+
"Captured at `grimoire init`. Edit freely.",
|
|
120
|
+
"",
|
|
121
|
+
"## Do",
|
|
122
|
+
"",
|
|
123
|
+
`- ${voiceDo}`,
|
|
124
|
+
"",
|
|
125
|
+
"## Don't",
|
|
126
|
+
"",
|
|
127
|
+
`- ${voiceDont}`,
|
|
128
|
+
"",
|
|
129
|
+
].join("\n");
|
|
130
|
+
}
|
|
131
|
+
async function writeDesignToolStub(root, designTool) {
|
|
132
|
+
const stubSrc = join(PACKAGE_ROOT, "templates", "design-tool-setup-stub.md");
|
|
133
|
+
const stubDest = join(root, ".grimoire", "docs", "design-tool-setup.md");
|
|
134
|
+
const template = await readFile(stubSrc, "utf-8");
|
|
135
|
+
const rendered = template.replace(/\{\{tool\}\}/g, designTool);
|
|
136
|
+
await writeFile(stubDest, rendered);
|
|
137
|
+
console.log(` ${chalk.green("created")} .grimoire/docs/design-tool-setup.md`);
|
|
138
|
+
}
|
|
139
|
+
function stripNone(answer) {
|
|
140
|
+
const trimmed = answer.trim();
|
|
141
|
+
return trimmed && trimmed !== "none" ? trimmed : undefined;
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Section functions (exported so init --full can call them directly)
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
function applyDeadCodeAnswer(config, answer) {
|
|
147
|
+
const t = answer.trim();
|
|
148
|
+
if (!t || t === "auto")
|
|
149
|
+
return;
|
|
150
|
+
if (t === "none") {
|
|
151
|
+
delete config.tools.dead_code;
|
|
152
|
+
config.checks = config.checks.filter((c) => c !== "dead_code");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const deadCodeCommands = {
|
|
156
|
+
knip: "npx knip",
|
|
157
|
+
"ts-prune": "npx ts-prune",
|
|
158
|
+
vulture: "vulture .",
|
|
159
|
+
deadcode: "deadcode ./...",
|
|
160
|
+
};
|
|
161
|
+
config.tools.dead_code = { name: t, command: deadCodeCommands[t] ?? t };
|
|
162
|
+
}
|
|
163
|
+
export async function configureToolsSection(rl, config) {
|
|
164
|
+
console.log(chalk.bold("\n Code style & quality tools:\n"));
|
|
165
|
+
const docToolAnswer = await rl.question(` Doc generator? (sphinx/mkdocs/typedoc/jsdoc/none) [${config.project.doc_tool ?? "none"}]: `);
|
|
166
|
+
if (docToolAnswer.trim())
|
|
167
|
+
config.project.doc_tool = stripNone(docToolAnswer);
|
|
168
|
+
const commentAnswer = await rl.question(` Comment/docstring style? (google/numpy/sphinx/jsdoc/tsdoc/none) [${config.project.comment_style ?? "none"}]: `);
|
|
169
|
+
if (commentAnswer.trim())
|
|
170
|
+
config.project.comment_style = stripNone(commentAnswer);
|
|
171
|
+
const currentDeadCode = config.tools.dead_code?.name ?? "auto";
|
|
172
|
+
const deadCodeAnswer = await rl.question(` Dead code finder? (knip/ts-prune/vulture/deadcode/none/auto) [${currentDeadCode}]: `);
|
|
173
|
+
applyDeadCodeAnswer(config, deadCodeAnswer);
|
|
174
|
+
}
|
|
175
|
+
function applyToolAnswer(config, toolKey, answer, commands, field) {
|
|
176
|
+
const t = answer.trim();
|
|
177
|
+
if (!t || t === "auto")
|
|
178
|
+
return;
|
|
179
|
+
if (t === "none") {
|
|
180
|
+
delete config.tools[toolKey];
|
|
181
|
+
config.checks = config.checks.filter((c) => c !== toolKey);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
config.tools[toolKey] = { name: t, [field]: commands[t] ?? t };
|
|
185
|
+
}
|
|
186
|
+
export async function configureComplianceSection(rl, config) {
|
|
187
|
+
console.log(chalk.bold("\n Security & compliance:\n"));
|
|
188
|
+
console.log(chalk.dim(" Which compliance frameworks apply to this project?"));
|
|
189
|
+
console.log(chalk.dim(" Options: owasp, pci-dss, hipaa, soc2, gdpr, iso27001, or Enter to skip.\n"));
|
|
190
|
+
const complianceAnswer = await rl.question(` Compliance frameworks (comma-separated) [${(config.project.compliance ?? []).join(",") || "none"}]: `);
|
|
191
|
+
if (complianceAnswer.trim() && complianceAnswer.trim().toLowerCase() !== "none") {
|
|
192
|
+
config.project.compliance = complianceAnswer.split(",").map((s) => s.trim().toLowerCase()).filter(Boolean);
|
|
193
|
+
}
|
|
194
|
+
const depAuditAnswer = await rl.question(` Dep audit tool? (npm-audit/pip-audit/safety/yarn-audit/pnpm-audit/none/auto) [${config.tools.dep_audit?.name ?? "auto"}]: `);
|
|
195
|
+
applyToolAnswer(config, "dep_audit", depAuditAnswer, {
|
|
196
|
+
"npm-audit": "npm audit --audit-level=high",
|
|
197
|
+
"pip-audit": "pip-audit",
|
|
198
|
+
safety: "safety check",
|
|
199
|
+
"yarn-audit": "yarn audit --level high",
|
|
200
|
+
"pnpm-audit": "pnpm audit --audit-level=high",
|
|
201
|
+
}, "check_command");
|
|
202
|
+
const secretsAnswer = await rl.question(` Secret scanner? (detect-secrets/gitleaks/trufflehog/none/auto) [${config.tools.secrets?.name ?? "auto"}]: `);
|
|
203
|
+
applyToolAnswer(config, "secrets", secretsAnswer, {
|
|
204
|
+
"detect-secrets": "detect-secrets scan --baseline .secrets.baseline",
|
|
205
|
+
gitleaks: "gitleaks detect --no-git",
|
|
206
|
+
trufflehog: "trufflehog filesystem . --no-update",
|
|
207
|
+
}, "check_command");
|
|
208
|
+
}
|
|
209
|
+
export async function configureDesignSection(rl, config, root) {
|
|
210
|
+
console.log(chalk.bold("\n Front-end design:\n"));
|
|
211
|
+
console.log(chalk.dim(" Where do UI/UX designs live? This helps grimoire reference"));
|
|
212
|
+
console.log(chalk.dim(" designs during requirements elicitation.\n"));
|
|
213
|
+
const currentDesignTool = config.project.design_tool?.name ?? "none";
|
|
214
|
+
const designToolAnswer = await rl.question(` Design tool? (figma/sketch/penpot/framer/storybook/zeplin/none) [${currentDesignTool}]: `);
|
|
215
|
+
const designTool = designToolAnswer.trim().toLowerCase();
|
|
216
|
+
if (designTool && designTool !== "none") {
|
|
217
|
+
const mcp = DESIGN_TOOL_MCP[designTool];
|
|
218
|
+
let mcpServer;
|
|
219
|
+
if (mcp) {
|
|
220
|
+
const installAnswer = await rl.question(` Install ${mcp.display} MCP server? (Y/n) `);
|
|
221
|
+
if (installAnswer.trim().toLowerCase() !== "n") {
|
|
222
|
+
mcpServer = {
|
|
223
|
+
name: mcp.mcpName,
|
|
224
|
+
command: mcp.command,
|
|
225
|
+
args: mcp.args,
|
|
226
|
+
};
|
|
227
|
+
console.log(chalk.green(` ✓ ${mcp.display} MCP configured`));
|
|
228
|
+
console.log(chalk.dim(" Reminder: set FIGMA_ACCESS_TOKEN in your shell. Never paste it here."));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
await writeDesignToolStub(root, designTool);
|
|
233
|
+
console.log(chalk.dim(` ${designTool} lacks a first-class MCP — see .grimoire/docs/design-tool-setup.md`));
|
|
234
|
+
}
|
|
235
|
+
const designPathAnswer = await rl.question(` Local design assets path? (e.g., designs/, docs/wireframes/) [none]: `);
|
|
236
|
+
const designUrlAnswer = await rl.question(` Design project URL? (e.g., Figma project link) [none]: `);
|
|
237
|
+
config.project.design_tool = {
|
|
238
|
+
name: designTool,
|
|
239
|
+
path: stripNone(designPathAnswer),
|
|
240
|
+
url: stripNone(designUrlAnswer),
|
|
241
|
+
mcp: mcpServer,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// Brand capture
|
|
245
|
+
console.log(chalk.bold("\n Brand guidelines:\n"));
|
|
246
|
+
const existing = await findExistingTokens(root);
|
|
247
|
+
if (existing) {
|
|
248
|
+
const useExisting = await rl.question(` Use existing tokens file at ${existing}? (Y/n) `);
|
|
249
|
+
if (useExisting.trim().toLowerCase() !== "n") {
|
|
250
|
+
await copyFile(existing, join(root, ".grimoire", "brand", "tokens.json"));
|
|
251
|
+
console.log(` ${chalk.green("created")} .grimoire/brand/tokens.json (copied)`);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const captureAnswer = await rl.question(` Capture brand guidelines now? (y/N) `);
|
|
256
|
+
if (captureAnswer.trim().toLowerCase() !== "y") {
|
|
257
|
+
console.log(chalk.dim(" Run `grimoire configure design` later to add brand tokens."));
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const primary = await askHex(rl, "Primary color");
|
|
261
|
+
const secondary = await askHex(rl, "Secondary color");
|
|
262
|
+
const accent = await askHex(rl, "Accent color");
|
|
263
|
+
const fontFamily = (await rl.question(" Font family (e.g., Inter, sans-serif): ")).trim();
|
|
264
|
+
const fontSize = (await rl.question(" Base font size (px, e.g., 16): ")).trim();
|
|
265
|
+
const spacing = (await rl.question(" Base spacing unit (px, e.g., 8): ")).trim();
|
|
266
|
+
const logo = (await rl.question(" Logo path (optional, Enter to skip): ")).trim();
|
|
267
|
+
const favicon = (await rl.question(" Favicon path (optional, Enter to skip): ")).trim();
|
|
268
|
+
const voiceDo = (await rl.question(" Voice — one do-example: ")).trim();
|
|
269
|
+
const voiceDont = (await rl.question(" Voice — one don't-example: ")).trim();
|
|
270
|
+
const tokens = buildBrandTokens({
|
|
271
|
+
primary,
|
|
272
|
+
secondary,
|
|
273
|
+
accent,
|
|
274
|
+
fontFamily,
|
|
275
|
+
fontSize,
|
|
276
|
+
spacing,
|
|
277
|
+
logo,
|
|
278
|
+
favicon,
|
|
279
|
+
});
|
|
280
|
+
await writeFile(join(root, ".grimoire", "brand", "tokens.json"), JSON.stringify(tokens, null, 2) + "\n");
|
|
281
|
+
console.log(` ${chalk.green("created")} .grimoire/brand/tokens.json`);
|
|
282
|
+
await writeFile(join(root, ".grimoire", "brand", "voice.md"), renderVoiceFile(voiceDo, voiceDont));
|
|
283
|
+
console.log(` ${chalk.green("created")} .grimoire/brand/voice.md`);
|
|
284
|
+
}
|
|
285
|
+
function applyAgentAnswer(agent, cmdAnswer, modelAnswer) {
|
|
286
|
+
if (cmdAnswer.trim())
|
|
287
|
+
agent.command = cmdAnswer.trim();
|
|
288
|
+
const m = modelAnswer.trim();
|
|
289
|
+
if (m && m !== "default")
|
|
290
|
+
agent.model = m === "auto" ? undefined : m;
|
|
291
|
+
}
|
|
292
|
+
export async function configureLlmSection(rl, config) {
|
|
293
|
+
console.log(chalk.bold("\n AI agent preferences:\n"));
|
|
294
|
+
const thinkAnswer = await rl.question(` Thinking agent (planning, review)? (claude/codex/cursor/custom) [${config.llm.thinking.command}]: `);
|
|
295
|
+
const thinkModelAnswer = await rl.question(` Thinking model? (opus/sonnet/o3/auto) [${config.llm.thinking.model ?? "default"}]: `);
|
|
296
|
+
applyAgentAnswer(config.llm.thinking, thinkAnswer, thinkModelAnswer);
|
|
297
|
+
const codeAnswer = await rl.question(` Coding agent (apply, implement)? (claude/codex/cursor/custom) [${config.llm.coding.command}]: `);
|
|
298
|
+
const codeModelAnswer = await rl.question(` Coding model? (sonnet/opus/gpt-4.1/auto) [${config.llm.coding.model ?? "default"}]: `);
|
|
299
|
+
applyAgentAnswer(config.llm.coding, codeAnswer, codeModelAnswer);
|
|
300
|
+
}
|
|
301
|
+
export async function configureTrackersSection(rl, config) {
|
|
302
|
+
console.log(chalk.bold("\n Bug trackers:\n"));
|
|
303
|
+
console.log(chalk.dim(" Where do bug reports live? Add one or more trackers."));
|
|
304
|
+
console.log(chalk.dim(" Options: jira, linear, github, other, or press Enter to skip.\n"));
|
|
305
|
+
const trackers = config.bug_trackers ?? [];
|
|
306
|
+
let adding = true;
|
|
307
|
+
while (adding) {
|
|
308
|
+
const answer = await rl.question(` Bug tracker${trackers.length > 0 ? " (another, or Enter to finish)" : ""}? `);
|
|
309
|
+
const trimmed = answer.trim().toLowerCase();
|
|
310
|
+
if (!trimmed) {
|
|
311
|
+
adding = false;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
const known = BUG_TRACKER_MCP[trimmed];
|
|
315
|
+
const tracker = { name: trimmed };
|
|
316
|
+
if (known) {
|
|
317
|
+
const installAnswer = await rl.question(` Install ${known.display} MCP server? (Y/n) `);
|
|
318
|
+
if (installAnswer.trim().toLowerCase() !== "n") {
|
|
319
|
+
tracker.mcp = {
|
|
320
|
+
name: known.display.toLowerCase().replace(/[^a-z0-9]+/g, "-"),
|
|
321
|
+
command: known.command,
|
|
322
|
+
args: known.args,
|
|
323
|
+
url: known.url,
|
|
324
|
+
transport: known.transport,
|
|
325
|
+
};
|
|
326
|
+
console.log(chalk.green(` ✓ ${known.display} MCP configured`));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
trackers.push(tracker);
|
|
330
|
+
}
|
|
331
|
+
config.bug_trackers = trackers;
|
|
332
|
+
}
|
|
333
|
+
export async function configureTestingSection(rl, config) {
|
|
334
|
+
console.log(chalk.bold("\n Testing tools:\n"));
|
|
335
|
+
console.log(chalk.dim(" What testing tools do your testers use? Add one or more."));
|
|
336
|
+
console.log(chalk.dim(" Options: playwright, cypress, selenium, postman, other, or Enter to skip.\n"));
|
|
337
|
+
const tools = config.testing_tools ?? [];
|
|
338
|
+
let adding = true;
|
|
339
|
+
while (adding) {
|
|
340
|
+
const answer = await rl.question(` Testing tool${tools.length > 0 ? " (another, or Enter to finish)" : ""}? `);
|
|
341
|
+
const trimmed = answer.trim().toLowerCase();
|
|
342
|
+
if (!trimmed) {
|
|
343
|
+
adding = false;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
const purposeAnswer = await rl.question(` Purpose? (e2e/integration/performance/api/general) [general]: `);
|
|
347
|
+
const purpose = purposeAnswer.trim().toLowerCase() || "general";
|
|
348
|
+
const tool = { name: trimmed, purpose };
|
|
349
|
+
const known = TESTING_TOOL_MCP[trimmed];
|
|
350
|
+
if (known) {
|
|
351
|
+
const installAnswer = await rl.question(` Install ${known.display} MCP server? (Y/n) `);
|
|
352
|
+
if (installAnswer.trim().toLowerCase() !== "n") {
|
|
353
|
+
tool.mcp = { name: trimmed, command: known.command, args: known.args };
|
|
354
|
+
console.log(chalk.green(` ✓ ${known.display} MCP configured`));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
tools.push(tool);
|
|
358
|
+
}
|
|
359
|
+
config.testing_tools = tools;
|
|
360
|
+
}
|
|
361
|
+
// ---------------------------------------------------------------------------
|
|
362
|
+
// Main configure command entry point
|
|
363
|
+
// ---------------------------------------------------------------------------
|
|
364
|
+
async function pickSections(rl) {
|
|
365
|
+
console.log(chalk.bold("\nWhat would you like to configure?\n"));
|
|
366
|
+
ALL_SECTIONS.forEach((key, i) => {
|
|
367
|
+
console.log(` ${i + 1}. ${SECTION_LABELS[key]} [${key}]`);
|
|
368
|
+
});
|
|
369
|
+
console.log(" all. Everything\n");
|
|
370
|
+
const answer = await rl.question(' Section(s) — number, name, or "all" (comma-separated): ');
|
|
371
|
+
const trimmed = answer.trim().toLowerCase();
|
|
372
|
+
if (trimmed === "all" || trimmed === "") {
|
|
373
|
+
return [...ALL_SECTIONS];
|
|
374
|
+
}
|
|
375
|
+
return trimmed
|
|
376
|
+
.split(",")
|
|
377
|
+
.map((s) => {
|
|
378
|
+
const t = s.trim();
|
|
379
|
+
const num = parseInt(t);
|
|
380
|
+
if (!isNaN(num) && num >= 1 && num <= ALL_SECTIONS.length)
|
|
381
|
+
return ALL_SECTIONS[num - 1];
|
|
382
|
+
if (ALL_SECTIONS.includes(t))
|
|
383
|
+
return t;
|
|
384
|
+
return null;
|
|
385
|
+
})
|
|
386
|
+
.filter((s) => s !== null);
|
|
387
|
+
}
|
|
388
|
+
export async function runSections(rl, config, root, sections) {
|
|
389
|
+
for (const section of sections) {
|
|
390
|
+
switch (section) {
|
|
391
|
+
case "tools":
|
|
392
|
+
await configureToolsSection(rl, config);
|
|
393
|
+
break;
|
|
394
|
+
case "compliance":
|
|
395
|
+
await configureComplianceSection(rl, config);
|
|
396
|
+
break;
|
|
397
|
+
case "design":
|
|
398
|
+
await configureDesignSection(rl, config, root);
|
|
399
|
+
break;
|
|
400
|
+
case "llm":
|
|
401
|
+
await configureLlmSection(rl, config);
|
|
402
|
+
break;
|
|
403
|
+
case "trackers":
|
|
404
|
+
await configureTrackersSection(rl, config);
|
|
405
|
+
break;
|
|
406
|
+
case "testing":
|
|
407
|
+
await configureTestingSection(rl, config);
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
export async function configureProject(root, requestedSections) {
|
|
413
|
+
const configPath = join(root, ".grimoire", "config.yaml");
|
|
414
|
+
if (!(await fileExists(configPath))) {
|
|
415
|
+
console.error(chalk.red("No .grimoire/config.yaml found. Run `grimoire init` first."));
|
|
416
|
+
process.exit(1);
|
|
417
|
+
}
|
|
418
|
+
const { loadConfig } = await import("../utils/config.js");
|
|
419
|
+
const config = await loadConfig(root);
|
|
420
|
+
const readline = await import("node:readline/promises");
|
|
421
|
+
const rl = readline.createInterface({
|
|
422
|
+
input: process.stdin,
|
|
423
|
+
output: process.stdout,
|
|
424
|
+
});
|
|
425
|
+
const sections = requestedSections && requestedSections.length > 0
|
|
426
|
+
? requestedSections
|
|
427
|
+
: await pickSections(rl);
|
|
428
|
+
await runSections(rl, config, root, sections);
|
|
429
|
+
rl.close();
|
|
430
|
+
const serialized = yamlStringify(config);
|
|
431
|
+
await writeFile(configPath, serialized);
|
|
432
|
+
console.log(chalk.green("\nConfiguration saved to .grimoire/config.yaml"));
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/core/configure.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2CD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BpE"}
|