@adamchanadam/cer-workflow 0.3.17
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 +58 -0
- package/bin/cer-workflow.mjs +292 -0
- package/package.json +56 -0
- package/skills/cer-workflow/SKILL.md +63 -0
- package/skills/cer-workflow/VERSION +1 -0
- package/skills/cer-workflow/agents/openai.yaml +6 -0
- package/skills/cer-workflow/references/core-runtime.md +479 -0
- package/skills/cer-workflow/references/parallel-producers.md +159 -0
- package/skills/cer-workflow/references/roadmap.md +182 -0
- package/skills/cer-workflow/references/uat.md +605 -0
- package/skills/cer-workflow/scripts/validate_cer_skill.py +1887 -0
- package/skills/cer-workflow-en/SKILL.md +71 -0
- package/skills/cer-workflow-en/VERSION +1 -0
- package/skills/cer-workflow-en/agents/openai.yaml +6 -0
- package/skills/cer-workflow-en/references/core-runtime.md +602 -0
- package/skills/cer-workflow-en/references/parallel-producers.md +174 -0
- package/skills/cer-workflow-en/references/roadmap.md +198 -0
- package/skills/cer-workflow-en/references/uat.md +718 -0
- package/skills/cer-workflow-en/scripts/validate_cer_skill.py +1889 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Adam Chan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# CER Workflow
|
|
2
|
+
|
|
3
|
+
Installable npm package for the CER Workflow Codex skills.
|
|
4
|
+
|
|
5
|
+
Status:
|
|
6
|
+
|
|
7
|
+
- Package version `0.3.17` matches the included CER Workflow Skill runtime VERSION files.
|
|
8
|
+
- npm support is an installability layer for future users. It does not change CER runtime behavior.
|
|
9
|
+
- Validator, package, and install checks do not by themselves prove manual UAT pass, token saving, or universal task quality.
|
|
10
|
+
|
|
11
|
+
Packaged surfaces:
|
|
12
|
+
|
|
13
|
+
- `skills/cer-workflow`: Traditional Chinese installable Skill package.
|
|
14
|
+
- `skills/cer-workflow-en`: English installable Skill package.
|
|
15
|
+
- `bin/cer-workflow.mjs`: small local helper for package inspection and explicit-target install tests.
|
|
16
|
+
|
|
17
|
+
The package whitelist intentionally excludes internal maintenance material such as `dev/`, `CER_docs/`, handoff and log files, backups, temporary evidence, local workspace paths, and cross-project comparison evidence.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npm install -g @adamchanadam/cer-workflow
|
|
23
|
+
cer-workflow help
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For one-off inspection without a global install:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
npx @adamchanadam/cer-workflow inspect
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Local Checks
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
npm run package:inspect
|
|
36
|
+
npm run pack:dry-run
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
After packing and installing the generated tarball into a temporary project, run:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
npx cer-workflow inspect --strict-package
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Install Helper
|
|
46
|
+
|
|
47
|
+
The helper does not auto-detect or silently write to any global Skill directory. A file-copy Skill install requires an explicit target and confirmation:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
npx cer-workflow install --skill en --target <empty-skill-directory> --yes
|
|
51
|
+
npx cer-workflow install --skill zh --target <empty-skill-directory> --yes
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The target directory must be absent or empty. The helper does not overwrite, delete, migrate, or back up an existing Skill directory.
|
|
55
|
+
|
|
56
|
+
## Release Boundary
|
|
57
|
+
|
|
58
|
+
This package is a distribution wrapper for the included Skill packages. Public runtime behavior remains owned by the Skill files and their references.
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import process from "node:process";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const packageRoot = path.resolve(__dirname, "..");
|
|
10
|
+
const packageJsonPath = path.join(packageRoot, "package.json");
|
|
11
|
+
|
|
12
|
+
const skillFiles = [
|
|
13
|
+
"SKILL.md",
|
|
14
|
+
"VERSION",
|
|
15
|
+
"agents/openai.yaml",
|
|
16
|
+
"references/core-runtime.md",
|
|
17
|
+
"references/parallel-producers.md",
|
|
18
|
+
"references/roadmap.md",
|
|
19
|
+
"references/uat.md",
|
|
20
|
+
"scripts/validate_cer_skill.py",
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const skills = {
|
|
24
|
+
zh: {
|
|
25
|
+
label: "Traditional Chinese",
|
|
26
|
+
source: "skills/cer-workflow",
|
|
27
|
+
expectedTargetName: "cer-workflow",
|
|
28
|
+
},
|
|
29
|
+
en: {
|
|
30
|
+
label: "English",
|
|
31
|
+
source: "skills/cer-workflow-en",
|
|
32
|
+
expectedTargetName: "cer-workflow-en",
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
function readPackageJson() {
|
|
37
|
+
return JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function usage() {
|
|
41
|
+
return `CER Workflow package helper
|
|
42
|
+
|
|
43
|
+
Usage:
|
|
44
|
+
cer-workflow help
|
|
45
|
+
cer-workflow version
|
|
46
|
+
cer-workflow inspect [--strict-package]
|
|
47
|
+
cer-workflow install --skill zh|en --target <empty-skill-directory> --yes
|
|
48
|
+
|
|
49
|
+
Notes:
|
|
50
|
+
- This helper installs only the packaged CER Workflow Skill files.
|
|
51
|
+
- install never auto-detects a global Skill path.
|
|
52
|
+
- install refuses non-empty targets and does not delete, overwrite, migrate, or back up files.
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function parseFlags(args) {
|
|
57
|
+
const flags = new Map();
|
|
58
|
+
const positionals = [];
|
|
59
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
60
|
+
const arg = args[i];
|
|
61
|
+
if (!arg.startsWith("--")) {
|
|
62
|
+
positionals.push(arg);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const key = arg.slice(2);
|
|
66
|
+
if (key === "yes" || key === "strict-package") {
|
|
67
|
+
flags.set(key, true);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const value = args[i + 1];
|
|
71
|
+
if (!value || value.startsWith("--")) {
|
|
72
|
+
throw new Error(`Missing value for --${key}`);
|
|
73
|
+
}
|
|
74
|
+
flags.set(key, value);
|
|
75
|
+
i += 1;
|
|
76
|
+
}
|
|
77
|
+
return { flags, positionals };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function requiredPackageFiles() {
|
|
81
|
+
const files = ["README.md", "LICENSE", "bin/cer-workflow.mjs"];
|
|
82
|
+
for (const skill of Object.values(skills)) {
|
|
83
|
+
for (const file of skillFiles) {
|
|
84
|
+
files.push(path.posix.join(skill.source, file));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return files;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function inspectPackage(strictPackage) {
|
|
91
|
+
const pkg = readPackageJson();
|
|
92
|
+
const errors = [];
|
|
93
|
+
const warnings = [];
|
|
94
|
+
if (pkg.name !== "@adamchanadam/cer-workflow") {
|
|
95
|
+
errors.push("package name mismatch");
|
|
96
|
+
}
|
|
97
|
+
const zhVersion = fs.readFileSync(path.join(packageRoot, skills.zh.source, "VERSION"), "utf8").trim();
|
|
98
|
+
const enVersion = fs.readFileSync(path.join(packageRoot, skills.en.source, "VERSION"), "utf8").trim();
|
|
99
|
+
if (pkg.version !== zhVersion || pkg.version !== enVersion) {
|
|
100
|
+
errors.push("package version must match both packaged Skill VERSION files");
|
|
101
|
+
}
|
|
102
|
+
if (pkg.private === true) {
|
|
103
|
+
errors.push("package must not be private for the promoted npm candidate");
|
|
104
|
+
}
|
|
105
|
+
if (pkg.license !== "MIT") {
|
|
106
|
+
errors.push("package license must be MIT");
|
|
107
|
+
}
|
|
108
|
+
if (pkg.publishConfig?.access !== "public" || pkg.publishConfig?.tag !== "next") {
|
|
109
|
+
errors.push("publishConfig must keep access=public and tag=next before first publish");
|
|
110
|
+
}
|
|
111
|
+
if (pkg.bin?.["cer-workflow"] !== "bin/cer-workflow.mjs") {
|
|
112
|
+
errors.push("bin mapping is missing or changed");
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const expectedFiles = requiredPackageFiles();
|
|
116
|
+
for (const file of expectedFiles) {
|
|
117
|
+
if (!fs.existsSync(path.join(packageRoot, file))) {
|
|
118
|
+
errors.push(`missing required package file: ${file}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const whitelist = Array.isArray(pkg.files) ? pkg.files : [];
|
|
123
|
+
const missingWhitelistEntries = expectedFiles.filter((file) => !whitelist.includes(file));
|
|
124
|
+
for (const file of missingWhitelistEntries) {
|
|
125
|
+
errors.push(`package files whitelist missing: ${file}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const forbiddenWhitelist = [
|
|
129
|
+
"dev",
|
|
130
|
+
"dev/",
|
|
131
|
+
"CER_docs",
|
|
132
|
+
"CER_docs/",
|
|
133
|
+
"backup",
|
|
134
|
+
"backup/",
|
|
135
|
+
"tmp",
|
|
136
|
+
"tmp/",
|
|
137
|
+
"START_NEXT_SESSION_PROMPT.txt",
|
|
138
|
+
];
|
|
139
|
+
for (const entry of whitelist) {
|
|
140
|
+
if (forbiddenWhitelist.includes(entry)) {
|
|
141
|
+
errors.push(`forbidden whitelist entry: ${entry}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (strictPackage) {
|
|
146
|
+
const forbiddenPackagedPaths = [
|
|
147
|
+
"dev",
|
|
148
|
+
"CER_docs",
|
|
149
|
+
"backup",
|
|
150
|
+
"tmp",
|
|
151
|
+
"Adam_Personal_Notes",
|
|
152
|
+
"travel-checklist",
|
|
153
|
+
"assets",
|
|
154
|
+
"START_NEXT_SESSION_PROMPT.txt",
|
|
155
|
+
];
|
|
156
|
+
for (const entry of forbiddenPackagedPaths) {
|
|
157
|
+
if (fs.existsSync(path.join(packageRoot, entry))) {
|
|
158
|
+
errors.push(`internal path is present in strict packaged mode: ${entry}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
warnings.push("strict package absence check skipped; use --strict-package after tarball install");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (errors.length) {
|
|
166
|
+
console.error("CER package inspection failed:");
|
|
167
|
+
for (const error of errors) {
|
|
168
|
+
console.error(`- ${error}`);
|
|
169
|
+
}
|
|
170
|
+
process.exitCode = 1;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
console.log(`CER package inspection OK: ${pkg.name}@${pkg.version}`);
|
|
175
|
+
console.log(`Public package candidate: ${pkg.private === true ? "no" : "yes"}`);
|
|
176
|
+
console.log(`Publish tag: ${pkg.publishConfig?.tag ?? "(unset)"}`);
|
|
177
|
+
console.log(`Required files checked: ${expectedFiles.length}`);
|
|
178
|
+
for (const warning of warnings) {
|
|
179
|
+
console.log(`Note: ${warning}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function expandHome(inputPath) {
|
|
184
|
+
if (inputPath === "~") {
|
|
185
|
+
return os.homedir();
|
|
186
|
+
}
|
|
187
|
+
if (inputPath.startsWith("~/") || inputPath.startsWith("~\\")) {
|
|
188
|
+
return path.join(os.homedir(), inputPath.slice(2));
|
|
189
|
+
}
|
|
190
|
+
return inputPath;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function assertSafeTarget(target, skill) {
|
|
194
|
+
const resolved = path.resolve(expandHome(target));
|
|
195
|
+
const parsed = path.parse(resolved);
|
|
196
|
+
const home = path.resolve(os.homedir());
|
|
197
|
+
const root = path.resolve(parsed.root);
|
|
198
|
+
const packageRootResolved = path.resolve(packageRoot);
|
|
199
|
+
|
|
200
|
+
if (resolved === root) {
|
|
201
|
+
throw new Error("Refusing to install into a filesystem root");
|
|
202
|
+
}
|
|
203
|
+
if (resolved === home) {
|
|
204
|
+
throw new Error("Refusing to install directly into the user home directory");
|
|
205
|
+
}
|
|
206
|
+
if (resolved === packageRootResolved || resolved.startsWith(`${packageRootResolved}${path.sep}`)) {
|
|
207
|
+
throw new Error("Refusing to install inside this package source root");
|
|
208
|
+
}
|
|
209
|
+
if (path.basename(resolved) !== skill.expectedTargetName) {
|
|
210
|
+
throw new Error(`Target directory name must be ${skill.expectedTargetName}`);
|
|
211
|
+
}
|
|
212
|
+
return resolved;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function listDirectoryIfExists(target) {
|
|
216
|
+
if (!fs.existsSync(target)) {
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
const stat = fs.statSync(target);
|
|
220
|
+
if (!stat.isDirectory()) {
|
|
221
|
+
throw new Error("Target exists but is not a directory");
|
|
222
|
+
}
|
|
223
|
+
return fs.readdirSync(target);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function copySkill(skill, target) {
|
|
227
|
+
const sourceRoot = path.join(packageRoot, skill.source);
|
|
228
|
+
for (const relative of skillFiles) {
|
|
229
|
+
const source = path.join(sourceRoot, relative);
|
|
230
|
+
const destination = path.join(target, relative);
|
|
231
|
+
fs.mkdirSync(path.dirname(destination), { recursive: true });
|
|
232
|
+
fs.copyFileSync(source, destination, fs.constants.COPYFILE_EXCL);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function installSkill(args) {
|
|
237
|
+
const { flags } = parseFlags(args);
|
|
238
|
+
const skillKey = flags.get("skill");
|
|
239
|
+
const targetInput = flags.get("target");
|
|
240
|
+
const confirmed = flags.get("yes") === true;
|
|
241
|
+
|
|
242
|
+
if (!skillKey || !skills[skillKey]) {
|
|
243
|
+
throw new Error("install requires --skill zh or --skill en");
|
|
244
|
+
}
|
|
245
|
+
if (!targetInput) {
|
|
246
|
+
throw new Error("install requires --target <empty-skill-directory>");
|
|
247
|
+
}
|
|
248
|
+
if (!confirmed) {
|
|
249
|
+
throw new Error("install requires --yes");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const skill = skills[skillKey];
|
|
253
|
+
const target = assertSafeTarget(targetInput, skill);
|
|
254
|
+
const existingEntries = listDirectoryIfExists(target);
|
|
255
|
+
if (existingEntries.length > 0) {
|
|
256
|
+
throw new Error("Target directory is not empty; this helper does not overwrite or delete files");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
fs.mkdirSync(target, { recursive: true });
|
|
260
|
+
copySkill(skill, target);
|
|
261
|
+
console.log(`Installed ${skill.label} CER Workflow skill to ${target}`);
|
|
262
|
+
console.log(`Files copied: ${skillFiles.length}`);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function main() {
|
|
266
|
+
const [command = "help", ...args] = process.argv.slice(2);
|
|
267
|
+
if (command === "help" || command === "--help" || command === "-h") {
|
|
268
|
+
console.log(usage());
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (command === "version" || command === "--version" || command === "-v") {
|
|
272
|
+
console.log(readPackageJson().version);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (command === "inspect") {
|
|
276
|
+
const { flags } = parseFlags(args);
|
|
277
|
+
inspectPackage(flags.get("strict-package") === true);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (command === "install") {
|
|
281
|
+
installSkill(args);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
throw new Error(`Unknown command: ${command}`);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
main();
|
|
289
|
+
} catch (error) {
|
|
290
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
291
|
+
process.exitCode = 1;
|
|
292
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@adamchanadam/cer-workflow",
|
|
3
|
+
"version": "0.3.17",
|
|
4
|
+
"description": "Installable npm package for the CER Workflow Codex skills.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cer-workflow": "bin/cer-workflow.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"README.md",
|
|
11
|
+
"LICENSE",
|
|
12
|
+
"bin/cer-workflow.mjs",
|
|
13
|
+
"skills/cer-workflow/SKILL.md",
|
|
14
|
+
"skills/cer-workflow/VERSION",
|
|
15
|
+
"skills/cer-workflow/agents/openai.yaml",
|
|
16
|
+
"skills/cer-workflow/references/core-runtime.md",
|
|
17
|
+
"skills/cer-workflow/references/parallel-producers.md",
|
|
18
|
+
"skills/cer-workflow/references/roadmap.md",
|
|
19
|
+
"skills/cer-workflow/references/uat.md",
|
|
20
|
+
"skills/cer-workflow/scripts/validate_cer_skill.py",
|
|
21
|
+
"skills/cer-workflow-en/SKILL.md",
|
|
22
|
+
"skills/cer-workflow-en/VERSION",
|
|
23
|
+
"skills/cer-workflow-en/agents/openai.yaml",
|
|
24
|
+
"skills/cer-workflow-en/references/core-runtime.md",
|
|
25
|
+
"skills/cer-workflow-en/references/parallel-producers.md",
|
|
26
|
+
"skills/cer-workflow-en/references/roadmap.md",
|
|
27
|
+
"skills/cer-workflow-en/references/uat.md",
|
|
28
|
+
"skills/cer-workflow-en/scripts/validate_cer_skill.py"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"package:inspect": "node bin/cer-workflow.mjs inspect",
|
|
32
|
+
"pack:dry-run": "npm pack --dry-run --json"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"codex",
|
|
36
|
+
"skill",
|
|
37
|
+
"cer-workflow",
|
|
38
|
+
"agent-workflow"
|
|
39
|
+
],
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/Adamchanadam/cer-workflow.git"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/Adamchanadam/cer-workflow#readme",
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/Adamchanadam/cer-workflow/issues"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"tag": "next"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cer-workflow
|
|
3
|
+
description: "執行獨立 CER 工作法,或用本地 /CER-auto 選最低足夠的 ordinary/Goal/CER 工作法/blocked 路線。只在使用者明確帶 CER 的指令或同等語意時使用;適合長期、多批、易中斷、需要唯一 writer、fresh Reviewer、自足派工、持久化及按需平行候選分析的工作。單獨「開工/收工」不是 CER 觸發。本 Skill 不規定項目文件。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CER 工作法
|
|
7
|
+
|
|
8
|
+
CER Core v1 只供 Codex 使用。Claude Code 需要另一個尚未提供的 Skill;不得聲稱本
|
|
9
|
+
Skill 或本 repo 目前支援 Claude Code。
|
|
10
|
+
|
|
11
|
+
公開 runtime 語言邊界由 [core-runtime.md](references/core-runtime.md) 擁有:未來行為先
|
|
12
|
+
改英文 `cer-workflow-en` canonical;本入口只保留中文觸發/回覆相容,不另定 runtime。
|
|
13
|
+
|
|
14
|
+
## 入口路由
|
|
15
|
+
|
|
16
|
+
1. 處理本地 `/CER-auto` 時,在任何 CER 身份成立前,只讀取
|
|
17
|
+
[core-runtime.md](references/core-runtime.md) 的「執行強度閘門」及裁決所需的使用者
|
|
18
|
+
要求與目標專案真源;路徑已知時按該 owner 的單次有界讀取要求載入。選 ordinary execution 或 Goal 後停止載入其他 CER references;選 CER 工作法
|
|
19
|
+
時只在需要 CER 的停點完整讀取 `core-runtime.md` 及 [roadmap.md](references/roadmap.md),按現行
|
|
20
|
+
CER 啟動。CER 啟動後才成立 C/E1;R 仍按既有 Reviewer owner 的風險條件建立。
|
|
21
|
+
blocked 則報缺口並停止。Remote `/CER-auto` 首版不支援。
|
|
22
|
+
2. 接受 `/CER-start` 前,完整讀取 [core-runtime.md](references/core-runtime.md) 及
|
|
23
|
+
[roadmap.md](references/roadmap.md)。
|
|
24
|
+
3. 處理 `/CER-close` 時,只讀取 `core-runtime.md` 的「角色」、「小熊卡 package 版本」及
|
|
25
|
+
「獨立持久化與收工」,以及 `roadmap.md` 的「固定生命週期卡」。
|
|
26
|
+
4. 處理 `/CER-stop` 時,只讀取 `core-runtime.md` 的「角色」、「小熊卡 package 版本」及
|
|
27
|
+
「停用 CER」,以及 `roadmap.md` 的「固定生命週期卡」;其他停點只讀相關段落。
|
|
28
|
+
5. 只有角色座標或終態證據不完整、互相矛盾,或目標專案另有要求時才擴大讀取;不得只因指令是 stop/close 而完整重讀全部 references。
|
|
29
|
+
6. CER 啟動後,目標 `AGENTS.md` 明確路由 Kit full closeout 或 governance bridge 時,只讀取 `core-runtime.md` 的「自足派工」相應規則,不另行設計 Kit 程序。
|
|
30
|
+
7. 只有安裝驗收或 fresh UAT 才完整讀取 [uat.md](references/uat.md)。
|
|
31
|
+
8. C 評估或使用平行候選生產者前,完整讀取
|
|
32
|
+
[parallel-producers.md](references/parallel-producers.md);該檔是此能力的唯一完整 owner。
|
|
33
|
+
|
|
34
|
+
## 操作指令
|
|
35
|
+
|
|
36
|
+
slash command 是文字別名;平台不支援時,直接貼上同一句仍有效。
|
|
37
|
+
|
|
38
|
+
| 指令 | 自然語言 | 效果 |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `/CER-auto <任務、限制、優先序>` | `CER 自適應:...` | 本地 task 先選 ordinary execution、Goal、CER 工作法或 blocked;路線裁決前不成立 C;選到 CER 工作法才進完整 C/E/R,R 按風險決定。Remote 首版不支援。 |
|
|
41
|
+
| `/CER-start <任務、限制、優先序>` | `CER 啟動:...` | 啟動 CER;本地或明確 Remote 接收 task 可成為唯一 C。單獨 `開工` 不啟動 CER。 |
|
|
42
|
+
| `/CER-stop` | `停止 CER,改用單 thread 繼續。` | 按 runtime 收斂 active writer 後停用 CER。 |
|
|
43
|
+
| `/CER-close` | `CER 收工。`/`CER 關閉。` | 按 runtime 收尾並證明 writer closed。單獨 `收工` 不觸發 CER close。 |
|
|
44
|
+
| `/CER-status` | `顯示 CER 狀態。` | 只報 C 已知狀態、座標、停點及阻礙;不輪詢。 |
|
|
45
|
+
| `/CER-help` | `顯示 CER 指令。` | 顯示本表與 `/CER-auto` 任務寫法。 |
|
|
46
|
+
|
|
47
|
+
`/CER-auto` 任務寫法:用 `目標+限制/不可做+成功驗收+權威來源/授權邊界`。需要例子時,按使用者情境生成,不固定行業:`/CER-auto 幫我比較/整理/修補 <你的資料或問題>;不要 <不可做的事>;成功條件是 <可驗收成果>;如要作正式決策、付款、發布或外部承諾,先停下改用 CER 工作法。`
|
|
48
|
+
|
|
49
|
+
## 入口邊界
|
|
50
|
+
|
|
51
|
+
- 完整唯一 C 啟動閘門由 `core-runtime.md` 擁有:candidate `C_READY` 與發送方讀回仍不足夠;
|
|
52
|
+
接收者實際收到 `C_ACCEPTED` 後才成為 active Controller(C)。
|
|
53
|
+
- 正式 E/R 必須在同一 Codex project 側欄可見並由官方 `create_thread` 建立,不得用 inline sub-agent、fork 或 delegate 降級代替。每輪 `CER-start` 建立全新 E1,同一輪後續批次持續復用該同一 E1;每個 R 都必須是 fresh 新 task。完整拓撲、唯一 writer、Reviewer、批次、direct-push、result disposition、正式採用裁決、persistence 及 close 規則只在 `core-runtime.md` 定義。
|
|
54
|
+
- 顯示標籤只作辨識:`🚀 C:01|...`、`E1:01|...`、`R1:01|...`、`R2:01|...`、
|
|
55
|
+
`E2:01|...`。`00` 只可標示無法可靠回推的 legacy cycle;新 cycle 必須用 `01` 以上,
|
|
56
|
+
不顯示問號 cycle label。cycle 編號只供側欄辨識,完整 threadId 仍是權威;收尾改名失敗只報
|
|
57
|
+
`title sync warning`。卡片文字及 `VERSION` 讀法由 `roadmap.md`/`core-runtime.md` 擁有。
|
|
58
|
+
- 真源攝取門檻只由 `core-runtime.md` 的 Controller preflight 擁有;`/CER-auto` 的路線選擇、重判及安全切換只由其「執行強度閘門」擁有;長任務防失焦檢查點只由其成果錨定與進展閘擁有。入口不重寫 profile、Reviewer、YAGNI 或停止規則。
|
|
59
|
+
|
|
60
|
+
## 版本與藍圖邊界
|
|
61
|
+
|
|
62
|
+
`v1` 是工作流世代,不是 package 版本;package 版本只來自本 Skill 同層的 `VERSION`。
|
|
63
|
+
根目錄 `01_CER工作法_人類概覽.md` 與 `02_CER工作法_AI執行協議.md` 是來源專案的內部需求與驗收藍圖;Skill references 是實際操作規程。兩者對齊但互不擁有,不在入口複製 runtime。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.3.17
|