@miniidealab/openlogos 0.7.3 → 0.8.1

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 (68) hide show
  1. package/codex-plugin-template/plugin.json +10 -0
  2. package/codex-plugin-template/session-start.sh +125 -0
  3. package/dist/commands/change.d.ts +1 -1
  4. package/dist/commands/change.d.ts.map +1 -1
  5. package/dist/commands/change.js +75 -6
  6. package/dist/commands/change.js.map +1 -1
  7. package/dist/commands/detect.d.ts.map +1 -1
  8. package/dist/commands/detect.js +15 -1
  9. package/dist/commands/detect.js.map +1 -1
  10. package/dist/commands/init.d.ts +13 -4
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +181 -44
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/launch.d.ts +1 -1
  15. package/dist/commands/launch.d.ts.map +1 -1
  16. package/dist/commands/launch.js +71 -16
  17. package/dist/commands/launch.js.map +1 -1
  18. package/dist/commands/module.d.ts +5 -0
  19. package/dist/commands/module.d.ts.map +1 -0
  20. package/dist/commands/module.js +231 -0
  21. package/dist/commands/module.js.map +1 -0
  22. package/dist/commands/next.d.ts +22 -0
  23. package/dist/commands/next.d.ts.map +1 -0
  24. package/dist/commands/next.js +195 -0
  25. package/dist/commands/next.js.map +1 -0
  26. package/dist/commands/status.d.ts +43 -2
  27. package/dist/commands/status.d.ts.map +1 -1
  28. package/dist/commands/status.js +351 -62
  29. package/dist/commands/status.js.map +1 -1
  30. package/dist/commands/sync.d.ts.map +1 -1
  31. package/dist/commands/sync.js +38 -5
  32. package/dist/commands/sync.js.map +1 -1
  33. package/dist/commands/verify.js +2 -2
  34. package/dist/commands/verify.js.map +1 -1
  35. package/dist/i18n.d.ts +1 -1
  36. package/dist/i18n.d.ts.map +1 -1
  37. package/dist/i18n.js +95 -15
  38. package/dist/i18n.js.map +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +48 -8
  41. package/dist/index.js.map +1 -1
  42. package/dist/lib/migrate-lifecycle.d.ts +13 -0
  43. package/dist/lib/migrate-lifecycle.d.ts.map +1 -0
  44. package/dist/lib/migrate-lifecycle.js +55 -0
  45. package/dist/lib/migrate-lifecycle.js.map +1 -0
  46. package/dist/lib/sync-resource-index.js +5 -5
  47. package/dist/lib/sync-resource-index.js.map +1 -1
  48. package/opencode-plugin-template/commands/openlogos-launch.md +8 -3
  49. package/opencode-plugin-template/openlogos.js +10 -1
  50. package/package.json +8 -4
  51. package/skills/architecture-designer/SKILL.en.md +1 -1
  52. package/skills/architecture-designer/SKILL.md +1 -1
  53. package/skills/prd-writer/SKILL.en.md +1 -1
  54. package/skills/prd-writer/SKILL.md +1 -1
  55. package/skills/product-designer/SKILL.en.md +1 -1
  56. package/skills/product-designer/SKILL.md +1 -1
  57. package/skills/scenario-architect/SKILL.en.md +2 -2
  58. package/skills/scenario-architect/SKILL.md +5 -5
  59. package/skills/test-writer/SKILL.en.md +1 -1
  60. package/skills/test-writer/SKILL.md +2 -2
  61. package/spec/change-management.md +5 -0
  62. package/spec/cli-json-output.md +63 -6
  63. package/spec/codex-plugin.md +138 -0
  64. package/spec/directory-convention.md +4 -2
  65. package/spec/logos-project.md +38 -5
  66. package/spec/module-naming-convention.md +72 -0
  67. package/spec/opencode-plugin.md +3 -3
  68. package/spec/workflow.md +1 -1
@@ -2,6 +2,84 @@ import { existsSync, readdirSync, statSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { readLocale, t, PHASE_KEYS, SUGGEST_KEYS } from '../i18n.js';
4
4
  import { makeEnvelope, makeErrorEnvelope } from '../lib/json-output.js';
5
+ import { parse as parseYaml } from 'yaml';
6
+ const MERGE_SUPPORTED_DELTA_DIRS = ['prd', 'api', 'database', 'scenario'];
7
+ // Phase paths indexed by PHASE_KEYS order
8
+ const PHASE_SUBPATHS = [
9
+ 'logos/resources/prd/1-product-requirements',
10
+ 'logos/resources/prd/2-product-design',
11
+ 'logos/resources/prd/3-technical-plan/1-architecture',
12
+ 'logos/resources/prd/3-technical-plan/2-scenario-implementation',
13
+ 'logos/resources/api',
14
+ 'logos/resources/database',
15
+ 'logos/resources/test',
16
+ 'logos/resources/scenario',
17
+ 'logos/resources/implementation',
18
+ 'logos/resources/verify',
19
+ ];
20
+ // Phases that require per-scenario file coverage
21
+ const SCENARIO_PHASES = new Set(['phase.3-1', 'phase.3-3a']);
22
+ function isProposalTemplateFilled(content) {
23
+ const normalized = content.trim();
24
+ if (!normalized)
25
+ return false;
26
+ return normalized.includes('## 变更原因')
27
+ && normalized.includes('## 变更类型')
28
+ && normalized.includes('## 变更范围')
29
+ && normalized.includes('## 变更概述')
30
+ && !normalized.includes('[为什么要做这个变更?')
31
+ && !normalized.includes('[需求级 / 设计级 / 接口级 / 代码级]')
32
+ && !normalized.includes('[列表]')
33
+ && !normalized.includes('[用 1-3 段话概述具体改什么]');
34
+ }
35
+ function isTasksTemplateFilled(content) {
36
+ const normalized = content.trim();
37
+ if (!normalized)
38
+ return false;
39
+ return !normalized.includes('更新需求文档的场景和验收条件')
40
+ && !normalized.includes('更新产品设计文档的功能规格')
41
+ && !normalized.includes('更新原型')
42
+ && !normalized.includes('更新场景时序图')
43
+ && !normalized.includes('更新 API YAML')
44
+ && !normalized.includes('更新 DB DDL')
45
+ && !normalized.includes('更新 API 编排测试用例')
46
+ && !normalized.includes('实现代码变更')
47
+ && !normalized.includes('部署到测试环境')
48
+ && !normalized.includes('运行编排验收');
49
+ }
50
+ function countMergeableDeltaFiles(proposalDir) {
51
+ let count = 0;
52
+ for (const category of MERGE_SUPPORTED_DELTA_DIRS) {
53
+ count += listFiles(join(proposalDir, 'deltas', category)).length;
54
+ }
55
+ return count;
56
+ }
57
+ function countTasks(content) {
58
+ const checked = (content.match(/^- \[x\]/gim) ?? []).length;
59
+ const unchecked = (content.match(/^- \[ \]/gm) ?? []).length;
60
+ return { checked, total: checked + unchecked };
61
+ }
62
+ function allTasksChecked(content) {
63
+ const { checked, total } = countTasks(content);
64
+ return total > 0 && checked === total;
65
+ }
66
+ export function detectProposalStep(proposalDir) {
67
+ const proposalContent = existsSync(join(proposalDir, 'proposal.md'))
68
+ ? readFileSync(join(proposalDir, 'proposal.md'), 'utf-8') : '';
69
+ const tasksContent = existsSync(join(proposalDir, 'tasks.md'))
70
+ ? readFileSync(join(proposalDir, 'tasks.md'), 'utf-8') : '';
71
+ const mergeableDeltaCount = countMergeableDeltaFiles(proposalDir);
72
+ if (!isProposalTemplateFilled(proposalContent) || !isTasksTemplateFilled(tasksContent)) {
73
+ return 'writing';
74
+ }
75
+ if (mergeableDeltaCount > 0 && allTasksChecked(tasksContent)) {
76
+ return 'ready-to-merge';
77
+ }
78
+ if (mergeableDeltaCount > 0) {
79
+ return 'in-progress';
80
+ }
81
+ return 'implementing';
82
+ }
5
83
  export function listFiles(dir) {
6
84
  if (!existsSync(dir))
7
85
  return [];
@@ -17,21 +95,131 @@ export function listFiles(dir) {
17
95
  return [];
18
96
  }
19
97
  }
20
- export function collectStatusData(root) {
98
+ function deriveModulePhaseProgress(root, moduleId, scenarios, locale) {
99
+ const progress = {};
100
+ for (let i = 0; i < PHASE_KEYS.length; i++) {
101
+ const key = PHASE_KEYS[i];
102
+ const dir = join(root, PHASE_SUBPATHS[i]);
103
+ if (SCENARIO_PHASES.has(key)) {
104
+ // Per-scenario coverage check
105
+ const suffix = key === 'phase.3-1' ? '' : '-test-cases';
106
+ const covered = [];
107
+ const missing = [];
108
+ for (const s of scenarios) {
109
+ const pattern = `${moduleId}-${s.id}`;
110
+ const files = listFiles(dir);
111
+ const found = files.some(f => f.includes(pattern) && (suffix === '' || f.includes(suffix)));
112
+ if (found)
113
+ covered.push(s.id);
114
+ else
115
+ missing.push(s.id);
116
+ }
117
+ progress[key] = {
118
+ done: missing.length === 0 && scenarios.length > 0,
119
+ skipped: false,
120
+ scenario_coverage: { total: scenarios.length, covered: covered.length, missing },
121
+ };
122
+ }
123
+ else {
124
+ const files = listFiles(dir);
125
+ progress[key] = { done: files.length > 0, skipped: false };
126
+ }
127
+ }
128
+ // Mark skipped: empty phase before a done phase
129
+ const keys = PHASE_KEYS;
130
+ const lastDoneIdx = keys.reduce((acc, k, i) => (progress[k].done ? i : acc), -1);
131
+ for (let i = 0; i < lastDoneIdx; i++) {
132
+ if (!progress[keys[i]].done)
133
+ progress[keys[i]].skipped = true;
134
+ }
135
+ const currentPhase = keys.find(k => !progress[k].done && !progress[k].skipped) ?? null;
136
+ return { progress, currentPhase };
137
+ }
138
+ function buildModuleStatusItem(root, mod, scenarios, locale, guardActiveChange, guardModule) {
139
+ if (mod.lifecycle === 'launched') {
140
+ let activeChange = null;
141
+ if (guardActiveChange && guardModule === mod.id) {
142
+ const proposalDir = join(root, 'logos', 'changes', guardActiveChange);
143
+ const step = existsSync(proposalDir) ? detectProposalStep(proposalDir) : 'writing';
144
+ const stepLabel = t(locale, `status.proposalStep.${step}`);
145
+ const hasProposal = existsSync(join(proposalDir, 'proposal.md'));
146
+ const hasTasksFile = existsSync(join(proposalDir, 'tasks.md'));
147
+ const tasksContent = hasTasksFile ? readFileSync(join(proposalDir, 'tasks.md'), 'utf-8') : '';
148
+ const { checked, total } = countTasks(tasksContent);
149
+ const deltaCount = countMergeableDeltaFiles(proposalDir);
150
+ activeChange = {
151
+ slug: guardActiveChange,
152
+ proposal_step: step,
153
+ proposal_step_label: stepLabel,
154
+ has_proposal: hasProposal,
155
+ has_tasks: hasTasksFile,
156
+ tasks_checked: checked,
157
+ tasks_total: total,
158
+ delta_count: deltaCount,
159
+ };
160
+ }
161
+ let suggestion;
162
+ if (activeChange) {
163
+ if (activeChange.proposal_step === 'ready-to-merge') {
164
+ suggestion = locale === 'zh'
165
+ ? `运行 openlogos merge ${activeChange.slug}`
166
+ : `Run openlogos merge ${activeChange.slug}`;
167
+ }
168
+ else {
169
+ suggestion = locale === 'zh'
170
+ ? `继续实现 ${activeChange.slug},完成后运行 openlogos merge ${activeChange.slug}`
171
+ : `Continue implementing ${activeChange.slug}, then run openlogos merge ${activeChange.slug}`;
172
+ }
173
+ }
174
+ else if (guardActiveChange && guardModule !== mod.id) {
175
+ suggestion = locale === 'zh'
176
+ ? `当前提案 ${guardActiveChange}(归属 ${guardModule ?? '?'})未完成,请先完成后再为此模块创建新提案`
177
+ : `Active proposal ${guardActiveChange} (module: ${guardModule ?? '?'}) is in progress — finish it before creating a new proposal for this module`;
178
+ }
179
+ else {
180
+ suggestion = locale === 'zh'
181
+ ? '运行 openlogos change <slug> 创建新提案'
182
+ : 'Run openlogos change <slug> to create a new change proposal';
183
+ }
184
+ return {
185
+ id: mod.id,
186
+ name: mod.name,
187
+ lifecycle: 'launched',
188
+ current_phase: null,
189
+ current_phase_label: null,
190
+ phase_progress: null,
191
+ active_change: activeChange,
192
+ suggestion,
193
+ };
194
+ }
195
+ // initial lifecycle
196
+ const { progress, currentPhase } = deriveModulePhaseProgress(root, mod.id, scenarios, locale);
197
+ const currentPhaseLabel = currentPhase ? t(locale, currentPhase) : null;
198
+ let suggestion;
199
+ if (!currentPhase) {
200
+ suggestion = locale === 'zh' ? '所有阶段已完成' : 'All phases complete';
201
+ }
202
+ else {
203
+ const suggestKey = SUGGEST_KEYS[currentPhase];
204
+ suggestion = suggestKey
205
+ ? t(locale, suggestKey)
206
+ : (locale === 'zh' ? '继续推进当前阶段' : 'Continue current phase');
207
+ }
208
+ return {
209
+ id: mod.id,
210
+ name: mod.name,
211
+ lifecycle: 'initial',
212
+ current_phase: currentPhase,
213
+ current_phase_label: currentPhaseLabel,
214
+ phase_progress: progress,
215
+ active_change: null,
216
+ suggestion,
217
+ };
218
+ }
219
+ export function collectStatusData(root, filterModuleId) {
21
220
  const configPath = join(root, 'logos', 'logos.config.json');
22
221
  const locale = readLocale(root);
23
- const phasePaths = [
24
- join(root, 'logos/resources/prd/1-product-requirements'),
25
- join(root, 'logos/resources/prd/2-product-design'),
26
- join(root, 'logos/resources/prd/3-technical-plan/1-architecture'),
27
- join(root, 'logos/resources/prd/3-technical-plan/2-scenario-implementation'),
28
- join(root, 'logos/resources/api'),
29
- join(root, 'logos/resources/database'),
30
- join(root, 'logos/resources/test'),
31
- join(root, 'logos/resources/scenario'),
32
- join(root, 'logos/resources/implementation'),
33
- join(root, 'logos/resources/verify'),
34
- ];
222
+ const phasePaths = PHASE_SUBPATHS.map(p => join(root, p));
35
223
  const phases = PHASE_KEYS.map((key, i) => ({
36
224
  key,
37
225
  label: t(locale, key),
@@ -44,14 +232,10 @@ export function collectStatusData(root) {
44
232
  phase.files = listFiles(phase.path);
45
233
  phase.done = phase.files.length > 0;
46
234
  }
47
- // Auto-detect skipped phases: if a phase is empty but a later phase
48
- // is done, the empty one was intentionally skipped (e.g. CLI projects
49
- // that don't need API/DB design).
50
235
  const lastDoneIdx = phases.reduce((acc, p, i) => (p.done ? i : acc), -1);
51
236
  for (let i = 0; i < lastDoneIdx; i++) {
52
- if (!phases[i].done) {
237
+ if (!phases[i].done)
53
238
  phases[i].skipped = true;
54
- }
55
239
  }
56
240
  // Collect active proposals
57
241
  const changesDir = join(root, 'logos', 'changes');
@@ -65,27 +249,73 @@ export function collectStatusData(root) {
65
249
  continue;
66
250
  const hasProposal = existsSync(join(entryPath, 'proposal.md'));
67
251
  const hasTasks = existsSync(join(entryPath, 'tasks.md'));
68
- const deltasDir = join(entryPath, 'deltas');
69
- const deltaCount = existsSync(deltasDir) ? listFiles(deltasDir).length : 0;
252
+ const deltaCount = existsSync(join(entryPath, 'deltas')) ? listFiles(join(entryPath, 'deltas')).length : 0;
70
253
  activeProposals.push({ name: entry, hasProposal, hasTasks, deltaCount });
71
254
  }
72
255
  }
73
- // Determine current phase and suggestion (skip over skipped phases)
74
256
  const firstIncomplete = phases.find(p => !p.done && !p.skipped);
75
257
  const allDone = !firstIncomplete;
76
258
  let lifecycle = 'initial';
77
259
  let sourceRoots = null;
78
260
  try {
79
261
  const config = JSON.parse(readFileSync(configPath, 'utf-8'));
80
- lifecycle = config.lifecycle || 'initial';
81
262
  sourceRoots = config.sourceRoots ?? null;
82
263
  }
83
264
  catch { /* ignore */ }
265
+ // Read scenarios and raw modules from logos-project.yaml
266
+ const projectYamlPath = join(root, 'logos', 'logos-project.yaml');
267
+ let rawModules;
268
+ let scenarios = [];
269
+ if (existsSync(projectYamlPath)) {
270
+ try {
271
+ const yaml = parseYaml(readFileSync(projectYamlPath, 'utf-8'));
272
+ if (Array.isArray(yaml?.modules)) {
273
+ rawModules = yaml.modules.map(m => ({
274
+ id: m.id,
275
+ name: m.name,
276
+ lifecycle: (m.lifecycle === 'launched' ? 'launched' : 'initial'),
277
+ }));
278
+ // Derive project lifecycle from modules
279
+ if (rawModules.some(m => m.lifecycle === 'launched')) {
280
+ lifecycle = 'launched';
281
+ }
282
+ }
283
+ if (Array.isArray(yaml?.scenarios)) {
284
+ scenarios = yaml.scenarios;
285
+ }
286
+ }
287
+ catch { /* ignore */ }
288
+ }
289
+ // Read guard
290
+ let activeChange = null;
291
+ let proposalStep = null;
292
+ let guardModule = null;
293
+ const guardPath = join(root, 'logos', '.openlogos-guard');
294
+ if (existsSync(guardPath)) {
295
+ try {
296
+ const guard = JSON.parse(readFileSync(guardPath, 'utf-8'));
297
+ activeChange = guard.activeChange || null;
298
+ guardModule = guard.module || null;
299
+ if (activeChange) {
300
+ const proposalDir = join(root, 'logos', 'changes', activeChange);
301
+ proposalStep = existsSync(proposalDir) ? detectProposalStep(proposalDir) : 'writing';
302
+ }
303
+ }
304
+ catch { /* ignore */ }
305
+ }
306
+ // Build module status items
307
+ let modules;
308
+ if (rawModules !== undefined) {
309
+ const filtered = filterModuleId
310
+ ? rawModules.filter(m => m.id === filterModuleId)
311
+ : rawModules;
312
+ modules = filtered.map(m => buildModuleStatusItem(root, m, scenarios, locale, activeChange, guardModule));
313
+ }
84
314
  let suggestion;
85
315
  if (allDone) {
86
- suggestion = lifecycle === 'initial'
87
- ? t(locale, 'launch.suggest')
88
- : t(locale, 'status.allDoneHint').trim();
316
+ suggestion = lifecycle === 'launched'
317
+ ? t(locale, 'status.allDoneHint').trim()
318
+ : t(locale, 'launch.suggest');
89
319
  }
90
320
  else {
91
321
  const suggestKey = SUGGEST_KEYS[firstIncomplete.key];
@@ -93,6 +323,7 @@ export function collectStatusData(root) {
93
323
  }
94
324
  return {
95
325
  phases: phases.map(p => ({ key: p.key, label: p.label, done: p.done, skipped: p.skipped, files: p.files })),
326
+ ...(modules !== undefined ? { modules } : {}),
96
327
  active_proposals: activeProposals.map(p => ({
97
328
  name: p.name,
98
329
  has_proposal: p.hasProposal,
@@ -103,10 +334,13 @@ export function collectStatusData(root) {
103
334
  suggestion,
104
335
  all_done: allDone,
105
336
  lifecycle,
337
+ locale,
106
338
  source_roots: sourceRoots,
339
+ active_change: activeChange,
340
+ proposal_step: proposalStep,
107
341
  };
108
342
  }
109
- export function status(format = 'text') {
343
+ export function status(format = 'text', moduleId) {
110
344
  const root = process.cwd();
111
345
  const configPath = join(root, 'logos', 'logos.config.json');
112
346
  if (!existsSync(configPath)) {
@@ -118,54 +352,109 @@ export function status(format = 'text') {
118
352
  console.error('Run `openlogos init` first to initialize the project.');
119
353
  process.exit(1);
120
354
  }
121
- const data = collectStatusData(root);
355
+ // Validate --module if provided
356
+ if (moduleId) {
357
+ const yamlPath = join(root, 'logos', 'logos-project.yaml');
358
+ if (existsSync(yamlPath)) {
359
+ try {
360
+ const yaml = parseYaml(readFileSync(yamlPath, 'utf-8'));
361
+ const mods = Array.isArray(yaml?.modules) ? yaml.modules : [];
362
+ if (!mods.find(m => m.id === moduleId)) {
363
+ console.error(`Error: Module '${moduleId}' not found in logos-project.yaml.`);
364
+ console.error('Run `openlogos module list` to see available modules.');
365
+ process.exit(1);
366
+ }
367
+ }
368
+ catch { /* ignore */ }
369
+ }
370
+ }
371
+ const data = collectStatusData(root, moduleId);
122
372
  if (format === 'json') {
123
373
  console.log(JSON.stringify(makeEnvelope('status', data)));
124
374
  return;
125
375
  }
126
- // Human-readable output (unchanged behavior)
127
376
  const locale = readLocale(root);
128
377
  const LINE = '─'.repeat(50);
129
- console.log('\n📊 OpenLogos Project Status\n');
130
- console.log(LINE);
131
- for (const phase of data.phases) {
132
- if (phase.skipped)
133
- continue;
134
- const icon = phase.done ? '✅' : '🔲';
135
- console.log(`${icon} ${phase.label}`);
136
- if (phase.done) {
137
- for (const f of phase.files) {
138
- console.log(` └─ ${f}`);
378
+ if (!moduleId) {
379
+ console.log('\n📊 OpenLogos Project Status\n');
380
+ console.log(LINE);
381
+ for (const phase of data.phases) {
382
+ if (phase.skipped)
383
+ continue;
384
+ const icon = phase.done ? '✅' : '🔲';
385
+ console.log(`${icon} ${phase.label}`);
386
+ if (phase.done) {
387
+ for (const f of phase.files)
388
+ console.log(` └─ ${f}`);
139
389
  }
140
390
  }
141
- }
142
- console.log(LINE);
143
- if (data.source_roots) {
144
- console.log(`\n📂 Source roots: src=[${data.source_roots.src.join(', ')}] test=[${data.source_roots.test.join(', ')}]`);
145
- }
146
- if (data.active_proposals.length > 0) {
147
- console.log(`\n📝 ${t(locale, 'status.activeProposals')}`);
148
- for (const p of data.active_proposals) {
149
- const parts = [
150
- p.has_proposal ? 'proposal.md ✓' : 'proposal.md ✗',
151
- p.has_tasks ? 'tasks.md ✓' : 'tasks.md ✗',
152
- `deltas: ${p.delta_count} files`,
153
- ];
154
- console.log(` └─ ${p.name} (${parts.join(' | ')})`);
155
- }
156
391
  console.log(LINE);
157
392
  }
158
- if (data.all_done) {
159
- console.log(`\n🎉 ${t(locale, 'status.allDone')}`);
160
- if (data.lifecycle === 'initial') {
161
- console.log(` → ${t(locale, 'launch.suggest')}`);
393
+ // Show modules
394
+ if (data.modules && data.modules.length > 0) {
395
+ if (!moduleId)
396
+ console.log(`\n🧩 ${t(locale, 'status.modules')}`);
397
+ for (const m of data.modules) {
398
+ if (m.lifecycle === 'launched') {
399
+ const ac = m.active_change;
400
+ if (ac) {
401
+ console.log(` 🔄 ${m.id} (${m.name}) [launched]`);
402
+ console.log(` ${t(locale, 'status.activeChange')}: ${ac.slug} → ${ac.proposal_step_label}`);
403
+ console.log(` tasks: ${ac.tasks_checked}/${ac.tasks_total} deltas: ${ac.delta_count}`);
404
+ }
405
+ else {
406
+ const blocked = data.active_change && data.active_change !== null;
407
+ const icon = blocked ? '⏸️ ' : '✅';
408
+ console.log(` ${icon} ${m.id} (${m.name}) [launched]`);
409
+ }
410
+ }
411
+ else {
412
+ const phase = m.current_phase ? ` → ${m.current_phase_label}` : ' → 全部完成';
413
+ console.log(` 🔄 ${m.id} (${m.name}) [initial${phase}]`);
414
+ if (m.phase_progress && m.current_phase) {
415
+ const cp = m.phase_progress[m.current_phase];
416
+ if (cp?.scenario_coverage && cp.scenario_coverage.missing.length > 0) {
417
+ console.log(` 缺少场景: ${cp.scenario_coverage.missing.join(', ')}`);
418
+ }
419
+ }
420
+ }
421
+ console.log(` 💡 ${m.suggestion}`);
162
422
  }
163
- console.log(t(locale, 'status.allDoneHint') + '\n');
423
+ console.log('');
164
424
  }
165
- else {
166
- const firstIncomplete = data.phases.find(p => !p.done && !p.skipped);
167
- console.log(`\n💡 ${t(locale, 'status.suggestNext', { label: firstIncomplete.label })}`);
168
- console.log(` → ${data.suggestion}\n`);
425
+ if (!moduleId) {
426
+ if (data.source_roots) {
427
+ console.log(`\n📂 Source roots: src=[${data.source_roots.src.join(', ')}] test=[${data.source_roots.test.join(', ')}]`);
428
+ }
429
+ if (data.active_change) {
430
+ const stepLabel = t(locale, `status.proposalStep.${data.proposal_step ?? 'writing'}`);
431
+ console.log(`\n🔒 ${t(locale, 'status.activeChange')}: ${data.active_change}`);
432
+ console.log(` ${t(locale, 'status.proposalStepLabel')}: ${stepLabel}`);
433
+ console.log(LINE);
434
+ }
435
+ else if (data.active_proposals.length > 0) {
436
+ console.log(`\n📝 ${t(locale, 'status.activeProposals')}`);
437
+ for (const p of data.active_proposals) {
438
+ const parts = [
439
+ p.has_proposal ? 'proposal.md ✓' : 'proposal.md ✗',
440
+ p.has_tasks ? 'tasks.md ✓' : 'tasks.md ✗',
441
+ `deltas: ${p.delta_count} files`,
442
+ ];
443
+ console.log(` └─ ${p.name} (${parts.join(' | ')})`);
444
+ }
445
+ console.log(LINE);
446
+ }
447
+ if (data.all_done) {
448
+ console.log(`\n🎉 ${t(locale, 'status.allDone')}`);
449
+ if (data.lifecycle === 'initial')
450
+ console.log(` → ${t(locale, 'launch.suggest')}`);
451
+ console.log(t(locale, 'status.allDoneHint') + '\n');
452
+ }
453
+ else {
454
+ const firstIncomplete = data.phases.find(p => !p.done && !p.skipped);
455
+ console.log(`\n💡 ${t(locale, 'status.suggestNext', { label: firstIncomplete.label })}`);
456
+ console.log(` → ${data.suggestion}\n`);
457
+ }
169
458
  }
170
459
  }
171
460
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAerE;AAED,wBAAgB,IAAI,SA+FnB"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AASA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAerE;AAED,wBAAgB,IAAI,SA8HnB"}
@@ -1,9 +1,11 @@
1
1
  import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
+ import { parse as parseYaml } from 'yaml';
3
4
  import { readLocale, t } from '../i18n.js';
4
- import { createAgentsMd, deploySkills, deploySpecs, deployOpenCodePlugin } from './init.js';
5
+ import { createAgentsMd, deploySkills, deploySpecs, deployOpenCodePlugin, deployCodexPlugin } from './init.js';
5
6
  import { syncResourceIndex } from '../lib/sync-resource-index.js';
6
7
  import { VERSION } from '../lib/json-output.js';
8
+ import { migrateProjectLifecycle } from '../lib/migrate-lifecycle.js';
7
9
  export function syncLogosProjectName(root, projectName) {
8
10
  const yamlPath = join(root, 'logos', 'logos-project.yaml');
9
11
  if (!existsSync(yamlPath))
@@ -31,7 +33,26 @@ export function sync() {
31
33
  const rawAiTool = config.aiTool || 'cursor';
32
34
  const aiTools = Array.isArray(rawAiTool) ? rawAiTool : [rawAiTool];
33
35
  const primaryAiTool = aiTools[0];
34
- const lifecycle = config.lifecycle || 'initial';
36
+ // Run migration for old projects (config.lifecycle === 'active' → mark module launched)
37
+ const migration = migrateProjectLifecycle(root);
38
+ if (migration.migrated && migration.autoMarked) {
39
+ console.log(` ✓ ${t(locale, 'launch.migrationAuto', { module: migration.autoMarked })}`);
40
+ }
41
+ else if (migration.migrated && migration.warned) {
42
+ console.error(` ⚠ ${t(locale, 'launch.migrationWarn')}`);
43
+ }
44
+ // Derive isLaunched from modules
45
+ const yamlPath = join(root, 'logos', 'logos-project.yaml');
46
+ let isLaunched = false;
47
+ if (existsSync(yamlPath)) {
48
+ try {
49
+ const yaml = parseYaml(readFileSync(yamlPath, 'utf-8'));
50
+ if (Array.isArray(yaml?.modules)) {
51
+ isLaunched = yaml.modules.some(m => m.lifecycle === 'launched');
52
+ }
53
+ }
54
+ catch { /* ignore */ }
55
+ }
35
56
  const namesynced = syncLogosProjectName(root, projectName);
36
57
  if (namesynced) {
37
58
  console.log(` ✓ logos-project.yaml name synced to "${projectName}"`);
@@ -70,12 +91,12 @@ export function sync() {
70
91
  writeFileSync(configPath, JSON.stringify(config, null, 2));
71
92
  console.log(' ✓ sourceRoots added to logos.config.json');
72
93
  }
73
- writeFileSync(join(root, 'AGENTS.md'), createAgentsMd(locale, primaryAiTool, 'agents', lifecycle));
94
+ writeFileSync(join(root, 'AGENTS.md'), createAgentsMd(locale, primaryAiTool, 'agents', isLaunched));
74
95
  console.log(' ✓ AGENTS.md updated');
75
- writeFileSync(join(root, 'CLAUDE.md'), createAgentsMd(locale, primaryAiTool, 'claude', lifecycle));
96
+ writeFileSync(join(root, 'CLAUDE.md'), createAgentsMd(locale, primaryAiTool, 'claude', isLaunched));
76
97
  console.log(' ✓ CLAUDE.md updated');
77
98
  for (const tool of aiTools) {
78
- const deployResult = deploySkills(root, tool, locale, lifecycle);
99
+ const deployResult = deploySkills(root, tool, locale, isLaunched);
79
100
  if (deployResult && deployResult.count > 0) {
80
101
  console.log(` ✓ ${t(locale, 'init.skillsSynced', { count: String(deployResult.count), target: deployResult.target })}`);
81
102
  }
@@ -95,6 +116,18 @@ export function sync() {
95
116
  }
96
117
  }
97
118
  }
119
+ if (aiTools.includes('codex')) {
120
+ const codexResult = deployCodexPlugin(root, locale);
121
+ if (codexResult) {
122
+ console.log(` ✓ ${t(locale, 'init.codexPluginSynced', { target: codexResult.target })}`);
123
+ if (codexResult.config.created) {
124
+ console.log(` ✓ ${t(locale, 'init.codexConfigCreated')}`);
125
+ }
126
+ else if (codexResult.config.updated) {
127
+ console.log(` ✓ ${t(locale, 'init.codexConfigUpdated')}`);
128
+ }
129
+ }
130
+ }
98
131
  const specResult = deploySpecs(root);
99
132
  if (specResult && specResult.count > 0) {
100
133
  console.log(` ✓ ${specResult.count} specs synced to logos/spec/`);