@modus-ai/modus 0.2.5 → 0.2.7

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.
Files changed (49) hide show
  1. package/README.md +62 -45
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +37 -6
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/generators/claude.js +1 -1
  6. package/dist/generators/claude.js.map +1 -1
  7. package/dist/generators/codebuddy.d.ts.map +1 -1
  8. package/dist/generators/codebuddy.js +3 -1
  9. package/dist/generators/codebuddy.js.map +1 -1
  10. package/dist/generators/codex.d.ts +10 -0
  11. package/dist/generators/codex.d.ts.map +1 -0
  12. package/dist/generators/codex.js +178 -0
  13. package/dist/generators/codex.js.map +1 -0
  14. package/dist/generators/cursor.d.ts.map +1 -1
  15. package/dist/generators/cursor.js +36 -7
  16. package/dist/generators/cursor.js.map +1 -1
  17. package/dist/generators/custom.d.ts +55 -0
  18. package/dist/generators/custom.d.ts.map +1 -0
  19. package/dist/generators/custom.js +166 -0
  20. package/dist/generators/custom.js.map +1 -0
  21. package/dist/generators/index.d.ts +1 -0
  22. package/dist/generators/index.d.ts.map +1 -1
  23. package/dist/generators/index.js +10 -0
  24. package/dist/generators/index.js.map +1 -1
  25. package/dist/utils/config.d.ts +6 -1
  26. package/dist/utils/config.d.ts.map +1 -1
  27. package/dist/utils/config.js.map +1 -1
  28. package/package.json +1 -1
  29. package/schemas/harness-schema.yaml +178 -53
  30. package/templates/agents/modus-analyst.md +1 -1
  31. package/templates/commands/auto.md +61 -27
  32. package/templates/commands/harness.md +94 -34
  33. package/templates/commands/init.md +43 -10
  34. package/templates/commands/modus.md +55 -28
  35. package/templates/commands/plan.md +60 -18
  36. package/templates/commands/spec.md +69 -25
  37. package/templates/commands/upgrade.md +54 -0
  38. package/templates/commands/vibe.md +55 -5
  39. package/templates/knowledge-catalog.md +23 -10
  40. package/templates/skills/modus-agents/analyst/SKILL.md +11 -12
  41. package/templates/skills/modus-agents/developer/SKILL.md +14 -12
  42. package/templates/skills/modus-agents/reviewer/SKILL.md +50 -23
  43. package/templates/skills/modus-auto/SKILL.md +580 -123
  44. package/templates/skills/modus-design-brief/SKILL.md +17 -9
  45. package/templates/skills/modus-harness/SKILL.md +95 -96
  46. package/templates/skills/modus-init/SKILL.md +403 -188
  47. package/templates/skills/modus-plan/SKILL.md +16 -5
  48. package/templates/skills/modus-platform/SKILL.md +271 -0
  49. package/templates/skills/modus-vibe/SKILL.md +285 -187
@@ -0,0 +1,178 @@
1
+ // Codex (OpenAI Codex / OpenCode) file generator.
2
+ // Writes a single AGENTS.md at the project root following the OpenAI Codex AGENTS.md spec.
3
+ // Codex does not support a multi-file rules directory, so all content (constitution,
4
+ // framework skill summaries, command index) is merged into one file.
5
+ // Business domain biz-* content is referenced by path, not inlined (to keep token count manageable).
6
+ import path from 'node:path';
7
+ import { writeFile, readTemplate, fileExists, readFile } from '../utils/file-system.js';
8
+ const AGENTS_MD = 'AGENTS.md';
9
+ // Marker so modus can identify the section it owns inside an existing AGENTS.md
10
+ const MODUS_START = '<!-- modus:start -->';
11
+ const MODUS_END = '<!-- modus:end -->';
12
+ // Framework skill IDs in display order
13
+ const FRAMEWORK_SKILL_IDS = [
14
+ 'modus-init',
15
+ 'modus-vibe',
16
+ 'modus-plan',
17
+ 'modus-spec',
18
+ 'modus-auto',
19
+ 'modus-harness',
20
+ ];
21
+ const SKILL_TEMPLATE_MAP = {
22
+ 'modus-init': 'skills/modus-init/SKILL.md',
23
+ 'modus-vibe': 'skills/modus-vibe/SKILL.md',
24
+ 'modus-plan': 'skills/modus-plan/SKILL.md',
25
+ 'modus-spec': 'skills/modus-spec/SKILL.md',
26
+ 'modus-auto': 'skills/modus-auto/SKILL.md',
27
+ 'modus-harness': 'skills/modus-harness/SKILL.md',
28
+ };
29
+ // ---------------------------------------------------------------------------
30
+ // Main entry
31
+ // ---------------------------------------------------------------------------
32
+ export function generateCodexFiles(projectRoot, config, _opts = {}) {
33
+ const agentsMd = buildAgentsMd(projectRoot, config);
34
+ const agentsMdPath = path.join(projectRoot, AGENTS_MD);
35
+ if (fileExists(agentsMdPath)) {
36
+ // Merge: replace the modus-managed section, keep the rest
37
+ const existing = readFile(agentsMdPath);
38
+ const merged = mergeModus(existing, agentsMd);
39
+ writeFile(agentsMdPath, merged);
40
+ }
41
+ else {
42
+ writeFile(agentsMdPath, agentsMd);
43
+ }
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Build the full modus-managed section of AGENTS.md
47
+ // ---------------------------------------------------------------------------
48
+ function buildAgentsMd(projectRoot, config) {
49
+ const any = config;
50
+ const constitution = any['constitution'] ?? {};
51
+ const context = config.context ?? '';
52
+ const techStack = String(constitution['tech_stack'] ?? config.techStack ?? '');
53
+ const hardRules = Array.isArray(constitution['hard_rules'])
54
+ ? constitution['hard_rules'].map((r) => `- ${r}`).join('\n')
55
+ : '';
56
+ const enabled = new Set(config.commands.enabled);
57
+ // ── Section: header & quick-start ────────────────────────────────────────
58
+ const lines = [
59
+ '# Modus Agent Instructions',
60
+ '<!-- Codex / OpenCode / AGENTS.md format — auto-generated by modus, do not edit manually -->',
61
+ '',
62
+ ];
63
+ if (context) {
64
+ lines.push(`> ${context}`, '');
65
+ }
66
+ lines.push('## 快速启动(必读,执行任何编码任务前)', '', '按以下顺序加载上下文:', '', '1. **工作区路由**(~100 tokens):读取 `modus/workspace-catalog.md`,确认目标项目', '2. **项目知识**(~200 tokens):读取 `{project}/modus/knowledge-catalog.md`', '3. **业务域知识**(~3000 tokens/个,按需):读取 `{project}/modus/knowledge/biz-*/SKILL.md`', '4. **项目宪法**(硬性约束):读取 `{project}/modus/config.yaml` 的 `constitution` 字段', '', '**不要直接修改代码,先加载相关业务知识,再动手。**', '');
67
+ // ── Section: knowledge paths ──────────────────────────────────────────────
68
+ lines.push('## 知识库路径(Single Source of Truth)', '', '| 层级 | 路径 | 说明 |', '|------|------|------|', '| Layer 0-T 团队约定 | `{project}/modus/knowledge/_conventions/SKILL.md` | 编码规范、命名约定 |', '| Layer 1 技术知识 | `{project}/modus/knowledge/_tech-wiki/SKILL.md` | 架构决策、反模式库 |', '| Layer 2 业务知识 | `{project}/modus/knowledge/biz-*/SKILL.md` | 各业务域领域模型和业务规则 |', '| 项目知识目录 | `{project}/modus/knowledge-catalog.md` | 所有 Skill 的快速索引 |', '| 工作区路由 | `modus/workspace-catalog.md` | 多项目顶层路由 |', '');
69
+ // ── Section: tech stack ───────────────────────────────────────────────────
70
+ if (techStack) {
71
+ lines.push(`**Tech Stack:** ${techStack}`, '');
72
+ }
73
+ // ── Section: hard rules ───────────────────────────────────────────────────
74
+ if (hardRules) {
75
+ lines.push('## 硬性约束(不可违反)', '', hardRules, '');
76
+ }
77
+ // ── Section: commands ─────────────────────────────────────────────────────
78
+ lines.push('## 可用命令', '', '| 命令 | 用途 | 常用参数 |', '|------|------|---------|');
79
+ if (enabled.has('init'))
80
+ lines.push('| `/modus:init` | 初始化/更新知识库 | `--enhance <domain>`, `--dry-run` |');
81
+ if (enabled.has('vibe'))
82
+ lines.push('| `/modus:vibe` | 上下文感知日常编码 | `--domain <name>`, `--no-interactive` |');
83
+ if (enabled.has('plan'))
84
+ lines.push('| `/modus:plan` | 功能规划(设计文档) | `--story <url>`, `--quick` |');
85
+ if (enabled.has('spec'))
86
+ lines.push('| `/modus:spec` | 规范驱动开发 | `--story <url>`, `--lite` |');
87
+ if (enabled.has('auto'))
88
+ lines.push('| `/modus:auto` | 智能模式推荐 | `--show-scores` |');
89
+ if (enabled.has('harness'))
90
+ lines.push('| `/modus:harness` | 全自动双 Loop 交付流水线 | `--story <url>`, `--force` |');
91
+ if (enabled.has('platform'))
92
+ lines.push('| `/modus:platform` | 平台适配管理 | `-add <name>`, `-list`, `-remove <name>` |');
93
+ lines.push('');
94
+ // ── Section: HANDOFF protocol ─────────────────────────────────────────────
95
+ lines.push('## HANDOFF 协议要求', '', '所有 Modus Harness 产出物文件头部必须包含标准 YAML frontmatter(schema v1.1)。', '完整协议规范见:`modus/docs/protocol.md`', '');
96
+ // ── Section: framework skill summaries ────────────────────────────────────
97
+ lines.push('## 框架 Skill 说明', '', '以下是各 Skill 的触发条件摘要。完整流程见各 SKILL.md 模板。', '');
98
+ for (const id of FRAMEWORK_SKILL_IDS) {
99
+ const cmdId = id.replace('modus-', '');
100
+ if (['init', 'vibe', 'plan', 'spec', 'auto', 'harness'].includes(cmdId) && !enabled.has(cmdId)) {
101
+ continue;
102
+ }
103
+ const templatePath = SKILL_TEMPLATE_MAP[id];
104
+ let skillContent = '';
105
+ try {
106
+ skillContent = readTemplate(templatePath);
107
+ }
108
+ catch {
109
+ continue;
110
+ }
111
+ // Extract just the frontmatter description line as a summary
112
+ const descMatch = skillContent.match(/^description:\s*>?\s*\n?([\s\S]*?)(?=\n\S|\nallowed-tools)/m);
113
+ const triggerMatch = skillContent.match(/Trigger on:([\s\S]*?)(?=\n\S)/);
114
+ const summary = descMatch
115
+ ? descMatch[1].replace(/\n/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 200)
116
+ : '';
117
+ const trigger = triggerMatch
118
+ ? triggerMatch[1].replace(/\n/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 120)
119
+ : '';
120
+ lines.push(`### \`/modus:${cmdId}\``);
121
+ if (summary)
122
+ lines.push('', summary);
123
+ if (trigger)
124
+ lines.push('', `**触发词:** ${trigger}`);
125
+ lines.push('');
126
+ }
127
+ return lines.join('\n');
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Merge helpers
131
+ // ---------------------------------------------------------------------------
132
+ /**
133
+ * Replace the modus-managed section (between MODUS_START / MODUS_END markers)
134
+ * in the existing AGENTS.md content. If no markers exist, append the section.
135
+ */
136
+ function mergeModus(existing, modusSection) {
137
+ const wrapped = `${MODUS_START}\n${modusSection}\n${MODUS_END}`;
138
+ const startIdx = existing.indexOf(MODUS_START);
139
+ const endIdx = existing.indexOf(MODUS_END);
140
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
141
+ return existing.slice(0, startIdx) + wrapped + existing.slice(endIdx + MODUS_END.length);
142
+ }
143
+ // No markers: append modus section at end, separated by a blank line
144
+ return existing.trimEnd() + '\n\n' + wrapped + '\n';
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Business Skill sync
148
+ // ---------------------------------------------------------------------------
149
+ /**
150
+ * Sync a single business Skill into AGENTS.md by updating the biz-skill reference section.
151
+ * Since AGENTS.md is a single flat file we only add a lightweight reference entry,
152
+ * not the full content (which would be too large).
153
+ */
154
+ export function syncBizSkillToCodex(projectRoot, domain, _skillContent) {
155
+ const agentsMdPath = path.join(projectRoot, AGENTS_MD);
156
+ if (!fileExists(agentsMdPath))
157
+ return;
158
+ let content = readFile(agentsMdPath);
159
+ const bizSection = '## 业务域 Skill 索引';
160
+ const entry = `- **${domain}**: \`modus/knowledge/biz-${domain}/SKILL.md\``;
161
+ if (!content.includes(bizSection)) {
162
+ // Append section before MODUS_END or at end
163
+ const insertBefore = content.includes(MODUS_END) ? MODUS_END : null;
164
+ const section = `\n${bizSection}\n\n${entry}\n`;
165
+ if (insertBefore) {
166
+ content = content.replace(MODUS_END, section + MODUS_END);
167
+ }
168
+ else {
169
+ content = content.trimEnd() + '\n' + section;
170
+ }
171
+ }
172
+ else if (!content.includes(entry)) {
173
+ // Section exists, append entry
174
+ content = content.replace(bizSection, `${bizSection}\n\n${entry}`);
175
+ }
176
+ writeFile(agentsMdPath, content);
177
+ }
178
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/generators/codex.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/generators/cursor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAwCtD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,eAAoB,GAC1B,IAAI,CAMN;AAqKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,IAAI,CAON"}
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/generators/cursor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAqEtD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,eAAoB,GAC1B,IAAI,CAMN;AAqKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,IAAI,CAON"}
@@ -7,12 +7,41 @@ const MCP_PATH = path.join('.cursor', 'mcp.json');
7
7
  // Framework command skills → .cursor/skills/modus-{cmd}/SKILL.md
8
8
  // ---------------------------------------------------------------------------
9
9
  const COMMAND_SKILLS = [
10
- { id: 'modus-init', templatePath: 'skills/modus-init/SKILL.md' },
11
- { id: 'modus-vibe', templatePath: 'skills/modus-vibe/SKILL.md' },
12
- { id: 'modus-plan', templatePath: 'skills/modus-plan/SKILL.md' },
13
- { id: 'modus-spec', templatePath: 'skills/modus-spec/SKILL.md' },
14
- { id: 'modus-auto', templatePath: 'skills/modus-auto/SKILL.md' },
15
- { id: 'modus-harness', templatePath: 'skills/modus-harness/SKILL.md' },
10
+ {
11
+ id: 'modus-init',
12
+ templatePath: 'skills/modus-init/SKILL.md',
13
+ description: 'Run /modus:init to scan the codebase and build Business Skills for each domain',
14
+ },
15
+ {
16
+ id: 'modus-vibe',
17
+ templatePath: 'skills/modus-vibe/SKILL.md',
18
+ description: 'Run /modus:vibe to start context-aware vibe coding with business Skill preloading',
19
+ },
20
+ {
21
+ id: 'modus-plan',
22
+ templatePath: 'skills/modus-plan/SKILL.md',
23
+ description: 'Run /modus:plan to create structured feature proposals with complexity grading',
24
+ },
25
+ {
26
+ id: 'modus-spec',
27
+ templatePath: 'skills/modus-spec/SKILL.md',
28
+ description: 'Run /modus:spec for OpenSpec-driven development with delta specs and GIVEN/WHEN/THEN scenarios',
29
+ },
30
+ {
31
+ id: 'modus-auto',
32
+ templatePath: 'skills/modus-auto/SKILL.md',
33
+ description: 'Run /modus:auto with a TAPD story URL to get AI-recommended mode (vibe/plan/spec/harness)',
34
+ },
35
+ {
36
+ id: 'modus-harness',
37
+ templatePath: 'skills/modus-harness/SKILL.md',
38
+ description: 'Run /modus:harness to execute the full dual-loop multi-agent development pipeline',
39
+ },
40
+ {
41
+ id: 'modus-platform',
42
+ templatePath: 'skills/modus-platform/SKILL.md',
43
+ description: 'Run /modus:platform -add to add a new AI platform adapter via online research',
44
+ },
16
45
  ];
17
46
  // ---------------------------------------------------------------------------
18
47
  // Harness SubAgent skills → .cursor/skills/modus-harness-{id}/SKILL.md
@@ -47,7 +76,7 @@ function generateCursorCommandSkills(projectRoot, config) {
47
76
  const enabled = new Set(config.commands.enabled);
48
77
  for (const skill of COMMAND_SKILLS) {
49
78
  const cmdId = skill.id.replace('modus-', '');
50
- if (['init', 'vibe', 'plan', 'spec', 'auto', 'harness'].includes(cmdId) && !enabled.has(cmdId)) {
79
+ if (['init', 'vibe', 'plan', 'spec', 'auto', 'harness', 'platform'].includes(cmdId) && !enabled.has(cmdId)) {
51
80
  continue;
52
81
  }
53
82
  let body;
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/generators/cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/generators/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { ModusConfig } from '../utils/config.js';
2
+ import type { GenerateOptions } from './codebuddy.js';
3
+ export interface BizSkillSync {
4
+ /** Whether this platform needs biz skill copies */
5
+ enabled: boolean;
6
+ /**
7
+ * Output path template. Supports placeholders:
8
+ * {domain} → business domain name (e.g. "biz-track")
9
+ * {ext} → file extension (without dot, derived from fileExtension)
10
+ */
11
+ outputPath: string;
12
+ /** Markdown wrapper template. {content} is replaced with the skill body. */
13
+ wrapper?: string;
14
+ }
15
+ export interface PlatformCapabilities {
16
+ /** How skills/context are loaded: 'progressive' | 'flat' | 'none' */
17
+ skillsLoading: 'progressive' | 'flat' | 'none';
18
+ /** Whether the platform supports parallel Sub-Agents */
19
+ subAgents: boolean;
20
+ /** How commands are triggered: 'slash' | 'natural' | 'file' */
21
+ commandsTrigger: 'slash' | 'natural' | 'file';
22
+ /** Whether the platform has a native multi-file rules mechanism */
23
+ nativeRules: boolean;
24
+ }
25
+ export interface PlatformDescriptor {
26
+ name: string;
27
+ label: string;
28
+ /** Directory where framework adapter files are written */
29
+ outputDir: string;
30
+ /** File extension without dot (e.g. "md", "mdc") */
31
+ fileExtension: string;
32
+ capabilities: PlatformCapabilities;
33
+ bizSkill?: BizSkillSync;
34
+ /** Optional Markdown template for the constitution block. {hardRules} placeholder. */
35
+ constitutionTemplate?: string;
36
+ /** Optional Markdown template for the commands block. {commands} placeholder. */
37
+ commandsTemplate?: string;
38
+ }
39
+ /**
40
+ * Scan `modus/platforms/` and load all valid platform.yaml descriptors.
41
+ */
42
+ export declare function loadCustomPlatforms(projectRoot: string): PlatformDescriptor[];
43
+ export declare function generateCustomPlatformFiles(projectRoot: string, config: ModusConfig, _opts?: GenerateOptions): void;
44
+ /**
45
+ * Sync a biz skill to all custom platforms that have bizSkill.enabled=true.
46
+ * Called from the `/modus:init` SKILL.md flow after writing the canonical
47
+ * `modus/knowledge/biz-{domain}/SKILL.md`.
48
+ *
49
+ * This resolves the "ongoing sync" pain point for custom platforms:
50
+ * every time biz skills are updated, this function ensures custom platform
51
+ * directories are also kept in sync automatically.
52
+ */
53
+ export declare function syncBizSkillToAllCustomPlatforms(projectRoot: string, domain: string, skillContent: string): void;
54
+ export declare function syncBizSkillToCustomPlatform(projectRoot: string, platform: PlatformDescriptor, domain: string, skillContent: string): void;
55
+ //# sourceMappingURL=custom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/generators/custom.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMtD,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,aAAa,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/C,wDAAwD;IACxD,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,eAAe,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC9C,mEAAmE;IACnE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,oBAAoB,CAAC;IACnC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,sFAAsF;IACtF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,EAAE,CA2B7E;AAMD,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,KAAK,GAAE,eAAoB,GAC1B,IAAI,CAKN;AAsGD;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,IAAI,CAKN;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,IAAI,CAgBN"}
@@ -0,0 +1,166 @@
1
+ // Custom platform generator.
2
+ // Reads `modus/platforms/{name}/platform.yaml` descriptors registered via
3
+ // `/modus:platform -add` and generates platform-specific adapter files.
4
+ // This enables zero-code extension of Modus to any AI coding tool.
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import yaml from 'js-yaml';
8
+ import { writeFile, fileExists, readFile, ensureDir, readTemplate } from '../utils/file-system.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Discovery
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Scan `modus/platforms/` and load all valid platform.yaml descriptors.
14
+ */
15
+ export function loadCustomPlatforms(projectRoot) {
16
+ const platformsDir = path.join(projectRoot, 'modus', 'platforms');
17
+ if (!fs.existsSync(platformsDir))
18
+ return [];
19
+ const descriptors = [];
20
+ let entries = [];
21
+ try {
22
+ entries = fs.readdirSync(platformsDir);
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ for (const entry of entries) {
28
+ const yamlPath = path.join(platformsDir, entry, 'platform.yaml');
29
+ if (!fileExists(yamlPath))
30
+ continue;
31
+ try {
32
+ const raw = readFile(yamlPath);
33
+ const parsed = yaml.load(raw);
34
+ if (parsed?.name && parsed?.outputDir) {
35
+ descriptors.push(parsed);
36
+ }
37
+ }
38
+ catch {
39
+ // Skip malformed descriptors
40
+ }
41
+ }
42
+ return descriptors;
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Main entry
46
+ // ---------------------------------------------------------------------------
47
+ export function generateCustomPlatformFiles(projectRoot, config, _opts = {}) {
48
+ const platforms = loadCustomPlatforms(projectRoot);
49
+ for (const platform of platforms) {
50
+ generateFrameworkFiles(projectRoot, config, platform);
51
+ }
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Framework file generation
55
+ // ---------------------------------------------------------------------------
56
+ function generateFrameworkFiles(projectRoot, config, platform) {
57
+ const outputDir = path.join(projectRoot, platform.outputDir);
58
+ ensureDir(outputDir);
59
+ const ext = platform.fileExtension ?? 'md';
60
+ const enabled = new Set(config.commands.enabled);
61
+ const any = config;
62
+ const constitution = any['constitution'] ?? {};
63
+ const hardRules = Array.isArray(constitution['hard_rules'])
64
+ ? constitution['hard_rules'].map((r) => `- ${r}`).join('\n')
65
+ : '';
66
+ // ── Constitution file ─────────────────────────────────────────────────────
67
+ if (hardRules) {
68
+ const constitutionBody = platform.constitutionTemplate
69
+ ? platform.constitutionTemplate.replace('{hardRules}', hardRules)
70
+ : buildDefaultConstitution(config, hardRules);
71
+ writeFile(path.join(outputDir, `modus-constitution.${ext}`), constitutionBody);
72
+ }
73
+ // ── Commands index file ───────────────────────────────────────────────────
74
+ const commandLines = [];
75
+ if (enabled.has('init'))
76
+ commandLines.push('- `/modus:init` — 初始化/更新知识库');
77
+ if (enabled.has('vibe'))
78
+ commandLines.push('- `/modus:vibe` — 上下文感知日常编码');
79
+ if (enabled.has('plan'))
80
+ commandLines.push('- `/modus:plan` — 功能规划');
81
+ if (enabled.has('spec'))
82
+ commandLines.push('- `/modus:spec` — 规范驱动开发');
83
+ if (enabled.has('auto'))
84
+ commandLines.push('- `/modus:auto` — 智能模式推荐');
85
+ if (enabled.has('harness'))
86
+ commandLines.push('- `/modus:harness` — 全自动双 Loop 交付流水线');
87
+ if (enabled.has('platform'))
88
+ commandLines.push('- `/modus:platform` — 平台适配管理');
89
+ const commandsBody = platform.commandsTemplate
90
+ ? platform.commandsTemplate.replace('{commands}', commandLines.join('\n'))
91
+ : `# Modus Commands\n\n${commandLines.join('\n')}\n`;
92
+ writeFile(path.join(outputDir, `modus-commands.${ext}`), commandsBody);
93
+ // ── Framework skill files (one per enabled command) ───────────────────────
94
+ const skillTemplateMap = {
95
+ init: 'skills/modus-init/SKILL.md',
96
+ vibe: 'skills/modus-vibe/SKILL.md',
97
+ plan: 'skills/modus-plan/SKILL.md',
98
+ spec: 'skills/modus-spec/SKILL.md',
99
+ auto: 'skills/modus-auto/SKILL.md',
100
+ harness: 'skills/modus-harness/SKILL.md',
101
+ };
102
+ if (platform.capabilities.skillsLoading !== 'none') {
103
+ for (const [cmdId, templatePath] of Object.entries(skillTemplateMap)) {
104
+ if (!enabled.has(cmdId))
105
+ continue;
106
+ let body = '';
107
+ try {
108
+ body = readTemplate(templatePath);
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ writeFile(path.join(outputDir, `modus-${cmdId}.${ext}`), body);
114
+ }
115
+ }
116
+ }
117
+ function buildDefaultConstitution(config, hardRules) {
118
+ const any = config;
119
+ const constitution = any['constitution'] ?? {};
120
+ const techStack = String(constitution['tech_stack'] ?? config.techStack ?? '');
121
+ const context = config.context ?? '';
122
+ const lines = ['# Modus Project Constitution', ''];
123
+ if (context)
124
+ lines.push(`> ${context}`, '');
125
+ if (techStack)
126
+ lines.push(`**Tech Stack:** ${techStack}`, '');
127
+ if (hardRules) {
128
+ lines.push('**Hard Rules (must never violate):**', hardRules, '');
129
+ }
130
+ lines.push('**Modus Commands:** `/modus:init` · `/modus:vibe` · `/modus:plan` · `/modus:spec` · `/modus:auto` · `/modus:harness`');
131
+ return lines.join('\n') + '\n';
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Business Skill sync for custom platforms
135
+ // ---------------------------------------------------------------------------
136
+ /**
137
+ * Sync a biz skill to all custom platforms that have bizSkill.enabled=true.
138
+ * Called from the `/modus:init` SKILL.md flow after writing the canonical
139
+ * `modus/knowledge/biz-{domain}/SKILL.md`.
140
+ *
141
+ * This resolves the "ongoing sync" pain point for custom platforms:
142
+ * every time biz skills are updated, this function ensures custom platform
143
+ * directories are also kept in sync automatically.
144
+ */
145
+ export function syncBizSkillToAllCustomPlatforms(projectRoot, domain, skillContent) {
146
+ const platforms = loadCustomPlatforms(projectRoot);
147
+ for (const platform of platforms) {
148
+ syncBizSkillToCustomPlatform(projectRoot, platform, domain, skillContent);
149
+ }
150
+ }
151
+ export function syncBizSkillToCustomPlatform(projectRoot, platform, domain, skillContent) {
152
+ if (!platform.bizSkill?.enabled)
153
+ return;
154
+ const outputPath = platform.bizSkill.outputPath
155
+ .replace('{domain}', domain)
156
+ .replace('{ext}', platform.fileExtension ?? 'md');
157
+ const body = platform.bizSkill.wrapper
158
+ ? platform.bizSkill.wrapper
159
+ .replace('{domain}', domain)
160
+ .replace('{content}', skillContent)
161
+ : skillContent;
162
+ const fullPath = path.join(projectRoot, outputPath);
163
+ ensureDir(path.dirname(fullPath));
164
+ writeFile(fullPath, body);
165
+ }
166
+ //# sourceMappingURL=custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/generators/custom.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { ModusConfig } from '../utils/config.js';
3
3
  export type { GenerateOptions };
4
4
  /**
5
5
  * Generate configuration files for every platform listed in `config.platforms`.
6
+ * Also generates files for custom platforms registered in `config.customPlatforms`.
6
7
  * Defaults to ['codebuddy'] when the field is absent to preserve backward compat.
7
8
  */
8
9
  export declare function generateAllPlatformFiles(projectRoot: string, config: ModusConfig, opts?: GenerateOptions): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAI9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,eAAoB,GACzB,IAAI,CAeN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAM9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,eAAoB,GACzB,IAAI,CAuBN"}
@@ -4,8 +4,11 @@ import { generateCodeBuddyFiles } from './codebuddy.js';
4
4
  import { generateClaudeFiles } from './claude.js';
5
5
  import { generateCursorFiles } from './cursor.js';
6
6
  import { generateCopilotFiles } from './copilot.js';
7
+ import { generateCodexFiles } from './codex.js';
8
+ import { generateCustomPlatformFiles } from './custom.js';
7
9
  /**
8
10
  * Generate configuration files for every platform listed in `config.platforms`.
11
+ * Also generates files for custom platforms registered in `config.customPlatforms`.
9
12
  * Defaults to ['codebuddy'] when the field is absent to preserve backward compat.
10
13
  */
11
14
  export function generateAllPlatformFiles(projectRoot, config, opts = {}) {
@@ -22,5 +25,12 @@ export function generateAllPlatformFiles(projectRoot, config, opts = {}) {
22
25
  if (platforms.includes('copilot')) {
23
26
  generateCopilotFiles(projectRoot, config, opts);
24
27
  }
28
+ if (platforms.includes('codex')) {
29
+ generateCodexFiles(projectRoot, config, opts);
30
+ }
31
+ // Custom platforms registered via /modus:platform -add
32
+ if (config.customPlatforms && config.customPlatforms.length > 0) {
33
+ generateCustomPlatformFiles(projectRoot, config, opts);
34
+ }
25
35
  }
26
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,8FAA8F;AAC9F,OAAO,EAAE,sBAAsB,EAAwB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKpD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,MAAmB,EACnB,OAAwB,EAAE;IAE1B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,CAAC;IAEpD,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,8FAA8F;AAC9F,OAAO,EAAE,sBAAsB,EAAwB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAK1D;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,MAAmB,EACnB,OAAwB,EAAE;IAE1B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,CAAC;IAEpD,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,uDAAuD;IACvD,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /** Supported AI platform targets for file generation. */
2
- export type PlatformId = 'codebuddy' | 'claude' | 'cursor' | 'copilot';
2
+ export type PlatformId = 'codebuddy' | 'claude' | 'cursor' | 'copilot' | 'codex';
3
3
  export interface ModusAnalyticsConfig {
4
4
  /** Whether to send usage events. Defaults to true. */
5
5
  enabled?: boolean;
@@ -63,6 +63,11 @@ export interface ModusConfig {
63
63
  * Defaults to ['codebuddy'] when omitted.
64
64
  */
65
65
  platforms?: PlatformId[];
66
+ /**
67
+ * Custom platform names registered via `/modus:platform -add`.
68
+ * Each entry corresponds to a `modus/platforms/{name}/platform.yaml` descriptor.
69
+ */
70
+ customPlatforms?: string[];
66
71
  /**
67
72
  * The modus CLI version that last wrote the platform files.
68
73
  * Written by `modus init` and `modus update`.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAKA,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;IACzB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AASD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAY3D;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAIzE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAKA,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,4EAA4E;IAC5E,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AASD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAY3D;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAIzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAgFnE,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE;QACR,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;KAC7D;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,CAAC;IAC7C,4EAA4E;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAmB;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAqFnE,MAAM,cAAc,GAAgB;IAClC,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE;QACR,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;KAC7D;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAgB,CAAC;IAC7C,4EAA4E;IAC5E,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACnD,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAmB;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modus-ai/modus",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Modus — Business-grounded AI coding accelerator for CodeBuddy IDE",
5
5
  "keywords": [
6
6
  "ai",