clean-room-skill 0.3.1 → 0.4.0
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +2 -2
- package/docs/REFERENCE.md +14 -12
- package/lib/bootstrap.cjs +21 -9
- package/lib/install-cli.cjs +5 -0
- package/lib/install-options.cjs +1 -0
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/attended/SKILL.md +2 -2
- package/skills/clean-room/SKILL.md +2 -2
- package/skills/clean-room/references/PREFLIGHT.md +3 -3
- package/skills/clean-room/references/SPEC-SCHEMA.md +4 -4
- package/skills/init/SKILL.md +3 -3
- package/skills/unattended/SKILL.md +2 -2
package/README.md
CHANGED
|
@@ -107,9 +107,9 @@ Optionally create neutral external run folders and a clean-safe repository stub:
|
|
|
107
107
|
npx clean-room-skill@latest init
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
The default task root is `~/Documents/CleanRoom/<task-id>/` with `contaminated/`, `clean/`,
|
|
110
|
+
By default this creates a neutral clean-room project. The default task root is `~/Documents/CleanRoom/<project>/tasks/<task-id>/` with per-task `contaminated/`, `clean/`, and `quarantine/` children, plus one shared `~/Documents/CleanRoom/<project>/implementation/` root. Use `init --single-task` only when you need the legacy flat `~/Documents/CleanRoom/<task-id>/` layout.
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
To add another task to the same destination project, pass `init --project <name>` with the existing neutral project name. Plain `init` creates a new generated `proj-xxxxxxxx` project. Project names must stay neutral, like task IDs: a random word pair such as `amber-meadow` or a generated `proj-xxxxxxxx`, never derived from source folder names. Run at most one active task per project at a time because tasks share the implementation root; `clean-room-skill run` enforces this with an advisory `.clean-room-implementation.lock` in each implementation root.
|
|
113
113
|
|
|
114
114
|
In Claude Code, invoke skills with the plugin namespace:
|
|
115
115
|
|
package/docs/REFERENCE.md
CHANGED
|
@@ -165,6 +165,7 @@ npx clean-room-skill@latest init
|
|
|
165
165
|
npx clean-room-skill@latest init --target-dir . --target-profile speckit-feature-folder
|
|
166
166
|
npx clean-room-skill@latest init --artifact-base ~/Documents/CleanRoom --task-id task-1234abcd
|
|
167
167
|
npx clean-room-skill@latest init --project amber-meadow --task-id task-1234abcd
|
|
168
|
+
npx clean-room-skill@latest init --single-task --task-id task-1234abcd
|
|
168
169
|
```
|
|
169
170
|
|
|
170
171
|
Options:
|
|
@@ -174,22 +175,14 @@ Options:
|
|
|
174
175
|
| `--target-dir <path>` | Repository to initialize; default is current directory. |
|
|
175
176
|
| `--artifact-base <path>` | External CleanRoom base; default is `~/Documents/CleanRoom`. |
|
|
176
177
|
| `--task-id <id>` | Neutral task id; default is generated `task-xxxxxxxx`. |
|
|
177
|
-
| `--project <name>` | Group the task under a clean-room project; joins the project when it already exists. Names must be neutral (`[a-z0-9][a-z0-9-]{0,63}`, never derived from source or workspace folder names). |
|
|
178
|
-
| `--new-project` |
|
|
178
|
+
| `--project <name>` | Group the task under a named clean-room project; joins the project when it already exists. Names must be neutral (`[a-z0-9][a-z0-9-]{0,63}`, never derived from source or workspace folder names). |
|
|
179
|
+
| `--new-project` | Explicitly create a project with a generated `proj-xxxxxxxx` name. This is the default unless `--single-task` is passed. Cannot be combined with `--project`. |
|
|
180
|
+
| `--single-task` | Use the legacy flat layout under `<artifact-base>/<task-id>`. Cannot be combined with `--project` or `--new-project`. |
|
|
179
181
|
| `--target-profile <name>` | `openspec-delta`, `gsd-planning-package`, `speckit-feature-folder`, or `kiro-spec-folder`. |
|
|
180
182
|
| `--dry-run` | Print actions without writing files. |
|
|
181
183
|
| `--force` | Overwrite existing bootstrap metadata and repo stub. |
|
|
182
184
|
|
|
183
|
-
By default, `init` creates a
|
|
184
|
-
|
|
185
|
-
- `contaminated/`
|
|
186
|
-
- `clean/`
|
|
187
|
-
- `implementation/`
|
|
188
|
-
- `quarantine/`
|
|
189
|
-
- `clean-room-bootstrap.json`
|
|
190
|
-
- `.clean-room/README.md` in the target repository
|
|
191
|
-
|
|
192
|
-
With `--project` or `--new-project`, `init` creates a project layout instead. Tasks live under `<artifact-base>/<project>/tasks/<task-id>/` with per-task `contaminated/`, `clean/`, and `quarantine/`, while every task in the project shares one `<artifact-base>/<project>/implementation/` root:
|
|
185
|
+
By default, `init` creates a project layout. Plain `init` creates a new generated `proj-xxxxxxxx` project; pass `--project <name>` to add a task to an existing project. Tasks live under `<artifact-base>/<project>/tasks/<task-id>/` with per-task `contaminated/`, `clean/`, and `quarantine/`, while every task in the project shares one `<artifact-base>/<project>/implementation/` root:
|
|
193
186
|
|
|
194
187
|
```text
|
|
195
188
|
<artifact-base>/<project>/
|
|
@@ -203,6 +196,15 @@ With `--project` or `--new-project`, `init` creates a project layout instead. Ta
|
|
|
203
196
|
└── clean-room-bootstrap.json
|
|
204
197
|
```
|
|
205
198
|
|
|
199
|
+
With `--single-task`, `init` creates the legacy flat layout under `<artifact-base>/<task-id>/`:
|
|
200
|
+
|
|
201
|
+
- `contaminated/`
|
|
202
|
+
- `clean/`
|
|
203
|
+
- `implementation/`
|
|
204
|
+
- `quarantine/`
|
|
205
|
+
- `clean-room-bootstrap.json`
|
|
206
|
+
- `.clean-room/README.md` in the target repository
|
|
207
|
+
|
|
206
208
|
Re-running `init --project <name>` with a new task id joins the existing project without `--force`: the project metadata and shared `implementation/` are reused, and only the new task folders must not already exist. Because tasks share the implementation root, run at most one active task per project at a time; `clean-room-skill run` enforces this with an advisory `.clean-room-implementation.lock` in each implementation root.
|
|
207
209
|
|
|
208
210
|
Do not commit source roots, contaminated artifact paths, private identifiers, source-derived names, `preflight-goal.json`, `init-config.json`, `task-manifest.json`, `controller-status.json`, `role-session-brief.json`, or `clean-run-context.json` into the clean implementation repository.
|
package/lib/bootstrap.cjs
CHANGED
|
@@ -56,13 +56,16 @@ Options:
|
|
|
56
56
|
--target-dir <path> Repository to initialize (default: current directory)
|
|
57
57
|
--artifact-base <path> External CleanRoom base (default: ~/Documents/CleanRoom)
|
|
58
58
|
--task-id <id> Neutral task id (default: generated task-xxxxxxxx)
|
|
59
|
-
--project <name> Group this task under a clean-room project; joins the
|
|
59
|
+
--project <name> Group this task under a named clean-room project; joins the
|
|
60
60
|
project when it already exists. Project names must be
|
|
61
61
|
neutral ([a-z0-9][a-z0-9-]{0,63}) and never derived
|
|
62
62
|
from source or workspace folder names. Project layout:
|
|
63
63
|
<base>/<project>/tasks/<task-id> with one shared
|
|
64
64
|
<base>/<project>/implementation root for all tasks
|
|
65
|
-
--new-project
|
|
65
|
+
--new-project Explicitly create a project with a generated
|
|
66
|
+
proj-xxxxxxxx name (the default unless --single-task
|
|
67
|
+
is passed)
|
|
68
|
+
--single-task Use the legacy flat layout under <base>/<task-id>
|
|
66
69
|
--target-profile <name> openspec-delta, gsd-planning-package,
|
|
67
70
|
speckit-feature-folder, or kiro-spec-folder
|
|
68
71
|
(default: speckit-feature-folder)
|
|
@@ -79,6 +82,7 @@ function parseInitArgs(argv) {
|
|
|
79
82
|
taskId: null,
|
|
80
83
|
projectId: null,
|
|
81
84
|
newProject: false,
|
|
85
|
+
singleTask: false,
|
|
82
86
|
targetProfile: 'speckit-feature-folder',
|
|
83
87
|
dryRun: false,
|
|
84
88
|
force: false,
|
|
@@ -110,6 +114,8 @@ function parseInitArgs(argv) {
|
|
|
110
114
|
options.taskId = arg.slice('--task-id='.length);
|
|
111
115
|
} else if (arg === '--new-project') {
|
|
112
116
|
options.newProject = true;
|
|
117
|
+
} else if (arg === '--single-task') {
|
|
118
|
+
options.singleTask = true;
|
|
113
119
|
} else if (arg === '--project') {
|
|
114
120
|
i += 1;
|
|
115
121
|
options.projectId = requiredValue(argv, i, '--project');
|
|
@@ -130,6 +136,9 @@ function parseInitArgs(argv) {
|
|
|
130
136
|
if (options.projectId !== null && options.newProject) {
|
|
131
137
|
throw new Error('--project and --new-project cannot be combined');
|
|
132
138
|
}
|
|
139
|
+
if (options.singleTask && (options.projectId !== null || options.newProject)) {
|
|
140
|
+
throw new Error('--single-task cannot be combined with --project or --new-project');
|
|
141
|
+
}
|
|
133
142
|
|
|
134
143
|
return options;
|
|
135
144
|
}
|
|
@@ -172,7 +181,7 @@ function resolveInitOptions(options, env = process.env, homeDir = os.homedir())
|
|
|
172
181
|
const targetDir = path.resolve(expandTilde(options.targetDir, homeDir));
|
|
173
182
|
const artifactBase = path.resolve(expandTilde(options.artifactBase, homeDir));
|
|
174
183
|
|
|
175
|
-
const projectMode = options.
|
|
184
|
+
const projectMode = !options.singleTask;
|
|
176
185
|
const projectId = projectMode ? (options.projectId || generateProjectId()) : null;
|
|
177
186
|
if (projectMode) {
|
|
178
187
|
if (!PROJECT_ID_PATTERN.test(projectId)) {
|
|
@@ -254,18 +263,21 @@ function buildProjectMetadata(options) {
|
|
|
254
263
|
};
|
|
255
264
|
}
|
|
256
265
|
|
|
257
|
-
function renderRepoStub(
|
|
266
|
+
function renderRepoStub(options) {
|
|
267
|
+
const layoutDescription = options.projectId
|
|
268
|
+
? 'The bootstrap task root contains per-task `contaminated/`, `clean/`, and `quarantine/` directories. The project root contains the shared `implementation/` clean destination. Do not commit source roots, contaminated artifact paths, private identifiers, source-derived names, or active `init-config.json`, `task-manifest.json`, or `clean-run-context.json` files here.'
|
|
269
|
+
: 'The bootstrap task root contains `contaminated/`, `clean/`, `implementation/`, and `quarantine/`. Do not commit source roots, contaminated artifact paths, private identifiers, source-derived names, or active `init-config.json`, `task-manifest.json`, or `clean-run-context.json` files here.';
|
|
258
270
|
return `# Clean Room Bootstrap
|
|
259
271
|
|
|
260
272
|
This repository has a clean-room bootstrap stub.
|
|
261
273
|
|
|
262
|
-
Active clean-room run artifacts are stored outside this repository.
|
|
274
|
+
Active clean-room run artifacts are stored outside this repository. ${layoutDescription}
|
|
263
275
|
|
|
264
276
|
The final clean polish stage may create or update implementation-root \`AGENTS.md\`, \`.gitignore\`, and one local git commit through the bounded Agent 4 polish runner. That commit belongs to the clean implementation root, not to contaminated artifacts or source roots.
|
|
265
277
|
|
|
266
|
-
Default target profile: \`${targetProfile}\`
|
|
278
|
+
Default target profile: \`${options.targetProfile}\`
|
|
267
279
|
|
|
268
|
-
Start the runtime skill from your agent and provide the external
|
|
280
|
+
Start the runtime skill from your agent and provide the external task root printed by \`clean-room-skill init\`.
|
|
269
281
|
`;
|
|
270
282
|
}
|
|
271
283
|
|
|
@@ -643,7 +655,7 @@ function applyBootstrap(options) {
|
|
|
643
655
|
const metadata = `${JSON.stringify(buildBootstrapMetadata(options), null, 2)}\n`;
|
|
644
656
|
writeBootstrapFile(options.metadataPath, metadata, options.force);
|
|
645
657
|
if (options.force || !fs.existsSync(options.repoStubPath)) {
|
|
646
|
-
writeBootstrapFile(options.repoStubPath, renderRepoStub(options
|
|
658
|
+
writeBootstrapFile(options.repoStubPath, renderRepoStub(options), options.force);
|
|
647
659
|
}
|
|
648
660
|
}
|
|
649
661
|
printInitResult(options, projectState);
|
|
@@ -657,7 +669,7 @@ function printInitResult(options, projectState = { mode: 'none' }) {
|
|
|
657
669
|
console.log(` project: ${options.projectId} (${projectLabel})`);
|
|
658
670
|
console.log(` project root: ${options.projectRoot}`);
|
|
659
671
|
}
|
|
660
|
-
console.log(`
|
|
672
|
+
console.log(` task root: ${options.outputRoot}`);
|
|
661
673
|
console.log(` contaminated artifacts: ${options.roots.contaminated}`);
|
|
662
674
|
console.log(` clean artifacts: ${options.roots.clean}`);
|
|
663
675
|
if (options.projectId) {
|
package/lib/install-cli.cjs
CHANGED
|
@@ -4,6 +4,7 @@ const { runInit } = require('./bootstrap.cjs');
|
|
|
4
4
|
const { runDoctor } = require('./doctor.cjs');
|
|
5
5
|
const { runPreflight } = require('./preflight.cjs');
|
|
6
6
|
const { parseRunArgs, runCleanRoom } = require('./run.cjs');
|
|
7
|
+
const { packageVersion } = require('./install-artifacts.cjs');
|
|
7
8
|
const { resolveInteractiveOptions } = require('./install-tui.cjs');
|
|
8
9
|
const {
|
|
9
10
|
operationForOptions,
|
|
@@ -22,6 +23,10 @@ const {
|
|
|
22
23
|
|
|
23
24
|
async function main() {
|
|
24
25
|
const argv = process.argv.slice(2);
|
|
26
|
+
if (argv.length === 1 && argv[0] === '--version') {
|
|
27
|
+
console.log(packageVersion());
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
25
30
|
if (argv[0] === 'init') {
|
|
26
31
|
runInit(argv.slice(1));
|
|
27
32
|
return;
|
package/lib/install-options.cjs
CHANGED
|
@@ -117,6 +117,7 @@ Options:
|
|
|
117
117
|
--dry-run Print actions without writing files
|
|
118
118
|
--yes Non-interactive mode; unknown conflicts still abort
|
|
119
119
|
--uninstall Remove manifest-managed files and clean-room hook entries
|
|
120
|
+
--version Print the installed clean-room-skill version
|
|
120
121
|
|
|
121
122
|
Run without runtime and scope flags for interactive install or uninstall.
|
|
122
123
|
Interactive runtime selection accepts names, numbers, ranges, all, or installed.
|
package/package.json
CHANGED
package/plugin.json
CHANGED
package/skills/attended/SKILL.md
CHANGED
|
@@ -20,8 +20,8 @@ Load or create `preflight-goal.json` first. Attended mode may continue with unre
|
|
|
20
20
|
Gather only required setup facts:
|
|
21
21
|
|
|
22
22
|
- Authorization statement, requester, allowed actions, prohibited actions, and evidence handling.
|
|
23
|
-
- Artifact base root, defaulting to `~/Documents/CleanRoom/<task-id>/`. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
24
|
-
-
|
|
23
|
+
- Artifact base root, defaulting the task root to `~/Documents/CleanRoom/<project>/tasks/<task-id>/`. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
24
|
+
- Project grouping, following the canonical `clean-room` project layout rules: `<base>/<project>/tasks/<task-id>/` with one shared `<base>/<project>/implementation/` root, a neutral project name (`proj-` plus 8 lowercase hex unless the user supplies an approved neutral name, matching `[a-z0-9][a-z0-9-]{0,63}`, never source-derived), and at most one active task per project. Use legacy flat `<base>/<task-id>/` roots only when the user explicitly chooses single-task compatibility.
|
|
25
25
|
- Source roots, contaminated artifact root, clean artifact root, clean implementation root, quarantine root, and optional public or destination reference roots.
|
|
26
26
|
- Target stack, destination constraints, dependency/license policy, exactness policy, feature policy, code hygiene policy, and output policy from `preflight-goal.json`.
|
|
27
27
|
- Target schema profile: `openspec-delta`, `gsd-planning-package`, `speckit-feature-folder`, or `kiro-spec-folder`.
|
|
@@ -98,8 +98,8 @@ Load or create `preflight-goal.json` only after this discovery step. Do not star
|
|
|
98
98
|
Gather only the setup facts needed to decide whether the workflow may start, or invoke `init` when the user wants a dedicated setup pass:
|
|
99
99
|
|
|
100
100
|
- Authorization statement, requester, allowed actions, prohibited actions, and evidence handling.
|
|
101
|
-
- Artifact base root. Default to `~/Documents/CleanRoom/<task-id>/`. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
102
|
-
-
|
|
101
|
+
- Artifact base root. Default the task root to `~/Documents/CleanRoom/<project>/tasks/<task-id>/`. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
102
|
+
- Project grouping. Default to the clean-room project layout: `<base>/<project>/tasks/<task-id>/` with one shared `<base>/<project>/implementation/` root for every task in the project. When the user does not supply an approved neutral project name, generate `proj-` plus 8 lowercase hex characters; it must match `[a-z0-9][a-z0-9-]{0,63}`, must never be derived from source or destination folder basenames or meaningful source-name tokens, and appears in paths clean roles can see. Use the legacy flat `<base>/<task-id>/` layout only when the user explicitly chooses single-task compatibility. Only one task per project may run at a time because tasks share the implementation root; the durable runner enforces this with an advisory `.clean-room-implementation.lock` in each implementation root.
|
|
103
103
|
- Source roots or fallback visual evidence roots, contaminated artifact root, clean artifact root, clean implementation root, quarantine root, and optional public or destination reference roots.
|
|
104
104
|
- Target stack and destination constraints from `preflight-goal.json`.
|
|
105
105
|
- Target schema profile: `openspec-delta`, `gsd-planning-package`, `speckit-feature-folder`, or `kiro-spec-folder`.
|
|
@@ -22,9 +22,9 @@ Ask only enough to fill `preflight-goal.json`:
|
|
|
22
22
|
|
|
23
23
|
Record every default as an assumption. Good defaults:
|
|
24
24
|
|
|
25
|
-
- Artifact base: `~/Documents/CleanRoom/<task-id>/`.
|
|
26
|
-
- Implementation root: `~/Documents/CleanRoom/<
|
|
27
|
-
-
|
|
25
|
+
- Artifact base: `~/Documents/CleanRoom/<project>/tasks/<task-id>/`.
|
|
26
|
+
- Implementation root: `~/Documents/CleanRoom/<project>/implementation/`.
|
|
27
|
+
- Single-task compatibility layout: task root `~/Documents/CleanRoom/<task-id>/` with implementation root `~/Documents/CleanRoom/<task-id>/implementation/`.
|
|
28
28
|
- Existing destination policy: `inspect-and-preserve`.
|
|
29
29
|
- Dependency policy: allow new dependencies, prefer standard library, require approval for native/system dependencies.
|
|
30
30
|
- Dependency licenses: allow MIT, Apache-2.0, BSD-2-Clause, and BSD-3-Clause; block GPL-3.0 and AGPL-3.0 unless the user explicitly approves otherwise.
|
|
@@ -98,16 +98,16 @@ Unattended mode requires `unattended_allowed_after_preflight: true`, finite `max
|
|
|
98
98
|
|
|
99
99
|
### Path Naming Guards
|
|
100
100
|
|
|
101
|
-
Default artifact roots live under `~/Documents/CleanRoom/<task-id
|
|
101
|
+
Default artifact roots live under `~/Documents/CleanRoom/<project>/tasks/<task-id>/` with a shared `~/Documents/CleanRoom/<project>/implementation/` root. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. If the user does not provide an explicitly approved neutral project ID, generate one as `proj-` plus 8 lowercase hex characters. Do not use the source folder name as the task ID or project ID.
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
The legacy flat `~/Documents/CleanRoom/<task-id>/` layout remains valid only for explicit single-task compatibility. Project names follow the same neutrality rules as task IDs and are never derived from source folder names.
|
|
104
104
|
|
|
105
105
|
Clean artifact, contaminated artifact, and implementation roots must not contain source root basenames or meaningful non-generic tokens from those basenames. The environment preflight enforces this for `CLEAN_ROOM_CLEAN_ROOTS`, `CLEAN_ROOM_CONTAMINATED_ARTIFACT_ROOTS`, and `CLEAN_ROOM_IMPLEMENTATION_ROOTS`.
|
|
106
106
|
|
|
107
107
|
Capture:
|
|
108
108
|
|
|
109
|
-
- artifact base root, defaulting to `~/Documents/CleanRoom/<task-id>/` with
|
|
110
|
-
-
|
|
109
|
+
- artifact base root, defaulting to `~/Documents/CleanRoom/<project>/tasks/<task-id>/` with neutral project and task IDs
|
|
110
|
+
- `project_id` and `project_root` for the default project layout, omitted only for explicit single-task compatibility
|
|
111
111
|
- source roots or fallback visual evidence roots, contaminated artifact root, clean artifact root, clean implementation roots, quarantine root, and approved public references
|
|
112
112
|
- target profile
|
|
113
113
|
- default model plus optional clean, contaminated, or per-role overrides
|
package/skills/init/SKILL.md
CHANGED
|
@@ -19,7 +19,7 @@ Keep `preflight-goal.json` in the controller/contaminated artifact domain. Clean
|
|
|
19
19
|
|
|
20
20
|
Use the canonical `clean-room` skill workflow and references in this plugin. Preserve the clean-room boundary, role separation, artifact schemas, leakage rules, implementation-root rules, and hook expectations.
|
|
21
21
|
|
|
22
|
-
The CLI command `clean-room-skill init` (or `npx clean-room-skill@latest init` if the binary is not available) may have pre-created neutral external folders and a clean-safe `.clean-room/README.md` stub in the target repository. The
|
|
22
|
+
The CLI command `clean-room-skill init` (or `npx clean-room-skill@latest init` if the binary is not available) may have pre-created neutral external folders and a clean-safe `.clean-room/README.md` stub in the target repository. The default project layout places the task root at `<base>/<project>/tasks/<task-id>/` with per-task `contaminated/`, `clean/`, and `quarantine/`, plus a shared project-level `implementation/` and a `clean-room-project.json` metadata file at the project root. The legacy single-task root is created only when `--single-task` is passed and contains `contaminated/`, `clean/`, `implementation/`, and `quarantine/`. Treat that bootstrap output as convenience scaffolding only. It does not replace this skill's initialization workflow, and it must not be treated as an active `preflight-goal.json`, `init-config.json`, `task-manifest.json`, or `clean-run-context.json`.
|
|
23
23
|
|
|
24
24
|
When using an existing CLI bootstrap, check `clean-room-bootstrap.json`, `contaminated/`, `clean/`, `quarantine/`, the implementation root (task-level in the legacy layout, project-level in the project layout), and the target repo `.clean-room/README.md` before recording active init preferences. In the project layout also check `clean-room-project.json` and that the task root sits under the project's `tasks/` directory. Stop if metadata is missing, invalid, mismatched with the task root, or any generated path is missing or the wrong type. Do not infer active workflow state from those bootstrap files.
|
|
25
25
|
|
|
@@ -29,8 +29,8 @@ Collect only setup decisions that affect correctness, safety, resumability, or o
|
|
|
29
29
|
|
|
30
30
|
- Requester authorization, allowed actions, prohibited actions, and evidence handling.
|
|
31
31
|
- Source roots, contaminated artifact root, clean artifact root, clean implementation roots, quarantine root, and approved public or destination reference roots.
|
|
32
|
-
- Artifact base root. Default to `~/Documents/CleanRoom/<task-id>/`, never to the source workspace or a temporary directory unless the user explicitly chooses it. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
33
|
-
-
|
|
32
|
+
- Artifact base root. Default the task root to `~/Documents/CleanRoom/<project>/tasks/<task-id>/`, never to the source workspace or a temporary directory unless the user explicitly chooses it. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
33
|
+
- Project grouping. Default to a clean-room project with shared `~/Documents/CleanRoom/<project>/implementation/`. When adding a task to an existing destination project, record the user-supplied `project_id` and `project_root`; otherwise generate a neutral `proj-` plus 8 lowercase hex project id. Project names follow the same neutrality rules as task IDs, match `[a-z0-9][a-z0-9-]{0,63}`, and are never derived from source folder names. Record both fields in `init-config.json` and the manifest `initialization_snapshot`. Use the legacy flat `~/Documents/CleanRoom/<task-id>/` layout only when the user explicitly chooses single-task compatibility.
|
|
34
34
|
- Target schema profile: `openspec-delta`, `gsd-planning-package`, `speckit-feature-folder`, or `kiro-spec-folder`.
|
|
35
35
|
- Goal contract choices from `preflight-goal.json`, including target stack, dependency/license policy, exactness policy, feature policy, code hygiene, output policy, and controller mode.
|
|
36
36
|
- Default model plus optional overrides for contaminated roles, clean roles, or individual roles. Keep model ids as runtime-specific strings.
|
|
@@ -24,8 +24,8 @@ Do not assume target language, license policy, dependency policy, exactness poli
|
|
|
24
24
|
Gather only required setup facts:
|
|
25
25
|
|
|
26
26
|
- Authorization statement, requester, allowed actions, prohibited actions, and evidence handling.
|
|
27
|
-
- Artifact base root, defaulting to `~/Documents/CleanRoom/<task-id>/`. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
28
|
-
-
|
|
27
|
+
- Artifact base root, defaulting the task root to `~/Documents/CleanRoom/<project>/tasks/<task-id>/`. If the user does not provide an explicitly approved neutral task ID, generate one as `task-` plus 8 lowercase hex characters. Do not derive task IDs or output directory names from source folder names.
|
|
28
|
+
- Project grouping, following the canonical `clean-room` project layout rules: `<base>/<project>/tasks/<task-id>/` with one shared `<base>/<project>/implementation/` root, a neutral project name (`proj-` plus 8 lowercase hex unless the user supplies an approved neutral name, matching `[a-z0-9][a-z0-9-]{0,63}`, never source-derived), and at most one active task per project. Use legacy flat `<base>/<task-id>/` roots only when the user explicitly chooses single-task compatibility.
|
|
29
29
|
- Source roots, contaminated artifact root, clean artifact root, clean implementation root, quarantine root, and optional public or destination reference roots.
|
|
30
30
|
- Target stack, destination constraints, dependency/license policy, exactness policy, feature policy, code hygiene policy, and output policy from `preflight-goal.json`.
|
|
31
31
|
- Target schema profile: `openspec-delta`, `gsd-planning-package`, `speckit-feature-folder`, or `kiro-spec-folder`.
|