@iaforged/context-code 1.0.79 → 1.0.80

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.
@@ -1,15 +1,15 @@
1
1
  import { feature } from '../recovery/bunBundleShim.js';
2
2
  import { maybeMarkProjectOnboardingComplete } from '../projectOnboardingState.js';
3
3
  import { isEnvTruthy } from '../utils/envUtils.js';
4
- const OLD_INIT_PROMPT = `Please analyze this codebase and create a CLAUDE.md file, which will be given to future instances of Context Code to operate in this repository.
4
+ const OLD_INIT_PROMPT = `Please analyze this codebase and create a .context/CONTEXT.md file, which will be given to future instances of Context Code to operate in this repository.
5
5
 
6
6
  What to add:
7
7
  1. Commands that will be commonly used, such as how to build, lint, and run tests. Include the necessary commands to develop in this codebase, such as how to run a single test.
8
8
  2. High-level code architecture and structure so that future instances can be productive more quickly. Focus on the "big picture" architecture that requires reading multiple files to understand.
9
9
 
10
10
  Usage notes:
11
- - If there's already a CLAUDE.md, suggest improvements to it.
12
- - When you make the initial CLAUDE.md, do not repeat yourself and do not include obvious instructions like "Provide helpful error messages to users", "Write unit tests for all new utilities", "Never include sensitive information (API keys, tokens) in code or commits".
11
+ - If there's already a .context/CONTEXT.md, suggest improvements to it.
12
+ - When you make the initial .context/CONTEXT.md, do not repeat yourself and do not include obvious instructions like "Provide helpful error messages to users", "Write unit tests for all new utilities", "Never include sensitive information (API keys, tokens) in code or commits".
13
13
  - Avoid listing every component or file structure that can be easily discovered.
14
14
  - Don't include generic development practices.
15
15
  - If there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include the important parts.
@@ -18,7 +18,7 @@ Usage notes:
18
18
  - Be sure to prefix the file with the following text:
19
19
 
20
20
  \`\`\`
21
- # CLAUDE.md
21
+ # CONTEXT.md
22
22
 
23
23
  This file provides guidance to Context Code when working with code in this repository.
24
24
  \`\`\``;
@@ -28,7 +28,7 @@ const NEW_INIT_PROMPT = `Set up a minimal CLAUDE.md (and optionally skills and h
28
28
 
29
29
  Use AskUserQuestion to find out what the user wants:
30
30
 
31
- - "Which CLAUDE.md files should /init set up?"
31
+ - "Which CLAUDE.md files should /iniciar set up?"
32
32
  Options: "Project CLAUDE.md" | "Personal CLAUDE.local.md" | "Both project + personal"
33
33
  Description for project: "Team-shared instructions checked into source control — architecture, coding standards, common workflows."
34
34
  Description for personal: "Your private preferences for this project (gitignored, not shared) — your role, sandbox URLs, preferred test data, workflow quirks."
@@ -201,7 +201,7 @@ Check the environment and ask about each gap you find (use AskUserQuestion):
201
201
  - "before committing" (literal git-commit gate) → **not a hooks.json hook.** Matchers can't filter Bash by command content, so there's no way to target only \`git commit\`. Route this to a git pre-commit hook (\`.git/hooks/pre-commit\`, husky, pre-commit framework) instead — offer to write one. If the user actually means "before I review and commit Context's output", that's \`Stop\` — probe to disambiguate.
202
202
  Probe if the preference is ambiguous.
203
203
 
204
- 3. **Load the hook reference** (once per \`/init\` run, before the first hook): invoke the Skill tool with \`skill: 'update-config'\` and args starting with \`[hooks-only]\` followed by a one-line summary of what you're building — e.g., \`[hooks-only] Constructing a PostToolUse/Write|Edit format hook for .context/settings.json using ruff\`. This loads the hooks schema and verification flow into context. Subsequent hooks reuse it — don't re-invoke.
204
+ 3. **Load the hook reference** (once per \`/iniciar\` run, before the first hook): invoke the Skill tool with \`skill: 'update-config'\` and args starting with \`[hooks-only]\` followed by a one-line summary of what you're building — e.g., \`[hooks-only] Constructing a PostToolUse/Write|Edit format hook for .context/settings.json using ruff\`. This loads the hooks schema and verification flow into context. Subsequent hooks reuse it — don't re-invoke.
205
205
 
206
206
  4. Follow the skill's **"Constructing a Hook"** flow: dedup check → construct for THIS project → pipe-test raw → wrap → write JSON → \`jq -e\` validate → live-proof (for \`Pre|PostToolUse\` on triggerable matchers) → cleanup → handoff. Target file and event/matcher come from steps 1–2 above.
207
207
 
@@ -209,7 +209,7 @@ Act on each "yes" before moving on.
209
209
 
210
210
  ## Phase 8: Summary and next steps
211
211
 
212
- Recap what was set up — which files were written and the key points included in each. Remind the user these files are a starting point: they should review and tweak them, and can run \`/init\` again anytime to re-scan.
212
+ Recap what was set up — which files were written and the key points included in each. Remind the user these files are a starting point: they should review and tweak them, and can run \`/iniciar\` again anytime to re-scan.
213
213
 
214
214
  Then tell the user that you'll be introducing a few more suggestions for optimizing their codebase and Context Code setup based on what you found. Present these as a single, well-formatted to-do list where every item is relevant to this repo. Put the most impactful items first.
215
215
 
@@ -221,27 +221,28 @@ When building the list, work through these checks and include only what applies:
221
221
  - Browse official plugins with \`/plugin\` — these bundle skills, agents, hooks, and MCP servers that you may find helpful. You can also create your own custom plugins to share them with others. (Always include this one.)`;
222
222
  const command = {
223
223
  type: 'prompt',
224
- name: 'init',
224
+ name: 'iniciar',
225
225
  get description() {
226
226
  return feature('NEW_INIT') &&
227
227
  (process.env.USER_TYPE === 'ant' ||
228
228
  isEnvTruthy(process.env.CLAUDE_CODE_NEW_INIT))
229
- ? 'Inicializar nuevo(s) archivo(s) CLAUDE.md y habilidades/ganchos opcionales con documentación de la base de código'
230
- : 'Inicializar un nuevo archivo CLAUDE.md con documentación de la base de código';
229
+ ? 'Inicializar .context/CONTEXT.md y habilidades/ganchos opcionales con documentacion de la base de codigo'
230
+ : 'Inicializar .context/CONTEXT.md con documentacion de la base de codigo';
231
231
  },
232
232
  contentLength: 0, // Dynamic content
233
- progressMessage: 'analizando tu base de código',
233
+ progressMessage: 'analizando tu base de codigo',
234
234
  source: 'builtin',
235
235
  async getPromptForCommand() {
236
236
  maybeMarkProjectOnboardingComplete();
237
+ const prompt = feature('NEW_INIT') &&
238
+ (process.env.USER_TYPE === 'ant' ||
239
+ isEnvTruthy(process.env.CLAUDE_CODE_NEW_INIT))
240
+ ? NEW_INIT_PROMPT
241
+ : OLD_INIT_PROMPT;
237
242
  return [
238
243
  {
239
244
  type: 'text',
240
- text: feature('NEW_INIT') &&
241
- (process.env.USER_TYPE === 'ant' ||
242
- isEnvTruthy(process.env.CLAUDE_CODE_NEW_INIT))
243
- ? NEW_INIT_PROMPT
244
- : OLD_INIT_PROMPT,
245
+ text: prompt.replaceAll('CLAUDE.md', '.context/CONTEXT.md'),
245
246
  },
246
247
  ];
247
248
  },
@@ -26,7 +26,7 @@ export function AgentsList(t0) {
26
26
  const getOverrideInfo = _temp;
27
27
  let t2;
28
28
  if ($[2] !== isCreateNewSelected) {
29
- t2 = () => _jsxs(Box, { children: [_jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: isCreateNewSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: "Create new agent" })] });
29
+ t2 = () => _jsxs(Box, { children: [_jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: isCreateNewSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: "Crear nuevo agente" })] });
30
30
  $[2] = isCreateNewSelected;
31
31
  $[3] = t2;
32
32
  }
@@ -43,7 +43,7 @@ export function AgentsList(t0) {
43
43
  const dimmed = isBuiltIn || isOverridden;
44
44
  const textColor = !isBuiltIn && isSelected ? "suggestion" : undefined;
45
45
  const resolvedModel = resolveAgentModelDisplay(agent_0);
46
- return _jsxs(Box, { children: [_jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: isBuiltIn ? "" : isSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: agent_0.agentType }), resolvedModel && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", resolvedModel] }), agent_0.memory && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", agent_0.memory, " memory"] }), overriddenBy && _jsxs(Text, { dimColor: !isSelected, color: isSelected ? "warning" : undefined, children: [" ", figures.warning, " shadowed by ", getOverrideSourceLabel(overriddenBy)] })] }, `${agent_0.agentType}-${agent_0.source}`);
46
+ return _jsxs(Box, { children: [_jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: isBuiltIn ? "" : isSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: agent_0.agentType }), resolvedModel && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", resolvedModel] }), agent_0.memory && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", agent_0.memory, " memoria"] }), overriddenBy && _jsxs(Text, { dimColor: !isSelected, color: isSelected ? "warning" : undefined, children: [" ", figures.warning, " reemplazado por ", getOverrideSourceLabel(overriddenBy)] })] }, `${agent_0.agentType}-${agent_0.source}`);
47
47
  };
48
48
  $[4] = isCreateNewSelected;
49
49
  $[5] = selectedAgent?.agentType;
@@ -160,7 +160,7 @@ export function AgentsList(t0) {
160
160
  let t8;
161
161
  if ($[23] !== renderAgent || $[24] !== sortedAgents) {
162
162
  t8 = t9 => {
163
- const title = t9 === undefined ? "Built-in (always available):" : t9;
163
+ const title = t9 === undefined ? "Integrados (siempre disponibles):" : t9;
164
164
  const builtInAgents = sortedAgents.filter(_temp4);
165
165
  return _jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2, children: [_jsx(Text, { bold: true, dimColor: true, children: title }), builtInAgents.map(renderAgent)] });
166
166
  };
@@ -232,9 +232,9 @@ export function AgentsList(t0) {
232
232
  let t25;
233
233
  let t26;
234
234
  if ($[58] === Symbol.for("react.memo_cache_sentinel")) {
235
- t24 = _jsx(Text, { dimColor: true, children: "No agents found. Create specialized subagents that Claude can delegate to." });
236
- t25 = _jsx(Text, { dimColor: true, children: "Each subagent has its own context window, custom system prompt, and specific tools." });
237
- t26 = _jsx(Text, { dimColor: true, children: "Try creating: Code Reviewer, Code Simplifier, Security Reviewer, Tech Lead, or UX Reviewer." });
235
+ t24 = _jsx(Text, { dimColor: true, children: "No hay agentes. Crea subagentes especializados a los que Context Code pueda delegar tareas." });
236
+ t25 = _jsx(Text, { dimColor: true, children: "Cada subagente tiene su propia ventana de contexto, prompt de sistema personalizado y herramientas especificas." });
237
+ t26 = _jsx(Text, { dimColor: true, children: "Prueba crear: Revisor de codigo, Simplificador de codigo, Revisor de seguridad, Lider tecnico o Revisor UX." });
238
238
  $[58] = t24;
239
239
  $[59] = t25;
240
240
  $[60] = t26;
@@ -268,7 +268,7 @@ export function AgentsList(t0) {
268
268
  }
269
269
  let t29;
270
270
  if ($[69] !== onBack || $[70] !== sourceTitle || $[71] !== t28) {
271
- t29 = _jsx(Dialog, { title: sourceTitle, subtitle: "No agents found", onCancel: onBack, hideInputGuide: true, children: t28 });
271
+ t29 = _jsx(Dialog, { title: sourceTitle, subtitle: "No hay agentes", onCancel: onBack, hideInputGuide: true, children: t28 });
272
272
  $[69] = onBack;
273
273
  $[70] = sourceTitle;
274
274
  $[71] = t28;
@@ -291,7 +291,7 @@ export function AgentsList(t0) {
291
291
  else {
292
292
  t23 = $[74];
293
293
  }
294
- t18 = `${t23} agents`;
294
+ t18 = `${t23} agentes`;
295
295
  t19 = onBack;
296
296
  t20 = true;
297
297
  if ($[75] !== changes) {
@@ -319,7 +319,7 @@ export function AgentsList(t0) {
319
319
  t16 = source === "all" ? _jsxs(_Fragment, { children: [AGENT_SOURCE_GROUPS.filter(_temp9).map(t24 => {
320
320
  const { label, source: groupSource_0 } = t24;
321
321
  return _jsx(React.Fragment, { children: renderAgentGroup(label, sortedAgents.filter(a_7 => a_7.source === groupSource_0)) }, groupSource_0);
322
- }), builtInAgents_0.length > 0 && _jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2, children: [_jsxs(Text, { dimColor: true, children: [_jsx(Text, { bold: true, children: "Built-in agents" }), " (always available)"] }), builtInAgents_0.map(renderAgent)] })] }) : source === "built-in" ? _jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, italic: true, children: "Built-in agents are provided by default and cannot be modified." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: sortedAgents.map(agent_2 => renderAgent(agent_2)) })] }) : _jsxs(_Fragment, { children: [sortedAgents.filter(_temp0).map(agent_3 => renderAgent(agent_3)), sortedAgents.some(_temp1) && _jsxs(_Fragment, { children: [_jsx(Divider, {}), renderBuiltInAgentsSection()] })] });
322
+ }), builtInAgents_0.length > 0 && _jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2, children: [_jsxs(Text, { dimColor: true, children: [_jsx(Text, { bold: true, children: "Agentes integrados" }), " (siempre disponibles)"] }), builtInAgents_0.map(renderAgent)] })] }) : source === "built-in" ? _jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, italic: true, children: "Los agentes integrados vienen por defecto y no se pueden modificar." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: sortedAgents.map(agent_2 => renderAgent(agent_2)) })] }) : _jsxs(_Fragment, { children: [sortedAgents.filter(_temp0).map(agent_3 => renderAgent(agent_3)), sortedAgents.some(_temp1) && _jsxs(_Fragment, { children: [_jsx(Divider, {}), renderBuiltInAgentsSection()] })] });
323
323
  }
324
324
  $[30] = changes;
325
325
  $[31] = handleKeyDown;
@@ -170,7 +170,7 @@ export function AgentsMenu(t0) {
170
170
  }
171
171
  };
172
172
  });
173
- setChanges(prev_0 => [...prev_0, `Deleted agent: ${chalk.bold(agent.agentType)}`]);
173
+ setChanges(prev_0 => [...prev_0, `Agente eliminado: ${chalk.bold(agent.agentType)}`]);
174
174
  setModeState({
175
175
  mode: "list-agents",
176
176
  source: "all"
@@ -217,8 +217,8 @@ export function AgentsMenu(t0) {
217
217
  let t15;
218
218
  if ($[34] !== changes || $[35] !== onExit) {
219
219
  t15 = () => {
220
- const exitMessage = changes.length > 0 ? `Agent changes:\n${changes.join("\n")}` : undefined;
221
- onExit(exitMessage ?? "Agents dialog dismissed", {
220
+ const exitMessage = changes.length > 0 ? `Cambios de agentes:\n${changes.join("\n")}` : undefined;
221
+ onExit(exitMessage ?? "Panel de agentes cerrado", {
222
222
  display: changes.length === 0 ? "system" : undefined
223
223
  });
224
224
  };
@@ -1,14 +1,18 @@
1
1
  import capitalize from 'lodash-es/capitalize.js';
2
2
  import { getSettingSourceName } from '../../utils/settings/constants.js';
3
+ const SOURCE_DISPLAY_NAMES = {
4
+ all: 'Agentes',
5
+ 'built-in': 'Agentes integrados',
6
+ plugin: 'Agentes de plugins',
7
+ userSettings: 'Agentes de usuario',
8
+ projectSettings: 'Agentes del proyecto',
9
+ localSettings: 'Agentes locales',
10
+ policySettings: 'Agentes administrados',
11
+ flagSettings: 'Agentes por argumento CLI',
12
+ };
3
13
  export function getAgentSourceDisplayName(source) {
4
- if (source === 'all') {
5
- return 'Agents';
6
- }
7
- if (source === 'built-in') {
8
- return 'Built-in agents';
9
- }
10
- if (source === 'plugin') {
11
- return 'Plugin agents';
12
- }
14
+ const translatedName = SOURCE_DISPLAY_NAMES[source];
15
+ if (translatedName)
16
+ return translatedName;
13
17
  return capitalize(getSettingSourceName(source));
14
18
  }
@@ -5,7 +5,7 @@ import { getCwd } from './utils/cwd.js';
5
5
  import { isDirEmpty } from './utils/file.js';
6
6
  import { getFsImplementation } from './utils/fsOperations.js';
7
7
  export function getSteps() {
8
- const hasClaudeMd = getFsImplementation().existsSync(join(getCwd(), 'CLAUDE.md'));
8
+ const hasContextMd = getFsImplementation().existsSync(join(getCwd(), '.context', 'CONTEXT.md'));
9
9
  const isWorkspaceDirEmpty = isDirEmpty(getCwd());
10
10
  return [
11
11
  {
@@ -17,8 +17,8 @@ export function getSteps() {
17
17
  },
18
18
  {
19
19
  key: 'claudemd',
20
- text: 'Ejecuta /init para crear un archivo CLAUDE.md con instrucciones para Context Code',
21
- isComplete: hasClaudeMd,
20
+ text: 'Ejecuta /iniciar para crear .context/CONTEXT.md con instrucciones para Context Code',
21
+ isComplete: hasContextMd,
22
22
  isCompletable: true,
23
23
  isEnabled: !isWorkspaceDirEmpty,
24
24
  },
@@ -3,19 +3,27 @@
3
3
  * Used by both the CLI `claude agents` handler and the interactive `/agents` command.
4
4
  */
5
5
  import { getDefaultSubagentModel } from '../../utils/model/agent.js';
6
- import { getSourceDisplayName, } from '../../utils/settings/constants.js';
6
+ const OVERRIDE_SOURCE_LABELS = {
7
+ userSettings: 'usuario',
8
+ projectSettings: 'proyecto',
9
+ localSettings: 'local',
10
+ policySettings: 'administrado',
11
+ flagSettings: 'argumento CLI',
12
+ 'built-in': 'integrado',
13
+ plugin: 'plugin',
14
+ };
7
15
  /**
8
16
  * Ordered list of agent source groups for display.
9
17
  * Both the CLI and interactive UI should use this to ensure consistent ordering.
10
18
  */
11
19
  export const AGENT_SOURCE_GROUPS = [
12
- { label: 'User agents', source: 'userSettings' },
13
- { label: 'Project agents', source: 'projectSettings' },
14
- { label: 'Local agents', source: 'localSettings' },
15
- { label: 'Managed agents', source: 'policySettings' },
16
- { label: 'Plugin agents', source: 'plugin' },
17
- { label: 'CLI arg agents', source: 'flagSettings' },
18
- { label: 'Built-in agents', source: 'built-in' },
20
+ { label: 'Agentes de usuario', source: 'userSettings' },
21
+ { label: 'Agentes del proyecto', source: 'projectSettings' },
22
+ { label: 'Agentes locales', source: 'localSettings' },
23
+ { label: 'Agentes administrados', source: 'policySettings' },
24
+ { label: 'Agentes de plugins', source: 'plugin' },
25
+ { label: 'Agentes por argumento CLI', source: 'flagSettings' },
26
+ { label: 'Agentes integrados', source: 'built-in' },
19
27
  ];
20
28
  /**
21
29
  * Annotate agents with override information by comparing against the active
@@ -53,14 +61,14 @@ export function resolveAgentModelDisplay(agent) {
53
61
  const model = agent.model || getDefaultSubagentModel();
54
62
  if (!model)
55
63
  return undefined;
56
- return model === 'inherit' ? 'inherit' : model;
64
+ return model === 'inherit' ? 'heredar' : model;
57
65
  }
58
66
  /**
59
67
  * Get a human-readable label for the source that overrides an agent.
60
68
  * Returns lowercase, e.g. "user", "project", "managed".
61
69
  */
62
70
  export function getOverrideSourceLabel(source) {
63
- return getSourceDisplayName(source).toLowerCase();
71
+ return OVERRIDE_SOURCE_LABELS[source];
64
72
  }
65
73
  /**
66
74
  * Compare agents alphabetically by name (case-insensitive).
@@ -6,7 +6,7 @@ const require = createRequire(import.meta.url);
6
6
  *
7
7
  * 1. Managed memory (eg. /etc/claude-code/CLAUDE.md) - Global instructions for all users
8
8
  * 2. User memory (~/.context/CLAUDE.md) - Private global instructions for all projects
9
- * 3. Project memory (CLAUDE.md, .context/CLAUDE.md, and .context/rules/*.md in project roots) - Instructions checked into the codebase
9
+ * 3. Project memory (CLAUDE.md, .context/CONTEXT.md, .context/CLAUDE.md, and .context/rules/*.md in project roots) - Instructions checked into the codebase
10
10
  * 4. Local memory (CLAUDE.local.md in project roots) - Private project-specific instructions
11
11
  *
12
12
  * Files are loaded in reverse order of priority, i.e. the latest files are highest priority
@@ -16,7 +16,7 @@ const require = createRequire(import.meta.url);
16
16
  * - User memory is loaded from the user's home directory
17
17
  * - Project and Local files are discovered by traversing from the current directory up to root
18
18
  * - Files closer to the current directory have higher priority (loaded later)
19
- * - CLAUDE.md, .context/CLAUDE.md, and all .md files in .context/rules/ are checked in each directory for Project memory
19
+ * - CLAUDE.md, .context/CONTEXT.md, .context/CLAUDE.md, and all .md files in .context/rules/ are checked in each directory for Project memory
20
20
  *
21
21
  * Memory @include directive:
22
22
  * - Memory files can include other files using @ notation
@@ -668,7 +668,10 @@ export const getMemoryFiles = memoize(async (forceIncludeExternal = false) => {
668
668
  if (isSettingSourceEnabled('projectSettings') && !skipProject) {
669
669
  const projectPath = join(dir, 'CLAUDE.md');
670
670
  result.push(...(await processMemoryFile(projectPath, 'Project', processedPaths, includeExternal)));
671
- // Try reading .context/CLAUDE.md (Project)
671
+ // Try reading .context/CONTEXT.md (Project)
672
+ const dotContextContextPath = join(dir, '.context', 'CONTEXT.md');
673
+ result.push(...(await processMemoryFile(dotContextContextPath, 'Project', processedPaths, includeExternal)));
674
+ // Try reading .context/CLAUDE.md (Project, legacy)
672
675
  const dotContextPath = join(dir, '.context', 'CLAUDE.md');
673
676
  result.push(...(await processMemoryFile(dotContextPath, 'Project', processedPaths, includeExternal)));
674
677
  // Try reading .context/rules/*.md files (Project)
@@ -697,7 +700,10 @@ export const getMemoryFiles = memoize(async (forceIncludeExternal = false) => {
697
700
  // Try reading CLAUDE.md from the additional directory
698
701
  const projectPath = join(dir, 'CLAUDE.md');
699
702
  result.push(...(await processMemoryFile(projectPath, 'Project', processedPaths, includeExternal)));
700
- // Try reading .context/CLAUDE.md from the additional directory
703
+ // Try reading .context/CONTEXT.md from the additional directory
704
+ const dotContextContextPath = join(dir, '.context', 'CONTEXT.md');
705
+ result.push(...(await processMemoryFile(dotContextContextPath, 'Project', processedPaths, includeExternal)));
706
+ // Try reading .context/CLAUDE.md from the additional directory (legacy)
701
707
  const dotContextPath = join(dir, '.context', 'CLAUDE.md');
702
708
  result.push(...(await processMemoryFile(dotContextPath, 'Project', processedPaths, includeExternal)));
703
709
  // Try reading .context/rules/*.md files from the additional directory
@@ -900,7 +906,7 @@ export async function getManagedAndUserConditionalRules(targetPath, processedPat
900
906
  }
901
907
  /**
902
908
  * Gets memory files for a single nested directory (between CWD and target).
903
- * Loads CLAUDE.md, unconditional rules, and conditional rules for that directory.
909
+ * Loads CLAUDE.md/.context/CONTEXT.md, unconditional rules, and conditional rules for that directory.
904
910
  *
905
911
  * @param dir The directory to process
906
912
  * @param targetPath The target file path (for conditional rule matching)
@@ -909,10 +915,12 @@ export async function getManagedAndUserConditionalRules(targetPath, processedPat
909
915
  */
910
916
  export async function getMemoryFilesForNestedDirectory(dir, targetPath, processedPaths) {
911
917
  const result = [];
912
- // Process project memory files (CLAUDE.md and .context/CLAUDE.md)
918
+ // Process project memory files (CLAUDE.md, .context/CONTEXT.md, and .context/CLAUDE.md)
913
919
  if (isSettingSourceEnabled('projectSettings')) {
914
920
  const projectPath = join(dir, 'CLAUDE.md');
915
921
  result.push(...(await processMemoryFile(projectPath, 'Project', processedPaths, false)));
922
+ const dotContextContextPath = join(dir, '.context', 'CONTEXT.md');
923
+ result.push(...(await processMemoryFile(dotContextContextPath, 'Project', processedPaths, false)));
916
924
  const dotContextPath = join(dir, '.context', 'CLAUDE.md');
917
925
  result.push(...(await processMemoryFile(dotContextPath, 'Project', processedPaths, false)));
918
926
  }
@@ -1016,7 +1024,7 @@ export async function shouldShowClaudeMdExternalIncludesWarning() {
1016
1024
  return hasExternalClaudeMdIncludes(await getMemoryFiles(true));
1017
1025
  }
1018
1026
  /**
1019
- * Check if a file path is a memory file (CLAUDE.md, CLAUDE.local.md, or .context/rules/*.md)
1027
+ * Check if a file path is a memory file (CLAUDE.md, .context/CONTEXT.md, CLAUDE.local.md, or .context/rules/*.md)
1020
1028
  */
1021
1029
  export function isMemoryFilePath(filePath) {
1022
1030
  const name = basename(filePath);
@@ -1024,6 +1032,10 @@ export function isMemoryFilePath(filePath) {
1024
1032
  if (name === 'CLAUDE.md' || name === 'CLAUDE.local.md') {
1025
1033
  return true;
1026
1034
  }
1035
+ if (name === 'CONTEXT.md' &&
1036
+ filePath.includes(`${sep}.context${sep}`)) {
1037
+ return true;
1038
+ }
1027
1039
  // .md files in .context/rules/ directories
1028
1040
  if (name.endsWith('.md') &&
1029
1041
  filePath.includes(`${sep}.context${sep}rules${sep}`)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iaforged/context-code",
3
- "version": "1.0.79",
3
+ "version": "1.0.80",
4
4
  "description": "Context Code es un asistente de desarrollo para la terminal. Puede revisar tu proyecto, editar archivos, ejecutar comandos y apoyarte en tareas reales de programacion.",
5
5
  "author": "Context AI",
6
6
  "license": "MIT",