draftgo-cli 2.0.0 → 2.0.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.
package/README.md CHANGED
@@ -35,7 +35,7 @@ draftgo init all # 所有支持的工具
35
35
  | 命令 | 说明 |
36
36
  |---|---|
37
37
  | `draftgo init [target]...` | 安装 skill。不传 target 时自动识别;`all` 表示全部。 |
38
- | `draftgo update [target]...` | 把 CLI 内置 skill 覆盖写到每个已安装 AI 工具自己的 skill 目录;保留本地 `config / changelog / lessons / Task` 等运行时数据。**若 npm 上存在更新的 CLI 版本,会先自动升级 CLI 再重跑自己**。 |
38
+ | `draftgo update [target]...` | 把 CLI 内置 skill 覆盖写到每个已安装或项目中检测到的 AI 工具自己的 skill 目录;保留本地 `config / changelog / lessons / Task` 等运行时数据。**若 npm 上存在更新的 CLI 版本,会先自动升级 CLI 再重跑自己**。 |
39
39
  | `draftgo uninstall [target]...` | 移除指定 AI 工具的 skill 目录(含入口文件 + 子技能 + scripts)。加 `--purge` 会连 `.draftgo/` 一起删。 |
40
40
  | `draftgo status` | 查看当前项目装了哪些 AI 工具入口、skill 版本。 |
41
41
  | `draftgo doctor` | 诊断:Python 是否可用、检测到哪些 AI 工具、各入口状态。 |
@@ -147,6 +147,17 @@ CLI v1.2.0 在 skill 包里追加了一套**分级开发流程规范**(`rules/
147
147
 
148
148
  ---
149
149
 
150
+ ## v2.0.1 升级要点(update 目标识别修复)
151
+
152
+ CLI v2.0.1 修复 `draftgo update` 空参数时只刷新部分工具的问题。
153
+
154
+ **核心变化:**
155
+
156
+ - **update 合并识别目标**:不传 target 时,`draftgo update` 会同时刷新“已安装 skill 的目标”和项目中可检测到的 AI 工具信号(如 `.claude`、`.codex`、`AGENTS.md`)。
157
+ - **Codex 项目级目录不再漏刷**:项目里已有 `.codex` 但 Codex skill 尚未落地时,update 也会主动写入 `.codex/skills/draftgo/`。
158
+
159
+ ---
160
+
150
161
  ## v2.0.0 升级要点(精简 skill 包体)
151
162
 
152
163
  CLI v2.0.0 删除了内置 `resources/skill/reference/` 基座参考副本,进一步精简安装到各 AI 工具中的 DraftGo skill 包体。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "draftgo-cli",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Install and manage the DraftGo skill across AI coding agents (Claude Code, Codex, Cursor, Windsurf, Antigravity, Copilot, Gemini, Kiro).",
5
5
  "bin": {
6
6
  "draftgo": "bin/draftgo.js"
@@ -2,9 +2,10 @@
2
2
 
3
3
  const { spawnSync } = require('child_process');
4
4
  const log = require('../logger');
5
- const { all, resolveTargets } = require('../installers');
5
+ const { all, byName, resolveTargets } = require('../installers');
6
6
  const { ensureRuntime, writeInstalledVersion, readInstalledVersion, getPackageVersion } = require('../skill');
7
7
  const { fetchLatestVersion, cmpSemver } = require('../updateCheck');
8
+ const { detectTargets } = require('../detect');
8
9
 
9
10
  // Env flag we set before re-exec to avoid infinite upgrade loops.
10
11
  const REENTRY_FLAG = 'DRAFTGO_UPDATE_REENTERED';
@@ -78,20 +79,27 @@ async function update(projectDir, positional, flags) {
78
79
  if (upgraded) return exitCode;
79
80
 
80
81
  // Determine which entry files to refresh:
81
- // - no positional → refresh only targets that are currently installed
82
+ // - no positional → refresh installed targets plus project-level tool signals
82
83
  // - "all" → refresh every known target
83
84
  // - names → refresh the specified targets
84
85
  let resolved = [];
85
86
  let unknown = [];
86
87
 
87
88
  if (positional.length === 0) {
88
- resolved = all.filter((t) => t.status(projectDir).installed);
89
+ const byTarget = new Map();
90
+ for (const t of all) {
91
+ if (t.status(projectDir).installed) byTarget.set(t.name, t);
92
+ }
93
+ for (const name of detectTargets(projectDir)) {
94
+ if (byName[name]) byTarget.set(name, byName[name]);
95
+ }
96
+ resolved = Array.from(byTarget.values());
89
97
  if (resolved.length === 0) {
90
- log.warn('未检测到任何已安装的 AI 工具 skill 目录,无可刷新内容。');
98
+ log.warn('未检测到任何已安装或可识别的 AI 工具目标,无可刷新内容。');
91
99
  log.dim(' 使用 `draftgo update all` 或 `draftgo update <target>` 强制刷新。');
92
100
  return 0;
93
101
  } else {
94
- log.info(`刷新已安装目标:${resolved.map((r) => r.displayName).join(', ')}`);
102
+ log.info(`刷新目标:${resolved.map((r) => r.displayName).join(', ')}`);
95
103
  }
96
104
  } else {
97
105
  ({ resolved, unknown } = resolveTargets(positional));