lynxprompt 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +226 -60
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1715,23 +1715,43 @@ function parseVariablesString(varsStr) {
|
|
|
1715
1715
|
return variables;
|
|
1716
1716
|
}
|
|
1717
1717
|
var PLATFORM_FILES = {
|
|
1718
|
+
// Popular platforms
|
|
1719
|
+
universal: "AGENTS.md",
|
|
1718
1720
|
agents: "AGENTS.md",
|
|
1721
|
+
// Alias for universal
|
|
1719
1722
|
cursor: ".cursor/rules/project.mdc",
|
|
1720
1723
|
claude: "CLAUDE.md",
|
|
1721
1724
|
copilot: ".github/copilot-instructions.md",
|
|
1722
1725
|
windsurf: ".windsurfrules",
|
|
1726
|
+
// AI-powered IDEs
|
|
1723
1727
|
antigravity: "GEMINI.md",
|
|
1724
1728
|
zed: ".zed/instructions.md",
|
|
1725
|
-
|
|
1729
|
+
void: ".void/config.json",
|
|
1730
|
+
trae: ".trae/rules/project.mdc",
|
|
1731
|
+
firebase: ".idx/rules/project.mdc",
|
|
1732
|
+
// Editor extensions
|
|
1726
1733
|
cline: ".clinerules",
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1734
|
+
roocode: ".roo/rules/project.mdc",
|
|
1735
|
+
continue: ".continue/config.json",
|
|
1736
|
+
cody: ".cody/config.json",
|
|
1730
1737
|
tabnine: ".tabnine.yaml",
|
|
1731
|
-
supermaven: ".supermaven/
|
|
1732
|
-
codegpt: ".codegpt/
|
|
1733
|
-
|
|
1734
|
-
|
|
1738
|
+
supermaven: ".supermaven/config.json",
|
|
1739
|
+
codegpt: ".codegpt/config.json",
|
|
1740
|
+
amazonq: ".amazonq/rules/project.md",
|
|
1741
|
+
augment: ".augment/rules/project.mdc",
|
|
1742
|
+
kilocode: ".kilocode/rules/project.mdc",
|
|
1743
|
+
junie: ".junie/guidelines.md",
|
|
1744
|
+
kiro: ".kiro/steering/project.mdc",
|
|
1745
|
+
// CLI tools
|
|
1746
|
+
aider: ".aider.conf.yml",
|
|
1747
|
+
goose: ".goosehints",
|
|
1748
|
+
warp: "WARP.md",
|
|
1749
|
+
"gemini-cli": "GEMINI.md",
|
|
1750
|
+
opencode: "opencode.json",
|
|
1751
|
+
// Other emerging tools
|
|
1752
|
+
openhands: ".openhands/microagents/repo.md",
|
|
1753
|
+
crush: "CRUSH.md",
|
|
1754
|
+
firebender: "firebender.json"
|
|
1735
1755
|
};
|
|
1736
1756
|
var PERSONA_DESCRIPTIONS = {
|
|
1737
1757
|
backend: "a senior backend developer specializing in APIs, databases, and microservices architecture",
|
|
@@ -2155,14 +2175,22 @@ function generateConfig(options) {
|
|
|
2155
2175
|
}
|
|
2156
2176
|
function generateFileContent(options, platform2) {
|
|
2157
2177
|
const sections = [];
|
|
2158
|
-
const
|
|
2159
|
-
const
|
|
2160
|
-
const
|
|
2161
|
-
const
|
|
2178
|
+
const mdcPlatforms = ["cursor", "trae", "firebase", "roocode", "augment", "kilocode", "kiro"];
|
|
2179
|
+
const yamlPlatforms = ["aider", "tabnine"];
|
|
2180
|
+
const plainTextPlatforms = ["windsurf", "cline", "goose"];
|
|
2181
|
+
const jsonPlatforms = ["void", "continue", "cody", "supermaven", "codegpt", "opencode", "firebender"];
|
|
2182
|
+
const isMdc = mdcPlatforms.includes(platform2);
|
|
2183
|
+
const isYaml = yamlPlatforms.includes(platform2);
|
|
2184
|
+
const isPlainText = plainTextPlatforms.includes(platform2);
|
|
2185
|
+
const isJson = jsonPlatforms.includes(platform2);
|
|
2186
|
+
const isMarkdown = !isMdc && !isYaml && !isPlainText && !isJson;
|
|
2162
2187
|
const bp = options.blueprintMode || false;
|
|
2163
2188
|
if (isYaml) {
|
|
2164
2189
|
return generateYamlConfig(options, platform2);
|
|
2165
2190
|
}
|
|
2191
|
+
if (isJson) {
|
|
2192
|
+
return generateJsonConfig(options, platform2);
|
|
2193
|
+
}
|
|
2166
2194
|
const projectName = bpVar(bp, "PROJECT_NAME", options.name);
|
|
2167
2195
|
if (isMdc) {
|
|
2168
2196
|
sections.push("---");
|
|
@@ -2786,6 +2814,51 @@ function generateFileContent(options, platform2) {
|
|
|
2786
2814
|
}
|
|
2787
2815
|
return sections.join("\n");
|
|
2788
2816
|
}
|
|
2817
|
+
function generateJsonConfig(options, platform2) {
|
|
2818
|
+
const config2 = {
|
|
2819
|
+
version: "1.0.0",
|
|
2820
|
+
project: {
|
|
2821
|
+
name: options.name,
|
|
2822
|
+
description: options.description || "",
|
|
2823
|
+
stack: options.stack.map((s) => STACK_NAMES[s] || s)
|
|
2824
|
+
}
|
|
2825
|
+
};
|
|
2826
|
+
const personaDesc = options.userPersona || PERSONA_DESCRIPTIONS[options.persona] || options.persona || "";
|
|
2827
|
+
if (personaDesc) {
|
|
2828
|
+
config2.persona = personaDesc;
|
|
2829
|
+
}
|
|
2830
|
+
const rules = [];
|
|
2831
|
+
const boundaryRules = BOUNDARIES[options.boundaries] || BOUNDARIES.standard;
|
|
2832
|
+
rules.push(...boundaryRules.always.map((r) => `AUTO-APPROVE: ${r}`));
|
|
2833
|
+
rules.push(...boundaryRules.askFirst.map((r) => `ASK FIRST: ${r}`));
|
|
2834
|
+
rules.push(...boundaryRules.never.map((r) => `PROHIBITED: ${r}`));
|
|
2835
|
+
rules.push("SECURITY: Do not commit secrets. Use environment variables or secret managers.");
|
|
2836
|
+
rules.push("SECURITY: When making changes involving auth, data, or APIs, perform security audit.");
|
|
2837
|
+
config2.rules = rules;
|
|
2838
|
+
if (options.importantFiles && options.importantFiles.length > 0) {
|
|
2839
|
+
config2.context = {
|
|
2840
|
+
readFirst: options.importantFiles.map((f) => IMPORTANT_FILES_PATHS[f] || f)
|
|
2841
|
+
};
|
|
2842
|
+
}
|
|
2843
|
+
if (platform2 === "continue") {
|
|
2844
|
+
config2.name = options.name;
|
|
2845
|
+
config2.customInstructions = rules.join("\n");
|
|
2846
|
+
} else if (platform2 === "cody") {
|
|
2847
|
+
config2.customInstructions = rules.join("\n");
|
|
2848
|
+
} else if (platform2 === "void") {
|
|
2849
|
+
config2.editor = { rules: rules.join("\n") };
|
|
2850
|
+
} else if (platform2 === "supermaven") {
|
|
2851
|
+
config2.rules = rules;
|
|
2852
|
+
} else if (platform2 === "codegpt") {
|
|
2853
|
+
config2.systemPrompt = rules.join("\n");
|
|
2854
|
+
} else if (platform2 === "opencode") {
|
|
2855
|
+
config2.instructions = rules;
|
|
2856
|
+
} else if (platform2 === "firebender") {
|
|
2857
|
+
config2.transforms = rules;
|
|
2858
|
+
}
|
|
2859
|
+
config2._comment = `Generated by LynxPrompt CLI for ${options.name}`;
|
|
2860
|
+
return JSON.stringify(config2, null, 2);
|
|
2861
|
+
}
|
|
2789
2862
|
function generateYamlConfig(options, platform2) {
|
|
2790
2863
|
const lines = [];
|
|
2791
2864
|
if (platform2 === "aider") {
|
|
@@ -3307,11 +3380,11 @@ var LOGGING_OPTIONS = [
|
|
|
3307
3380
|
{ id: "other", label: "Other" }
|
|
3308
3381
|
];
|
|
3309
3382
|
var AI_BEHAVIOR_RULES = [
|
|
3310
|
-
{ id: "always_debug_after_build", label: "Always Debug After Building", description: "
|
|
3311
|
-
{ id: "check_logs_after_build", label: "Check Logs After Build/Commit", description: "
|
|
3312
|
-
{ id: "run_tests_before_commit", label: "Run Tests Before Commit", description: "
|
|
3313
|
-
{ id: "follow_existing_patterns", label: "Follow Existing Patterns", description: "
|
|
3314
|
-
{ id: "ask_before_large_refactors", label: "Ask Before Large Refactors", description: "
|
|
3383
|
+
{ id: "always_debug_after_build", label: "Always Debug After Building", description: "AI should build and run code locally to verify changes work before suggesting them as complete", recommended: true },
|
|
3384
|
+
{ id: "check_logs_after_build", label: "Check Logs After Build/Commit", description: "AI should review build output, test logs, and error messages to catch issues early", recommended: true },
|
|
3385
|
+
{ id: "run_tests_before_commit", label: "Run Tests Before Commit", description: "AI must run the test suite and ensure all tests pass before suggesting a commit", recommended: true },
|
|
3386
|
+
{ id: "follow_existing_patterns", label: "Follow Existing Patterns", description: "AI should study existing code and follow the same naming, structure, and conventions used in the codebase", recommended: true },
|
|
3387
|
+
{ id: "ask_before_large_refactors", label: "Ask Before Large Refactors", description: "AI should always ask for explicit approval before making significant architectural changes or refactoring multiple files", recommended: true }
|
|
3315
3388
|
];
|
|
3316
3389
|
var SECRETS_MANAGEMENT_OPTIONS = [
|
|
3317
3390
|
{ id: "env_vars", label: "Environment Variables", description: "Use .env files locally, env vars in prod", recommended: true },
|
|
@@ -3409,11 +3482,18 @@ var DATA_HANDLING_OPTIONS = [
|
|
|
3409
3482
|
{ id: "other", label: "Other", description: "Custom data handling" }
|
|
3410
3483
|
];
|
|
3411
3484
|
var IMPORTANT_FILES = [
|
|
3412
|
-
{ id: "readme", label: "README.md", icon: "\u{1F4D6} " },
|
|
3413
|
-
{ id: "
|
|
3414
|
-
{ id: "
|
|
3415
|
-
{ id: "
|
|
3416
|
-
{ id: "
|
|
3485
|
+
{ id: "readme", label: "README.md", icon: "\u{1F4D6}", description: "Project overview, setup instructions, and documentation" },
|
|
3486
|
+
{ id: "package_json", label: "package.json", icon: "\u{1F4E6}", description: "Dependencies, scripts, and project metadata" },
|
|
3487
|
+
{ id: "changelog", label: "CHANGELOG.md", icon: "\u{1F4DD}", description: "Version history and release notes" },
|
|
3488
|
+
{ id: "contributing", label: "CONTRIBUTING.md", icon: "\u{1F91D}", description: "Contribution guidelines and code standards" },
|
|
3489
|
+
{ id: "makefile", label: "Makefile", icon: "\u{1F527}", description: "Build commands and automation tasks" },
|
|
3490
|
+
{ id: "dockerfile", label: "Dockerfile", icon: "\u{1F433}", description: "Container configuration and build steps" },
|
|
3491
|
+
{ id: "docker_compose", label: "docker-compose.yml", icon: "\u{1F433}", description: "Multi-container setup and services" },
|
|
3492
|
+
{ id: "env_example", label: ".env.example", icon: "\u{1F510}", description: "Environment variables template" },
|
|
3493
|
+
{ id: "openapi", label: "openapi.yaml / swagger.json", icon: "\u{1F4E1}", description: "API specification and endpoints" },
|
|
3494
|
+
{ id: "architecture_md", label: "ARCHITECTURE.md", icon: "\u{1F3D7}\uFE0F", description: "System architecture and design decisions" },
|
|
3495
|
+
{ id: "api_docs", label: "API documentation", icon: "\u{1F4DA}", description: "API reference and usage examples" },
|
|
3496
|
+
{ id: "database_schema", label: "Database schema / migrations", icon: "\u{1F5C4}\uFE0F", description: "Database structure and migration files" }
|
|
3417
3497
|
];
|
|
3418
3498
|
var BOUNDARY_OPTIONS = [
|
|
3419
3499
|
"Delete files",
|
|
@@ -3862,7 +3942,7 @@ async function runWizardWithDraftProtection(options) {
|
|
|
3862
3942
|
console.log(chalk7.gray(" No project detected in current directory."));
|
|
3863
3943
|
console.log();
|
|
3864
3944
|
}
|
|
3865
|
-
const canDetectRemote =
|
|
3945
|
+
const canDetectRemote = !options.yes;
|
|
3866
3946
|
if (canDetectRemote) {
|
|
3867
3947
|
console.log();
|
|
3868
3948
|
console.log(chalk7.magenta.bold(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"));
|
|
@@ -4326,11 +4406,14 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4326
4406
|
console.log(chalk7.green(` \u2713 Detected in project: ${detected.stack.join(", ")}`));
|
|
4327
4407
|
console.log();
|
|
4328
4408
|
}
|
|
4329
|
-
const languageChoices = sortSelectedFirst(LANGUAGES.map((s) =>
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4409
|
+
const languageChoices = sortSelectedFirst(LANGUAGES.map((s) => {
|
|
4410
|
+
const isDetected = detected?.stack?.includes(s.value);
|
|
4411
|
+
return {
|
|
4412
|
+
title: isDetected ? `${s.title} ${chalk7.green("(detected)")}` : s.title,
|
|
4413
|
+
value: s.value,
|
|
4414
|
+
selected: isDetected
|
|
4415
|
+
};
|
|
4416
|
+
}));
|
|
4334
4417
|
const languageResponse = await prompts3({
|
|
4335
4418
|
type: "autocompleteMultiselect",
|
|
4336
4419
|
name: "languages",
|
|
@@ -4340,11 +4423,14 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4340
4423
|
instructions: false
|
|
4341
4424
|
}, promptConfig);
|
|
4342
4425
|
const selectedLanguages = languageResponse.languages || [];
|
|
4343
|
-
const frameworkChoices = sortSelectedFirst(FRAMEWORKS.map((s) =>
|
|
4344
|
-
|
|
4345
|
-
|
|
4346
|
-
|
|
4347
|
-
|
|
4426
|
+
const frameworkChoices = sortSelectedFirst(FRAMEWORKS.map((s) => {
|
|
4427
|
+
const isDetected = detected?.stack?.includes(s.value);
|
|
4428
|
+
return {
|
|
4429
|
+
title: isDetected ? `${s.title} ${chalk7.green("(detected)")}` : s.title,
|
|
4430
|
+
value: s.value,
|
|
4431
|
+
selected: isDetected
|
|
4432
|
+
};
|
|
4433
|
+
}));
|
|
4348
4434
|
const frameworkResponse = await prompts3({
|
|
4349
4435
|
type: "autocompleteMultiselect",
|
|
4350
4436
|
name: "frameworks",
|
|
@@ -4354,11 +4440,14 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4354
4440
|
instructions: false
|
|
4355
4441
|
}, promptConfig);
|
|
4356
4442
|
const selectedFrameworks = frameworkResponse.frameworks || [];
|
|
4357
|
-
const databaseChoices = sortSelectedFirst(DATABASES.map((s) =>
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4443
|
+
const databaseChoices = sortSelectedFirst(DATABASES.map((s) => {
|
|
4444
|
+
const isDetected = detected?.stack?.includes(s.value);
|
|
4445
|
+
return {
|
|
4446
|
+
title: isDetected ? `${s.title} ${chalk7.green("(detected)")}` : s.title,
|
|
4447
|
+
value: s.value,
|
|
4448
|
+
selected: isDetected
|
|
4449
|
+
};
|
|
4450
|
+
}));
|
|
4362
4451
|
const databaseResponse = await prompts3({
|
|
4363
4452
|
type: "autocompleteMultiselect",
|
|
4364
4453
|
name: "databases",
|
|
@@ -4507,18 +4596,24 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4507
4596
|
answers.customRegistryUrl = customRegistryResponse.customRegistryUrl || "";
|
|
4508
4597
|
}
|
|
4509
4598
|
}
|
|
4599
|
+
console.log();
|
|
4600
|
+
console.log(chalk7.gray(" \u{1F4DA} Point the AI to a well-structured public repository as a reference."));
|
|
4601
|
+
console.log(chalk7.gray(" The AI will study its code patterns, architecture, and conventions to better assist you."));
|
|
4510
4602
|
const exampleRepoResponse = await prompts3({
|
|
4511
4603
|
type: "text",
|
|
4512
4604
|
name: "exampleRepoUrl",
|
|
4513
|
-
message: chalk7.white("
|
|
4514
|
-
hint: chalk7.gray("
|
|
4605
|
+
message: chalk7.white("Reference repository URL (optional):"),
|
|
4606
|
+
hint: chalk7.gray("e.g., https://github.com/vercel/next.js")
|
|
4515
4607
|
}, promptConfig);
|
|
4516
4608
|
answers.exampleRepoUrl = exampleRepoResponse.exampleRepoUrl || "";
|
|
4609
|
+
console.log();
|
|
4610
|
+
console.log(chalk7.gray(" \u{1F4D6} Link to your team's external documentation for project context."));
|
|
4611
|
+
console.log(chalk7.gray(" The AI will read these docs to understand your project's domain and conventions."));
|
|
4517
4612
|
const docsUrlResponse = await prompts3({
|
|
4518
4613
|
type: "text",
|
|
4519
4614
|
name: "documentationUrl",
|
|
4520
|
-
message: chalk7.white("External
|
|
4521
|
-
hint: chalk7.gray("Confluence, Notion, GitBook,
|
|
4615
|
+
message: chalk7.white("External docs URL (optional):"),
|
|
4616
|
+
hint: chalk7.gray("e.g., Confluence, Notion, GitBook, internal wiki")
|
|
4522
4617
|
}, promptConfig);
|
|
4523
4618
|
answers.documentationUrl = docsUrlResponse.documentationUrl || "";
|
|
4524
4619
|
const securityStep = getCurrentStep("security");
|
|
@@ -4544,6 +4639,15 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4544
4639
|
instructions: false
|
|
4545
4640
|
}, promptConfig);
|
|
4546
4641
|
answers.secretsManagement = secretsResponse.secretsManagement || [];
|
|
4642
|
+
if (answers.secretsManagement.includes("other")) {
|
|
4643
|
+
const customSecretsResponse = await prompts3({
|
|
4644
|
+
type: "text",
|
|
4645
|
+
name: "customSecretsManagement",
|
|
4646
|
+
message: chalk7.white("Describe your secrets management approach:"),
|
|
4647
|
+
hint: chalk7.gray("e.g., custom KMS integration, proprietary vault")
|
|
4648
|
+
}, promptConfig);
|
|
4649
|
+
answers.secretsManagementOther = customSecretsResponse.customSecretsManagement || "";
|
|
4650
|
+
}
|
|
4547
4651
|
console.log();
|
|
4548
4652
|
console.log(chalk7.cyan(" 2\uFE0F\u20E3 Security Tooling"));
|
|
4549
4653
|
console.log(chalk7.gray(" Security scanning, dependency updates, and vulnerability detection."));
|
|
@@ -4562,6 +4666,15 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4562
4666
|
instructions: false
|
|
4563
4667
|
}, promptConfig);
|
|
4564
4668
|
answers.securityTooling = securityToolingResponse.securityTooling || [];
|
|
4669
|
+
if (answers.securityTooling.includes("other")) {
|
|
4670
|
+
const customSecurityToolingResponse = await prompts3({
|
|
4671
|
+
type: "text",
|
|
4672
|
+
name: "customSecurityTooling",
|
|
4673
|
+
message: chalk7.white("Describe your security tooling:"),
|
|
4674
|
+
hint: chalk7.gray("e.g., custom SAST tool, internal vulnerability scanner")
|
|
4675
|
+
}, promptConfig);
|
|
4676
|
+
answers.securityToolingOther = customSecurityToolingResponse.customSecurityTooling || "";
|
|
4677
|
+
}
|
|
4565
4678
|
console.log();
|
|
4566
4679
|
console.log(chalk7.cyan(" 3\uFE0F\u20E3 Authentication Patterns"));
|
|
4567
4680
|
console.log(chalk7.gray(" How users and services authenticate with your application."));
|
|
@@ -4579,6 +4692,15 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4579
4692
|
instructions: false
|
|
4580
4693
|
}, promptConfig);
|
|
4581
4694
|
answers.authPatterns = authPatternsResponse.authPatterns || [];
|
|
4695
|
+
if (answers.authPatterns.includes("other")) {
|
|
4696
|
+
const customAuthResponse = await prompts3({
|
|
4697
|
+
type: "text",
|
|
4698
|
+
name: "customAuthPatterns",
|
|
4699
|
+
message: chalk7.white("Describe your authentication approach:"),
|
|
4700
|
+
hint: chalk7.gray("e.g., custom SSO, proprietary auth system")
|
|
4701
|
+
}, promptConfig);
|
|
4702
|
+
answers.authPatternsOther = customAuthResponse.customAuthPatterns || "";
|
|
4703
|
+
}
|
|
4582
4704
|
console.log();
|
|
4583
4705
|
console.log(chalk7.cyan(" 4\uFE0F\u20E3 Data Handling & Compliance"));
|
|
4584
4706
|
console.log(chalk7.gray(" Data protection, encryption, and compliance requirements."));
|
|
@@ -4597,6 +4719,15 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4597
4719
|
instructions: false
|
|
4598
4720
|
}, promptConfig);
|
|
4599
4721
|
answers.dataHandling = dataHandlingResponse.dataHandling || [];
|
|
4722
|
+
if (answers.dataHandling.includes("other")) {
|
|
4723
|
+
const customDataHandlingResponse = await prompts3({
|
|
4724
|
+
type: "text",
|
|
4725
|
+
name: "customDataHandling",
|
|
4726
|
+
message: chalk7.white("Describe your data handling policies:"),
|
|
4727
|
+
hint: chalk7.gray("e.g., custom encryption, specific compliance requirements")
|
|
4728
|
+
}, promptConfig);
|
|
4729
|
+
answers.dataHandlingOther = customDataHandlingResponse.customDataHandling || "";
|
|
4730
|
+
}
|
|
4600
4731
|
const securityNotesResponse = await prompts3({
|
|
4601
4732
|
type: "text",
|
|
4602
4733
|
name: "securityNotes",
|
|
@@ -4802,24 +4933,50 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4802
4933
|
if (rule) console.log(chalk7.cyan(` \u2022 ${rule.label}`));
|
|
4803
4934
|
}
|
|
4804
4935
|
}
|
|
4936
|
+
console.log();
|
|
4937
|
+
console.log(chalk7.gray(" \u{1F4C1} Select files the AI should read first to understand your project context."));
|
|
4938
|
+
console.log(chalk7.gray(" These help the AI understand your codebase, APIs, and conventions."));
|
|
4805
4939
|
const importantFilesResponse = await prompts3({
|
|
4806
4940
|
type: "autocompleteMultiselect",
|
|
4807
4941
|
name: "importantFiles",
|
|
4808
4942
|
message: chalk7.white("Important files AI should read (type to search):"),
|
|
4809
4943
|
choices: IMPORTANT_FILES.map((f) => ({
|
|
4810
4944
|
title: `${f.icon} ${f.label}`,
|
|
4811
|
-
value: f.id
|
|
4812
|
-
|
|
4945
|
+
value: f.id,
|
|
4946
|
+
description: chalk7.gray(f.description)
|
|
4813
4947
|
})),
|
|
4814
4948
|
hint: chalk7.gray("type to filter \u2022 space select \u2022 enter confirm"),
|
|
4815
4949
|
instructions: false
|
|
4816
4950
|
}, promptConfig);
|
|
4817
4951
|
answers.importantFiles = importantFilesResponse.importantFiles || [];
|
|
4818
4952
|
console.log();
|
|
4953
|
+
const customImportantFilesResponse = await prompts3({
|
|
4954
|
+
type: "text",
|
|
4955
|
+
name: "importantFilesOther",
|
|
4956
|
+
message: chalk7.white("Other important files (comma-separated, optional):"),
|
|
4957
|
+
hint: chalk7.gray("e.g., src/config/index.ts, docs/api.md, prisma/schema.prisma")
|
|
4958
|
+
}, promptConfig);
|
|
4959
|
+
answers.importantFilesOther = customImportantFilesResponse.importantFilesOther || "";
|
|
4960
|
+
console.log();
|
|
4819
4961
|
console.log(chalk7.gray(" \u2500\u2500\u2500 Cloud & AI Options \u2500\u2500\u2500"));
|
|
4820
4962
|
console.log();
|
|
4821
|
-
console.log(chalk7.gray(" \u{
|
|
4822
|
-
console.log(chalk7.gray(" When
|
|
4963
|
+
console.log(chalk7.gray(" \u{1F9E0} Enable AI to suggest improvements to your config file."));
|
|
4964
|
+
console.log(chalk7.gray(" When enabled, the AI can propose updates to this AGENTS.md file"));
|
|
4965
|
+
console.log(chalk7.gray(" (e.g., better rules, new patterns) and you approve the changes."));
|
|
4966
|
+
const selfImproveResponse = await prompts3({
|
|
4967
|
+
type: "toggle",
|
|
4968
|
+
name: "selfImprove",
|
|
4969
|
+
message: chalk7.white("Allow AI to suggest config improvements?"),
|
|
4970
|
+
initial: false,
|
|
4971
|
+
active: "Yes",
|
|
4972
|
+
inactive: "No",
|
|
4973
|
+
hint: chalk7.gray("AI proposes updates, you approve")
|
|
4974
|
+
}, promptConfig);
|
|
4975
|
+
answers.selfImprove = selfImproveResponse.selfImprove || false;
|
|
4976
|
+
console.log();
|
|
4977
|
+
console.log(chalk7.gray(" \u2601\uFE0F Save your config to LynxPrompt cloud for automatic updates."));
|
|
4978
|
+
console.log(chalk7.gray(" When you update the blueprint online, the AI can run the sync command"));
|
|
4979
|
+
console.log(chalk7.gray(" to fetch the latest version automatically."));
|
|
4823
4980
|
const enableAutoUpdateResponse = await prompts3({
|
|
4824
4981
|
type: "toggle",
|
|
4825
4982
|
name: "enableAutoUpdate",
|
|
@@ -4827,28 +4984,37 @@ async function runInteractiveWizard(options, detected, userTier) {
|
|
|
4827
4984
|
initial: false,
|
|
4828
4985
|
active: "Yes",
|
|
4829
4986
|
inactive: "No",
|
|
4830
|
-
hint: chalk7.gray("Adds
|
|
4987
|
+
hint: chalk7.gray("Adds sync command for automatic updates")
|
|
4831
4988
|
}, promptConfig);
|
|
4832
4989
|
answers.enableAutoUpdate = enableAutoUpdateResponse.enableAutoUpdate || false;
|
|
4990
|
+
answers.preferCliSync = false;
|
|
4991
|
+
if (answers.enableAutoUpdate && api) {
|
|
4992
|
+
console.log();
|
|
4993
|
+
console.log(chalk7.gray(" \u{1F4E5} Choose how the AI should sync updates from the cloud:"));
|
|
4994
|
+
console.log(chalk7.gray(" \u2022 CLI: Uses 'lynxp pull' command (requires CLI installed in dev environment)"));
|
|
4995
|
+
console.log(chalk7.gray(" \u2022 curl: Uses curl command with API (works everywhere, but exposes token in file)"));
|
|
4996
|
+
const syncMethodResponse = await prompts3({
|
|
4997
|
+
type: "toggle",
|
|
4998
|
+
name: "preferCliSync",
|
|
4999
|
+
message: chalk7.white("Will you have LynxPrompt CLI available in your dev environment?"),
|
|
5000
|
+
initial: true,
|
|
5001
|
+
active: "Yes (use CLI)",
|
|
5002
|
+
inactive: "No (use curl)",
|
|
5003
|
+
hint: chalk7.gray("CLI is recommended - no token in file")
|
|
5004
|
+
}, promptConfig);
|
|
5005
|
+
answers.preferCliSync = syncMethodResponse.preferCliSync ?? true;
|
|
5006
|
+
if (answers.preferCliSync) {
|
|
5007
|
+
console.log(chalk7.green(" \u2713 Great! AI will use 'lynxp pull' to sync (no API token in file)"));
|
|
5008
|
+
} else {
|
|
5009
|
+
console.log(chalk7.yellow(" \u26A0\uFE0F Using curl with API token. The token will be visible in your config file."));
|
|
5010
|
+
}
|
|
5011
|
+
}
|
|
4833
5012
|
if (answers.enableAutoUpdate && !api) {
|
|
4834
5013
|
console.log(chalk7.yellow(" \u26A0\uFE0F Cloud sync requires login. Run 'lynxp login' first."));
|
|
4835
5014
|
console.log(chalk7.gray(" Continuing without cloud sync..."));
|
|
4836
5015
|
answers.enableAutoUpdate = false;
|
|
4837
5016
|
}
|
|
4838
5017
|
console.log();
|
|
4839
|
-
console.log(chalk7.gray(" \u{1F9E0} Self-improving blueprints track your manual edits and suggest improvements."));
|
|
4840
|
-
console.log(chalk7.gray(" LynxPrompt learns your preferences to generate better configs over time."));
|
|
4841
|
-
const selfImproveResponse = await prompts3({
|
|
4842
|
-
type: "toggle",
|
|
4843
|
-
name: "selfImprove",
|
|
4844
|
-
message: chalk7.white("Enable AI learning from your edits?"),
|
|
4845
|
-
initial: false,
|
|
4846
|
-
active: "Yes",
|
|
4847
|
-
inactive: "No",
|
|
4848
|
-
hint: chalk7.gray("AI learns your style from manual changes")
|
|
4849
|
-
}, promptConfig);
|
|
4850
|
-
answers.selfImprove = selfImproveResponse.selfImprove || false;
|
|
4851
|
-
console.log();
|
|
4852
5018
|
console.log(chalk7.gray(" \u{1F464} Include your profile info (name, email, persona) in the generated config."));
|
|
4853
5019
|
console.log(chalk7.gray(" This helps AI tools personalize responses to your expertise level."));
|
|
4854
5020
|
const includePersonalResponse = await prompts3({
|