depa-codument 0.4.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/LICENSE +21 -0
- package/README.md +262 -0
- package/package.json +63 -0
- package/src/cli/commands/archive.ts +519 -0
- package/src/cli/commands/decisions.ts +123 -0
- package/src/cli/commands/engineering.ts +105 -0
- package/src/cli/commands/init.ts +54 -0
- package/src/cli/commands/list.ts +73 -0
- package/src/cli/commands/modeling.ts +105 -0
- package/src/cli/commands/show.ts +238 -0
- package/src/cli/commands/status.ts +140 -0
- package/src/cli/commands/upgrade-track.ts +385 -0
- package/src/cli/commands/upgrade-workspace.ts +138 -0
- package/src/cli/commands/validate.ts +330 -0
- package/src/cli/engineering/config.ts +68 -0
- package/src/cli/engineering/lint.ts +58 -0
- package/src/cli/engineering/merge.ts +172 -0
- package/src/cli/engineering/registry.ts +230 -0
- package/src/cli/engineering/schema.ts +126 -0
- package/src/cli/engineering/validate.ts +286 -0
- package/src/cli/index.ts +136 -0
- package/src/cli/modeling/config.ts +68 -0
- package/src/cli/modeling/lint.ts +58 -0
- package/src/cli/modeling/merge.ts +172 -0
- package/src/cli/modeling/registry.ts +229 -0
- package/src/cli/modeling/schema.ts +160 -0
- package/src/cli/modeling/validate.ts +282 -0
- package/src/cli/utils/index.ts +941 -0
- package/src/cli/utils/install.ts +291 -0
- package/src/cli/utils/spec-xml.ts +673 -0
- package/src/cli/utils/track-time.ts +75 -0
- package/src/cli/utils/vfs.ts +102 -0
- package/src/templates/codument/README.md +59 -0
- package/src/templates/codument/attractors/product.md +17 -0
- package/src/templates/codument/attractors/project.md +10 -0
- package/src/templates/codument/backlog/README.md +33 -0
- package/src/templates/codument/config/attractor-profiles.xml +31 -0
- package/src/templates/codument/config/engineering.xml +22 -0
- package/src/templates/codument/config/modeling.xml +22 -0
- package/src/templates/codument/config/operation-hooks.xml +55 -0
- package/src/templates/codument/memory/README.md +13 -0
- package/src/templates/codument/missions/README.md +125 -0
- package/src/templates/codument/sop/README.md +14 -0
- package/src/templates/codument/std/AGENTS.md +82 -0
- package/src/templates/codument/std/attractors/depa-attractor.md +572 -0
- package/src/templates/codument/std/attractors/knowledge-tiers.md +128 -0
- package/src/templates/codument/std/attractors/model-driven-docs.md +293 -0
- package/src/templates/codument/std/attractors/project-memory.md +48 -0
- package/src/templates/codument/std/docs-impl-fractal/index.md +110 -0
- package/src/templates/codument/std/docs-modeling-fractal/index.md +156 -0
- package/src/templates/codument/std/kernel-pointer.md +19 -0
- package/src/templates/codument/std/operations/README.md +30 -0
- package/src/templates/codument/std/operations/_operation-spec.md +41 -0
- package/src/templates/codument/std/operations/archive-mission.md +66 -0
- package/src/templates/codument/std/operations/archive-track.md +238 -0
- package/src/templates/codument/std/operations/artifact-sync.md +172 -0
- package/src/templates/codument/std/operations/discuss-phase.md +214 -0
- package/src/templates/codument/std/operations/discuss.md +87 -0
- package/src/templates/codument/std/operations/docs-bootstrap.md +148 -0
- package/src/templates/codument/std/operations/gap-loop.md +301 -0
- package/src/templates/codument/std/operations/impl-mission.md +167 -0
- package/src/templates/codument/std/operations/impl-quick.md +79 -0
- package/src/templates/codument/std/operations/impl-track.md +537 -0
- package/src/templates/codument/std/operations/migrate.md +337 -0
- package/src/templates/codument/std/operations/plan-mission.md +230 -0
- package/src/templates/codument/std/operations/plan-track-wave.md +231 -0
- package/src/templates/codument/std/operations/plan-track.md +579 -0
- package/src/templates/codument/std/operations/revise-track.md +136 -0
- package/src/templates/codument/std/operations/validate.md +339 -0
- package/src/templates/codument/std/operations/verify.md +184 -0
- package/src/templates/codument/std/root-agents.md +39 -0
- package/src/templates/codument/std/sop/questioning.md +98 -0
- package/src/templates/codument/std/sop/tdd.md +26 -0
- package/src/templates/codument/std/sop/validation.md +25 -0
- package/src/templates/codument/std/sop/wave-exec.md +42 -0
- package/src/templates/codument/std/sop/workflow.md +35 -0
- package/src/templates/codument/std/spec/behavior-delta.md +36 -0
- package/src/templates/codument/std/spec/behavior-registry.md +42 -0
- package/src/templates/codument/std/spec/engineering-delta.md +68 -0
- package/src/templates/codument/std/spec/engineering-node-schema.md +86 -0
- package/src/templates/codument/std/spec/engineering-registry.md +82 -0
- package/src/templates/codument/std/spec/flow-notation.md +93 -0
- package/src/templates/codument/std/spec/folder-manifest.md +99 -0
- package/src/templates/codument/std/spec/mission-xml-spec.md +249 -0
- package/src/templates/codument/std/spec/modeling-delta.md +85 -0
- package/src/templates/codument/std/spec/modeling-node-schema.md +183 -0
- package/src/templates/codument/std/spec/modeling-registry.md +49 -0
- package/src/templates/codument/std/spec/track-xml-spec.md +272 -0
- package/src/templates/codument/std/spec/xnl-format.md +301 -0
- package/src/templates/codument/workflows/README.md +15 -0
- package/src/templates/manifest.ts +177 -0
- package/src/templates/skills/README.md +38 -0
- package/src/templates/skills/codument-archive/SKILL.md +17 -0
- package/src/templates/skills/codument-archive-mission/SKILL.md +17 -0
- package/src/templates/skills/codument-archive-track/SKILL.md +17 -0
- package/src/templates/skills/codument-artifact-sync/SKILL.md +17 -0
- package/src/templates/skills/codument-code-quality-score/SKILL.md +67 -0
- package/src/templates/skills/codument-decision-tree/SKILL.md +40 -0
- package/src/templates/skills/codument-discuss/SKILL.md +17 -0
- package/src/templates/skills/codument-discuss-phase/SKILL.md +17 -0
- package/src/templates/skills/codument-docs-bootstrap/SKILL.md +17 -0
- package/src/templates/skills/codument-gap-loop/SKILL.md +17 -0
- package/src/templates/skills/codument-impl-mission/SKILL.md +17 -0
- package/src/templates/skills/codument-impl-quick/SKILL.md +17 -0
- package/src/templates/skills/codument-impl-track/SKILL.md +17 -0
- package/src/templates/skills/codument-implement/SKILL.md +14 -0
- package/src/templates/skills/codument-migrate/SKILL.md +17 -0
- package/src/templates/skills/codument-modeling-engineering-e2e/SKILL.md +74 -0
- package/src/templates/skills/codument-plan-mission/SKILL.md +17 -0
- package/src/templates/skills/codument-plan-track/SKILL.md +17 -0
- package/src/templates/skills/codument-plan-track-wave/SKILL.md +17 -0
- package/src/templates/skills/codument-revise-track/SKILL.md +17 -0
- package/src/templates/skills/codument-track/SKILL.md +14 -0
- package/src/templates/skills/codument-validate/SKILL.md +17 -0
- package/src/templates/skills/codument-verify/SKILL.md +17 -0
- package/src/types/text-assets.d.ts +9 -0
- package/src/version.ts +1 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { ARCHIVE_DIR } from './index';
|
|
4
|
+
|
|
5
|
+
function parseDate(value: string | undefined): Date | null {
|
|
6
|
+
if (!value) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const date = new Date(value);
|
|
10
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function readUpdatedAtFromTrack(trackXmlPath: string): Date | null {
|
|
14
|
+
if (!fs.existsSync(trackXmlPath)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const content = fs.readFileSync(trackXmlPath, 'utf-8');
|
|
18
|
+
const meta = content.match(/<Metadata>([\s\S]*?)<\/Metadata>/)?.[1] ?? content;
|
|
19
|
+
const updatedAt = meta.match(/<UpdatedAt>([\s\S]*?)<\/UpdatedAt>/)?.[1]?.trim();
|
|
20
|
+
const createdAt = meta.match(/<CreatedAt>([\s\S]*?)<\/CreatedAt>/)?.[1]?.trim();
|
|
21
|
+
return parseDate(updatedAt) ?? parseDate(createdAt);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function maxMtimeMs(dir: string): number {
|
|
25
|
+
if (!fs.existsSync(dir)) {
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const stat = fs.statSync(dir);
|
|
30
|
+
if (stat.isFile()) {
|
|
31
|
+
return stat.mtimeMs;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let max = stat.mtimeMs;
|
|
35
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
36
|
+
const childPath = path.join(dir, entry.name);
|
|
37
|
+
const childMax = maxMtimeMs(childPath);
|
|
38
|
+
if (childMax > max) {
|
|
39
|
+
max = childMax;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return max;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function resolveTrackUpdatedDate(trackDir: string, now = new Date()): Date {
|
|
46
|
+
const trackDate = readUpdatedAtFromTrack(path.join(trackDir, 'track.xml'));
|
|
47
|
+
if (trackDate) {
|
|
48
|
+
return trackDate;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const mtime = maxMtimeMs(trackDir);
|
|
52
|
+
return mtime > 0 ? new Date(mtime) : now;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function pad(value: number): string {
|
|
56
|
+
return String(value).padStart(2, '0');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function formatLocalMinutePrefix(date: Date): { monthBucket: string; minutePrefix: string } {
|
|
60
|
+
const year = date.getFullYear();
|
|
61
|
+
const month = pad(date.getMonth() + 1);
|
|
62
|
+
const day = pad(date.getDate());
|
|
63
|
+
const hour = pad(date.getHours());
|
|
64
|
+
const minute = pad(date.getMinutes());
|
|
65
|
+
return {
|
|
66
|
+
monthBucket: `${year}-${month}`,
|
|
67
|
+
minutePrefix: `${year}-${month}-${day}-${hour}${minute}`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function buildArchiveDestination(trackDir: string, trackId: string, archiveDir = ARCHIVE_DIR): string {
|
|
72
|
+
const updatedDate = resolveTrackUpdatedDate(trackDir);
|
|
73
|
+
const prefix = formatLocalMinutePrefix(updatedDate);
|
|
74
|
+
return path.join(archiveDir, prefix.monthBucket, `${prefix.minutePrefix}-${trackId}`);
|
|
75
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export const CODUMENT_VFS_SCHEMES = [
|
|
2
|
+
'behavior',
|
|
3
|
+
'spec',
|
|
4
|
+
'decision',
|
|
5
|
+
'memory',
|
|
6
|
+
'attractor',
|
|
7
|
+
'track',
|
|
8
|
+
'archive',
|
|
9
|
+
'knowledge',
|
|
10
|
+
'test',
|
|
11
|
+
] as const;
|
|
12
|
+
|
|
13
|
+
export type CodumentVfsScheme = typeof CODUMENT_VFS_SCHEMES[number];
|
|
14
|
+
|
|
15
|
+
export interface CodumentVfsUri {
|
|
16
|
+
raw: string;
|
|
17
|
+
scheme: CodumentVfsScheme;
|
|
18
|
+
authority: string;
|
|
19
|
+
path: string;
|
|
20
|
+
segments: string[];
|
|
21
|
+
query: Record<string, string>;
|
|
22
|
+
fragment?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const SCHEME_SET = new Set<string>(CODUMENT_VFS_SCHEMES);
|
|
26
|
+
|
|
27
|
+
function parseQuery(rawQuery: string): Record<string, string> {
|
|
28
|
+
const query: Record<string, string> = {};
|
|
29
|
+
if (!rawQuery) {
|
|
30
|
+
return query;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const part of rawQuery.split('&')) {
|
|
34
|
+
if (!part) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const [rawKey, rawValue = ''] = part.split('=');
|
|
38
|
+
const key = decodeURIComponent(rawKey);
|
|
39
|
+
query[key] = decodeURIComponent(rawValue);
|
|
40
|
+
}
|
|
41
|
+
return query;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function isCodumentVfsScheme(value: string): value is CodumentVfsScheme {
|
|
45
|
+
return SCHEME_SET.has(value);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function parseCodumentVfsUri(input: string): CodumentVfsUri {
|
|
49
|
+
const match = input.match(/^([a-z][a-z0-9+.-]*):\/\/([^/?#]+)([^?#]*)(?:\?([^#]*))?(?:#(.+))?$/);
|
|
50
|
+
if (!match) {
|
|
51
|
+
throw new Error(`Invalid Codument VFS URI: ${input}`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const [, rawScheme, authority, rawPath = '', rawQuery = '', fragment] = match;
|
|
55
|
+
if (!isCodumentVfsScheme(rawScheme)) {
|
|
56
|
+
throw new Error(`Unsupported Codument VFS scheme: ${rawScheme}`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const pathPart = rawPath.startsWith('/') ? rawPath.slice(1) : rawPath;
|
|
60
|
+
const segments = [authority, ...pathPart.split('/').filter(Boolean)].map(decodeURIComponent);
|
|
61
|
+
if (segments.length === 0 || segments.some((segment) => segment.trim().length === 0)) {
|
|
62
|
+
throw new Error(`Invalid Codument VFS path: ${input}`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
raw: input,
|
|
67
|
+
scheme: rawScheme,
|
|
68
|
+
authority: decodeURIComponent(authority),
|
|
69
|
+
path: pathPart,
|
|
70
|
+
segments,
|
|
71
|
+
query: parseQuery(rawQuery),
|
|
72
|
+
fragment: fragment ? decodeURIComponent(fragment) : undefined,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function tryParseCodumentVfsUri(input: string): CodumentVfsUri | null {
|
|
77
|
+
try {
|
|
78
|
+
return parseCodumentVfsUri(input);
|
|
79
|
+
} catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function buildCodumentVfsUri(
|
|
85
|
+
scheme: CodumentVfsScheme,
|
|
86
|
+
segments: string[],
|
|
87
|
+
query?: Record<string, string>,
|
|
88
|
+
): string {
|
|
89
|
+
if (segments.length === 0) {
|
|
90
|
+
throw new Error('A Codument VFS URI requires at least one segment.');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const [authority, ...rest] = segments.map(encodeURIComponent);
|
|
94
|
+
const path = rest.length > 0 ? `/${rest.join('/')}` : '';
|
|
95
|
+
const queryString = query && Object.keys(query).length > 0
|
|
96
|
+
? `?${Object.entries(query)
|
|
97
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
98
|
+
.join('&')}`
|
|
99
|
+
: '';
|
|
100
|
+
|
|
101
|
+
return `${scheme}://${authority}${path}${queryString}`;
|
|
102
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Codument Workspace
|
|
2
|
+
|
|
3
|
+
本目录是项目内自包含的 Codument 工作区。它保存项目吸引子、行为登记表、track、内置规程与操作提示词,使 AI 助手可以在项目本地完成 planning、实现、验证、归档和迁移。
|
|
4
|
+
|
|
5
|
+
Codument 的核心状态文件是 `tracks/<id>/track.xml`。它把一次变更拆成三条正交轴:
|
|
6
|
+
|
|
7
|
+
| 轴 | 位置 | 作用 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 结构 | `<TaskSpace>` | 记录任务树、阶段、任务状态与验收信息 |
|
|
10
|
+
| 调度 | `<Schedule>` | 记录顺序 / DAG 依赖与并行约束 |
|
|
11
|
+
| 行为 | `<Hooks>` | 记录方向审查、gap-loop、人工确认、制品同步等生命周期动作 |
|
|
12
|
+
|
|
13
|
+
旧 `plan.xml`、`specs/`、`spec_deltas/` 等路径已迁移到当前标准:`track.xml`、`behaviors/`、`behavior_deltas/`。
|
|
14
|
+
|
|
15
|
+
## 目录职责
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
codument/
|
|
19
|
+
├── std/ 内置标准、规程、操作提示词;upgrade-workspace 会刷新
|
|
20
|
+
│ ├── AGENTS.md AI 入口与路由
|
|
21
|
+
│ ├── root-agents.md 项目根 AGENTS.md 受管块模板
|
|
22
|
+
│ ├── kernel-pointer.md Codument 与通用 workflow/task 内核的关系
|
|
23
|
+
│ ├── spec/ 文件格式规范
|
|
24
|
+
│ ├── attractors/ 可升级标准 attractor(knowledge/docs/memory/DEPA)
|
|
25
|
+
│ ├── sop/ 内置执行规程
|
|
26
|
+
│ └── operations/ codument-* skill 的权威操作 body
|
|
27
|
+
├── attractors/ 项目、产品等项目自有吸引子
|
|
28
|
+
├── config/ profile 与 operation hook 配置
|
|
29
|
+
├── workflows/ 结构化 workflow definitions / instances
|
|
30
|
+
├── sop/ 项目自定义执行流程
|
|
31
|
+
├── backlog/ 候选工作与 AI 自主度规则
|
|
32
|
+
├── missions/ 跨多个 track 的 mission / roadmap
|
|
33
|
+
├── memory/ 长期记忆:lessons / incidents / patterns / summaries
|
|
34
|
+
├── behaviors/ 行为登记表,归档时由 behavior_deltas 提升
|
|
35
|
+
└── tracks/ 运行期创建的变更追踪目录
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 当前标准
|
|
39
|
+
|
|
40
|
+
1. `track.xml` 是 track 状态真源;任务状态在 XML 内维护,不再依赖 `state.json`。
|
|
41
|
+
2. 第一层 `TaskGroup` 表示 phase;其下可继续嵌套 `TaskGroup` 或 `Task`。
|
|
42
|
+
3. 调度按层声明:需要并行的层标 `cdt:child-mode="dag"`,依赖写入 `<Schedule><Dag>`.
|
|
43
|
+
4. `summary` 不手维护;统计由工具遍历 TaskSpace 派生。
|
|
44
|
+
5. 变更输入输出使用目录物料:`behavior_deltas/`、`docs/`、`codument/behaviors/` 等。
|
|
45
|
+
6. 能力开关使用 `config/attractor-profiles.xml` 的 `<Profile enabled>`;不再使用 `config/feature.json`。
|
|
46
|
+
7. 内置规程在 `std/sop/`,项目自定义规程在顶层 `sop/`,结构化 workflow 放在 `workflows/`。
|
|
47
|
+
8. 行为登记表使用 `codument/behaviors/`;行为增量使用 `behavior_deltas/`;selector 使用 `behavior://`。
|
|
48
|
+
9. 跨多个 track 的长期路线放在 `missions/<id>/roadmap.md`;单次变更仍以 `tracks/<id>/track.xml` 为状态真源。
|
|
49
|
+
10. `std/operations/` 是各 `codument-*` skill 的权威提示词 body;agent skill 目录只安装薄壳入口。
|
|
50
|
+
|
|
51
|
+
## 常用入口
|
|
52
|
+
|
|
53
|
+
- `std/AGENTS.md`:给 AI 助手的总入口。
|
|
54
|
+
- `std/spec/track-xml-spec.md`:`track.xml` 格式。
|
|
55
|
+
- `std/spec/behavior-delta.md`:行为增量格式。
|
|
56
|
+
- `std/spec/behavior-registry.md`:行为登记表格式。
|
|
57
|
+
- `std/sop/workflow.md`:Codument 工作流总纲。
|
|
58
|
+
- `missions/README.md`:跨 track 路线图写法。
|
|
59
|
+
- `std/operations/README.md`:所有操作提示词索引。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# codument/backlog —— 候选工作清单 + AI 自主度
|
|
2
|
+
|
|
3
|
+
> 目录职责 · holds: 跨 track 的候选工作项 + 优先级 + AI 自主度标签 · excludes: 需求(→track proposal)、owner 真源(→docs/behaviors)、执行计划(→track.xml) · tier: 活的工作面(就地改、不带日期,非真源) · ⬆from: 用户/复盘提出的下一步 · ⬇to: 选中后开 track
|
|
4
|
+
|
|
5
|
+
本目录是 codument 对 AGE `docs/backlog/` 的对应物:一份**活的、可变的**"下一步该做什么"清单。它**不替代** track 的 proposal/behavior_deltas(需求)、`docs/`+`behaviors/`(owner 真源)、`track.xml`(执行计划),只用来**选下一个 track**。
|
|
6
|
+
|
|
7
|
+
## 工作项表
|
|
8
|
+
|
|
9
|
+
| 优先级 | 工作项 | 关联 behavior/需求 | owner 文档 | track | 状态 | AI 自主度 | 阻塞 | 最后检查 |
|
|
10
|
+
|---|---|---|---|---|---|---|---|---|
|
|
11
|
+
| P0 | `<一句话>` | `behaviors/<cap>` 或 `<待澄清>` | `docs/...` 或 `<无>` | `tracks/<id>` 或 `<未开>` | `needs-track` | `blocked` | `<占位未替换>` | `<YYYY-MM-DD>` |
|
|
12
|
+
|
|
13
|
+
## AI 自主度(沿用 codument 校验/审查语义)
|
|
14
|
+
|
|
15
|
+
- `implement` — 已读关联需求/owner 文档/校验命令后可直接开 track 并实现。
|
|
16
|
+
- `plan-first` — 可起草 track.xml,但实现前要过校验(cdt:GapLoop/HumanConfirm)或受保护区批准。
|
|
17
|
+
- `ask-first` — 改代码/用户可见行为前必须先问。
|
|
18
|
+
- `research-only` — 只能调研/总结/提选项,不改产品行为。
|
|
19
|
+
- `blocked` — 阻塞未解前不动。
|
|
20
|
+
|
|
21
|
+
## ready 不变量(可被选中执行的前提)
|
|
22
|
+
|
|
23
|
+
`ready` 当且仅当:
|
|
24
|
+
- 关联 behavior/需求已明确、有可测验收(或能在开 track 的澄清里立刻定清);
|
|
25
|
+
- owner 文档存在且对该 slice 不是已知 stale(见 `knowledge-tiers.md` 新鲜度);
|
|
26
|
+
- 不触发受保护区(破坏性/数据/权限/外部集成)或已有批准路径;
|
|
27
|
+
- 阻塞为空或显式标注非阻塞。
|
|
28
|
+
|
|
29
|
+
## 选择规则
|
|
30
|
+
|
|
31
|
+
用户让"继续"但没点名任务时:选**优先级最高、自主度=`implement`、无阻塞**的工作项开 track。无安全 `implement` 项时,总结最高优先级的 `blocked`/`plan-first`/`ask-first` 项并请用户定夺。AI 可凭证据把 `ready` 降级为 `needs-*`/`blocked`;**不得**在无人确认下把项升为 `ready`、把自主度调成 `implement`、或清除阻塞。
|
|
32
|
+
|
|
33
|
+
> 本文件是单一可变清单(就地改),不要按日期拆分;跨 track 复发的教训应进 `memory/`,稳定真源应进 `docs/`/`behaviors/`,都不留在这里。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
config/attractor-profiles.xml —— 命名 attractor 组合(XML,vfs 标准)。
|
|
3
|
+
取代旧 attractor-profiles.json。被 track.xml / operation-hooks.xml 的 <cdt:AttractorCheck use="<name>"/> 按 profile 名引用。
|
|
4
|
+
每个 <Profile enabled="true|false">(默认 true)。profile 的开关【取代 feature.json 的能力开关】——
|
|
5
|
+
例如 docs profile 启用 = 开启 docs 知识同步能力;未来不再需要 codument/config/feature.json。
|
|
6
|
+
-->
|
|
7
|
+
<AttractorProfiles version="1">
|
|
8
|
+
|
|
9
|
+
<Profile name="coding" enabled="true">
|
|
10
|
+
<Description>编码方向(DEPA 标准架构吸引子 + 项目工程约束)</Description>
|
|
11
|
+
<Attractor ref="vfs://@/codument/std/attractors/depa-attractor.md"/>
|
|
12
|
+
<Attractor ref="vfs://@/codument/attractors/project.md"/>
|
|
13
|
+
</Profile>
|
|
14
|
+
|
|
15
|
+
<!-- 启用即开启 docs 知识同步能力;停用则 docs 相关 hook/同步不触发 -->
|
|
16
|
+
<Profile name="docs" enabled="true">
|
|
17
|
+
<Description>docs 知识方向(分层晋升 + 分形规范)</Description>
|
|
18
|
+
<Attractor ref="vfs://@/codument/std/attractors/knowledge-tiers.md"/>
|
|
19
|
+
<Attractor ref="vfs://@/codument/std/attractors/model-driven-docs.md"/>
|
|
20
|
+
<Attractor ref="vfs://@/codument/std/docs-modeling-fractal/index.md"/>
|
|
21
|
+
<Attractor ref="vfs://@/codument/std/docs-impl-fractal/index.md"/>
|
|
22
|
+
<Attractor ref="vfs://@/codument/std/spec/folder-manifest.md"/>
|
|
23
|
+
</Profile>
|
|
24
|
+
|
|
25
|
+
<!-- 启用即开启长期项目记忆提升能力(取代旧 feature.json projectMemory.enabled);停用则归档不提升 memory:// -->
|
|
26
|
+
<Profile name="memory" enabled="true">
|
|
27
|
+
<Description>长期记忆方向(lessons/incidents/patterns/summaries)</Description>
|
|
28
|
+
<Attractor ref="vfs://@/codument/std/attractors/project-memory.md"/>
|
|
29
|
+
</Profile>
|
|
30
|
+
|
|
31
|
+
</AttractorProfiles>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
config/engineering.xml —— 长期工程知识 registry 能力开关 + merge 策略(XML,vfs 标准;仿 modeling.xml)。
|
|
3
|
+
默认 disabled:无此文件或 enabled="false" 时,track / implement / archive / lint 全部跳过 engineering,行为不变。
|
|
4
|
+
启用后:track 产出 engineering_deltas、archive 做节点级 3-way 合并进 codument/engineering/、engineering lint 给分形拆分建议。
|
|
5
|
+
规范见 codument/std/spec/engineering-registry.md、engineering-delta.md、engineering-node-schema.md。
|
|
6
|
+
-->
|
|
7
|
+
<Engineering version="1" enabled="false">
|
|
8
|
+
|
|
9
|
+
<!-- registry 工作树根(宿主 git 版本化;不持久化平行 vcs 仓库) -->
|
|
10
|
+
<Registry dir="vfs://@/codument/engineering/"/>
|
|
11
|
+
|
|
12
|
+
<!-- 分形拆分 lint 阈值(codument engineering lint);超阈即建议拆同名文件夹 -->
|
|
13
|
+
<Lint maxLines="400" maxNodes="8"/>
|
|
14
|
+
|
|
15
|
+
<!-- 归档 3-way 合并的冲突策略:默认保守(human=报告并暂停,不静默覆盖);可改 ours|theirs|base -->
|
|
16
|
+
<MergePolicy>
|
|
17
|
+
<Conflict type="same-field" resolve="human"/>
|
|
18
|
+
<Conflict type="delete-modify" resolve="human"/>
|
|
19
|
+
<Conflict type="add-add" resolve="human"/>
|
|
20
|
+
</MergePolicy>
|
|
21
|
+
|
|
22
|
+
</Engineering>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
config/modeling.xml —— 领域建模 registry 能力开关 + merge 策略(XML,vfs 标准;仿 attractor-profiles.xml)。
|
|
3
|
+
默认 disabled:无此文件或 enabled="false" 时,track / implement / archive / lint 全部跳过 modeling,行为不变。
|
|
4
|
+
启用后:track 产出 modeling_delta、archive 做节点级 3-way 合并进 codument/modeling/、modeling lint 给分形拆分建议。
|
|
5
|
+
规范见 codument/std/spec/modeling-registry.md、modeling-delta.md、modeling-node-schema.md。
|
|
6
|
+
-->
|
|
7
|
+
<Modeling version="1" enabled="false">
|
|
8
|
+
|
|
9
|
+
<!-- registry 工作树根(宿主 git 版本化;不持久化平行 vcs 仓库) -->
|
|
10
|
+
<Registry dir="vfs://@/codument/modeling/"/>
|
|
11
|
+
|
|
12
|
+
<!-- 分形拆分 lint 阈值(codument modeling lint);超阈即建议拆同名文件夹 -->
|
|
13
|
+
<Lint maxLines="400" maxNodes="8"/>
|
|
14
|
+
|
|
15
|
+
<!-- 归档 3-way 合并的冲突策略:默认保守(human=报告并暂停,不静默覆盖);可改 ours|theirs|base -->
|
|
16
|
+
<MergePolicy>
|
|
17
|
+
<Conflict type="same-field" resolve="human"/>
|
|
18
|
+
<Conflict type="delete-modify" resolve="human"/>
|
|
19
|
+
<Conflict type="add-add" resolve="human"/>
|
|
20
|
+
</MergePolicy>
|
|
21
|
+
|
|
22
|
+
</Modeling>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
config/operation-hooks.xml —— 命令生命周期 hook(无独立 track.xml 的操作)。
|
|
3
|
+
与 track.xml 的 <Hooks> 同语法(统一 <Hook on>),只是宿主是命令生命周期点而非节点。
|
|
4
|
+
typed check 用 cdt: 命名空间,配置直接写在节点上:
|
|
5
|
+
AttractorCheck use="<profile>"(指 config/attractor-profiles.xml 的 profile;fresh-subagent 由 std 提示词约定)
|
|
6
|
+
ArtifactSync use="<artifact>"(归档后按 track 的 output MaterialBundle 同步)
|
|
7
|
+
-->
|
|
8
|
+
<OperationHooks version="1" xmlns:cdt="urn:codument:v1">
|
|
9
|
+
|
|
10
|
+
<Operation name="plan-track">
|
|
11
|
+
<Hooks>
|
|
12
|
+
<Hook on="plan-track:before"><cdt:AttractorCheck use="coding"/></Hook>
|
|
13
|
+
</Hooks>
|
|
14
|
+
</Operation>
|
|
15
|
+
|
|
16
|
+
<Operation name="plan-mission">
|
|
17
|
+
<Hooks>
|
|
18
|
+
<Hook on="plan-mission:before"><cdt:AttractorCheck use="coding"/></Hook>
|
|
19
|
+
</Hooks>
|
|
20
|
+
</Operation>
|
|
21
|
+
|
|
22
|
+
<Operation name="discuss">
|
|
23
|
+
<Hooks>
|
|
24
|
+
<Hook on="discuss:before"><cdt:AttractorCheck use="coding"/></Hook>
|
|
25
|
+
</Hooks>
|
|
26
|
+
</Operation>
|
|
27
|
+
|
|
28
|
+
<Operation name="impl-quick">
|
|
29
|
+
<Hooks>
|
|
30
|
+
<Hook on="impl-quick:before"><cdt:AttractorCheck use="coding"/></Hook>
|
|
31
|
+
</Hooks>
|
|
32
|
+
</Operation>
|
|
33
|
+
|
|
34
|
+
<Operation name="archive-track">
|
|
35
|
+
<Hooks>
|
|
36
|
+
<Hook on="archive-track:after"><cdt:ArtifactSync use="docs"/></Hook>
|
|
37
|
+
</Hooks>
|
|
38
|
+
</Operation>
|
|
39
|
+
|
|
40
|
+
<Operation name="revise-track">
|
|
41
|
+
<Hooks>
|
|
42
|
+
<Hook on="revise-track:before"><cdt:AttractorCheck use="coding"/></Hook>
|
|
43
|
+
</Hooks>
|
|
44
|
+
</Operation>
|
|
45
|
+
|
|
46
|
+
<Operation name="gap-loop">
|
|
47
|
+
<!--
|
|
48
|
+
gap-loop 全局默认:verify-round 控制「首轮 NO_GAP 后是否再追一轮(轻量)验证轮」做首轮怀疑。
|
|
49
|
+
默认 false(关)。节点 <cdt:GapLoop verify-round="true|false"> 覆盖此全局默认(per-scope)。
|
|
50
|
+
详见 std/operations/gap-loop.md §0.2.4。
|
|
51
|
+
-->
|
|
52
|
+
<cdt:GapLoopDefaults verify-round="false"/>
|
|
53
|
+
</Operation>
|
|
54
|
+
|
|
55
|
+
</OperationHooks>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# codument/memory —— 长期项目记忆
|
|
2
|
+
|
|
3
|
+
> 目录职责 · holds: 跨 track 的耐久 lessons/incidents/patterns/summaries · excludes: 任务日志(→track reports)、behaviors/docs/源码里的事实、未解决的猜测 · tier: stable·追加(每条目录自包含,无全局 index) · ⬆from: track 复盘提供的候选 · ⬇to: 复发的固化为 sop/skill/check
|
|
4
|
+
|
|
5
|
+
记忆规则、类别语义、提升判定见吸引子 [std/attractors/project-memory.md](../std/attractors/project-memory.md);分层与晋升阶梯见 [std/attractors/knowledge-tiers.md](../std/attractors/knowledge-tiers.md)。
|
|
6
|
+
|
|
7
|
+
## 结构
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
memory/<category>/YYYY-MM/YYYY-MM-DD-HHmm-slug/ # category ∈ lessons|incidents|patterns|summaries
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
每条目录自包含;**不建全局 `index.md`**(跨分支会冲突)。归档时若该 track 无耐久教训,不造条目。仅当 `memory` profile 启用且 track 显式给出候选时才提升(见 `std/operations/archive-track.md`)。
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# codument/missions —— 长周期 mission
|
|
2
|
+
|
|
3
|
+
> 目录职责 · holds: 跨多个 track 的长周期 mission、mission.xml 状态真源、proposal/design、执行期 evidence/report 外部记忆 · excludes: 单次变更需求(→tracks/<id>/proposal.md)、代码落地状态(→track.xml)、长期 owner 真源(→docs/behaviors/decisions/memory) · tier: 长周期控制面(活层,非行为真源) · from: backlog/用户战略目标/复盘 · to: 多个 tracks
|
|
4
|
+
|
|
5
|
+
mission 是比 track 跨度更长的任务类型。它用于把战略目标拆成多个 plan 节点和落地 track,并在较长时间内通过控制论反馈循环持续收敛。mission **不替代 track**:真实代码、规范、测试、迁移仍由 track 承担;mission 负责编排、观察、重规划和归档。
|
|
6
|
+
|
|
7
|
+
## 目录结构
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
codument/missions/
|
|
11
|
+
README.md
|
|
12
|
+
|
|
13
|
+
pending/
|
|
14
|
+
<mission-id>/
|
|
15
|
+
mission.xml
|
|
16
|
+
proposal.md
|
|
17
|
+
design.md
|
|
18
|
+
decisions.md
|
|
19
|
+
decisions/
|
|
20
|
+
memory/
|
|
21
|
+
analysis/ # 默认不进 git
|
|
22
|
+
reports/ # 默认不进 git
|
|
23
|
+
|
|
24
|
+
active/
|
|
25
|
+
<mission-id>/
|
|
26
|
+
mission.xml
|
|
27
|
+
proposal.md
|
|
28
|
+
design.md
|
|
29
|
+
decisions.md
|
|
30
|
+
decisions/
|
|
31
|
+
memory/
|
|
32
|
+
analysis/ # 默认不进 git
|
|
33
|
+
reports/ # 默认不进 git
|
|
34
|
+
|
|
35
|
+
archived/
|
|
36
|
+
YYYY-MM-DD-<mission-id>/
|
|
37
|
+
mission.xml
|
|
38
|
+
proposal.md
|
|
39
|
+
design.md
|
|
40
|
+
decisions.md
|
|
41
|
+
decisions/
|
|
42
|
+
memory/
|
|
43
|
+
analysis/
|
|
44
|
+
reports/
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- `pending/`:已规划但未批准 / 未启动。
|
|
48
|
+
- `active/`:正在执行;允许基于 evidence 或 human decision 受控重规划。
|
|
49
|
+
- `archived/`:完成、取消、废弃或被替代后的 mission。归档目录名必须使用 `YYYY-MM-DD-<mission-id>` 前缀。
|
|
50
|
+
|
|
51
|
+
## 标准制品
|
|
52
|
+
|
|
53
|
+
新 mission 的标准制品是三件套:
|
|
54
|
+
|
|
55
|
+
- `mission.xml`:唯一结构 / 状态 / 调度真源。它与 `track.xml` 同构,但根为 `<Mission>`,顶层默认 DAG。顶层 `TaskGroup` 可 DAG 调度;组内 leaf `Task` 默认按 `order` 顺序执行。
|
|
56
|
+
- `proposal.md`:为什么要做、目标 / 非目标、成功判据、为什么这是 mission 而不是单个 track。
|
|
57
|
+
- `design.md`:控制论 + DEPA actor 模型、执行协议、重规划规则、人工介入规则、风险与迁移。
|
|
58
|
+
|
|
59
|
+
`cdt:TrackLink` 只挂在 leaf `Task` 上,用 `state="candidate|bound"` + `id` 记录推荐或真实 track id;不写 path/archive-path,active/archive 位置从真实 track id 推导。
|
|
60
|
+
|
|
61
|
+
新 mission **不创建 `roadmap.md`**。旧 roadmap 内容按职责拆分:
|
|
62
|
+
|
|
63
|
+
| 原路线内容 | 新落点 |
|
|
64
|
+
|---|---|
|
|
65
|
+
| mission 目标、Non-Goals、成功判据 | `proposal.md` |
|
|
66
|
+
| 阶段路线、节点依赖、状态、TrackLink candidate/bound | `mission.xml` |
|
|
67
|
+
| plan vs track 区分规则 | `design.md` |
|
|
68
|
+
| 当前判断、阻塞、风险 | `design.md` + `mission.xml` 状态 |
|
|
69
|
+
| 证据链接、执行报告链接 | `reports/` |
|
|
70
|
+
| 移交项 | `design.md` 或后续 track proposal |
|
|
71
|
+
|
|
72
|
+
## 控制论 + DEPA actor 执行模型
|
|
73
|
+
|
|
74
|
+
mission execution is a cybernetic actor loop over a DAG-shaped desired state.
|
|
75
|
+
|
|
76
|
+
| Actor | 控制论角色 | DEPA 归属 | 职责 |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| `MissionPlanner` | 期望态产出者 | Processor + Actor | 产出或修订 desired mission graph:TaskGroup/Task、依赖、门禁、TrackLink |
|
|
79
|
+
| `MissionObserver` | 传感器 | Data + Actor | 读取 actual state projection:mission.xml、track 状态、archive、测试结果、reports、用户新约束 |
|
|
80
|
+
| `MissionReconciler` | 控制器 | Processor + Actor | 比较 desired vs actual,判定 drift / ready / blocked / done |
|
|
81
|
+
| `MissionApplier` | 执行器 | Effect + Actor | 唯一执行收敛动作:启动 mission、创建/续跑/归档 track、修订 mission.xml、写 reports |
|
|
82
|
+
|
|
83
|
+
循环协议:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
MissionObserver 观测实际态
|
|
87
|
+
-> MissionReconciler 比较 mission.xml 期望态 vs 实际态
|
|
88
|
+
-> MissionPlanner 在必要时提出重规划
|
|
89
|
+
-> MissionApplier 执行一个 bounded action
|
|
90
|
+
-> 写 report / 更新 mission.xml
|
|
91
|
+
-> 下一轮
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
纪律:
|
|
95
|
+
|
|
96
|
+
- **level-triggered**:每轮读取当前实际态,不依赖“上一轮我以为做过什么”。
|
|
97
|
+
- **evidence-based**:重规划必须有 evidence 或 human decision。
|
|
98
|
+
- **idempotent**:同样 desired + actual 不重复创建 track、不重复归档。
|
|
99
|
+
- **bounded action**:每轮只执行一个有限动作,避免长周期自动化漂移。
|
|
100
|
+
- **chat history is not state**:恢复点只来自 `mission.xml`、`analysis/`、`reports/` 和实际 track 状态。
|
|
101
|
+
|
|
102
|
+
## 受控重规划
|
|
103
|
+
|
|
104
|
+
active mission 执行中允许:
|
|
105
|
+
|
|
106
|
+
- 新增节点:发现必须先补证据、先建底座 track、先跑验证。
|
|
107
|
+
- 删除节点:证伪、过时、被合并。
|
|
108
|
+
- 修改节点:目标、验收、依赖、状态变化。
|
|
109
|
+
- 修改 DAG:依赖顺序变化、并行转串行、拆分 wave。
|
|
110
|
+
- 人工介入:用户暂停、改目标、批准 / 拒绝某个 convergence action。
|
|
111
|
+
|
|
112
|
+
每次重规划必须:
|
|
113
|
+
|
|
114
|
+
1. 写 `reports/replan-XXX.md` 或 `reports/human-intervention-XXX.md`。
|
|
115
|
+
2. 说明 trigger、actual state、desired state、diff、decision、applied change。
|
|
116
|
+
3. 更新 `mission.xml` 的 `Metadata.Revision` 和 `UpdatedAt`。
|
|
117
|
+
4. 若决策有长期约束,追加到 `decisions.md`,必要时写 `decisions/<slug>.md`。
|
|
118
|
+
|
|
119
|
+
## 使用规则
|
|
120
|
+
|
|
121
|
+
- 用 `codument-plan-mission` 创建 pending mission。
|
|
122
|
+
- 用 `codument-impl-mission` 启动或续跑 active mission。
|
|
123
|
+
- 用 `codument-archive-mission` 归档 completed / cancelled / superseded mission。
|
|
124
|
+
- 发现稳定领域知识、承重决策、复用教训时,仍按 `std/attractors/knowledge-tiers.md` 晋升到 owner 层;不要让 mission 成为长期知识垃圾桶。
|
|
125
|
+
- 旧 `missions/<mission-id>/roadmap.md` 形态可以手工迁移为新结构;新规范不要求自动迁移旧 mission。
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# codument/sop/ —— 项目自定义执行流程(项目级,非内置)
|
|
2
|
+
|
|
3
|
+
本目录放**本项目特有**的执行流程 / 方法论(文字或轻结构化)。它与 `codument/std/sop/`(codument **内置标准** sop:workflow、questioning、validation、tdd、wave-exec、gap-loop、archive、artifact-sync)区分:
|
|
4
|
+
|
|
5
|
+
- **`std/sop/`** = 随 codument 分发、init 落盘的**内置标准规程**;升级时刷新。
|
|
6
|
+
- **`sop/`(本目录)** = 项目团队自己加的规程(特定领域套路、团队约定流程),不被 codument 升级覆盖。
|
|
7
|
+
|
|
8
|
+
## 约定
|
|
9
|
+
|
|
10
|
+
- 两段式可选(「轻量 XML 骨架 + prose」,同 `std/operations/_operation-spec.md` 精神)。
|
|
11
|
+
- 项目自定义 skill / 或对内置 skill 的项目特化,可经 `<protocols><ref>codument/sop/<name>.md</ref>` 引用本目录。
|
|
12
|
+
- 与内置规程同名时,项目可在此覆盖/扩展(由引用方决定优先级)。
|
|
13
|
+
|
|
14
|
+
> 内置规程不放这里——它们在 `std/sop/`。本目录初始为空(仅本 README)。
|