msdevflow 0.8.0 → 0.8.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.
package/LICENSE
CHANGED
package/lib/bootstrap.js
CHANGED
|
@@ -1180,10 +1180,16 @@ function npmGitcodeDiagnosis(executable, doctor) {
|
|
|
1180
1180
|
};
|
|
1181
1181
|
}
|
|
1182
1182
|
} catch {
|
|
1183
|
-
// Fall through to
|
|
1183
|
+
// Fall through to coexist.
|
|
1184
1184
|
}
|
|
1185
1185
|
}
|
|
1186
|
-
|
|
1186
|
+
// doctor failed: existing gitcode is not the npm official CLI.
|
|
1187
|
+
// Coexist by installing npm CLI alongside and using gitcode-npm.
|
|
1188
|
+
return {
|
|
1189
|
+
classification: "python", // triggers coexist mode, installs npm CLI separately
|
|
1190
|
+
existingExecutable: executable,
|
|
1191
|
+
workflowCommand: "gitcode-npm",
|
|
1192
|
+
};
|
|
1187
1193
|
}
|
|
1188
1194
|
|
|
1189
1195
|
export function diagnoseGitcode(run, platform) {
|
|
@@ -1512,6 +1518,10 @@ function wrapperContent(details, platform) {
|
|
|
1512
1518
|
: `#!/usr/bin/env bash\nexec ${shellQuote(details.cliTarget)} "$@"\n`;
|
|
1513
1519
|
}
|
|
1514
1520
|
|
|
1521
|
+
function isNpmGitcodeShim(content) {
|
|
1522
|
+
return /@gitcode-cli|gitcode\.js/i.test(content);
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1515
1525
|
function validateWrapper(details, platform) {
|
|
1516
1526
|
const existing = readOptionalFile(details.wrapper);
|
|
1517
1527
|
if (existing === null) {
|
|
@@ -1521,7 +1531,7 @@ function validateWrapper(details, platform) {
|
|
|
1521
1531
|
if (platform !== "win32") {
|
|
1522
1532
|
accepted.push(`#!/usr/bin/env bash\nexec "${details.cliTarget}" "$@"\n`);
|
|
1523
1533
|
}
|
|
1524
|
-
if (!accepted.includes(existing)) {
|
|
1534
|
+
if (!accepted.includes(existing) && !isNpmGitcodeShim(existing)) {
|
|
1525
1535
|
throw new BootstrapError(`Refusing to overwrite unrelated wrapper: ${details.wrapper}`, 3);
|
|
1526
1536
|
}
|
|
1527
1537
|
}
|
|
@@ -1562,6 +1572,32 @@ function writeWrapper(details, platform) {
|
|
|
1562
1572
|
}
|
|
1563
1573
|
}
|
|
1564
1574
|
|
|
1575
|
+
function removeNpmGitcodeShims(npmPrefix, platform) {
|
|
1576
|
+
const pathApi = platform === "win32" ? path.win32 : path.posix;
|
|
1577
|
+
const candidates = platform === "win32"
|
|
1578
|
+
? ["gitcode.cmd", "gitcode"]
|
|
1579
|
+
: ["gitcode"];
|
|
1580
|
+
for (const name of candidates) {
|
|
1581
|
+
const file = pathApi.join(npmPrefix, name);
|
|
1582
|
+
try {
|
|
1583
|
+
const metadata = lstatSync(file);
|
|
1584
|
+
if (metadata.isSymbolicLink() || !metadata.isFile()) {
|
|
1585
|
+
continue;
|
|
1586
|
+
}
|
|
1587
|
+
const content = readFileSync(file, "utf8");
|
|
1588
|
+
// Only remove if it looks like an npm shim for @gitcode-cli/cli.
|
|
1589
|
+
if (!/@gitcode-cli|gitcode\.js/i.test(content)) {
|
|
1590
|
+
continue;
|
|
1591
|
+
}
|
|
1592
|
+
unlinkSync(file);
|
|
1593
|
+
} catch (error) {
|
|
1594
|
+
if (error?.code !== "ENOENT") {
|
|
1595
|
+
throw error;
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1565
1601
|
async function installGitcode(plan, runLong, run, platform) {
|
|
1566
1602
|
await runLong(plan.installInvocation);
|
|
1567
1603
|
if (plan.gitcodeInstall.mode === "coexist") {
|
|
@@ -1570,6 +1606,8 @@ async function installGitcode(plan, runLong, run, platform) {
|
|
|
1570
1606
|
`Installed GitCode npm CLI target not found: ${plan.gitcodeInstall.cliTarget}.`,
|
|
1571
1607
|
);
|
|
1572
1608
|
writeWrapper(plan.gitcodeInstall, platform);
|
|
1609
|
+
// Remove any global npm gitcode shims so PATH falls through to Python gitcode.
|
|
1610
|
+
removeNpmGitcodeShims(plan.gitcodeInstall.wrapperDir, platform);
|
|
1573
1611
|
return {
|
|
1574
1612
|
command: plan.gitcodeInstall.workflowCommand,
|
|
1575
1613
|
executable: plan.gitcodeInstall.wrapper,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "msdevflow",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "Install the msdevflow GitCode skill and its runtime dependencies",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -27,5 +27,5 @@
|
|
|
27
27
|
"gitcode",
|
|
28
28
|
"setup"
|
|
29
29
|
],
|
|
30
|
-
"license": "
|
|
30
|
+
"license": "MIT"
|
|
31
31
|
}
|
package/skill/msd/SKILL.md
CHANGED
|
@@ -64,7 +64,9 @@ msd-merge
|
|
|
64
64
|
4. 不执行下游 action。例如 `action=ci` 通过后不得处理 feedback 或 merge;`action=pr` 创建 PR 后不得自动触发 CI。
|
|
65
65
|
5. action 自身为安全完成所必需的复验属于本 action:例如 `pr` 在提交前重新运行适用本地门禁,`feedback` 修改后运行受影响本地测试。这不授权执行独立的下游 `ci`、补做缺失的产品实现或扩大范围。
|
|
66
66
|
6. `ci` 和完整 E2E 在 openLiBing 只读接口返回 401/403 时可运行 OAuth 认证子流程并恢复原流程;这是读取当前 CI 证据的必要步骤,不视为越界执行显式 `openlibing-auth` action。
|
|
67
|
-
7.
|
|
67
|
+
7. 每个 action 在自身边界内连续执行到完成状态;不得在分析、设计、编辑、验证等中间步骤询问是否继续。能从权威证据、仓库约定和已确认目标可靠推导的结论直接采用,并报告依据,不把可自行完成的判断转交用户。
|
|
68
|
+
8. 只有证据缺失或矛盾且不同选择会实质改变范围、公共行为、兼容性、性能目标或风险,或安全契约明确要求确认时才询问;其余不影响已确认语义的实现细节选择最小、可逆且符合仓库惯例的方案。
|
|
69
|
+
9. action 内端到端完成不授权执行其上游或下游 action,也不替代 guided/autonomous 授权、UTF-8、尾签、幂等和最终 merge 确认规则。
|
|
68
70
|
|
|
69
71
|
## 完整作者 E2E
|
|
70
72
|
|
|
@@ -109,7 +111,7 @@ discovered -> claimed -> verified -> analyzed -> designed
|
|
|
109
111
|
-> approved -> merge-confirmed -> merged
|
|
110
112
|
```
|
|
111
113
|
|
|
112
|
-
任一状态可进入 `blocked`。状态晋级必须有远端或本地证据,不能只依据先前文本声明。`issue-created` 和 `openlibing-authenticated` 是独立 action 的完成状态,不改变作者主流程的业务阶段;`issue-created` 不自动进入 `claimed`,`openlibing-authenticated` 也只作为 `ci`/E2E 的条件性认证子状态。`review-findings`、`review-passed` 和 `review-incomplete` 仅属于独立 `code-review`,按 reviewer 与固定 `review_head_sha` 绑定,不进入作者状态机。
|
|
114
|
+
任一状态可进入 `blocked`。状态晋级必须有远端或本地证据,不能只依据先前文本声明。`designed` 的证据按 [references/design-and-development.md](references/design-and-development.md) 的分级和实际触发维度确定:simple 使用最小设计记录;standard/complex 使用决策树结论,并分别为行为、领域与数据、兼容性、性能等触发维度提供对应证据,未触发的维度不强制生成产物。用户原始请求已完整表达 simple 的最小设计时即视为确认;其他适用设计内容由用户整体确认后才进入实现。`issue-created` 和 `openlibing-authenticated` 是独立 action 的完成状态,不改变作者主流程的业务阶段;`issue-created` 不自动进入 `claimed`,`openlibing-authenticated` 也只作为 `ci`/E2E 的条件性认证子状态。`review-findings`、`review-passed` 和 `review-incomplete` 仅属于独立 `code-review`,按 reviewer 与固定 `review_head_sha` 绑定,不进入作者状态机。
|
|
113
115
|
|
|
114
116
|
## 全局不变量
|
|
115
117
|
|
|
@@ -4,32 +4,69 @@
|
|
|
4
4
|
|
|
5
5
|
## Phase 3:需求分析与设计决策树
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
先只读搜索 Issue、评论、仓库文档和受影响代码,优先从材料建立事实;材料中已有答案时不得反问用户。先按下方门禁完成一次分级,该结果同时决定设计负载和归档要求。
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- 范围和非目标;
|
|
11
|
-
- 验收标准;
|
|
12
|
-
- 兼容性与风险;
|
|
13
|
-
- 依赖和待确认项;
|
|
14
|
-
- 候选方案及权衡。
|
|
9
|
+
### 设计分级与归档门禁
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
识别本次变更触发的风险维度:
|
|
17
12
|
|
|
18
|
-
|
|
13
|
+
- **行为**:新增或改变用户流程、交互语义、可访问性语义、公共行为或接口契约;按已有明确契约恢复原行为,或做不改变语义的局部文案/样式修正,不单独触发本维度;
|
|
14
|
+
- **领域与数据**:正确性依赖表关系、基数、唯一性、顺序、时间语义等领域不变量;
|
|
15
|
+
- **兼容性**:新旧数据、接口、行为或调用方需要共存或迁移;
|
|
16
|
+
- **性能**:改动可能改变查询计划、I/O 或调用次数、遍历/匹配/过滤范围、缓存命中、内存分配,或其他随数据规模增长的成本;仅修改不影响执行路径的查询常量或拼写不触发本维度。
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
按且仅按以下一档执行:
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- 涉及兼容性、迁移、安全、性能或重要测试策略;
|
|
26
|
-
- Issue、仓库规范或维护者要求设计文档。
|
|
20
|
+
1. **simple**:局部、预期行为已有明确证据、无风险维度、无新状态,且不引入新的公共语义;可以恢复已有明确契约,或做不改变语义的局部文案/样式修正。只输出需求事实、改动范围、验收方式和跳过独立设计文档的理由;用户原始请求已明确覆盖这些内容时即视为整体确认,不重复询问,否则最多询问一个会影响实现的未决事实,并把回复视为整体确认。
|
|
21
|
+
2. **standard**:范围限于单个组件且只触发一个风险维度,并且不新增或改变持久化状态、数据模型、公共接口,不涉及迁移或安全。建立决策树,只产出被触发维度的证据,不要求独立 RFC/design。
|
|
22
|
+
3. **complex**:触发两个及以上风险维度;或跨多个组件/模块/前后端;或新增、改变持久化状态、数据模型、公共接口、生命周期、迁移、安全或重要测试策略;或 Issue、仓库规范、维护者要求设计文档。建立完整决策树,并在仓库约定位置创建或更新 RFC/design。
|
|
27
23
|
|
|
28
|
-
|
|
24
|
+
分级不确定时按更高一级处理。simple 的最小设计记录、standard 的决策树结论、complex 的归档文档都是 `designed` 状态的设计产物。
|
|
29
25
|
|
|
30
|
-
|
|
26
|
+
### 决策树与提问
|
|
31
27
|
|
|
32
|
-
|
|
28
|
+
standard 和 complex 按依赖顺序建立决策树,上游未闭环前不得跳入下游:
|
|
29
|
+
|
|
30
|
+
1. **目标与成功标准**;
|
|
31
|
+
2. **范围与非目标**;
|
|
32
|
+
3. **事实、约束和风险维度**;
|
|
33
|
+
4. **目标模块、行为与接口契约**;
|
|
34
|
+
5. **实现策略**:数据结构、算法、过滤时机和复用边界;
|
|
35
|
+
6. **测试、性能验证、迁移/回滚和 PR 范围**。
|
|
36
|
+
|
|
37
|
+
显式标明决策依赖和被否决方案。只有材料缺失、矛盾、过时或无法证明且会改变设计的事项才问用户;每轮只问一个最高价值问题,并给出推荐答案和理由。所有分支闭环后合并展示一次完整设计供用户确认;用户已明确确认完整方案时不重复确认各小节。
|
|
38
|
+
|
|
39
|
+
### 领域事实与数据模型
|
|
40
|
+
|
|
41
|
+
触发"领域与数据"维度时先发现后确认,不得只凭变量名、单个样本或实现习惯推断:
|
|
42
|
+
|
|
43
|
+
- 读取受影响链路中的权威定义和最小充分上下文,如 schema/迁移、实体或协议定义、生产者写入逻辑、消费者查询、现有测试和代表性样本;
|
|
44
|
+
- 对关键结论引用可定位的文件、符号、测试或命令证据;样本只能证明现象,不能单独证明唯一性等不变量;
|
|
45
|
+
- 列出关键字段、基数关系(1:1 / 1:N / N:M)、唯一确定规则、顺序与时间语义、缺失/重复数据行为;
|
|
46
|
+
- 将结论区分为已验证事实、由证据推导的结论和仍未证实的假设;只有最后一类且会影响设计时才询问用户。
|
|
47
|
+
|
|
48
|
+
### 兼容性分析
|
|
49
|
+
|
|
50
|
+
触发"兼容性"维度时:
|
|
51
|
+
|
|
52
|
+
- 记录改前行为,并用仓库内引用、签名和数据格式枚举已知调用方;可能存在仓库外消费者时显式记录风险,不假装已穷举;
|
|
53
|
+
- 列出新旧数据、接口和可见行为的差异,以及旧路径、旧格式、错误/缺失数据的处理方式;
|
|
54
|
+
- 明确兼容或迁移策略、回退方式、退役条件和验证用例。除非 Issue 明确要求改变,现有可观察行为默认保持不变。
|
|
55
|
+
|
|
56
|
+
### 性能基线
|
|
57
|
+
|
|
58
|
+
触发"性能"维度时:
|
|
59
|
+
|
|
60
|
+
- 必须先记录改前静态基线及证据:查询/I/O 次数、遍历与数据结构、处理数据范围、时间和空间复杂度;不得只用同阶 Big-O 证明性能不劣化;
|
|
61
|
+
- 有现成 benchmark、profiling 工具或可重复代表性数据时,改码前运行并记录命令、环境、数据规模和结果;热点路径、查询次数或同阶算法常数可能变化时,应优先补最小可重复基准;
|
|
62
|
+
- 无法安全获得运行基线时不伪造数据,改用查询次数、扫描范围、分配量和复杂度上界作为静态预算,并披露未测量风险;
|
|
63
|
+
- 写明改后目标和最终复测方法。默认不得增加渐进复杂度、查询往返或无界扫描,也不得出现超出测量波动的稳定回退;确需接受劣化时必须在设计阶段说明收益和代价并取得用户确认。
|
|
64
|
+
|
|
65
|
+
### 设计产物门禁
|
|
66
|
+
|
|
67
|
+
设计产物按分级包含最小记录或归档文档:simple 覆盖需求事实与证据、改动范围和验收方式;standard/complex 还须覆盖范围/非目标、决策树结论、触发风险维度的分析、文件级计划、测试与回滚。实现复用建议必须与产品需求语义分开描述。
|
|
68
|
+
|
|
69
|
+
**硬门禁:对应分级的设计产物已展示、内容经用户整体确认之前,不得创建工作分支或修改代码;complex 还必须先落盘并报告路径。** 若发现已经越过门禁,立即暂停实现,盘点现有修改,补齐并确认设计;不得用事后文档默认为已批准。
|
|
33
70
|
|
|
34
71
|
## Phase 4:分支和计划
|
|
35
72
|
|
|
@@ -61,15 +98,27 @@ git switch -c <branch> <canonical-remote>/<default-branch>
|
|
|
61
98
|
|
|
62
99
|
失败必须修复或记录 blocker。不能验证 UI 或运行全量测试时,执行风险匹配的最小集合并披露未运行项。不得声称未执行的检查通过。
|
|
63
100
|
|
|
101
|
+
### 实现对照设计验证
|
|
102
|
+
|
|
103
|
+
- **simple**:实现后运行受影响测试和最小适用门禁,确认结果符合最小设计记录。
|
|
104
|
+
- **standard/complex**:逐项修改后只核验该项实际影响的设计维度,不重复验证未受影响维度;实现全部完成后,在进入 `locally-verified` 前对所有触发维度至少完整验证一次。
|
|
105
|
+
- 触发"领域与数据"时,用测试或可重复查询验证关键基数、唯一性、顺序、时间范围及缺失/重复数据行为。
|
|
106
|
+
- 触发"兼容性"时,分别验证设计产物中的新旧路径和行为差异清单。
|
|
107
|
+
- 触发"性能"时,执行设计产物约定的复测并与改前基线或静态预算对比;无法实际测量时报告未验证项,不得声称性能未劣化。
|
|
108
|
+
|
|
109
|
+
正常实现不暂停询问用户。只有发现影响范围、行为、兼容性、性能目标或已确认领域事实的实质偏差时才停止,集中报告偏差、影响和推荐处理方式;命名或局部结构等不改变设计的小偏差直接修正并在最终报告披露。
|
|
110
|
+
|
|
64
111
|
实现完成后展示:
|
|
65
112
|
|
|
66
113
|
```text
|
|
67
114
|
Changed files and purpose
|
|
68
115
|
Scope deviations: none | details
|
|
116
|
+
Design dimensions verified: behavior | domain/data | compatibility | performance
|
|
117
|
+
Performance comparison: not-applicable | baseline vs result | static budget | unverified + reason
|
|
69
118
|
Local gate commands and results
|
|
70
119
|
Unrun checks and reason
|
|
71
120
|
git diff summary
|
|
72
121
|
Next state: locally-verified | blocked
|
|
73
122
|
```
|
|
74
123
|
|
|
75
|
-
达到 `locally-verified`
|
|
124
|
+
达到 `locally-verified` 后立即停止,确认工作分支不是默认分支;simple 的变更范围与最小设计记录一致,standard/complex 的变更范围与已确认设计产物一致。显式 `action=develop` 不 commit、不 push、不创建 PR;建议下一个 action 为 `pr`。
|
|
@@ -107,11 +107,13 @@ Agent 创建或修改的 Issue/PR 正文,以及发布的 Issue 评论、PR 普
|
|
|
107
107
|
|
|
108
108
|
## Guided 检查点
|
|
109
109
|
|
|
110
|
+
确认只用于真实决策或受保护动作,不用于汇报内部步骤。每个 action 在取得适用确认后连续执行到自身完成条件,不询问“是否继续分析/修改/测试”,也不要求用户代选可由权威证据、仓库约定和已确认目标可靠推导的实现细节。用户原始请求或本轮已确认内容已经明确授权同一目标、范围和动作时不重复确认;安全契约明确规定必须针对当前事实重新确认的 merge、`code-review` finding/`/lgtm` 等例外不复用旧确认。
|
|
111
|
+
|
|
110
112
|
开始以下动作前确认:
|
|
111
113
|
|
|
112
114
|
- 创建 Issue 的最终目标、模板、标题、正文、开放里程碑选择和其他元数据预览;
|
|
113
115
|
- 自领/修改 Issue assignee 或发布接取评论;
|
|
114
|
-
-
|
|
116
|
+
- 权威证据和用户原始请求无法唯一确定、且会实质改变范围、公共行为、兼容性、性能目标或风险的需求结论和方案选择;
|
|
115
117
|
- 修改范围发生变化;
|
|
116
118
|
- 首次 push;
|
|
117
119
|
- 创建 PR,包括从目标 Issue 继承的里程碑及创建后必要的 `pr edit --milestone`;
|