Skip to content

Commit 9b4224d

Browse files
Merge pull request #8073 from continuedev/tomasz/fix-rules-and-prompts
Detect invokable rules located in 'prompts' directory
2 parents feb92c7 + 25b1253 commit 9b4224d

File tree

3 files changed

+57
-34
lines changed

3 files changed

+57
-34
lines changed

core/config/markdown/loadMarkdownRules.ts

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import {
33
markdownToRule,
44
} from "@continuedev/config-yaml";
55
import { IDE, RuleWithSource } from "../..";
6+
import { PROMPTS_DIR_NAME, RULES_DIR_NAME } from "../../promptFiles";
67
import { joinPathsToUri } from "../../util/uri";
78
import { getAllDotContinueDefinitionFiles } from "../loadLocalAssistants";
89

910
export const SUPPORTED_AGENT_FILES = ["AGENTS.md", "AGENT.md", "CLAUDE.md"];
1011
/**
11-
* Loads rules from markdown files in the .continue/rules directory
12+
* Loads rules from markdown files in the .continue/rules and .continue/prompts directories
1213
* and agent files (AGENTS.md, AGENT.md, CLAUDE.md) at workspace root
1314
*/
1415
export async function loadMarkdownRules(ide: IDE): Promise<{
@@ -53,37 +54,45 @@ export async function loadMarkdownRules(ide: IDE): Promise<{
5354
}
5455
}
5556

56-
try {
57-
// Get all .md files from .continue/rules
58-
const markdownFiles = await getAllDotContinueDefinitionFiles(
59-
ide,
60-
{ includeGlobal: true, includeWorkspace: true, fileExtType: "markdown" },
61-
"rules",
62-
);
57+
// Load markdown files from both .continue/rules and .continue/prompts
58+
const dirsToCheck = [RULES_DIR_NAME, PROMPTS_DIR_NAME];
6359

64-
// Filter to just .md files
65-
const mdFiles = markdownFiles.filter((file) => file.path.endsWith(".md"));
60+
for (const dirName of dirsToCheck) {
61+
try {
62+
const markdownFiles = await getAllDotContinueDefinitionFiles(
63+
ide,
64+
{
65+
includeGlobal: true,
66+
includeWorkspace: true,
67+
fileExtType: "markdown",
68+
},
69+
dirName,
70+
);
6671

67-
// Process each markdown file
68-
for (const file of mdFiles) {
69-
try {
70-
const rule = markdownToRule(file.content, {
71-
uriType: "file",
72-
fileUri: file.path,
73-
});
74-
rules.push({ ...rule, source: "rules-block", sourceFile: file.path });
75-
} catch (e) {
76-
errors.push({
77-
fatal: false,
78-
message: `Failed to parse markdown rule file ${file.path}: ${e instanceof Error ? e.message : e}`,
79-
});
72+
// Filter to just .md files
73+
const mdFiles = markdownFiles.filter((file) => file.path.endsWith(".md"));
74+
75+
// Process each markdown file
76+
for (const file of mdFiles) {
77+
try {
78+
const rule = markdownToRule(file.content, {
79+
uriType: "file",
80+
fileUri: file.path,
81+
});
82+
rules.push({ ...rule, source: "rules-block", sourceFile: file.path });
83+
} catch (e) {
84+
errors.push({
85+
fatal: false,
86+
message: `Failed to parse markdown rule file ${file.path}: ${e instanceof Error ? e.message : e}`,
87+
});
88+
}
8089
}
90+
} catch (e) {
91+
errors.push({
92+
fatal: false,
93+
message: `Error loading markdown rule files from ${dirName}: ${e instanceof Error ? e.message : e}`,
94+
});
8195
}
82-
} catch (e) {
83-
errors.push({
84-
fatal: false,
85-
message: `Error loading markdown rule files: ${e instanceof Error ? e.message : e}`,
86-
});
8796
}
8897

8998
return { rules, errors };

core/promptFiles/getPromptFiles.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { DEFAULT_PROMPTS_FOLDER_V1 } from ".";
1+
import path from "path";
2+
import {
3+
DEFAULT_PROMPTS_FOLDER_V1,
4+
DEFAULT_PROMPTS_FOLDER_V2,
5+
DEFAULT_RULES_FOLDER,
6+
RULES_DIR_NAME,
7+
} from ".";
28
import { IDE } from "..";
39
import { walkDir } from "../indexing/walkDir";
4-
import { readAllGlobalPromptFiles } from "../util/paths";
10+
import { getContinueGlobalPath, readAllGlobalPromptFiles } from "../util/paths";
511
import { joinPathsToUri } from "../util/uri";
612

7-
export const DEFAULT_PROMPTS_FOLDER_V2 = ".continue/prompts";
8-
913
export async function getPromptFilesFromDir(
1014
ide: IDE,
1115
dir: string,
@@ -40,7 +44,7 @@ export async function getAllPromptFiles(
4044
const workspaceDirs = await ide.getWorkspaceDirs();
4145
let promptFiles: { path: string; content: string }[] = [];
4246

43-
let dirsToCheck = [DEFAULT_PROMPTS_FOLDER_V2];
47+
let dirsToCheck = [DEFAULT_PROMPTS_FOLDER_V2, DEFAULT_RULES_FOLDER];
4448
if (checkV1DefaultFolder) {
4549
dirsToCheck.push(DEFAULT_PROMPTS_FOLDER_V1);
4650
}
@@ -56,9 +60,14 @@ export async function getAllPromptFiles(
5660
await Promise.all(fullDirs.map((dir) => getPromptFilesFromDir(ide, dir)))
5761
).flat();
5862

59-
// Also read from ~/.continue/prompts
63+
// Also read from ~/.continue/prompts and ~/.continue/rules
6064
promptFiles.push(...readAllGlobalPromptFiles());
6165

66+
const promptFilesFromRulesDirectory = readAllGlobalPromptFiles(
67+
path.join(getContinueGlobalPath(), RULES_DIR_NAME),
68+
);
69+
promptFiles.push(...promptFilesFromRulesDirectory);
70+
6271
return await Promise.all(
6372
promptFiles.map(async (file) => {
6473
const content = await ide.readFile(file.path);

core/promptFiles/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import { ContextProviderName } from "..";
22

33
export const DEFAULT_PROMPTS_FOLDER_V1 = ".prompts";
44
export const DEFAULT_PROMPTS_FOLDER_V2 = ".continue/prompts";
5+
export const DEFAULT_RULES_FOLDER = ".continue/rules";
6+
7+
// Subdirectory names (without .continue/ prefix)
8+
export const RULES_DIR_NAME = "rules";
9+
export const PROMPTS_DIR_NAME = "prompts";
510

611
export const SUPPORTED_PROMPT_CONTEXT_PROVIDERS: ContextProviderName[] = [
712
"file",

0 commit comments

Comments
 (0)