@modus-ai/modus 0.1.0 → 0.1.2

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 (57) hide show
  1. package/dist/cli/index.js +41 -2
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/commands/global.d.ts +15 -0
  4. package/dist/commands/global.d.ts.map +1 -0
  5. package/dist/commands/global.js +222 -0
  6. package/dist/commands/global.js.map +1 -0
  7. package/dist/commands/init.d.ts +17 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +278 -58
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/update.d.ts +8 -1
  12. package/dist/commands/update.d.ts.map +1 -1
  13. package/dist/commands/update.js +27 -4
  14. package/dist/commands/update.js.map +1 -1
  15. package/dist/generators/codebuddy.d.ts +5 -1
  16. package/dist/generators/codebuddy.d.ts.map +1 -1
  17. package/dist/generators/codebuddy.js +358 -5
  18. package/dist/generators/codebuddy.js.map +1 -1
  19. package/dist/utils/config.d.ts +17 -0
  20. package/dist/utils/config.d.ts.map +1 -1
  21. package/dist/utils/config.js +15 -0
  22. package/dist/utils/config.js.map +1 -1
  23. package/package.json +1 -1
  24. package/templates/agents/modus-harness-00-skills-builder.md +12 -0
  25. package/templates/agents/modus-harness-01-5-design.md +40 -0
  26. package/templates/agents/modus-harness-01-analysis.md +14 -0
  27. package/templates/agents/modus-harness-02-dev.md +16 -0
  28. package/templates/agents/modus-harness-03-test.md +16 -0
  29. package/templates/agents/modus-harness-04-perf.md +16 -0
  30. package/templates/agents/modus-harness-05-security.md +16 -0
  31. package/templates/agents/modus-harness-06-review.md +16 -0
  32. package/templates/agents/modus-harness-07-deploy.md +16 -0
  33. package/templates/commands/modus.md +25 -0
  34. package/templates/hooks/post-tool-use-lint.py +78 -0
  35. package/templates/hooks/pre-compact-save.py +117 -0
  36. package/templates/hooks/pre-tool-use-safety.py +80 -0
  37. package/templates/hooks/session-start.py +86 -0
  38. package/templates/hooks/stop-update-skills.py +91 -0
  39. package/templates/hooks-config.json +83 -0
  40. package/templates/rules/modus-constitution/RULE.mdc +40 -0
  41. package/templates/rules/modus-design-brief/RULE.mdc +127 -0
  42. package/templates/rules/modus-workflow/RULE.mdc +64 -0
  43. package/templates/skills/modus-design-brief/SKILL.md +324 -0
  44. package/templates/skills/modus-harness/SKILL.md +17 -0
  45. package/templates/skills/modus-harness-agents/00-skills-builder/SKILL.md +80 -6
  46. package/templates/skills/modus-harness-agents/01-5-design/SKILL.md +140 -0
  47. package/templates/skills/modus-harness-agents/01-analysis/SKILL.md +7 -0
  48. package/templates/skills/modus-harness-agents/02-dev/SKILL.md +7 -0
  49. package/templates/skills/modus-harness-agents/03-test/SKILL.md +7 -0
  50. package/templates/skills/modus-harness-agents/04-perf/SKILL.md +7 -0
  51. package/templates/skills/modus-harness-agents/05-security/SKILL.md +7 -0
  52. package/templates/skills/modus-harness-agents/06-review/SKILL.md +7 -0
  53. package/templates/skills/modus-harness-agents/07-deploy/SKILL.md +7 -0
  54. package/templates/skills/modus-init/SKILL.md +24 -0
  55. package/templates/skills/modus-plan/SKILL.md +65 -8
  56. package/templates/skills/modus-spec/SKILL.md +71 -4
  57. package/templates/skills/modus-vibe/SKILL.md +89 -6
package/dist/cli/index.js CHANGED
@@ -4,6 +4,7 @@ import { createRequire } from 'node:module';
4
4
  import { runInit } from '../commands/init.js';
5
5
  import { runUpdate } from '../commands/update.js';
6
6
  import { runConfig } from '../commands/config.js';
7
+ import { runGlobalInit, runGlobalList } from '../commands/global.js';
7
8
  const require = createRequire(import.meta.url);
8
9
  const pkg = require('../../package.json');
9
10
  const program = new Command();
@@ -15,17 +16,36 @@ program
15
16
  .command('init')
16
17
  .description('Initialize Modus in the current project (generates .codebuddy/ files)')
17
18
  .option('--root <path>', 'Project root directory', process.cwd())
19
+ .option('-y, --yes', 'Skip all prompts; use flags + defaults (non-interactive)')
20
+ .option('--tech-stack <stack>', 'Tech stack description, written to modus/config.yaml')
21
+ .option('--context <text>', 'One-line project description used as AI context')
22
+ .option('--tapd-project-id <id>', 'TAPD project ID (optional, for /harness command)')
23
+ .option('--team-name <name>', 'Team name — copies Skills from ~/.codebuddy/team/<name>/')
24
+ .option('--commands <csv>', 'Comma-separated list of commands to enable (default: all)')
25
+ .option('--force', 'Re-generate files even if already initialized (use with --yes)')
26
+ .option('--sync-scopes', 'Re-sync Skills from global/team directories (overwrites project copies)')
18
27
  .action(async (opts) => {
19
28
  const projectRoot = path.resolve(opts.root);
20
- await runInit(projectRoot);
29
+ await runInit(projectRoot, {
30
+ yes: opts.yes,
31
+ techStack: opts.techStack,
32
+ context: opts.context,
33
+ tapdProjectId: opts.tapdProjectId,
34
+ teamName: opts.teamName,
35
+ commands: opts.commands,
36
+ force: opts.force,
37
+ syncScopes: opts.syncScopes,
38
+ });
21
39
  });
22
40
  program
23
41
  .command('update')
24
42
  .description('Re-generate .codebuddy/ skill and command files from latest templates')
25
43
  .option('--root <path>', 'Project root directory', process.cwd())
44
+ .option('--sync-scopes', 'Re-sync Skills/Rules from global/team directories (overwrites project copies)')
26
45
  .action(async (opts) => {
27
46
  const projectRoot = path.resolve(opts.root);
28
- await runUpdate(projectRoot);
47
+ const updateOpts = { syncScopes: Boolean(opts.syncScopes) };
48
+ await runUpdate(projectRoot, updateOpts);
29
49
  });
30
50
  program
31
51
  .command('config [subcommand]')
@@ -35,5 +55,24 @@ program
35
55
  const projectRoot = path.resolve(opts.root);
36
56
  await runConfig(projectRoot, subcommand);
37
57
  });
58
+ // ---------------------------------------------------------------------------
59
+ // modus global — manage global / team-level Skills and Rules
60
+ // ---------------------------------------------------------------------------
61
+ const globalCmd = program
62
+ .command('global')
63
+ .description('Manage global (~/.codebuddy/global/) and team-level (~/.codebuddy/team/) Skills');
64
+ globalCmd
65
+ .command('init')
66
+ .description('Initialize global or team-level Modus directory with starter Skills')
67
+ .option('--team <name>', 'Target a team-level directory (~/.codebuddy/team/<name>/)')
68
+ .action(async (opts) => {
69
+ await runGlobalInit({ team: opts.team });
70
+ });
71
+ globalCmd
72
+ .command('list')
73
+ .description('List all Skills available in global and team directories')
74
+ .action(async () => {
75
+ await runGlobalList();
76
+ });
38
77
  program.parse(process.argv);
39
78
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,mEAAmE,CAAC;KAChF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface GlobalCliOptions {
2
+ team?: string;
3
+ }
4
+ /**
5
+ * Initialize a global or team-level Modus directory with starter Skills.
6
+ *
7
+ * Global: ~/.codebuddy/global/
8
+ * Team: ~/.codebuddy/team/{teamName}/
9
+ */
10
+ export declare function runGlobalInit(opts?: GlobalCliOptions): Promise<void>;
11
+ /**
12
+ * List all Skills available in global and all team directories.
13
+ */
14
+ export declare function runGlobalList(): Promise<void>;
15
+ //# sourceMappingURL=global.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../../src/commands/global.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAyBD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD9E;AAMD;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBnD"}
@@ -0,0 +1,222 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import chalk from 'chalk';
4
+ import { getGlobalDir, getTeamDir } from '../utils/config.js';
5
+ import { ensureDir, writeFile, listDirs, fileExists, readFile } from '../utils/file-system.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Scope directory helpers
8
+ // ---------------------------------------------------------------------------
9
+ function getScopeDir(opts) {
10
+ if (opts.team) {
11
+ return {
12
+ dir: getTeamDir(opts.team),
13
+ label: `团队(${opts.team})`,
14
+ scope: `team:${opts.team}`,
15
+ };
16
+ }
17
+ return {
18
+ dir: getGlobalDir(),
19
+ label: '全局(Global)',
20
+ scope: 'global',
21
+ };
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // modus global init
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * Initialize a global or team-level Modus directory with starter Skills.
28
+ *
29
+ * Global: ~/.codebuddy/global/
30
+ * Team: ~/.codebuddy/team/{teamName}/
31
+ */
32
+ export async function runGlobalInit(opts = {}) {
33
+ console.log(chalk.bold('\n Modus — global init\n'));
34
+ const { dir, label, scope } = getScopeDir(opts);
35
+ const skillsDir = path.join(dir, 'skills');
36
+ const rulesDir = path.join(dir, 'rules');
37
+ ensureDir(skillsDir);
38
+ ensureDir(rulesDir);
39
+ const conventionsSkillDir = path.join(skillsDir, 'modus-team-conventions');
40
+ const techWikiSkillDir = path.join(skillsDir, 'modus-tech-wiki');
41
+ const alreadyExists = fileExists(path.join(conventionsSkillDir, 'SKILL.md')) ||
42
+ fileExists(path.join(techWikiSkillDir, 'SKILL.md'));
43
+ if (alreadyExists) {
44
+ console.log(chalk.yellow(` ${label} 目录已存在 Skills,将跳过已有文件(使用 --force 可覆盖)。`));
45
+ console.log(chalk.gray(` 目录: ${dir}\n`));
46
+ }
47
+ else {
48
+ console.log(chalk.cyan(` 正在初始化 ${label} 目录...`));
49
+ }
50
+ // Write starter modus-team-conventions Skill
51
+ const conventionsSkillPath = path.join(conventionsSkillDir, 'SKILL.md');
52
+ if (!fileExists(conventionsSkillPath)) {
53
+ ensureDir(conventionsSkillDir);
54
+ writeFile(conventionsSkillPath, buildConventionsSkill(scope, opts.team));
55
+ console.log(chalk.green(` ✓ ${conventionsSkillDir}/SKILL.md`));
56
+ }
57
+ else {
58
+ console.log(chalk.gray(` - 已跳过(已存在): modus-team-conventions/SKILL.md`));
59
+ }
60
+ // Write starter modus-tech-wiki Skill
61
+ const techWikiSkillPath = path.join(techWikiSkillDir, 'SKILL.md');
62
+ if (!fileExists(techWikiSkillPath)) {
63
+ ensureDir(techWikiSkillDir);
64
+ writeFile(techWikiSkillPath, buildTechWikiSkill(scope, opts.team));
65
+ console.log(chalk.green(` ✓ ${techWikiSkillDir}/SKILL.md`));
66
+ }
67
+ else {
68
+ console.log(chalk.gray(` - 已跳过(已存在): modus-tech-wiki/SKILL.md`));
69
+ }
70
+ console.log(chalk.bold(`\n ${label} 目录已初始化:`));
71
+ console.log(chalk.white(` ${dir}`));
72
+ console.log(chalk.dim('\n 下一步:'));
73
+ console.log(chalk.dim(` 1. 编辑上述 SKILL.md 文件,填写团队代码规范、已知坑、架构决策`));
74
+ console.log(chalk.dim(` 2. 在项目中运行 modus init --team-name ${opts.team ?? '<团队名>'}`));
75
+ console.log(chalk.dim(` → Modus 会将这些 Skills 自动复制到项目 .codebuddy/ 目录\n`));
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // modus global list
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * List all Skills available in global and all team directories.
82
+ */
83
+ export async function runGlobalList() {
84
+ console.log(chalk.bold('\n Modus — global list\n'));
85
+ // Global scope
86
+ const globalDir = getGlobalDir();
87
+ listScopeSkills(globalDir, '全局(Global)', 'global');
88
+ // All team scopes
89
+ const teamBaseDir = path.join(require_homedir(), '.codebuddy', 'team');
90
+ if (fs.existsSync(teamBaseDir)) {
91
+ const teams = listDirs(teamBaseDir);
92
+ if (teams.length === 0) {
93
+ console.log(chalk.gray(' 暂无团队目录(运行 modus global init --team <name> 创建)\n'));
94
+ }
95
+ else {
96
+ for (const teamName of teams) {
97
+ listScopeSkills(getTeamDir(teamName), `团队(${teamName})`, `team:${teamName}`);
98
+ }
99
+ }
100
+ }
101
+ else {
102
+ console.log(chalk.gray(' 暂无团队目录\n'));
103
+ }
104
+ }
105
+ function listScopeSkills(dir, label, scope) {
106
+ const skillsDir = path.join(dir, 'skills');
107
+ if (!fs.existsSync(skillsDir)) {
108
+ console.log(chalk.yellow(` ${label} [${scope}] — 未初始化(目录不存在)`));
109
+ console.log(chalk.gray(` 路径: ${dir}\n`));
110
+ return;
111
+ }
112
+ const skillDirs = listDirs(skillsDir);
113
+ if (skillDirs.length === 0) {
114
+ console.log(chalk.yellow(` ${label} [${scope}] — 无 Skills`));
115
+ console.log(chalk.gray(` 路径: ${dir}\n`));
116
+ return;
117
+ }
118
+ console.log(chalk.bold(` ${label} [${scope}]`));
119
+ console.log(chalk.gray(` 路径: ${dir}`));
120
+ for (const skillDir of skillDirs) {
121
+ const skillPath = path.join(skillsDir, skillDir, 'SKILL.md');
122
+ if (fileExists(skillPath)) {
123
+ const maturity = extractMaturity(readFile(skillPath));
124
+ const maturityBadge = maturity === 'proven' ? chalk.green(maturity)
125
+ : maturity === 'verified' ? chalk.cyan(maturity)
126
+ : chalk.gray(maturity || 'draft');
127
+ console.log(` ${chalk.white(skillDir)} [${maturityBadge}]`);
128
+ }
129
+ }
130
+ console.log('');
131
+ }
132
+ function extractMaturity(skillContent) {
133
+ const match = skillContent.match(/^maturity:\s*(.+)$/m);
134
+ return match ? match[1].trim().replace(/['"]/g, '') : 'draft';
135
+ }
136
+ function require_homedir() {
137
+ return process.env['HOME'] ?? process.env['USERPROFILE'] ?? '/tmp';
138
+ }
139
+ // ---------------------------------------------------------------------------
140
+ // Starter Skill content builders
141
+ // ---------------------------------------------------------------------------
142
+ function buildConventionsSkill(scope, teamName) {
143
+ const scopeLabel = teamName ? `团队(${teamName})` : '全局';
144
+ return `---
145
+ name: modus-team-conventions
146
+ description: ${scopeLabel}团队约定(Layer 0-T):代码规范、提交规范、硬性约束。适用于所有项目。
147
+ maturity: draft
148
+ source: ${scope}
149
+ source_synced: ${new Date().toISOString().slice(0, 10)}
150
+ allowed-tools: Read
151
+ disable: false
152
+ ---
153
+
154
+ # 团队约定 [MODUS:TEAM]
155
+
156
+ > 此 Skill 存放于 ${scope} 目录,初始化新项目时会自动复制到项目 .codebuddy/skills/modus-team-conventions/
157
+
158
+ ## 代码规范
159
+
160
+ <!-- 填写团队代码规范,例如: -->
161
+ <!-- - 命名规范:变量/函数使用 camelCase,常量使用 UPPER_SNAKE_CASE -->
162
+ <!-- - 注释规范:公共 API 必须有 JSDoc/JavaDoc 注释 -->
163
+
164
+ ## 提交规范
165
+
166
+ <!-- 填写 Git Commit 规范,例如: -->
167
+ <!-- - 格式:feat/fix/docs/refactor/test/chore: 描述 -->
168
+ <!-- - 每次提交只做一件事 -->
169
+
170
+ ## 硬性约束 [guideline]
171
+
172
+ <!-- 填写团队硬性约束(AI 不可违反),例如: -->
173
+ <!-- - Mapper 接口必须在 dao 包下 -->
174
+ <!-- - 金额字段使用 Long(单位:分),禁止 float/double -->
175
+
176
+ ## 已知风险 [pitfall]
177
+
178
+ <!-- 填写团队遇到过的坑 -->
179
+
180
+ ## 架构决策 [decision]
181
+
182
+ <!-- 填写团队级别的架构决策 -->
183
+ `;
184
+ }
185
+ function buildTechWikiSkill(scope, teamName) {
186
+ const scopeLabel = teamName ? `团队(${teamName})` : '全局';
187
+ return `---
188
+ name: modus-tech-wiki
189
+ description: ${scopeLabel}跨项目技术知识(Layer 1):架构决策、反模式库、性能优化经验。
190
+ maturity: draft
191
+ source: ${scope}
192
+ source_synced: ${new Date().toISOString().slice(0, 10)}
193
+ allowed-tools: Read
194
+ disable: false
195
+ ---
196
+
197
+ # 技术知识库 [MODUS:TECH]
198
+
199
+ > 此 Skill 存放于 ${scope} 目录,初始化新项目时会自动复制到项目 .codebuddy/skills/modus-tech-wiki/
200
+
201
+ ## 架构决策 [decision]
202
+
203
+ <!-- 跨项目通用架构决策,例如: -->
204
+ <!-- - [decision] 高并发预算扣减:选择 Redis+Lua 原子操作,而非数据库乐观锁 -->
205
+ <!-- 原因:Lua 脚本保证原子性,避免重试风暴 -->
206
+
207
+ ## 反模式库 [pitfall]
208
+
209
+ <!-- 跨项目已知坑,例如: -->
210
+ <!-- - [pitfall] 循环内调用数据库(N+1 查询):应使用 IN 批量查询 + Map 映射 -->
211
+ <!-- - [pitfall] 大事务包含外部 HTTP 调用:外部调用耗时不可控,会导致数据库连接耗尽 -->
212
+
213
+ ## 性能优化经验 [guideline]
214
+
215
+ <!-- 跨项目性能经验 -->
216
+
217
+ ## 安全规范 [guideline]
218
+
219
+ <!-- 跨项目安全规范 -->
220
+ `;
221
+ }
222
+ //# sourceMappingURL=global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.js","sourceRoot":"","sources":["../../src/commands/global.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,18 @@
1
- export declare function runInit(projectRoot: string): Promise<void>;
1
+ /** CLI flags for `modus init` (interactive vs non-interactive) */
2
+ export interface InitCliOptions {
3
+ /** Skip all prompts; use flags + defaults */
4
+ yes?: boolean;
5
+ techStack?: string;
6
+ context?: string;
7
+ tapdProjectId?: string;
8
+ /** Team name — references ~/.codebuddy/team/{teamName}/ for Skills reuse */
9
+ teamName?: string;
10
+ /** Comma-separated: init,vibe,plan,spec,harness */
11
+ commands?: string;
12
+ /** When modus/ already exists, regenerate without asking */
13
+ force?: boolean;
14
+ /** Re-sync Skills from global/team directories (overwrite project copies) */
15
+ syncScopes?: boolean;
16
+ }
17
+ export declare function runInit(projectRoot: string, cli?: InitCliOptions): Promise<void>;
2
18
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FhE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAWA,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAqGD,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0N1F"}