scene-capability-engine 3.3.15 → 3.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/CHANGELOG.md +36 -0
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/bin/scene-capability-engine.js +4 -0
- package/docs/agent-runtime/orchestrator-rate-limit-profiles.md +66 -0
- package/docs/architecture.md +2 -2
- package/docs/command-reference.md +90 -2
- package/docs/developer-guide.md +1 -1
- package/lib/adoption/adoption-strategy.js +20 -11
- package/lib/adoption/backup-manager.js +1 -0
- package/lib/adoption/detection-engine.js +1 -0
- package/lib/adoption/file-classifier.js +3 -2
- package/lib/adoption/smart-orchestrator.js +3 -1
- package/lib/adoption/strategy-selector.js +1 -0
- package/lib/adoption/template-sync.js +1 -0
- package/lib/commands/adopt.js +2 -2
- package/lib/commands/orchestrate.js +223 -3
- package/lib/commands/studio.js +1186 -0
- package/lib/orchestrator/orchestration-engine.js +234 -9
- package/lib/orchestrator/orchestrator-config.js +91 -2
- package/lib/templates/registry-parser.js +23 -14
- package/lib/version/version-checker.js +11 -11
- package/lib/version/version-manager.js +9 -9
- package/package.json +2 -1
- package/template/.sce/config/orchestrator.json +24 -0
- package/template/.sce/config/studio-security.json +9 -0
- package/template/.sce/hooks/{sync-tasks-on-edit.kiro.hook → sync-tasks-on-edit.sce.hook} +1 -1
- /package/template/.sce/hooks/{check-spec-on-create.kiro.hook → check-spec-on-create.sce.hook} +0 -0
- /package/template/.sce/hooks/{run-tests-on-save.kiro.hook → run-tests-on-save.sce.hook} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.3.17] - 2026-02-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Orchestrator rate-limit profile management commands:
|
|
14
|
+
- `sce orchestrate profile list`
|
|
15
|
+
- `sce orchestrate profile show`
|
|
16
|
+
- `sce orchestrate profile set <conservative|balanced|aggressive> [--reset-overrides]`
|
|
17
|
+
- Runtime one-shot profile override:
|
|
18
|
+
- `sce orchestrate run --rate-limit-profile <profile>`
|
|
19
|
+
- New anti-429 regression shortcut:
|
|
20
|
+
- `npm run test:orchestrator-429`
|
|
21
|
+
- Added default orchestrator baseline config files:
|
|
22
|
+
- `.sce/config/orchestrator.json`
|
|
23
|
+
- `template/.sce/config/orchestrator.json`
|
|
24
|
+
- Added profile runbook:
|
|
25
|
+
- `docs/agent-runtime/orchestrator-rate-limit-profiles.md`
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- Orchestration engine now supports runtime config overrides for one execution without mutating persisted config.
|
|
29
|
+
- Command reference updated with profile workflow and recommended anti-429 usage.
|
|
30
|
+
|
|
31
|
+
## [3.3.16] - 2026-02-26
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
- Studio strict gate profiles:
|
|
35
|
+
- `sce studio verify --profile strict`
|
|
36
|
+
- `sce studio release --profile strict`
|
|
37
|
+
- Release preflight default gates now include:
|
|
38
|
+
- `scene package-publish-batch --dry-run` ontology thresholds (`average >= 70`, `valid-rate >= 100`)
|
|
39
|
+
- `auto handoff capability-matrix --fail-on-gap`
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
- Strict profiles now fail when any required gate step is skipped.
|
|
43
|
+
- Orchestration rate-limit handling now adapts launch budget under sustained `429` spikes and recovers budget gradually after cooldown.
|
|
44
|
+
- Command reference updated for strict Studio profiles and required gate behavior.
|
|
45
|
+
|
|
10
46
|
## [3.3.13] - 2026-02-25
|
|
11
47
|
|
|
12
48
|
### Changed
|
package/README.md
CHANGED
package/README.zh.md
CHANGED
|
@@ -817,6 +817,10 @@ registerLockCommands(program);
|
|
|
817
817
|
const { registerKnowledgeCommands } = require('../lib/commands/knowledge');
|
|
818
818
|
registerKnowledgeCommands(program);
|
|
819
819
|
|
|
820
|
+
// Studio orchestration commands
|
|
821
|
+
const { registerStudioCommands } = require('../lib/commands/studio');
|
|
822
|
+
registerStudioCommands(program);
|
|
823
|
+
|
|
820
824
|
// Orchestration commands
|
|
821
825
|
const { registerOrchestrateCommands } = require('../lib/commands/orchestrate');
|
|
822
826
|
registerOrchestrateCommands(program);
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Orchestrator Rate-Limit Profiles
|
|
2
|
+
|
|
3
|
+
This document defines the default anti-429 presets used by SCE multi-agent orchestration.
|
|
4
|
+
|
|
5
|
+
## Profiles
|
|
6
|
+
|
|
7
|
+
| Profile | Positioning | Best for |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `conservative` | strongest throttling, safest | unstable provider quota windows, repeated `429` spikes |
|
|
10
|
+
| `balanced` | default baseline | normal daily multi-agent runs |
|
|
11
|
+
| `aggressive` | higher throughput, lower safety margin | stable quota windows with strict delivery deadlines |
|
|
12
|
+
|
|
13
|
+
## Effective Preset Values
|
|
14
|
+
|
|
15
|
+
| Key | conservative | balanced | aggressive |
|
|
16
|
+
|---|---:|---:|---:|
|
|
17
|
+
| `rateLimitMaxRetries` | 10 | 8 | 6 |
|
|
18
|
+
| `rateLimitBackoffBaseMs` | 2200 | 1500 | 1000 |
|
|
19
|
+
| `rateLimitBackoffMaxMs` | 90000 | 60000 | 30000 |
|
|
20
|
+
| `rateLimitCooldownMs` | 60000 | 45000 | 20000 |
|
|
21
|
+
| `rateLimitLaunchBudgetPerMinute` | 4 | 8 | 16 |
|
|
22
|
+
| `rateLimitSignalWindowMs` | 45000 | 30000 | 20000 |
|
|
23
|
+
| `rateLimitSignalThreshold` | 2 | 3 | 4 |
|
|
24
|
+
| `rateLimitSignalExtraHoldMs` | 5000 | 3000 | 2000 |
|
|
25
|
+
| `rateLimitDynamicBudgetFloor` | 1 | 1 | 2 |
|
|
26
|
+
|
|
27
|
+
## Usage
|
|
28
|
+
|
|
29
|
+
Persistent (writes `.sce/config/orchestrator.json`):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
sce orchestrate profile set conservative
|
|
33
|
+
sce orchestrate profile set balanced --reset-overrides
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
One-shot for a single run (does not change file):
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
sce orchestrate run --specs "spec-a,spec-b,spec-c" --rate-limit-profile conservative
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Inspect current effective state:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
sce orchestrate profile show --json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Validation Checklist
|
|
49
|
+
|
|
50
|
+
Run anti-429 regression:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm run test:orchestrator-429
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Run full suite before release:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm test -- --runInBand
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Release readiness criteria:
|
|
63
|
+
|
|
64
|
+
1. No failing test in orchestrator/rate-limit scope.
|
|
65
|
+
2. `orchestrate profile show --json` returns expected profile and effective values.
|
|
66
|
+
3. Multi-agent run no longer stalls under sustained `429`; launch budget and hold telemetry progress over time.
|
package/docs/architecture.md
CHANGED
|
@@ -227,7 +227,7 @@ This document provides detailed architecture diagrams and explanations for Scene
|
|
|
227
227
|
│ version.json │
|
|
228
228
|
│ { │
|
|
229
229
|
│ "version": "1.2.0", │
|
|
230
|
-
│ "
|
|
230
|
+
│ "sceVersion": "1.2.0", │
|
|
231
231
|
│ "createdAt": "2026-01-23T00:00:00.000Z", │
|
|
232
232
|
│ "updatedAt": "2026-01-23T00:00:00.000Z", │
|
|
233
233
|
│ "upgradeHistory": [ │
|
|
@@ -235,7 +235,7 @@ This document provides detailed architecture diagrams and explanations for Scene
|
|
|
235
235
|
│ "from": "1.0.0", │
|
|
236
236
|
│ "to": "1.1.0", │
|
|
237
237
|
│ "timestamp": "2026-01-23T00:00:00.000Z", │
|
|
238
|
-
│ "
|
|
238
|
+
│ "sceVersion": "1.1.0" │
|
|
239
239
|
│ } │
|
|
240
240
|
│ ] │
|
|
241
241
|
│ } │
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> Quick reference for all `sce` commands
|
|
4
4
|
|
|
5
5
|
**Version**: 2.0.0
|
|
6
|
-
**Last Updated**: 2026-02-
|
|
6
|
+
**Last Updated**: 2026-02-26
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -295,15 +295,89 @@ sce repo health [--json]
|
|
|
295
295
|
# Start orchestration for multiple specs
|
|
296
296
|
sce orchestrate run --specs "spec-a,spec-b,spec-c" --max-parallel 3
|
|
297
297
|
|
|
298
|
+
# One-shot anti-429 profile override (without editing orchestrator.json)
|
|
299
|
+
sce orchestrate run --specs "spec-a,spec-b,spec-c" --rate-limit-profile conservative
|
|
300
|
+
|
|
298
301
|
# Show orchestration status
|
|
299
302
|
sce orchestrate status [--json]
|
|
300
303
|
|
|
301
304
|
# Stop all running sub-agents
|
|
302
305
|
sce orchestrate stop
|
|
306
|
+
|
|
307
|
+
# List/show/set persistent rate-limit profile
|
|
308
|
+
sce orchestrate profile list
|
|
309
|
+
sce orchestrate profile show --json
|
|
310
|
+
sce orchestrate profile set conservative
|
|
311
|
+
sce orchestrate profile set balanced --reset-overrides
|
|
303
312
|
```
|
|
304
313
|
|
|
305
314
|
When you pass `--specs` to `sce spec bootstrap|pipeline run|gate run`, sce now defaults to this orchestrate mode automatically.
|
|
306
315
|
|
|
316
|
+
Rate-limit profiles:
|
|
317
|
+
- `conservative`: strongest anti-429 throttling (recommended for unstable quota windows)
|
|
318
|
+
- `balanced`: default profile for normal multi-agent runs
|
|
319
|
+
- `aggressive`: higher throughput with lower protection margins
|
|
320
|
+
|
|
321
|
+
### Studio Workflow
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
# Build a plan from chat/session context
|
|
325
|
+
sce studio plan --from-chat session-20260226 --goal "customer+order+inventory demo" --json
|
|
326
|
+
|
|
327
|
+
# Generate patch bundle metadata for a target scene
|
|
328
|
+
sce studio generate --scene scene.customer-order-inventory --target 331 --json
|
|
329
|
+
|
|
330
|
+
# Apply generated patch metadata
|
|
331
|
+
sce studio apply --patch-bundle patch-scene.customer-order-inventory-<timestamp> --json
|
|
332
|
+
|
|
333
|
+
# Record verification result
|
|
334
|
+
sce studio verify --profile standard --json
|
|
335
|
+
sce studio verify --profile strict --json
|
|
336
|
+
|
|
337
|
+
# Record release event
|
|
338
|
+
sce studio release --channel dev --profile standard --json
|
|
339
|
+
sce studio release --channel dev --profile strict --json
|
|
340
|
+
|
|
341
|
+
# Resume from latest or explicit job
|
|
342
|
+
sce studio resume --job <job-id> --json
|
|
343
|
+
|
|
344
|
+
# Inspect recent stage events
|
|
345
|
+
sce studio events --job <job-id> --limit 50 --json
|
|
346
|
+
|
|
347
|
+
# Rollback a job after apply/release
|
|
348
|
+
sce studio rollback --job <job-id> --reason "manual-check-failed" --json
|
|
349
|
+
|
|
350
|
+
# Enforce authorization for a protected action
|
|
351
|
+
SCE_STUDIO_REQUIRE_AUTH=1 SCE_STUDIO_AUTH_PASSWORD=top-secret sce studio apply --job <job-id> --auth-password top-secret --json
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
Stage guardrails are enforced by default:
|
|
355
|
+
- `generate` requires `plan`
|
|
356
|
+
- `apply` requires `generate`
|
|
357
|
+
- `verify` requires `apply`
|
|
358
|
+
- `release` requires `verify`
|
|
359
|
+
|
|
360
|
+
Studio gate execution defaults:
|
|
361
|
+
- `verify --profile standard` runs executable gates (unit test script when available, interactive governance report when present, scene package publish-batch dry-run when handoff manifest exists)
|
|
362
|
+
- `release --profile standard` runs executable release preflight (npm pack dry-run, weekly ops gate when summary exists, release asset integrity when evidence directory exists, scene package publish-batch ontology gate, handoff capability matrix gate)
|
|
363
|
+
- `verify/release --profile strict` fails when any required gate step is skipped (for example missing manifest/evidence/scripts)
|
|
364
|
+
|
|
365
|
+
Authorization model (optional, policy-driven):
|
|
366
|
+
- Enable policy: `SCE_STUDIO_REQUIRE_AUTH=1`
|
|
367
|
+
- Secret env key: `SCE_STUDIO_AUTH_PASSWORD` (or override key name with `SCE_STUDIO_PASSWORD_ENV`)
|
|
368
|
+
- Protected actions: `apply`, `release`, `rollback`
|
|
369
|
+
- Per-command hard requirement: add `--require-auth`
|
|
370
|
+
|
|
371
|
+
Default policy file (recommended to commit): `.sce/config/studio-security.json`
|
|
372
|
+
|
|
373
|
+
```json
|
|
374
|
+
{
|
|
375
|
+
"enabled": false,
|
|
376
|
+
"require_auth_for": ["apply", "release", "rollback"],
|
|
377
|
+
"password_env": "SCE_STUDIO_AUTH_PASSWORD"
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
307
381
|
### Capability Matrix Utilities
|
|
308
382
|
|
|
309
383
|
```bash
|
|
@@ -348,6 +422,7 @@ Contract/baseline files:
|
|
|
348
422
|
- `docs/agent-runtime/capability-mapping-report.schema.json`
|
|
349
423
|
- `docs/agent-runtime/agent-result-summary-contract.schema.json`
|
|
350
424
|
- `docs/agent-runtime/multi-agent-coordination-policy-baseline.json`
|
|
425
|
+
- `docs/agent-runtime/orchestrator-rate-limit-profiles.md`
|
|
351
426
|
|
|
352
427
|
Multi-agent merge governance default:
|
|
353
428
|
- `sce orchestrate run` loads `docs/agent-runtime/multi-agent-coordination-policy-baseline.json`.
|
|
@@ -1267,6 +1342,7 @@ Recommended `.sce/config/orchestrator.json`:
|
|
|
1267
1342
|
"maxParallel": 3,
|
|
1268
1343
|
"timeoutSeconds": 900,
|
|
1269
1344
|
"maxRetries": 2,
|
|
1345
|
+
"rateLimitProfile": "balanced",
|
|
1270
1346
|
"rateLimitMaxRetries": 8,
|
|
1271
1347
|
"rateLimitBackoffBaseMs": 1500,
|
|
1272
1348
|
"rateLimitBackoffMaxMs": 60000,
|
|
@@ -1275,13 +1351,25 @@ Recommended `.sce/config/orchestrator.json`:
|
|
|
1275
1351
|
"rateLimitCooldownMs": 45000,
|
|
1276
1352
|
"rateLimitLaunchBudgetPerMinute": 8,
|
|
1277
1353
|
"rateLimitLaunchBudgetWindowMs": 60000,
|
|
1354
|
+
"rateLimitSignalWindowMs": 30000,
|
|
1355
|
+
"rateLimitSignalThreshold": 3,
|
|
1356
|
+
"rateLimitSignalExtraHoldMs": 3000,
|
|
1357
|
+
"rateLimitDynamicBudgetFloor": 1,
|
|
1278
1358
|
"apiKeyEnvVar": "CODEX_API_KEY",
|
|
1279
1359
|
"codexArgs": ["--skip-git-repo-check"],
|
|
1280
1360
|
"codexCommand": "npx @openai/codex"
|
|
1281
1361
|
}
|
|
1282
1362
|
```
|
|
1283
1363
|
|
|
1284
|
-
`
|
|
1364
|
+
`rateLimitProfile` applies preset anti-429 behavior (`conservative|balanced|aggressive`). Any explicit `rateLimit*` field in `orchestrator.json` overrides the selected profile value.
|
|
1365
|
+
|
|
1366
|
+
`rateLimit*` settings provide dedicated retry/backoff and adaptive throttling when providers return 429 / too-many-requests errors. Engine retry honors `Retry-After` / `try again in ...` hints from provider error messages and clamps final retry waits by `rateLimitBackoffMaxMs` to avoid unbounded pause windows. During active backoff windows, new pending spec launches are paused to reduce request bursts (launch hold remains active even if adaptive parallel throttling is disabled). Sustained 429 spikes are additionally controlled by:
|
|
1367
|
+
- `rateLimitSignalWindowMs`: rolling signal window for spike detection
|
|
1368
|
+
- `rateLimitSignalThreshold`: signals required inside window before escalation
|
|
1369
|
+
- `rateLimitSignalExtraHoldMs`: extra launch hold per escalation unit
|
|
1370
|
+
- `rateLimitDynamicBudgetFloor`: lowest dynamic launch budget allowed during sustained pressure
|
|
1371
|
+
|
|
1372
|
+
`orchestrate stop` interrupts pending retry waits immediately so long backoff windows do not look like deadlocks.
|
|
1285
1373
|
|
|
1286
1374
|
Codex sub-agent permission defaults:
|
|
1287
1375
|
- `--sandbox danger-full-access` is always injected by orchestrator runtime.
|
package/docs/developer-guide.md
CHANGED
|
@@ -73,6 +73,7 @@ class AdoptionStrategy {
|
|
|
73
73
|
await ensureDirectory(path.join(kiroPath, 'specs'));
|
|
74
74
|
await ensureDirectory(path.join(kiroPath, 'steering'));
|
|
75
75
|
await ensureDirectory(path.join(kiroPath, 'tools'));
|
|
76
|
+
await ensureDirectory(path.join(kiroPath, 'config'));
|
|
76
77
|
await ensureDirectory(path.join(kiroPath, 'backups'));
|
|
77
78
|
await ensureDirectory(path.join(kiroPath, 'hooks'));
|
|
78
79
|
}
|
|
@@ -111,6 +112,7 @@ class AdoptionStrategy {
|
|
|
111
112
|
'steering/ENVIRONMENT.md',
|
|
112
113
|
'steering/CURRENT_CONTEXT.md',
|
|
113
114
|
'steering/RULES_GUIDE.md',
|
|
115
|
+
'config/studio-security.json',
|
|
114
116
|
'specs/SPEC_WORKFLOW_GUIDE.md',
|
|
115
117
|
'hooks/sync-tasks-on-edit.sce.hook',
|
|
116
118
|
'hooks/check-spec-on-create.sce.hook',
|
|
@@ -189,7 +191,7 @@ class FreshAdoption extends AdoptionStrategy {
|
|
|
189
191
|
* @returns {Promise<AdoptionResult>}
|
|
190
192
|
*/
|
|
191
193
|
async execute(projectPath, mode, options = {}) {
|
|
192
|
-
const {
|
|
194
|
+
const { sceVersion = '1.0.0', dryRun = false } = options;
|
|
193
195
|
|
|
194
196
|
const filesCreated = [];
|
|
195
197
|
const filesUpdated = [];
|
|
@@ -225,6 +227,7 @@ class FreshAdoption extends AdoptionStrategy {
|
|
|
225
227
|
filesCreated.push('.sce/specs/');
|
|
226
228
|
filesCreated.push('.sce/steering/');
|
|
227
229
|
filesCreated.push('.sce/tools/');
|
|
230
|
+
filesCreated.push('.sce/config/');
|
|
228
231
|
filesCreated.push('.sce/backups/');
|
|
229
232
|
filesCreated.push('.sce/hooks/');
|
|
230
233
|
|
|
@@ -235,7 +238,7 @@ class FreshAdoption extends AdoptionStrategy {
|
|
|
235
238
|
filesSkipped.push(...copyResult.skipped);
|
|
236
239
|
|
|
237
240
|
// Create version.json
|
|
238
|
-
const versionInfo = this.versionManager.createVersionInfo(
|
|
241
|
+
const versionInfo = this.versionManager.createVersionInfo(sceVersion);
|
|
239
242
|
await this.versionManager.writeVersion(projectPath, versionInfo);
|
|
240
243
|
filesCreated.push('version.json');
|
|
241
244
|
|
|
@@ -279,7 +282,7 @@ class PartialAdoption extends AdoptionStrategy {
|
|
|
279
282
|
* @returns {Promise<AdoptionResult>}
|
|
280
283
|
*/
|
|
281
284
|
async execute(projectPath, mode, options = {}) {
|
|
282
|
-
const {
|
|
285
|
+
const { sceVersion = '1.0.0', dryRun = false, backupId = null, force = false, resolutionMap = {} } = options;
|
|
283
286
|
|
|
284
287
|
const filesCreated = [];
|
|
285
288
|
const filesUpdated = [];
|
|
@@ -320,6 +323,7 @@ class PartialAdoption extends AdoptionStrategy {
|
|
|
320
323
|
const specsPath = path.join(kiroPath, 'specs');
|
|
321
324
|
const steeringPath = path.join(kiroPath, 'steering');
|
|
322
325
|
const toolsPath = path.join(kiroPath, 'tools');
|
|
326
|
+
const configPath = path.join(kiroPath, 'config');
|
|
323
327
|
const backupsPath = path.join(kiroPath, 'backups');
|
|
324
328
|
const hooksPath = path.join(kiroPath, 'hooks');
|
|
325
329
|
|
|
@@ -337,6 +341,11 @@ class PartialAdoption extends AdoptionStrategy {
|
|
|
337
341
|
await ensureDirectory(toolsPath);
|
|
338
342
|
filesCreated.push('tools/');
|
|
339
343
|
}
|
|
344
|
+
|
|
345
|
+
if (!await pathExists(configPath)) {
|
|
346
|
+
await ensureDirectory(configPath);
|
|
347
|
+
filesCreated.push('config/');
|
|
348
|
+
}
|
|
340
349
|
|
|
341
350
|
if (!await pathExists(backupsPath)) {
|
|
342
351
|
await ensureDirectory(backupsPath);
|
|
@@ -356,15 +365,15 @@ class PartialAdoption extends AdoptionStrategy {
|
|
|
356
365
|
|
|
357
366
|
// Create or update version.json
|
|
358
367
|
if (!versionExists) {
|
|
359
|
-
const versionInfo = this.versionManager.createVersionInfo(
|
|
368
|
+
const versionInfo = this.versionManager.createVersionInfo(sceVersion);
|
|
360
369
|
await this.versionManager.writeVersion(projectPath, versionInfo);
|
|
361
370
|
filesCreated.push('version.json');
|
|
362
371
|
} else {
|
|
363
372
|
// Update existing version.json
|
|
364
373
|
const versionInfo = await this.versionManager.readVersion(projectPath);
|
|
365
374
|
if (versionInfo) {
|
|
366
|
-
versionInfo['sce-version'] =
|
|
367
|
-
versionInfo['template-version'] =
|
|
375
|
+
versionInfo['sce-version'] = sceVersion;
|
|
376
|
+
versionInfo['template-version'] = sceVersion;
|
|
368
377
|
versionInfo['last-upgraded'] = new Date().toISOString();
|
|
369
378
|
await this.versionManager.writeVersion(projectPath, versionInfo);
|
|
370
379
|
filesUpdated.push('version.json');
|
|
@@ -411,7 +420,7 @@ class FullAdoption extends AdoptionStrategy {
|
|
|
411
420
|
* @returns {Promise<AdoptionResult>}
|
|
412
421
|
*/
|
|
413
422
|
async execute(projectPath, mode, options = {}) {
|
|
414
|
-
const {
|
|
423
|
+
const { sceVersion = '1.0.0', dryRun = false, backupId = null } = options;
|
|
415
424
|
|
|
416
425
|
const filesCreated = [];
|
|
417
426
|
const filesUpdated = [];
|
|
@@ -437,8 +446,8 @@ class FullAdoption extends AdoptionStrategy {
|
|
|
437
446
|
const currentVersion = existingVersion['sce-version'];
|
|
438
447
|
|
|
439
448
|
// Check if upgrade is needed
|
|
440
|
-
if (!this.versionManager.needsUpgrade(currentVersion,
|
|
441
|
-
warnings.push(`Already at version ${
|
|
449
|
+
if (!this.versionManager.needsUpgrade(currentVersion, sceVersion)) {
|
|
450
|
+
warnings.push(`Already at version ${sceVersion} - no upgrade needed`);
|
|
442
451
|
return {
|
|
443
452
|
success: true,
|
|
444
453
|
mode: 'full',
|
|
@@ -456,7 +465,7 @@ class FullAdoption extends AdoptionStrategy {
|
|
|
456
465
|
success: true,
|
|
457
466
|
mode: 'full',
|
|
458
467
|
filesCreated: [],
|
|
459
|
-
filesUpdated: [`(dry-run) Would upgrade from ${currentVersion} to ${
|
|
468
|
+
filesUpdated: [`(dry-run) Would upgrade from ${currentVersion} to ${sceVersion}`],
|
|
460
469
|
filesSkipped: [],
|
|
461
470
|
backupId,
|
|
462
471
|
errors: [],
|
|
@@ -478,7 +487,7 @@ class FullAdoption extends AdoptionStrategy {
|
|
|
478
487
|
const updatedVersion = this.versionManager.addUpgradeHistory(
|
|
479
488
|
existingVersion,
|
|
480
489
|
currentVersion,
|
|
481
|
-
|
|
490
|
+
sceVersion,
|
|
482
491
|
true
|
|
483
492
|
);
|
|
484
493
|
await this.versionManager.writeVersion(projectPath, updatedVersion);
|
|
@@ -161,6 +161,7 @@ class DetectionEngine {
|
|
|
161
161
|
'steering/CURRENT_CONTEXT.md',
|
|
162
162
|
'steering/RULES_GUIDE.md',
|
|
163
163
|
'tools/ultrawork_enhancer.py',
|
|
164
|
+
'config/studio-security.json',
|
|
164
165
|
'README.md',
|
|
165
166
|
'ultrawork-application-guide.md',
|
|
166
167
|
'ultrawork-integration-summary.md',
|
|
@@ -14,7 +14,7 @@ const path = require('path');
|
|
|
14
14
|
const FileCategory = {
|
|
15
15
|
TEMPLATE: 'template', // steering/, tools/, README.md
|
|
16
16
|
USER_CONTENT: 'user-content', // specs/, custom files
|
|
17
|
-
CONFIG: 'config', // version.json, adoption-config.json
|
|
17
|
+
CONFIG: 'config', // version.json, adoption-config.json, config/*.json
|
|
18
18
|
GENERATED: 'generated' // backups/, logs/, node_modules/
|
|
19
19
|
};
|
|
20
20
|
|
|
@@ -62,7 +62,8 @@ class FileClassifier {
|
|
|
62
62
|
// Config file patterns
|
|
63
63
|
this.configPatterns = [
|
|
64
64
|
'version.json',
|
|
65
|
-
'adoption-config.json'
|
|
65
|
+
'adoption-config.json',
|
|
66
|
+
'config/studio-security.json'
|
|
66
67
|
];
|
|
67
68
|
|
|
68
69
|
// Generated directory patterns
|
|
@@ -282,6 +282,7 @@ class SmartOrchestrator {
|
|
|
282
282
|
'steering/ENVIRONMENT.md',
|
|
283
283
|
'steering/RULES_GUIDE.md',
|
|
284
284
|
'tools/ultrawork_enhancer.py',
|
|
285
|
+
'config/studio-security.json',
|
|
285
286
|
'README.md'
|
|
286
287
|
];
|
|
287
288
|
|
|
@@ -299,6 +300,7 @@ class SmartOrchestrator {
|
|
|
299
300
|
'.sce/specs/',
|
|
300
301
|
'.sce/steering/',
|
|
301
302
|
'.sce/tools/',
|
|
303
|
+
'.sce/config/',
|
|
302
304
|
'.sce/backups/',
|
|
303
305
|
...templateFiles.map(f => `.sce/${f}`),
|
|
304
306
|
'.sce/version.json'
|
|
@@ -380,7 +382,7 @@ class SmartOrchestrator {
|
|
|
380
382
|
});
|
|
381
383
|
|
|
382
384
|
const result = await strategy.execute(projectPath, strategyMode, {
|
|
383
|
-
|
|
385
|
+
sceVersion: packageJson.version,
|
|
384
386
|
dryRun: false,
|
|
385
387
|
force: !skipUpdate,
|
|
386
388
|
resolutionMap
|
package/lib/commands/adopt.js
CHANGED
|
@@ -285,7 +285,7 @@ async function adoptInteractive(projectPath, options) {
|
|
|
285
285
|
const packageJson = require('../../package.json');
|
|
286
286
|
|
|
287
287
|
const result = await adoptionStrategy.execute(projectPath, strategy, {
|
|
288
|
-
|
|
288
|
+
sceVersion: packageJson.version,
|
|
289
289
|
dryRun: true,
|
|
290
290
|
force
|
|
291
291
|
});
|
|
@@ -494,7 +494,7 @@ async function adoptInteractive(projectPath, options) {
|
|
|
494
494
|
const packageJson = require('../../package.json');
|
|
495
495
|
|
|
496
496
|
const result = await adoptionStrategy.execute(projectPath, strategy, {
|
|
497
|
-
|
|
497
|
+
sceVersion: packageJson.version,
|
|
498
498
|
dryRun: false,
|
|
499
499
|
backupId,
|
|
500
500
|
force,
|