@namewta/speculo 1.0.19 → 1.0.21
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 +8 -7
- package/THIRD-PARTY-NOTICES.md +33 -0
- package/dist/src/agent-files.js +2 -2
- package/dist/src/agent-files.js.map +1 -1
- package/dist/src/agent-skills.d.ts +81 -0
- package/dist/src/agent-skills.js +530 -0
- package/dist/src/agent-skills.js.map +1 -0
- package/dist/src/cli.js +11 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.js +5 -3
- package/dist/src/config.js.map +1 -1
- package/dist/src/doctor.js +7 -2
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +23 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/manifest.d.ts +9 -0
- package/dist/src/manifest.js +45 -7
- package/dist/src/manifest.js.map +1 -1
- package/dist/src/refresh.js +40 -0
- package/dist/src/refresh.js.map +1 -1
- package/dist/src/structured.js +15 -4
- package/dist/src/structured.js.map +1 -1
- package/dist/src/transaction.d.ts +24 -3
- package/dist/src/transaction.js +191 -12
- package/dist/src/transaction.js.map +1 -1
- package/package.json +7 -4
- package/scripts/validate-skills.mjs +56 -0
- package/template/AGENTS.md +1 -1
- package/template/CLAUDE.md +1 -1
- package/template/canonical/canonical-specdev-goal-plan.md +156 -28
- package/template/canonical/canonical-specdev-grill-with-docs.md +153 -31
- package/template/canonical/canonical-specdev-spec.md +153 -27
- package/template/canonical/canonical-specdev-tickets.md +153 -27
- package/template/canonical/canonical-specdev-wayfinder.md +142 -27
- package/template/commands/retro.md +11 -9
- package/template/skills/archive-and-consolidate/SKILL.md +163 -7
- package/template/skills/archive-and-consolidate/references/cleanup-rules.md +1 -1
- package/template/skills/docs-sync/references/agents/claude-redirect.md +8 -8
- package/template/skills/docs-sync/references/agents/content-contract.md +1 -1
- package/template/skills/docs-sync/references/agents/manifest-discovery.md +7 -7
- package/template/skills/docs-sync/references/agents/role-classification.md +4 -4
- package/template/skills/docs-sync/references/agents-contract.md +1 -1
- package/template/skills/engineering-standards-builder/SKILL.md +149 -9
- package/template/skills/engineering-standards-builder/agents/openai.yaml +2 -0
- package/template/skills/engineering-standards-builder/manifest.txt +2 -1
- package/template/skills/engineering-standards-builder/references/rules/09-mechanical-guardrails.md +9 -0
- package/template/skills/engineering-standards-builder/scripts/validate-builder.mjs +4 -7
- package/template/skills/git-history-squash/SKILL.md +87 -11
- package/template/skills/git-history-squash/agents/openai.yaml +2 -0
- package/template/skills/optimize-codex-config/SKILL.md +71 -11
- package/template/skills/{speculo-retro/references/entry-procedure.md → retrospective/SKILL.md} +12 -8
- package/template/skills/{speculo-retro → retrospective}/references/friction-taxonomy.md +22 -13
- package/template/skills/{speculo-retro → retrospective}/references/issue-drafting-sop.md +10 -20
- package/template/skills/source-code-zip/SKILL.md +44 -8
- package/template/skills/source-code-zip/references/{entry-procedure.md → cli-reference.md} +0 -43
- package/template/skills/upstream-fork-sync/SKILL.md +71 -8
- package/template/skills/{writing-great-skills → writing-for-agents}/GLOSSARY.md +1 -1
- package/template/skills/writing-for-agents/SKILL.md +22 -0
- package/template/skills/writing-for-agents/agents/openai.yaml +2 -0
- package/template/skills/{writing-great-skills/references/entry-procedure.md → writing-for-agents/references/authoring-principles.md} +2 -9
- package/template/workflows/ops/D-project-deploy/D-project-deploy.md +1 -1
- package/template/workflows/ops/H-host-manage/H-host-manage.md +4 -0
- package/template/workflows/ops/H-host-manage/references/host-profiles.md +4 -0
- package/template/workflows/ops/I-initialize/I-initialize.md +1 -1
- package/template/workflows/ops/INDEX.md +2 -0
- package/template/workflows/ops/README.md +7 -3
- package/template/workflows/ops/S-server-connect/S-server-connect.md +5 -5
- package/template/workflows/ops/V-inventory-view/V-inventory-view.md +2 -0
- package/template/workflows/ops/common/CAPABILITIES.md +2 -0
- package/template/workflows/ops/common/USAGE.md +5 -5
- package/template/workflows/ops/common/WORKSPACE-USAGE.md +29 -2
- package/template/workflows/ops/common/examples/README.md +1 -1
- package/template/workflows/ops/common/examples/register.example.json +7 -3
- package/template/workflows/ops/common/examples/server-connection.example.json +11 -0
- package/template/workflows/ops/common/rules/deployment-layout.md +1 -1
- package/template/workflows/ops/common/rules/host-root-and-onboarding.md +47 -0
- package/template/workflows/ops/common/rules/persistence-and-secrets.md +1 -1
- package/template/workflows/ops/common/rules/research-and-decisions.md +8 -0
- package/template/workflows/ops/common/rules/server-onboarding.md +3 -3
- package/template/workflows/ops/common/rules/workspace-and-authorization.md +2 -2
- package/template/workflows/ops/common/schemas/fleet-view.schema.json +64 -0
- package/template/workflows/ops/common/schemas/host.schema.json +19 -0
- package/template/workflows/ops/common/schemas/plan.schema.json +57 -0
- package/template/workflows/ops/common/schemas/root-confirmation.schema.json +118 -0
- package/template/workflows/ops/common/schemas/server-connection.schema.json +67 -0
- package/template/workflows/ops/common/schemas/server-discovery.schema.json +171 -0
- package/template/workflows/ops/common/schemas/spec.schema.json +19 -0
- package/template/workflows/ops/common/schemas/status.schema.json +19 -0
- package/template/workflows/ops/common/templates/FLEET.html +1 -1
- package/template/workflows/ops/common/templates/HOST-README.md +3 -1
- package/template/workflows/ops/common/tests/test_ops.mjs +8 -11
- package/template/workflows/ops/common/tests/test_ops_bootstrap.mjs +101 -16
- package/template/workflows/ops/common/tests/test_ops_onboarding.mjs +225 -0
- package/template/workflows/ops/common/tests/test_ops_workspace.mjs +17 -8
- package/template/workflows/ops/common/tools/demo-local.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/agent.mjs +26 -0
- package/template/workflows/ops/common/tools/opslib/bootstrap.mjs +52 -26
- package/template/workflows/ops/common/tools/opslib/cli.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/core.mjs +1 -1
- package/template/workflows/ops/common/tools/opslib/docs.mjs +1 -0
- package/template/workflows/ops/common/tools/opslib/execution.mjs +4 -0
- package/template/workflows/ops/common/tools/opslib/fleet.mjs +26 -4
- package/template/workflows/ops/common/tools/opslib/host_recipes.mjs +34 -0
- package/template/workflows/ops/common/tools/opslib/model.mjs +6 -0
- package/template/workflows/ops/common/tools/opslib/onboarding.mjs +215 -0
- package/template/workflows/ops/common/tools/opslib/planner.mjs +3 -0
- package/template/workflows/ops/common/tools/opslib/transport.mjs +10 -6
- package/template/workflows/ops/common/tools/opslib/workspace_cli.mjs +20 -1
- package/template/workflows/ops/common/tools/server-discover.sh +65 -0
- package/template/workflows/ops/common/tools/validate-ops.mjs +1 -1
- package/template/workflows/ops/manifest.json +12 -5
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +3 -3
- package/template/workflows/specdev/C-code-review/C-code-review.md +1 -1
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +6 -0
- package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +6 -6
- package/template/workflows/specdev/I-implement/references/implementation-procedure.md +1 -1
- package/template/workflows/specdev/I-implement/tdd-rules.md +4 -0
- package/template/workflows/specdev/I-init-setup/config-template.json +5 -1
- package/template/workflows/specdev/INDEX.md +2 -2
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
- package/template/workflows/specdev/P-prototype/P-prototype.md +7 -3
- package/template/workflows/specdev/P-prototype/logic-protocol.md +11 -0
- package/template/workflows/specdev/P-prototype/logic-template.md +27 -0
- package/template/workflows/specdev/P-prototype/project-preview-protocol.md +9 -0
- package/template/workflows/specdev/R-retro/R-retro.md +26 -0
- package/template/workflows/specdev/R-retro/retro-template.md +27 -0
- package/template/workflows/specdev/R-review-architecture/references/selected-design.md +1 -1
- package/template/workflows/specdev/README.md +13 -2
- package/template/workflows/specdev/S-spec/S-spec.md +4 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +4 -0
- package/template/workflows/specdev/T-triage/T-triage.md +31 -25
- package/template/workflows/specdev/T-triage/capture-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/ci-security-protocol.md +11 -0
- package/template/workflows/specdev/T-triage/intake-protocol.md +10 -4
- package/template/workflows/specdev/T-triage/pr-delivery-protocol.md +13 -0
- package/template/workflows/specdev/T-triage/pr-record-template.md +39 -0
- package/template/workflows/specdev/T-triage/publish-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/queue-protocol.md +7 -0
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +1 -1
- package/template/workflows/specdev/T-triage/references/issue-pr-policy.md +23 -0
- package/template/workflows/specdev/T-triage/references/release-authentication.md +9 -0
- package/template/workflows/specdev/T-triage/references/release-notes-injection.md +21 -0
- package/template/workflows/specdev/T-triage/references/workflow-yaml-reference.md +37 -0
- package/template/workflows/specdev/T-triage/release-preflight.md +13 -0
- package/template/workflows/specdev/T-triage/release-protocol.md +12 -0
- package/template/workflows/specdev/T-triage/release-recovery.md +18 -0
- package/template/workflows/specdev/T-triage/remote-operations.md +25 -0
- package/template/workflows/specdev/T-triage/scripts/github-transport.mjs +208 -0
- package/template/workflows/specdev/T-triage/source-template.md +7 -0
- package/template/workflows/specdev/T-triage/triage-run-template.md +34 -0
- package/template/workflows/specdev/T-triage/triage-template.md +4 -1
- package/template/workflows/specdev/common/rules/artifact-contract.md +7 -0
- package/template/workflows/specdev/common/rules/change-completion.md +6 -0
- package/template/workflows/specdev/common/rules/workflow-routing.md +6 -0
- package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +1 -1
- package/template/workflows/specdev/common/schemas/config.schema.json +137 -26
- package/template/workflows/specdev/common/schemas/logic-prototype.schema.json +62 -0
- package/template/workflows/specdev/common/schemas/pull-request.schema.json +90 -0
- package/template/workflows/specdev/common/schemas/retrospective.schema.json +58 -0
- package/template/workflows/specdev/common/schemas/triage-run.schema.json +149 -0
- package/template/workflows/specdev/common/schemas/triage.schema.json +117 -15
- package/template/workflows/specdev/common/tools/delivery-artifacts.mjs +95 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +60 -19
- package/template/workflows/specdev/runtime-contract.json +4 -2
- package/template/skills/archive-and-consolidate/references/entry-procedure.md +0 -178
- package/template/skills/docs-sync/references/entry-procedure.md +0 -3
- package/template/skills/engineering-standards-builder/references/entry-procedure.md +0 -154
- package/template/skills/git-history-squash/references/entry-procedure.md +0 -94
- package/template/skills/github-npm-ops/SKILL.md +0 -19
- package/template/skills/github-npm-ops/references/ci-and-security-ops.md +0 -178
- package/template/skills/github-npm-ops/references/entry-procedure.md +0 -25
- package/template/skills/github-npm-ops/references/failure-recovery.md +0 -123
- package/template/skills/github-npm-ops/references/issue-pr-triage.md +0 -227
- package/template/skills/github-npm-ops/references/issue-transport.md +0 -26
- package/template/skills/github-npm-ops/references/package-json-checklist.md +0 -171
- package/template/skills/github-npm-ops/references/preflight-checklist.md +0 -39
- package/template/skills/github-npm-ops/references/publish-detection.md +0 -68
- package/template/skills/github-npm-ops/references/release-notes-injection.md +0 -238
- package/template/skills/github-npm-ops/references/release-pipeline.md +0 -108
- package/template/skills/github-npm-ops/references/setup-npm-token.md +0 -63
- package/template/skills/github-npm-ops/references/troubleshooting-playbook.md +0 -293
- package/template/skills/github-npm-ops/references/version-bump-flow.md +0 -217
- package/template/skills/github-npm-ops/references/workflow-yaml-reference.md +0 -268
- package/template/skills/github-npm-ops/scripts/issue-transport.mjs +0 -227
- package/template/skills/optimize-codex-config/references/entry-procedure.md +0 -78
- package/template/skills/speculo-retro/SKILL.md +0 -19
- package/template/skills/upstream-fork-sync/references/entry-procedure.md +0 -78
- package/template/skills/writing-great-skills/SKILL.md +0 -23
- /package/template/skills/{writing-great-skills → writing-for-agents}/references/document-contract.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/adr-format.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs → common/rules}/context-format.md +0 -0
- /package/template/workflows/specdev/{I-implement → common/rules}/design-it-twice.md +0 -0
- /package/template/workflows/specdev/{G-grill-with-docs/domain-modeling-rules.md → common/rules/domain-modeling.md} +0 -0
|
@@ -3,16 +3,52 @@ name: source-code-zip
|
|
|
3
3
|
description: Create a requested source ZIP using the bundled Node script and its ignore rules; do not install dependencies.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Source Code ZIP
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
先确认 node 可用,只有 node 不存在时才回退 nodejs。使用 scripts/zip_source_code.js;无第三方依赖,不安装 npm/Python/zip 工具。
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## 标准工作流
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
1. 确认用户提供的是目录路径,不是单个文件;路径含空格时必须加引号。
|
|
13
|
+
2. 先确认 `node --version` 能正常执行。
|
|
14
|
+
3. 默认先运行一次 `--dry-run`;目录较大、规则刚修改或可能包含敏感信息时,同时添加 `--verbose`。
|
|
15
|
+
4. 检查预览结果,确认 `.env`、YAML、依赖目录、构建产物、归档文件和密钥没有被纳入。
|
|
16
|
+
5. 正式创建 ZIP。
|
|
17
|
+
6. 报告 ZIP 的绝对路径、纳入文件数、输入总大小和生成结果。
|
|
18
|
+
7. 除非用户明确理解风险并提出要求,不得使用 `--no-default-ignore`。
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
推荐预览:
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
```bash
|
|
23
|
+
node scripts/zip_source_code.js "/path/to/project" --dry-run
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
查看每个项目被排除的原因:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
node scripts/zip_source_code.js "/path/to/project" \
|
|
30
|
+
--dry-run \
|
|
31
|
+
--verbose
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
正式创建:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
node scripts/zip_source_code.js "/path/to/project"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
默认输出在源目录旁边:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
<目录名>.code.zip
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
例如:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
源目录:/work/my-app
|
|
50
|
+
输出: /work/my-app.code.zip
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
需要自定义过滤、额外文件、输出位置、覆盖、压缩或排障时读取 [参数与行为参考](references/cli-reference.md)。执行前核对目标目录和忽略策略,交付 ZIP 路径、清单/统计及未打包项。
|
|
@@ -74,49 +74,6 @@ chmod +x scripts/zip_source_code.js
|
|
|
74
74
|
./scripts/zip_source_code.js "/path/to/project"
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
## 标准工作流
|
|
78
|
-
|
|
79
|
-
1. 确认用户提供的是目录路径,不是单个文件;路径含空格时必须加引号。
|
|
80
|
-
2. 先确认 `node --version` 能正常执行。
|
|
81
|
-
3. 默认先运行一次 `--dry-run`;目录较大、规则刚修改或可能包含敏感信息时,同时添加 `--verbose`。
|
|
82
|
-
4. 检查预览结果,确认 `.env`、YAML、依赖目录、构建产物、归档文件和密钥没有被纳入。
|
|
83
|
-
5. 正式创建 ZIP。
|
|
84
|
-
6. 报告 ZIP 的绝对路径、纳入文件数、输入总大小和生成结果。
|
|
85
|
-
7. 除非用户明确理解风险并提出要求,不得使用 `--no-default-ignore`。
|
|
86
|
-
|
|
87
|
-
推荐预览:
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
node scripts/zip_source_code.js "/path/to/project" --dry-run
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
查看每个项目被排除的原因:
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
node scripts/zip_source_code.js "/path/to/project" \
|
|
97
|
-
--dry-run \
|
|
98
|
-
--verbose
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
正式创建:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
node scripts/zip_source_code.js "/path/to/project"
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
默认输出在源目录旁边:
|
|
108
|
-
|
|
109
|
-
```text
|
|
110
|
-
<目录名>.code.zip
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
例如:
|
|
114
|
-
|
|
115
|
-
```text
|
|
116
|
-
源目录:/work/my-app
|
|
117
|
-
输出: /work/my-app.code.zip
|
|
118
|
-
```
|
|
119
|
-
|
|
120
77
|
## 默认过滤行为
|
|
121
78
|
|
|
122
79
|
脚本采用两层过滤:
|
|
@@ -4,16 +4,79 @@ description: Assess a requested fork/upstream checkpoint and produce reproducibl
|
|
|
4
4
|
metadata: {"speculo-id": "upstream-fork-sync", "speculo-kind": "skill"}
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# Upstream Fork Sync
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
以**检查点**为主导词。每个仓库始终分开记录:本次观测到的 upstream tip、可选本地 mirror tip,以及已经由产品分支历史证明完成集成的 upstream checkpoint。Fetch 或 mirror 变化不能推进集成 checkpoint。
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 1. 解析上下文
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
1. 从当前目录向上寻找并读取 `<Path>{roots.state}/workspace.json</Path>`,验证 `path_base` 和所有 roots,再读取 `<Path>{roots.config}</Path>`;无法唯一确定项目根时停止。
|
|
14
|
+
2. 读取项目 `AGENTS.md` 及其作用域内规则。项目存在工程规范时读取适用入口。
|
|
15
|
+
3. 将本 Skill 的唯一持久化根解析为 `<Path>{roots.state}/skills/upstream-fork-sync/</Path>`。独立运行只写该根;不得创建 workflow change 或 command 报告。
|
|
16
|
+
4. 读取 [Repository contract](references/repository-contract.md),确定仓库、refs、网络刷新和副作用边界。
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
完成标准:项目根、Skill state 根、目标仓库集合和本次是否允许 fetch 都只有一个解释。
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
## 2. 建立稳定配置
|
|
21
|
+
|
|
22
|
+
读取 `<Path>{roots.state}/skills/upstream-fork-sync/repository-map.json</Path>`。不存在时,只读发现 Git 仓库、remotes、默认产品分支和 upstream tracking refs,按 [Repository contract](references/repository-contract.md) 创建 schema v1 配置;无法从 Git 事实唯一判断的字段一次性询问用户。配置已存在时验证,不静默改写。
|
|
23
|
+
|
|
24
|
+
读取 `<Path>{roots.state}/skills/upstream-fork-sync/customization-map.md</Path>`。不存在时创建最小稳定清单,记录 fork 必须长期保留的产品不变量和审查热点;无法从项目文档或代码证明的业务约束标记为待确认。该文件不接收运行 SHA、dirty paths、冲突或本次结论。
|
|
25
|
+
|
|
26
|
+
完成标准:每个 repository id 唯一,所有项目路径和 refs 可解析,稳定配置与动态运行事实分离。
|
|
27
|
+
|
|
28
|
+
## 3. 创建评估 change
|
|
29
|
+
|
|
30
|
+
读取 [State schema](references/state-schema.md) 和 [Report contract](references/report-contract.md),从用户主题生成小写 ASCII kebab-case topic,然后运行:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
node <Path>{roots.skills}/upstream-fork-sync/scripts/upstream-sync.mjs</Path> assess \
|
|
34
|
+
--root . \
|
|
35
|
+
--state-root <Path>{roots.state}/skills/upstream-fork-sync</Path> \
|
|
36
|
+
--repository-map <Path>{roots.state}/skills/upstream-fork-sync/repository-map.json</Path> \
|
|
37
|
+
--topic <topic>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- 默认离线使用本地 refs;只有用户明确要求刷新网络 refs 时添加 `--fetch`。
|
|
41
|
+
- 只需预览完整冻结快照时添加 `--dry-run`,此分支不写 state 或 change。
|
|
42
|
+
- 正常运行创建 `<Path>{roots.state}/skills/upstream-fork-sync/{date}-{topic}[-NN]/</Path>`,已有目录永不覆盖。
|
|
43
|
+
|
|
44
|
+
完成标准:脚本退出 0,change 的 state 与两份报告完整发布,根 `state.json` 只在 change 发布成功后更新。
|
|
45
|
+
|
|
46
|
+
## 4. 深化风险结论
|
|
47
|
+
|
|
48
|
+
逐仓库检查报告中的 Git 确认冲突、自动合并重叠和定制风险路径。对每条高风险路径使用报告冻结的 SHA 执行精确 `git diff <base>..<target> -- <path>`,再与 `customization-map.md` 的稳定不变量映射。
|
|
49
|
+
|
|
50
|
+
只把路径级证据支持的语义结论补入本 change 的报告。保持 Git 冲突、自动合并重叠、定制合同风险和 dirty-worktree 重叠为四个类别;零文本冲突不得表述为集成安全。
|
|
51
|
+
|
|
52
|
+
完成标准:所有冲突和定制热点都有结论或明确未验证项,报告中的命令可以从冻结 SHA 复现。
|
|
53
|
+
|
|
54
|
+
## 5. 返回后续选择
|
|
55
|
+
|
|
56
|
+
返回 change 路径、仓库 checkpoint、观测 upstream SHA、风险摘要和未验证项。列出适合继续处理的已安装 Work,但不自动创建 workflow change、不调用 Work、不 merge、不 commit、不 push;后续路线由用户选择。
|
|
57
|
+
|
|
58
|
+
完成标准:本次 Skill 在评估 change 完整后停止,用户能用冻结产物自行选择下一 Work。
|
|
59
|
+
|
|
60
|
+
## 6. 记录外部集成
|
|
61
|
+
|
|
62
|
+
只有其他 Work 已完成集成且用户要求更新 checkpoint 时进入此分支。读取目标 change state,并运行:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
node <Path>{roots.skills}/upstream-fork-sync/scripts/upstream-sync.mjs</Path> record-integration \
|
|
66
|
+
--root . \
|
|
67
|
+
--state-root <Path>{roots.state}/skills/upstream-fork-sync</Path> \
|
|
68
|
+
--repository-map <Path>{roots.state}/skills/upstream-fork-sync/repository-map.json</Path> \
|
|
69
|
+
--change <change> \
|
|
70
|
+
--repository <repository-id> \
|
|
71
|
+
--merge-commit <full-sha> \
|
|
72
|
+
--upstream-sha <full-sha> \
|
|
73
|
+
--verification '<command>: exit 0'
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
该入口只在 merge commit 可从产品 ref 到达、目标 upstream SHA 是其精确非第一父节点且匹配 change 冻结目标时更新状态;它不执行集成。
|
|
77
|
+
|
|
78
|
+
完成标准:change state 和根 checkpoint 都已原子重读,实际 Git 历史与记录一致。
|
|
79
|
+
|
|
80
|
+
## 停止条件
|
|
81
|
+
|
|
82
|
+
目标 ref 缺失、保存的 checkpoint 不在产品历史、checkpoint 不在当前 upstream 历史、存在多个 merge-base、配置越界或状态 schema 非法时,停止且不移动 refs、不发布部分 change、不推进 checkpoint。返回准确 repository id、路径、refs 与 SHAs。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 术语表 — 构建优秀技能
|
|
2
2
|
|
|
3
|
-
关于什么造就优秀技能的领域模型。技能的存在是为了从随机系统中驯服确定性;根本美德是 **Predictability**(可预测性),以下每个术语都是调节它的一根杠杆。这是 [`writing-
|
|
3
|
+
关于什么造就优秀技能的领域模型。技能的存在是为了从随机系统中驯服确定性;根本美德是 **Predictability**(可预测性),以下每个术语都是调节它的一根杠杆。这是 [`writing-for-agents`](SKILL.md) 的公开参考。
|
|
4
4
|
|
|
5
5
|
术语按轴分组:**Invocation**(调用,技能如何被触达)、**Information Hierarchy**(信息层级,其内容如何排列)、**Steering**(引导,Agent 的运行时行为如何被塑造)和 **Pruning**(修剪,如何保持精炼)。每个**失败模式**都紧邻治愈它的杠杆,标记为 _失败模式_。
|
|
6
6
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writing-for-agents
|
|
3
|
+
description: Review or author agent instructions, Skills, AGENTS, commands and workflow contracts when explicitly requested.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
metadata: {"speculo-id": "writing-for-agents", "speculo-kind": "skill", "speculo-invocation": "user-only"}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Writing for Agents
|
|
9
|
+
|
|
10
|
+
对明确要求的文档编写/重构使用本能力;不因仓库存在指令文件而自动审计。先读 [保真合同](references/document-contract.md),确定真实源、调用方、owner、输出与恢复边界。
|
|
11
|
+
|
|
12
|
+
1. 从当前任务入口追踪相关调用和生成器,列出现存能力、数量、工具、权限、验证及失败语义。不要默认整读仓库。
|
|
13
|
+
2. 明确触发分支和近邻职责;入口保留每次必读步骤,只有分支规则、示例、flags 与模板下沉。需要审查结构与冗余时读 [编写原则](references/authoring-principles.md),术语按需查 [GLOSSARY](GLOSSARY.md)。
|
|
14
|
+
3. 按单一规则 owner 合并重复;删除无效/过期内容,保留不可丢失的证据、研究、许可与必要元数据。新增或改变的行为单列。
|
|
15
|
+
4. 修订调用方与生成器,测试正常、近邻不触发、缺失输入、失败与恢复;语法通过不代表实际宿主行为。
|
|
16
|
+
5. 交付实际差异、全源字符统计、验证和未验证项。没有实际用量证据不声称 token 或额度节省。
|
|
17
|
+
|
|
18
|
+
## 宿主适配
|
|
19
|
+
|
|
20
|
+
Claude 的显式调用使用 disable-model-invocation;Codex 使用 agents/openai.yaml 中 policy.allow_implicit_invocation=false。metadata 仅描述策略,不授予权限。Speculo 的分发路径不等于宿主原生发现目录,安装/启用需由对应宿主方式完成;不要复制到系统或插件缓存。
|
|
21
|
+
|
|
22
|
+
AGENTS 放项目独有事实与作用域约束,工具可检验的规则交机械检查;CLAUDE 需要加载同层手册时使用 @AGENTS.md,保护用户现有内容。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 编写原则
|
|
2
2
|
|
|
3
3
|
一个 skill 的存在是为了从随机系统中提取确定性。**可预测性** —— 即 agent 每次运行时采取相同的*流程*,而非产生相同的输出 —— 是根本美德;以下每个杠杆都为此服务。
|
|
4
4
|
|
|
@@ -6,14 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## 调用方式
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- **模型调用** skill 保留 **description**,因此 agent 可以自主触发它,*并且*其他 skills 也可以触达它(你也仍然可以手动输入其名称)。它会产生**上下文负载** —— description 每轮都留在窗口里。实现机制:省略 `disable-model-invocation`,并编写一个面向模型的 description,包含丰富的触发短语("当用户想要……、提及……时使用")。
|
|
12
|
-
- **用户调用** skill 将 description 从 agent 的触达范围中移除:只有你手动输入其名称才能调用它 —— 其他 skill 也无法触达它。零上下文负载,但它消耗**认知负载**:*你*是必须记住它存在的索引。实现机制:设置 `disable-model-invocation: true`;`description` 变为面向人类的 —— 一句摘要,去掉触发列表。
|
|
13
|
-
|
|
14
|
-
只有当 agent 必须自行触达该 skill,或其他 skill 必须触达它时,才选择模型调用。如果它只需手动触发,则设为用户调用,不付出任何上下文负载。
|
|
15
|
-
|
|
16
|
-
当用户调用 skills 多到你记不住时,积累的认知负载可以通过一个**路由 skill** 来解决:一个用户调用的 skill,列出其他 skills 以及何时使用它们。
|
|
9
|
+
触发策略按宿主适配。模型调用时描述覆盖实际分支,显式调用时给出用途;宿主规则与元数据不能混淆。入口中的适配合同是唯一规则源,不宣称零上下文负载。
|
|
17
10
|
|
|
18
11
|
## 编写 description
|
|
19
12
|
|
|
@@ -17,7 +17,7 @@ keywords: [ops, project-deploy, 项目, 持久化, 明确范围]
|
|
|
17
17
|
|
|
18
18
|
## 流程与完成标准
|
|
19
19
|
|
|
20
|
-
先固定 project_id、显式 server_ids
|
|
20
|
+
先固定 project_id、显式 server_ids、环境和实例;读取 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>,展示每个目标已登记 host.root 和派生项目根,不从 cwd、默认 HOME 或上次目标猜测;新 Host 缺根确认先转 S。公共 MySQL/Redis/MinIO 作为 shared-service 项目,Host.host_services 里的 Nginx/WireGuard 不伪装成项目。服务器缺接入走 S,缺系统基线走 H;已明确授权的前置 H/D specs 可组成同一 task 顺序执行,不重复确认。
|
|
21
21
|
|
|
22
22
|
从用户指定的本地路径或固定 Git commit 读取实际清单;analyze 不执行仓库代码。网络获取源码必须用户允许并固定完整提交,不用浮动 main/tag。修改来源版本用 resource_updates 写进新计划,而非伪造旧部署的源码版本。任务执行所用本地构件/脚本放入 input_paths 冻结,编译器新发现的未审阅输入必须停止。
|
|
23
23
|
|
|
@@ -17,6 +17,10 @@ keywords: [ops, host-manage, 服务器, 持久化, 明确范围]
|
|
|
17
17
|
|
|
18
18
|
计划、执行或恢复前必须读取 `<Path>{roots.workflows}/ops/common/rules/workspace-and-authorization.md</Path>`、`<Path>{roots.workflows}/ops/common/rules/persistence-and-secrets.md</Path>` 和 `<Path>{roots.workflows}/ops/common/rules/recovery.md</Path>`。按本次 profile 读取 `<Path>{roots.workflows}/ops/H-host-manage/references/host-profiles.md</Path>` 的工具环境、Docker/镜像源、资源清理或系统控制/入口章节。
|
|
19
19
|
|
|
20
|
+
## 最小初始化
|
|
21
|
+
|
|
22
|
+
首次准备 Host 先读 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>,使用 server-initialize-spec 生成 H/prepare 规格,经原批准/执行通道补齐根内目录及双边文档。复用现有目录,不改账号 HOME 权限;Docker、语言环境和入口服务按具体需求补齐。登记成功不等于目录、文档或项目运行环境已就绪。
|
|
23
|
+
|
|
20
24
|
## 计划与执行
|
|
21
25
|
|
|
22
26
|
明确受影响消费者 `acknowledged_consumers`;任务还需列 `related_project_ids` 与相关 server_ids。计划包含下载、系统控制文件、服务重启、默认恢复、持久化和验证。影响项目布局/双边文档时先读 `<Path>{roots.workflows}/ops/common/rules/deployment-layout.md</Path>`;共享服务消费者再读 `<Path>{roots.workflows}/ops/common/rules/shared-services.md</Path>`。
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
只读取当前 H 任务命中的章节;多个 profile 的依赖必须全部过门,不因按需读取省掉适用检查。
|
|
4
4
|
|
|
5
|
+
## 最小初始化
|
|
6
|
+
|
|
7
|
+
读取 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。server-initialize-spec 只生成缺少目录的 mkdir 规格并交付原生成器文档;不安装 Docker、不迁移已有数据、不修改账号默认环境。重复检查复用已有目录,任何文件类型、权限或 owner 冲突停止受影响步骤。
|
|
8
|
+
|
|
5
9
|
## 工具环境
|
|
6
10
|
|
|
7
11
|
区分系统版本、用户默认、项目 pin、服务环境。environment-spec 支持明确版本的 uv、Volta、SDKMAN 管理配方;管理器缺失先用经过审核的安装器。保留旧默认与旧目录,不能为统一外观先删除旧环境。工作流不擅自改写用户 shell profile;激活新管理器入口是另一个明确的准备动作。
|
|
@@ -21,7 +21,7 @@ keywords: [ops, initialize, 控制端, 持久化, 明确范围]
|
|
|
21
21
|
|
|
22
22
|
使用 init 创建控制端身份与绝对 state 根,记录当前工具版本;不会顺便连接远端或清理当前机器。控制端受限账本和默认凭据文档策略按 `<Path>{roots.workflows}/ops/common/rules/persistence-and-secrets.md</Path>` 初始化,不加载后续服务器部署配方。新文档只含 secret_ref,明文交付必须显式 opt-in;真实 env/配置镜像仍受限保存。
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
服务器登记和根选择交给 S,项目登记/安排交给 D;不编造身份、用户名、旧密码或工具版本。控制端需要作为部署目标时必须另外明确登记 local Host,不能把“本机准备”自动变成项目配置。初始化系统软件时再读取 `<Path>{roots.workflows}/ops/common/rules/workspace-and-authorization.md</Path>` 和原 I/H 的完整 spec/plan;缺少管理员权限就报告阻塞,不绕过 sudo。
|
|
25
25
|
|
|
26
26
|
完成条件:控制端状态有效、目录权限受限、工具盘点有证据,后续入口可以独立运行。未具备的服务器能力明确列为缺口。下一步接入服务器用 S,查看已登记资产用 V。
|
|
27
27
|
|
|
@@ -15,6 +15,8 @@ keywords: [ops, 控制端, 服务器, SSH, 项目, 部署, Docker, 持久化,
|
|
|
15
15
|
|
|
16
16
|
激活后按当前任务读取 `<Path>{roots.workflows}/ops/common/rules/activation-and-memory.md</Path>`,再读取当前 Work 与必要规则;索引自身不授予执行或永久知识写入权限。
|
|
17
17
|
|
|
18
|
+
使用顺序为控制端初始化、指定 Host 初始化、Project 安排到明确 Host。首次 Host 的持久化根由用户选定,建议真实登录主目录下 ops;换账号后仍复用原根。
|
|
19
|
+
|
|
18
20
|
Controller 是发起任务的本机,Server 对应既有 Host.host_id;Project 是业务或共享服务,Deployment 连接项目、服务器、环境和实例。当前目录、上次服务器和浏览看板都不是隐含执行目标。
|
|
19
21
|
|
|
20
22
|
I-initialize:只准备控制端。
|
|
@@ -9,17 +9,21 @@
|
|
|
9
9
|
- **D-project-deploy** — 项目与共享服务部署:固定一个项目及目标服务器,配置项目容器、依赖、升级与双边文档,不隐式取得整台服务器的维护权限。
|
|
10
10
|
- **H-host-manage** — 服务器环境与治理:只维护一个明确服务器的系统基线、Docker 和主机级入口,不把系统配置误路由到项目。
|
|
11
11
|
- **I-initialize** — 控制端初始化:仅准备发起任务的控制端,建立受限状态根与本机工具证据,不默认登记部署服务器。
|
|
12
|
-
- **S-server-connect** — 服务器接入与登记:处理指定服务器的可信 SSH
|
|
12
|
+
- **S-server-connect** — 服务器接入与登记:处理指定服务器的可信 SSH、真实登录主目录探测、用户确认持久化根及接入登记,不部署项目或隐式改写 sshd。
|
|
13
13
|
- **V-inventory-view** — 服务器与部署资产视图:从现有资源和检查证据生成简单 MD、标准 JSON 与离线 HTML,双向查看服务器与项目,不连接或修改目标。
|
|
14
14
|
|
|
15
15
|
<!-- AUTO-INDEX-END -->
|
|
16
16
|
|
|
17
17
|
## 运行时根
|
|
18
18
|
|
|
19
|
-
先打开 workspace 解析 roots。静态代码在 `<Path>{roots.workflows}/ops/</Path>`,真实状态在 `<Path>{roots.state}/ops/</Path>`;调用 `<Path>{roots.workflows}/ops/common/tools/ops.mjs</Path>` 始终显式传绝对 `--state
|
|
19
|
+
先打开 workspace 解析 roots。静态代码在 `<Path>{roots.workflows}/ops/</Path>`,真实状态在 `<Path>{roots.state}/ops/</Path>`;调用 `<Path>{roots.workflows}/ops/common/tools/ops.mjs</Path>` 始终显式传绝对 `--state`,不能指向静态代码目录。首次连接先只读识别真实登录账号与主目录,建议其 `ops` 子目录;用户明确选择后才登记 host.root。根统一承载文档、项目及运行数据,确认后按 Host 复用,换账号不换根。既有根保留,不自动迁移。完整协议见 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。
|
|
20
20
|
|
|
21
21
|
控制端宜集中复用一个独立运维工作区,APP 源码可在其他目录;不从 cwd 猜服务器或项目,不扫描/合并其他状态根。多个已有账本需要显式迁移,不能复制 status.json 冒充合并。
|
|
22
22
|
|
|
23
|
+
## 三段流程与两个维度
|
|
24
|
+
|
|
25
|
+
I 初始化控制端 → S 接入指定 Host、确认根并登记 → H 最小初始化 Host → D 将指定 Project 部署到明确 Host。服务器与项目分别管理,Deployment 关联二者;V 双向查看。最小初始化不默认安装 Docker 或语言环境,按项目需求补齐。
|
|
26
|
+
|
|
23
27
|
## 启动协议
|
|
24
28
|
|
|
25
29
|
激活时读 `<Path>{roots.workflows}/ops/common/rules/activation-and-memory.md</Path>`,按 ID 定位最小证据。检查 Node >=22.22.3 <25,Python 仅按项目需要。缺 Node 先只读探测,安装须可信本地安装器、SHA256 与对应确认;不执行 curl|sh。
|
|
@@ -41,7 +45,7 @@
|
|
|
41
45
|
|
|
42
46
|
## 状态字段
|
|
43
47
|
|
|
44
|
-
status.json 保持 schema_version=3 的既有资源模型:hosts、projects、deployments、allocations、bindings、releases、controller、policies、public_ingress、revision、updated_at
|
|
48
|
+
status.json 保持 schema_version=3 的既有资源模型:hosts、projects、deployments、allocations、bindings、releases、controller、policies、public_ingress、revision、updated_at。Host.root_confirmation 可选引用 S 的独立回执(receipt_id/digest);新 Host 登记必需,旧 v3 Host 缺省兼容。S 独占 `<Path>{roots.state}/ops/records/servers/{host_id}/onboarding/</Path>`;双边生成器更新 `<Path>{roots.state}/ops/hosts/{host_id}/docs-receipt.json</Path>`,原 Run 回执保持不覆盖。主机基础入口 Nginx/WireGuard 属于 Host.host_services,不伪装成 APP;公共 MySQL/Redis/MinIO 属于项目。
|
|
45
49
|
|
|
46
50
|
version 与 observed_version 分开,未知/未测/过期不改成成功。部署完成必须有真实业务健康与 `both-sides-verified`;docs_pending 不是全部完成。
|
|
47
51
|
|
|
@@ -3,7 +3,7 @@ id: ops/server-connect
|
|
|
3
3
|
type: workflow-entry
|
|
4
4
|
workflow: ops
|
|
5
5
|
name: 服务器接入与登记
|
|
6
|
-
description: 处理指定服务器的可信 SSH
|
|
6
|
+
description: 处理指定服务器的可信 SSH、真实登录主目录探测、用户确认持久化根及接入登记,不部署项目或隐式改写 sshd。
|
|
7
7
|
keywords: [ops, server-connect, 服务器, 持久化, 明确范围]
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -17,12 +17,12 @@ keywords: [ops, server-connect, 服务器, 持久化, 明确范围]
|
|
|
17
17
|
|
|
18
18
|
## 流程与完成标准
|
|
19
19
|
|
|
20
|
-
必读 `<Path>{roots.workflows}/ops/common/rules/server-onboarding.md</Path
|
|
20
|
+
必读 `<Path>{roots.workflows}/ops/common/rules/server-onboarding.md</Path>` 和 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。输入为明确 server_id、真实地址/端口、远端账号、已验证主机指纹及私钥/agent 来源;根在连接后识别主目录并由用户选定。已有明确指定直接记录,不重复问确认。
|
|
21
21
|
|
|
22
|
-
按 onboarding 唯一顺序推进:可信接入 → 必要的固定 Node 引导 → enroll/盘点 → server-check base。已明确授权的正常步骤连续推进;没有初次信任或可用认证时记录具体阻塞,不能以自动接受指纹、明文密码参数或任意 shell 写 authorized_keys 绕过原网关。
|
|
22
|
+
按 onboarding 唯一顺序推进:可信接入 → server-discover(不提权)→ 用户选定根 / server-root-confirm → 必要的固定 Node 引导 → enroll/盘点 → server-check base。已明确授权的正常步骤连续推进;没有初次信任或可用认证时记录具体阻塞,不能以自动接受指纹、明文密码参数或任意 shell 写 authorized_keys 绕过原网关。
|
|
23
23
|
|
|
24
|
-
新增 records/servers/ID/checks 只由 server-check 写入,不手工补 pass。完成产物为 status.hosts
|
|
24
|
+
新增 records/servers/ID/checks 只由 server-check 写入,不手工补 pass。完成产物为 status.hosts 资源、账号/根确认回执、原 inventory、接入检查回执及缺口清单;登记成功不等于接入成功,base-ready 不等于可部署所有项目。
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
服务器接入完成后:用户已要求服务器初始化则进入 H 的最小初始化;只要求接入则返回路由。更换账号通过 server-connection-spec 验证同机身份并保留原根,按 S 的精确计划批准更新连接。系统环境用 H,项目部署用 D,列表与查看用 V。不从用户当前项目目录推断部署目标,不将控制端自动登记为目标机器。
|
|
27
27
|
|
|
28
28
|
需要实际命令参数时,只查当前动作的合同:`<Path>{roots.workflows}/ops/common/USAGE.md</Path>` 与 `<Path>{roots.workflows}/ops/common/WORKSPACE-USAGE.md</Path>`;执行只通过现有 ops.mjs 网关及明确新增的任务命令,不绕过授权直接拼接目标修改命令。
|
|
@@ -11,6 +11,8 @@ keywords: [ops, inventory-view, 资产清单, 持久化, 明确范围]
|
|
|
11
11
|
|
|
12
12
|
激活本 Work 后先读取 `<Path>{roots.workflows}/ops/README.md</Path>`。
|
|
13
13
|
|
|
14
|
+
视图按 Host 与 Project 双向组织,并列出连接账号、持久化根、根确认状态以及目录/双边文档/项目运行环境的分别验证结果;旧根标记 legacy-registered,不补造确认。只读取允许的回执摘要,不输出确认原话或私钥来源。
|
|
15
|
+
|
|
14
16
|
## 读取范围
|
|
15
17
|
|
|
16
18
|
读取 `<Path>{roots.workflows}/ops/common/rules/activation-and-memory.md</Path>`,按当前 ID 定位最小证据。
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
| 控制端 | Node 标准库 CLI(ops.mjs);状态、锁、受限凭据、计划、执行 | 无第三方 npm 包;使用一个专用控制工作区的绝对 STATE,不按当前 APP 目录隐式切换 |
|
|
8
8
|
| 明确范围 | I 控制端、S 服务器接入、H 服务器维护、D 项目部署、V 资产视图;route 输出明确主体 | server 是 Host.host_id 的用户名称,不是新增第二套服务器账本;原 I/H/D 命令兼容 |
|
|
9
9
|
| 连续执行 | 冻结任务规格、一次原始授权、关联原生 plan/approval/apply,逐步骤验证 | H/D 任务内不重复询问;范围/输入/连接/凭据/执行器漂移或过期停止;任意命令仍是受信任代码,不是沙箱 |
|
|
10
|
+
| 首次持久化根 | server-discover 不提权读取真实主目录;server-root-confirm 记录用户选定根,新 Host 必需回执 | Linux 无需 Node;其他 SSH 平台需已有 Node;默认真实主目录下 ops,确认不授权安装,旧根不迁移 |
|
|
11
|
+
| Host 最小初始化 | server-initialize-spec 生成目录及原双边文档计划;server-connection-spec 验证同机换账号 | Docker/语言环境按需求准备;不递归改 HOME;现有 scp 对含空白根的 Node 引导在写入前阻塞 |
|
|
10
12
|
| Linux 接入检查 | SSH 公钥认证、身份、Node、根目录、容量与 Compose profile;16 项清单、时间和摘要 | 公钥/agent 与可信 known_hosts 必须先存在;没有首次密码登录、公钥自动分发或自动信任主机密钥功能;未测安全项明确 unknown |
|
|
11
13
|
| Linux local | 原生 oneshot;systemd 配置/权限/健康门;Docker Engine Compose | systemd、Docker 和特权配置需要真实有权限主机验收;临时目录测试不能代替 |
|
|
12
14
|
| SSH | OpenSSH 密钥或 agent;固定 known_hosts;目标身份;可 sudo -n;Linux 缺 Node 可用固定 Volta 引导 | 引导 pin 见 common/toolchains/volta-linux.json;Windows 仍要求已有 Node;不实现交互式 SSH 密码登录 |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# OPS 2.
|
|
1
|
+
# OPS 2.3 操作手册
|
|
2
2
|
|
|
3
3
|
命令中的 WORKFLOW 是解压后的静态 ops 路径,STATE 是部署机永久状态绝对路径。示例用 Linux;PowerShell 传相同参数即可。所有示例密码、主机名和提交值均为演示,不可当作生产配置。
|
|
4
4
|
|
|
@@ -12,13 +12,13 @@ node /path/to/ops/common/tools/ops.mjs probe --output /safe/path/local-inventory
|
|
|
12
12
|
|
|
13
13
|
没有 Node 时运行 common/tools/bootstrap.sh probe 或 bootstrap.ps1 -Probe,只做检测。经过批准的本地安装器还需精确 SHA256 与确认字符串。完成后重新 init。SSH 目标缺 Node 不要对本机 bootstrap.sh 假装能装远端,改走下面的 `bootstrap-node`。
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
首次接入先按 WORKSPACE-USAGE 的 server-discover → 用户选定根 → server-root-confirm 流程取得 root_confirmation,再将返回 identity/root/root_confirmation 放入 host.json;新登记缺确认会阻塞。初次远端的 identity=discover 仅可用于只读 probe 或 enroll 的身份重验,connection 包含 hostname、username、known_hosts,可选 port、identity_file、sudo、shell。known_hosts 必须已经通过可信方式核对,不能自动信任 ssh-keyscan 输出。目标还没有 Node 时不要填一个 PATH 上的 `node` 然后把盘点留在对话里:
|
|
16
16
|
|
|
17
17
|
```sh
|
|
18
18
|
node /path/to/ops/common/tools/ops.mjs bootstrap-node --connection-file /safe/path/host-discovery.json --probe
|
|
19
19
|
# 若 tools.node=missing,准备已审核的 volta/node tar(SHA256 见 common/toolchains/volta-linux.json),再:
|
|
20
20
|
node /path/to/ops/common/tools/ops.mjs --state /path/to/.speculo/ops bootstrap-node --apply \
|
|
21
|
-
--connection-file /safe/path/host-discovery.json --host-id node-a --account
|
|
21
|
+
--connection-file /safe/path/host-discovery.json --host-id node-a --account wta --host-root /home/wta/ops \
|
|
22
22
|
--volta-archive /safe/volta-2.0.2-linux.tar.gz --volta-sha256 PINNED \
|
|
23
23
|
--node-archive /safe/node-v24.21.0-linux-x64.tar.gz --node-sha256 PINNED \
|
|
24
24
|
--ack I-APPROVE-THIS-BOOTSTRAP
|
|
@@ -37,7 +37,7 @@ node /path/to/ops/common/tools/ops.mjs --state /path/to/.speculo/ops enroll --fi
|
|
|
37
37
|
node /path/to/ops/common/tools/ops.mjs probe --connection-file /safe/path/host-discovery.json --output /safe/path/host-observed.json
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
核对后将真实 identity 写回 register.json,再登记。正式 register 不接受 discover
|
|
40
|
+
核对后将真实 identity、用户确认的 root 及返回的 root_confirmation 写回 register.json,再登记。正式 register 不接受 discover;示例中的零摘要不能作为确认回执。
|
|
41
41
|
|
|
42
42
|
```sh
|
|
43
43
|
node /path/to/ops/common/tools/ops.mjs --state /path/to/.speculo/ops register --file /safe/path/register.json
|
|
@@ -90,7 +90,7 @@ H.host_actions 支持 mkdir、write-file(host.root 内相对路径;不得写
|
|
|
90
90
|
|
|
91
91
|
## 5. 升级、共享与迁移
|
|
92
92
|
|
|
93
|
-
upgrade/rollback 与 deploy 使用相同完整 Deployment 输入,但 version、构件、环境变更都必须显式。Project.source
|
|
93
|
+
upgrade/rollback 与 deploy 使用相同完整 Deployment 输入,但 version、构件、环境变更都必须显式。Project.source 更新通过 spec.resource_updates。Host.connection 更新由 S 的 server-connection-spec 先验证同机与原根权限,再走精确 plan/approve/apply;固定身份/root/kind 和 root_confirmation 不可改,H/D task 不承接连接变更。
|
|
94
94
|
|
|
95
95
|
公共服务先作为 shared-service 登记并部署。Allocation 带逻辑资源 owner 与 app credential,Binding 将 APP 指向 provider。创建 allocation 必须配 provision/mysql|redis|minio|existing;existing 必须实际验证。示例见 common/examples 与 service-profiles。
|
|
96
96
|
|
|
@@ -17,7 +17,34 @@ node "$OPS" --state "$STATE" init --controller-id control-a
|
|
|
17
17
|
node "$OPS" --state "$STATE" route --scope access --server node-a
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
按 S 的 server-onboarding.md
|
|
20
|
+
按 S 的 server-onboarding.md 完成可信指纹与 key/agent,再读取 <Path>{roots.workflows}/ops/common/rules/host-root-and-onboarding.md</Path>。route 只路由;首次密码登录和公钥分发仍需既有可信交互通道。
|
|
21
|
+
|
|
22
|
+
连接文件提供 platform、transport、connection,结构见 <Path>{roots.workflows}/ops/common/examples/server-connection.example.json</Path>。Linux 无需预装 Node 或预填 root:
|
|
23
|
+
|
|
24
|
+
~~~sh
|
|
25
|
+
node "$OPS" --state "$STATE" server-discover --server node-a --connection-file /safe/connection.json
|
|
26
|
+
# Agent 展示实际账号、主目录和建议根,记录用户指定或接受路径的原话。
|
|
27
|
+
node "$OPS" --state "$STATE" server-root-confirm --server node-a --discovery RETURNED_DISCOVERY_ID --root /home/wta/ops --by actual-user --statement '用户实际给出的路径确认语句及来源'
|
|
28
|
+
~~~
|
|
29
|
+
|
|
30
|
+
将返回的 identity/root/root_confirmation 原样写入 Host 连接/登记文件。默认建议为真实登录主目录下 ops,root 通常 /root/ops、wta 通常 /home/wta/ops,自定义主目录以实际探测为准。已有明确指定不重复询问;建议本身不是确认,取消或未确认不写目标。根确认不代替安装授权。
|
|
31
|
+
|
|
32
|
+
已有 Node 时 enroll;缺 Node 时按 USAGE 的固定 bootstrap-node 网关执行,连接文件须携带确认回执,--account 使用实际登录账号,--host-root 与确认一致。登记后最小初始化:
|
|
33
|
+
|
|
34
|
+
~~~sh
|
|
35
|
+
node "$OPS" --state "$STATE" server-initialize-spec --server node-a --output /safe/host-initialize.json
|
|
36
|
+
node "$OPS" --state "$STATE" plan --file /safe/host-initialize.json
|
|
37
|
+
# 走原 approve/apply,或把规格放入已授权 H/D task。
|
|
38
|
+
~~~
|
|
39
|
+
|
|
40
|
+
最小初始化只准备受管目录和双边文档;Docker/Compose、语言环境及入口服务按项目需要经 H 准备。登记、目录准备、文档交付和项目运行基线分别验证。
|
|
41
|
+
|
|
42
|
+
同机换账号先准备新连接文件并保留原 root:
|
|
43
|
+
|
|
44
|
+
~~~sh
|
|
45
|
+
node "$OPS" --state "$STATE" server-connection-spec --server node-a --connection-file /safe/new-connection.json --output /safe/connection-update.json
|
|
46
|
+
# S 拥有的精确 plan/approve/apply;不通过 H/D task 更换连接,不撤销旧通道。
|
|
47
|
+
~~~
|
|
21
48
|
|
|
22
49
|
已有真实服务器登记后:
|
|
23
50
|
|
|
@@ -62,7 +89,7 @@ CLI 故意不把 task-plan 等同授权;入口替用户完成后续命令,
|
|
|
62
89
|
node "$OPS" --state "$STATE" fleet --stale-hours 24
|
|
63
90
|
```
|
|
64
91
|
|
|
65
|
-
直接打开输出的 FLEET.md,点击离线看板;也可直接打开命令返回的 HTML 绝对路径。无需启动 Web
|
|
92
|
+
直接打开输出的 FLEET.md,点击离线看板;也可直接打开命令返回的 HTML 绝对路径。无需启动 Web 服务。服务器、项目、部署记录状态和关键词可筛选;新增连接账号、已确认根、目录/文档/运行基线分别验证状态,旧根标为 legacy-registered,不导出确认原话;点击项目/服务器可反向查询。看板只读,不提供远程连接、部署、重试按钮,不拉取实时健康数据。
|
|
66
93
|
|
|
67
94
|
MD/HTML/JSON 同批次持久化在 records/views,根 FLEET.md 最后更新。新看板不覆盖原 FLEET-DEPLOYMENTS.md。输出虽无凭据字段,仍包含内部拓扑,不能直接公开上传。
|
|
68
95
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
这些文件是结构示例,不是可直接部署的生产参数。0 的主机指纹/镜像摘要、example.invalid、REPLACE、示例密码必须根据真实探测与项目清单替换。环境示例版本仅展示固定版本语法,不推荐使用该版本,更不声称它是最新或仍受支持。
|
|
4
4
|
|
|
5
|
-
register 和 credential 是本地登记请求;compose-app、shared-allocation 是 spec;binding 是放入 spec.bindings 的单个对象。凭据管理员/应用分离。实际共享分配要求 provider 已完成部署并登记 service.compose_service 与 administrator credential;不能只复制示例便声称分配成功。
|
|
5
|
+
server-connection 是首次只读探测输入;register 的 root_confirmation 必须换成 server-root-confirm 返回的真实引用,零摘要不能执行。已有明确指定根直接记录原话,不从示例推断默认。register 和 credential 是本地登记请求;compose-app、shared-allocation 是 spec;binding 是放入 spec.bindings 的单个对象。凭据管理员/应用分离。实际共享分配要求 provider 已完成部署并登记 service.compose_service 与 administrator credential;不能只复制示例便声称分配成功。
|
|
6
6
|
|
|
7
7
|
真实无网络演练使用 common/tools/demo-local.mjs --output 新空目录,会自动构造自包含示例与一次精确 demo 批准,严禁把该批准自动化用于生产。
|
|
@@ -5,15 +5,19 @@
|
|
|
5
5
|
"display_name": "REPLACE: reviewed target",
|
|
6
6
|
"platform": "linux",
|
|
7
7
|
"transport": "ssh",
|
|
8
|
-
"root": "/
|
|
8
|
+
"root": "/home/wta/ops",
|
|
9
9
|
"identity": "0000000000000000000000000000000000000000000000000000000000000000",
|
|
10
10
|
"connection": {
|
|
11
11
|
"hostname": "REPLACE.invalid",
|
|
12
|
-
"username": "
|
|
12
|
+
"username": "wta",
|
|
13
13
|
"port": 22,
|
|
14
14
|
"known_hosts": "/REPLACE/known_hosts",
|
|
15
|
-
"node": "/
|
|
15
|
+
"node": "/home/wta/ops/_host/toolchains/wta/volta/bin/ops-node",
|
|
16
16
|
"sudo": true
|
|
17
|
+
},
|
|
18
|
+
"root_confirmation": {
|
|
19
|
+
"receipt_id": "root-replace-with-real-receipt",
|
|
20
|
+
"digest": "0000000000000000000000000000000000000000000000000000000000000000"
|
|
17
21
|
}
|
|
18
22
|
}
|
|
19
23
|
],
|
|
@@ -4,7 +4,7 @@ D 创建、升级、迁移或交付项目时读取;H 维护影响已有项目
|
|
|
4
4
|
|
|
5
5
|
## 持久化约定
|
|
6
6
|
|
|
7
|
-
APP 和公共服务都在 host_root/project_id,同级聚合。Docker 与原生部署都遵循相同的项目根,不能因为工具默认而写入其他业务数据目录。
|
|
7
|
+
host_root 来自 S 的真实账号探测及用户确认,默认建议登录主目录下 ops;已登记后不再根据账号 HOME 推导。APP 和公共服务都在 host_root/project_id,同级聚合。Docker 与原生部署都遵循相同的项目根,不能因为工具默认而写入其他业务数据目录。
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
host_root/
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Host 首次接入与持久化根
|
|
2
|
+
|
|
3
|
+
S 在首次接入、确认根或更换连接时读取;H 最小初始化与 D 持久化预检也读取。本合同拥有账号探测和根确认规则;系统安装、项目部署、知识改写仍由原网关授权。
|
|
4
|
+
|
|
5
|
+
## 三段流程与两个管理维度
|
|
6
|
+
|
|
7
|
+
I 先初始化发起操作的控制端;S 接入用户指定 Host,再由 H 完成该 Host 的最小初始化;D 将明确 Project 安排到一个或多个明确 Host。Host 管机器身份、连接和持久化根;Project 管来源及项目需求;Deployment 连接项目、Host、环境和实例。V 提供双向只读视图。五个 Work 保留,不创建第二套 Server 账本。
|
|
8
|
+
|
|
9
|
+
只要求连接时,S 完成接入后返回 H 路由;用户已请求服务器初始化或项目安装时,已获授权的前置步骤连续执行。根目录选择不替代软件安装或项目部署授权。
|
|
10
|
+
|
|
11
|
+
## 首次选择
|
|
12
|
+
|
|
13
|
+
1. 已验证 host key 和 key/agent 登录具备后,执行 `server-discover --server ID --connection-file ABSOLUTE_FILE`。连接文件提供 platform、transport、connection;无需先有 root 或 Node。
|
|
14
|
+
2. Linux 使用不提权的 POSIX 只读探测,从实际登录 uid 的账号数据库得到账号和主目录;不得用控制端 HOME、sudo 后的 HOME 或 `/home/用户名` 推测。Windows/macOS SSH 仍需已有 Node,通过远端账号信息读取真实主目录;显式 local Host 使用本机账号信息。
|
|
15
|
+
3. 默认建议为真实主目录的 `ops` 子目录,例如 `/home/wta/ops`、`/root/ops`。首次必须由用户输入绝对路径或明确接受建议。用户已明确指定就记录其原话,不重复询问;静默、示例、任务文件和默认值不是确认。
|
|
16
|
+
4. 使用 `server-root-confirm --server ID --discovery DISCOVERY_ID --root ABSOLUTE_ROOT --by USER --statement '实际确认原话与来源'`。该命令只写控制端回执,不创建远端目录。取消或未确认时不登记新 Host,不安装、不写目标。
|
|
17
|
+
5. 将返回的 `identity`、`root`、`root_confirmation` 原样放入 Host 输入;需要固定 Node 引导时,连接文件也携带这些字段。`register/enroll` 新 Host 缺回执会阻塞;不能以 `identity=discover` 绕过确认。必要的 Node 引导继续要求可信固定 tar、SHA256 和独立 ack,然后 enroll 保存真实 inventory。
|
|
18
|
+
|
|
19
|
+
默认根统一承载服务器文档、项目配置、业务数据、日志、备份、受管工具链和 Docker data-root。控制端 `.speculo/ops` 仍保存资源账本、受限凭据及双边执行证据;不是把控制端目录移到服务器。
|
|
20
|
+
|
|
21
|
+
## 路径与权限
|
|
22
|
+
|
|
23
|
+
根必须为规范化绝对路径和专用子目录,不能是账号主目录本身、系统目录、链接/junction/UNC/ADS 路径或已登记根的重叠目录。探测检查路径祖先和受管入口,首次使用非空无 owner 根必须先选择空目录或取得专门的接管方案,不能覆盖其 README 或业务文件。
|
|
24
|
+
|
|
25
|
+
检查登录账号对根或最近已有父目录的写入/搜索权限;不足就明确列出待处理权限,不改用另一目录,不递归 chown/chmod HOME。Linux bootstrap 在登录账号身份下写入;缺 Node 且根包含空白时,现有 scp 适配不支持,必须在写入前阻塞并说明可先提供现有 Node。H 的特权动作仍按明确计划提权。
|
|
26
|
+
|
|
27
|
+
执行前重读回执、身份与路径。探测和确认期间身份、账号、主目录或 known_hosts 漂移则重新探测;这不允许自动接受新 host key。目标根的 `.ops-host.json` 继续由原执行器及固定 bootstrap 网关建立,绑定 host_id 与机器身份;其他 owner、锁、失败和 unknown 保留现场。
|
|
28
|
+
|
|
29
|
+
新确认 Host 的目录锁与解锁使用实际登录账号,确保首次根、owner 标记和锁目录仍由该账号持有;具体计划步骤才按 connection.sudo 提权。已有无确认引用的 Host 保留原执行身份。不会递归变更既有文件的所有者或权限。
|
|
30
|
+
|
|
31
|
+
## 最小初始化与后续使用
|
|
32
|
+
|
|
33
|
+
登记后使用 `server-initialize-spec --server ID --output ABSOLUTE_FILE` 生成 H/prepare 规格,经原 plan/approve/apply 或获准 H/D task 执行。它只补齐 `_host/cache`、`_host/installers`、`_host/toolchains`、`_runtime`、`docs/standards`、`knowledge`,并由原生成器交付 README、DEPLOYMENTS 与双边回执;已有目录复用。
|
|
34
|
+
|
|
35
|
+
Docker、Compose、Python、Java、Node 项目版本及 Nginx/WireGuard 按项目要求进入 H 对应分支。既有 Docker data-root 不一致仍需单独迁移方案。登记、目录准备、文档交付、compose/native 就绪分别呈现;base-ready 不代表任意项目可部署。
|
|
36
|
+
|
|
37
|
+
项目根始终由 host.root/project_id 派生;显式多实例沿用 project/instances/environment/instance。D 不另选服务器根、不从 cwd 或上次目标推断部署位置。布局细节读取 `<Path>{roots.workflows}/ops/common/rules/deployment-layout.md</Path>`。
|
|
38
|
+
|
|
39
|
+
## 同机换账号、兼容和恢复
|
|
40
|
+
|
|
41
|
+
同机新账号复用既有 Host 与原根。使用 `server-connection-spec --server ID --connection-file ABSOLUTE_FILE --output ABSOLUTE_FILE` 验证同机身份、新账号与原根权限,生成资源连接更新,走 S 拥有的原精确 plan/approve/apply 网关;H/D task 不得借此扩大连接权限。它保留原 root_confirmation,新会话成功后再讨论旧登录通道撤销。
|
|
42
|
+
|
|
43
|
+
已有 v3 Host 可以没有 root_confirmation,原 `/srv/ops` 等根继续有效,不补造历史确认、不修改旧 Run/Release。旧同机多根账本在需要自动识别/重接入时阻塞歧义,既有明确 Host/root 的运行证据保留。不自动合并账本或迁移目录;实际根迁移另行形成可恢复方案。
|
|
44
|
+
|
|
45
|
+
schema v3 的 Host.root 是唯一路径事实源。S 独占 `<Path>{roots.state}/ops/records/servers/{host_id}/onboarding/</Path>` 的 discovery/root 回执;独立 schema,带源摘要、原话、确认者和时间,原子排他写入后回读。Host.root_confirmation 只存 receipt_id/digest 引用。只读 V 仅投影允许的摘要,不导出原始确认语句或连接凭据文件。
|
|
46
|
+
|
|
47
|
+
bootstrap 将 started/installed 证据保存在 `<Path>{roots.state}/ops/hosts/{host_id}/bootstrap/</Path>`。同一机器/根的引导一旦 started 不自动重放,换确认回执也不能绕过;先读取报错给出的 attempt 文件、收据和远端现场,确认旧进程已停止。仅在用户明确授权恢复、原固定构件/账号/路径摘要一致时,原 bootstrap-node 参数追加 `--recover-ack I-VERIFIED-BOOTSTRAP-IS-STOPPED --recovery-statement 实际恢复授权原话`;保存旧 attempt 的不可覆盖 recovery 记录后重试。输入不同则阻塞,另行设计修复。H/D 的失败、docs_pending、unknown 按 `<Path>{roots.workflows}/ops/common/rules/recovery.md</Path>` 恢复,文档补交不重跑业务。
|