duaer-spec 0.27.0 → 0.27.2
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/rules/agents-workflow.md +2 -0
- package/.claude/rules/duaer-spec.md +1 -0
- package/.cursor/rules/agents-workflow.mdc +2 -0
- package/.cursor/rules/duaer-spec.mdc +1 -0
- package/.duaer/active-job.json +3 -3
- package/.duaer/specs/270-patch-version/delivery.json +7 -0
- package/.duaer/specs/270-patch-version/spec.md +19 -0
- package/.duaer/specs/270-patch-version/tasks.md +4 -0
- package/.duaer/specs/271-fde04-compat/delivery.json +9 -0
- package/.duaer/specs/271-fde04-compat/spec.md +25 -0
- package/.duaer/specs/271-fde04-compat/tasks.md +5 -0
- package/.duaer/specs/272-fde03-env-check/delivery.json +9 -0
- package/.duaer/specs/272-fde03-env-check/spec.md +34 -0
- package/.duaer/specs/272-fde03-env-check/tasks.md +5 -0
- package/.duaer/specs/273-fde06-data-precheck/delivery.json +9 -0
- package/.duaer/specs/273-fde06-data-precheck/spec.md +37 -0
- package/.duaer/specs/273-fde06-data-precheck/tasks.md +5 -0
- package/.duaer/specs/274-fde05-external-deps/delivery.json +9 -0
- package/.duaer/specs/274-fde05-external-deps/spec.md +37 -0
- package/.duaer/specs/274-fde05-external-deps/tasks.md +5 -0
- package/.duaer/specs/275-release-0271/delivery.json +9 -0
- package/.duaer/specs/275-release-0271/spec.md +13 -0
- package/.duaer/specs/275-release-0271/tasks.md +4 -0
- package/.duaer/specs/276-fde08-perf-budget/delivery.json +9 -0
- package/.duaer/specs/276-fde08-perf-budget/spec.md +38 -0
- package/.duaer/specs/276-fde08-perf-budget/tasks.md +5 -0
- package/.duaer/specs/277-project-dir-reuse/delivery.json +9 -0
- package/.duaer/specs/277-project-dir-reuse/spec.md +31 -0
- package/.duaer/specs/277-project-dir-reuse/tasks.md +5 -0
- package/.duaer/specs/278-project-create-unique/delivery.json +9 -0
- package/.duaer/specs/278-project-create-unique/spec.md +27 -0
- package/.duaer/specs/278-project-create-unique/tasks.md +5 -0
- package/.duaer/specs/279-arch-side-detour/delivery.json +8 -0
- package/.duaer/specs/279-arch-side-detour/spec.md +28 -0
- package/.duaer/specs/279-arch-side-detour/tasks.md +5 -0
- package/.duaer/specs/280-arch-bottom-via-label/delivery.json +8 -0
- package/.duaer/specs/280-arch-bottom-via-label/spec.md +22 -0
- package/.duaer/specs/280-arch-bottom-via-label/tasks.md +5 -0
- package/.duaer/specs/281-release-0272/spec.md +13 -0
- package/.duaer/specs/281-release-0272/tasks.md +4 -0
- package/AGENTS.md +5 -2
- package/CHANGELOG.md +69 -0
- package/bin/duaer-live.mjs +202 -23
- package/bin/live-archify.mjs +382 -26
- package/bin/live-deliverables.mjs +16 -0
- package/bin/live-modules.mjs +81 -1
- package/bin/live-project-chat.mjs +8 -0
- package/bin/live-repo-path.mjs +91 -2
- package/docs/agent/branching-and-release.md +16 -0
- package/docs/agent/e2e-test-plan.md +10 -0
- package/docs/agent/live-desk.md +34 -4
- package/docs/agent/workflow.md +2 -0
- package/package.json +1 -1
- package/web/live-dev/app.js +95 -2
- package/web/live-dev/baseline.mjs +4 -0
- package/web/live-dev/compat-matrix.mjs +38 -0
- package/web/live-dev/confirm-card.mjs +4 -0
- package/web/live-dev/data-precheck.mjs +35 -0
- package/web/live-dev/env-check.mjs +41 -0
- package/web/live-dev/external-deps.mjs +35 -0
- package/web/live-dev/i18n-de.js +25 -10
- package/web/live-dev/i18n-es.js +25 -10
- package/web/live-dev/i18n-fr.js +25 -10
- package/web/live-dev/i18n-ja.js +25 -10
- package/web/live-dev/i18n-ko.js +25 -10
- package/web/live-dev/i18n-pt-BR.js +25 -10
- package/web/live-dev/i18n-ru.js +25 -10
- package/web/live-dev/i18n-vi.js +25 -10
- package/web/live-dev/i18n-zh-TW.js +25 -10
- package/web/live-dev/i18n.js +50 -20
- package/web/live-dev/index.html +33 -9
- package/web/live-dev/perf-budget.mjs +38 -0
|
@@ -50,6 +50,8 @@ cd .worktree/feat-login
|
|
|
50
50
|
- Push only when the user explicitly asks (a deploy/hosting ask authorizes
|
|
51
51
|
the `gh` + push needed for that publish — see `docs/agent/deploy-github.md`)
|
|
52
52
|
- Promote **`develop` → `main`** only when the user asks to go online
|
|
53
|
+
- Version: fast iteration bumps the **patch** (`0.27.1`, `0.27.2`, …). Next
|
|
54
|
+
after `0.27.1` is `0.27.2`. Do not bump the minor on every ship.
|
|
53
55
|
- English docs: no Chinese (CJK); Chinese docs may include English terms
|
|
54
56
|
|
|
55
57
|
## GitHub issue / PR intake
|
|
@@ -33,6 +33,7 @@ For new behavior, fixes, refactors that change product behavior, or architecture
|
|
|
33
33
|
as you go so progress is visible. Do not leave only coarse mega-tasks.
|
|
34
34
|
7. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
|
|
35
35
|
**`develop`**). Promote to **`main`** only if the user asks to go online.
|
|
36
|
+
Version bump is the patch (`0.27.2` next).
|
|
36
37
|
8. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
|
|
37
38
|
the worktree, then restart services from the primary checkout on `develop`
|
|
38
39
|
using `.duaer/handoff.json` / `duaer handoff [--run]`. Never leave the user
|
|
@@ -53,6 +53,8 @@ cd .worktree/feat-login
|
|
|
53
53
|
- Push only when the user explicitly asks (a deploy/hosting ask authorizes
|
|
54
54
|
the `gh` + push needed for that publish — see `docs/agent/deploy-github.md`)
|
|
55
55
|
- Promote **`develop` → `main`** only when the user asks to go online
|
|
56
|
+
- Version: fast iteration bumps the **patch** (`0.27.1`, `0.27.2`, …). Next
|
|
57
|
+
after `0.27.1` is `0.27.2`. Do not bump the minor on every ship.
|
|
56
58
|
- English docs: no Chinese (CJK); Chinese docs may include English terms
|
|
57
59
|
|
|
58
60
|
## GitHub issue / PR intake
|
|
@@ -37,6 +37,7 @@ For new behavior, fixes, refactors that change product behavior, or architecture
|
|
|
37
37
|
as you go so progress is visible. Do not leave only coarse mega-tasks.
|
|
38
38
|
7. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
|
|
39
39
|
**`develop`**). Promote to **`main`** only if the user asks to go online.
|
|
40
|
+
Version bump is the patch (`0.27.2` next).
|
|
40
41
|
8. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
|
|
41
42
|
the worktree, then restart services from the primary checkout on `develop`
|
|
42
43
|
using `.duaer/handoff.json` / `duaer handoff [--run]`. Never leave the user
|
package/.duaer/active-job.json
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Feature Specification: Patch versions for fast iteration
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Ships after 0.27.0 increment the patch number. The next release is 0.27.1.
|
|
6
|
+
|
|
7
|
+
## In scope
|
|
8
|
+
|
|
9
|
+
- Release docs and agent rules state the default bump is the last number
|
|
10
|
+
|
|
11
|
+
## Out of scope
|
|
12
|
+
|
|
13
|
+
- Cutting 0.27.1 now
|
|
14
|
+
- Changing npm or GitHub release automation
|
|
15
|
+
|
|
16
|
+
## Acceptance
|
|
17
|
+
|
|
18
|
+
1. Branching docs say 0.27.0 is followed by 0.27.1, not 0.28.0
|
|
19
|
+
2. Agent rules repeat that patch bump
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Feature device matrix must name two targets, evidence, and a fallback; kickoff schedules the compat check.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs — pass",
|
|
6
|
+
"L1": "npm test — 239 pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Feature Specification: FDE-04 browser matrix evidence
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
A feature confirm card cannot pass with a vague browser line. The device
|
|
6
|
+
matrix must name real targets, point at evidence, and state a fallback.
|
|
7
|
+
Kickoff schedules that check.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Local validate on deviceMatrix
|
|
12
|
+
- One FDE-04 task per confirmed module
|
|
13
|
+
- Hint, placeholder, and chat/accept prompts
|
|
14
|
+
|
|
15
|
+
## Out of scope
|
|
16
|
+
|
|
17
|
+
- Bug desk
|
|
18
|
+
- Running a device lab
|
|
19
|
+
|
|
20
|
+
## Acceptance
|
|
21
|
+
|
|
22
|
+
1. "主流浏览器" or a single browser name fails local validate
|
|
23
|
+
2. Two named targets plus screenshot/cloud evidence plus a fallback passes
|
|
24
|
+
3. Kickoff adds an FDE-04 compat evidence task
|
|
25
|
+
4. npm test and npm run test:live pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Feature confirm requires a passed DNS/TLS/CORS/auth/third-party checklist, or a no-customer opt-out. Kickoff schedules the probe before implement.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/env-check.mjs — pass",
|
|
6
|
+
"L1": "npm test — 242 pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Feature Specification: FDE-03 environment checklist
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
A feature confirm card cannot pass until the environment checklist records
|
|
6
|
+
DNS, TLS, CORS, auth, and third-party reachability as passed. A failed probe
|
|
7
|
+
blocks confirm. Kickoff schedules that probe before implementation.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Local validate on envChecklist
|
|
12
|
+
- One FDE-03 task per confirmed module that declares a customer environment,
|
|
13
|
+
placed before that module's implement task
|
|
14
|
+
- Hint, placeholder, and chat/accept prompts
|
|
15
|
+
- Explicit opt-out: no customer environment
|
|
16
|
+
|
|
17
|
+
## Out of scope
|
|
18
|
+
|
|
19
|
+
- Bug desk
|
|
20
|
+
- Scanning the customer network from the desk
|
|
21
|
+
|
|
22
|
+
## Assumptions
|
|
23
|
+
|
|
24
|
+
- The desk records the checklist; the digital employee runs the probes.
|
|
25
|
+
- 「无客户联调环境」 / "no customer environment" skips the five probes and
|
|
26
|
+
the kickoff task.
|
|
27
|
+
|
|
28
|
+
## Acceptance
|
|
29
|
+
|
|
30
|
+
1. A vague line, a missing probe, or any failed probe fails local validate
|
|
31
|
+
2. All five probes marked passed, or the no-customer opt-out, passes
|
|
32
|
+
3. Kickoff adds an FDE-03 env probe before implement when a customer
|
|
33
|
+
environment is declared, and skips it on the opt-out
|
|
34
|
+
4. npm test and npm run test:live pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Feature confirm requires a field mapping, an import failure list, and an export, or a no-import opt-out. Kickoff schedules the precheck before implement.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/data-precheck.mjs — pass",
|
|
6
|
+
"L1": "npm test — 246 pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Feature Specification: FDE-06 import precheck
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
A feature confirm card cannot pass until it records a field mapping, an
|
|
6
|
+
import precheck failure list, and that the list can be exported for
|
|
7
|
+
cleanup. Kickoff schedules that precheck before implementation.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Local validate on dataPrecheck
|
|
12
|
+
- One FDE-06 task per confirmed module that declares an import, placed
|
|
13
|
+
before that module's implement task and after the environment probe
|
|
14
|
+
when both exist
|
|
15
|
+
- Hint, placeholder, and chat/accept prompts
|
|
16
|
+
- Explicit opt-out: no import for this module
|
|
17
|
+
|
|
18
|
+
## Out of scope
|
|
19
|
+
|
|
20
|
+
- Bug desk
|
|
21
|
+
- Scanning a customer database from the desk
|
|
22
|
+
|
|
23
|
+
## Assumptions
|
|
24
|
+
|
|
25
|
+
- The desk records the checklist; the digital employee produces the
|
|
26
|
+
mapping, the failure list, and the export.
|
|
27
|
+
- 「本模块无导入」 / "no import" skips the three requirements and the
|
|
28
|
+
kickoff task.
|
|
29
|
+
|
|
30
|
+
## Acceptance
|
|
31
|
+
|
|
32
|
+
1. A vague line or a line missing mapping, failure list, or export fails
|
|
33
|
+
local validate
|
|
34
|
+
2. All three present, or the no-import opt-out, passes
|
|
35
|
+
3. Kickoff adds an FDE-06 data precheck before implement when an import
|
|
36
|
+
is declared, and skips it on the opt-out
|
|
37
|
+
4. npm test and npm run test:live pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Feature confirm requires a blocker, SLA, backup mock, and parallel path, or a no-dependency opt-out. Kickoff schedules the board before implement.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/external-deps.mjs — pass",
|
|
6
|
+
"L1": "npm test — 250 pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Feature Specification: FDE-05 external dependency board
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
A feature confirm card cannot pass until it records a blocker, an SLA, a
|
|
6
|
+
backup mock, and a parallel path for third-party, ERP, or SSO work.
|
|
7
|
+
Kickoff schedules that board before implementation.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Local validate on externalDeps
|
|
12
|
+
- One FDE-05 task per confirmed module that declares an external
|
|
13
|
+
dependency, placed before implement and after the env probe and data
|
|
14
|
+
precheck when those exist
|
|
15
|
+
- Hint, placeholder, and chat/accept prompts
|
|
16
|
+
- Explicit opt-out: no external dependency
|
|
17
|
+
|
|
18
|
+
## Out of scope
|
|
19
|
+
|
|
20
|
+
- Bug desk
|
|
21
|
+
- Calling the vendor or the customer ERP from the desk
|
|
22
|
+
|
|
23
|
+
## Assumptions
|
|
24
|
+
|
|
25
|
+
- The desk records the board; the digital employee keeps the blocker,
|
|
26
|
+
SLA, mock, and parallel path current.
|
|
27
|
+
- 「本模块无外部依赖」 / "no external dependency" skips the four items
|
|
28
|
+
and the kickoff task.
|
|
29
|
+
|
|
30
|
+
## Acceptance
|
|
31
|
+
|
|
32
|
+
1. A vague line or a line missing blocker, SLA, mock, or parallel path
|
|
33
|
+
fails local validate
|
|
34
|
+
2. All four present, or the no-dependency opt-out, passes
|
|
35
|
+
3. Kickoff adds an FDE-05 task before implement when a dependency is
|
|
36
|
+
declared, and skips it on the opt-out
|
|
37
|
+
4. npm test and npm run test:live pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "0.27.1 is on main as v0.27.1, GitHub Release published, npm Trusted Publishing succeeded.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"publish": "git push origin main develop v0.27.1 — fast-forward 1d6d164..26ede20",
|
|
6
|
+
"release": "https://github.com/Duaer/duaer-spec/releases/tag/v0.27.1",
|
|
7
|
+
"npm": "gh run 35558574069 success — + duaer-spec@0.27.1"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Feature Specification: Release 0.27.1
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Ship 0.27.1: FDE-03 environment checklist, FDE-04 compat evidence, FDE-05
|
|
6
|
+
external dependency board, FDE-06 import precheck, and the patch-version
|
|
7
|
+
policy. Promote develop to main, publish a GitHub Release, and let npm
|
|
8
|
+
Trusted Publishing run.
|
|
9
|
+
|
|
10
|
+
## Acceptance
|
|
11
|
+
|
|
12
|
+
1. `package.json` is `0.27.1`; CHANGELOG has `0.27.1` and an empty Unreleased section.
|
|
13
|
+
2. Tag `v0.27.1` is on `main`; GitHub Release is published.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Feature confirm requires LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check, or a no-page-performance opt-out. A vague speed line fails. Kickoff schedules the budget before implement.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/perf-budget.mjs — pass",
|
|
6
|
+
"L1": "npm test — 254 pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Feature Specification: FDE-08 performance budget
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
A feature confirm card cannot pass on a vague speed claim. It must record
|
|
6
|
+
LCP, INP, bundle size, virtualized long lists, a weak-network check, and a
|
|
7
|
+
large-data check. Kickoff schedules that budget before implementation.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Local validate on perfBudget
|
|
12
|
+
- One FDE-08 task per confirmed module that declares page performance,
|
|
13
|
+
placed before implement and after the env probe, data precheck, and
|
|
14
|
+
external-dependency board when those exist
|
|
15
|
+
- Hint, placeholder, and chat/accept prompts
|
|
16
|
+
- Explicit opt-out: no page performance requirement
|
|
17
|
+
|
|
18
|
+
## Out of scope
|
|
19
|
+
|
|
20
|
+
- Bug desk
|
|
21
|
+
- Running a customer performance lab from the desk
|
|
22
|
+
|
|
23
|
+
## Assumptions
|
|
24
|
+
|
|
25
|
+
- The desk records the budget; the digital employee runs the weak-network
|
|
26
|
+
and large-data checks.
|
|
27
|
+
- 「本模块无页面性能要求」 / "no page performance" skips the six items
|
|
28
|
+
and the kickoff task.
|
|
29
|
+
- "挺快的" and other vague speed lines fail.
|
|
30
|
+
|
|
31
|
+
## Acceptance
|
|
32
|
+
|
|
33
|
+
1. A vague speed line, or a line missing any of the six items, fails
|
|
34
|
+
local validate
|
|
35
|
+
2. All six present, or the no-page-performance opt-out, passes
|
|
36
|
+
3. Kickoff adds an FDE-08 task before implement when page performance is
|
|
37
|
+
declared, and skips it on the opt-out
|
|
38
|
+
4. npm test and npm run test:live pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Create mode refuses when the target project directory already exists. Open from the list or browse still works. Existing folder contents are left untouched.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/live-repo-path.mjs bin/duaer-live.mjs web/live-dev/app.js — pass",
|
|
6
|
+
"L1": "npm test — pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Feature Specification: Refuse reusing an existing project directory on create
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Creating a new project must not reuse a directory that already exists.
|
|
6
|
+
An existing folder can only be opened from the project list or by browse-open.
|
|
7
|
+
|
|
8
|
+
## In scope
|
|
9
|
+
|
|
10
|
+
- `/api/projects/activate` create mode refuses when the target path already exists
|
|
11
|
+
- Create form sends create mode; list click opens without create
|
|
12
|
+
- Clear Chinese error telling the user to rename or open the existing project
|
|
13
|
+
- Unit / smoke coverage
|
|
14
|
+
|
|
15
|
+
## Out of scope
|
|
16
|
+
|
|
17
|
+
- Deleting or renaming old project folders
|
|
18
|
+
- Changing how desk sessions are keyed
|
|
19
|
+
|
|
20
|
+
## Assumptions
|
|
21
|
+
|
|
22
|
+
- "选为当前项目" on the create form means create when the path is new
|
|
23
|
+
- Clicking an item under 「已有项目」 means open
|
|
24
|
+
- Browse into an existing folder opens it; it does not create over it
|
|
25
|
+
|
|
26
|
+
## Acceptance
|
|
27
|
+
|
|
28
|
+
1. Create with a folder name that already exists under the parent returns an error; disk contents are unchanged
|
|
29
|
+
2. Opening the same path from the project list still works
|
|
30
|
+
3. Create with a never-used name still creates the directory
|
|
31
|
+
4. `npm test` and `npm run test:live` pass
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Create uses only a short folder name under the product parent. Absolute paths, existing folders, and duplicate project titles are refused. Open from the list or browse still works.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"L0": "node --check bin/live-repo-path.mjs bin/duaer-live.mjs — pass",
|
|
6
|
+
"L1": "npm test — pass",
|
|
7
|
+
"L3": "npm run test:live — pass"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Feature Specification: Unique create — short name under parent only
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Create and open are separate. Creating a project only uses a short folder
|
|
6
|
+
name under the product parent. Absolute paths, duplicate folders, and
|
|
7
|
+
duplicate project titles are refused.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- Create mode: short name only, must have parent set, refuse if folder exists
|
|
12
|
+
- Create mode: refuse if an existing project already uses that path or title
|
|
13
|
+
- Open from list / browse still accepts absolute paths
|
|
14
|
+
- Copy and labels match the rule
|
|
15
|
+
|
|
16
|
+
## Out of scope
|
|
17
|
+
|
|
18
|
+
- Moving or renaming existing project folders on disk
|
|
19
|
+
- Deleting stale list entries
|
|
20
|
+
|
|
21
|
+
## Acceptance
|
|
22
|
+
|
|
23
|
+
1. Create with `/Users/.../pcdemo` fails; asks for a short name under the parent
|
|
24
|
+
2. Create with a short name that already exists on disk or in the project list fails
|
|
25
|
+
3. Create with a title already used by another project fails
|
|
26
|
+
4. Open from the list still works with absolute paths
|
|
27
|
+
5. `npm test` and `npm run test:live` pass
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Corridor-aware Archify edge detours (validated bottom/top/side/gutter) plus vertical labelAt so stacked clean-flow IR renders.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"commands": ["node --test test/live-archify.test.mjs"],
|
|
6
|
+
"result": "16 pass / 0 fail"
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Feature Specification: Architecture corridor detour for clean-flow
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
When Archify rejects edges that cross unrelated components, auto-routing
|
|
6
|
+
must pick a corridor whose segments stay clear of other boxes — not a
|
|
7
|
+
naive bottom exit through column neighbors, and not a side via whose
|
|
8
|
+
horizontal leg clips co-row nodes. Vertical edge labels must sit in the
|
|
9
|
+
gap between stacked boxes.
|
|
10
|
+
|
|
11
|
+
## In scope
|
|
12
|
+
|
|
13
|
+
- `routeCrossingEdges` validates candidate routes (bottom/top wrap, side
|
|
14
|
+
corridor, gutter wrap) and applies the first clear detour
|
|
15
|
+
- Re-route edges that already have a bad bottom via
|
|
16
|
+
- Vertical edge labels get `labelAt` in the inter-box gap
|
|
17
|
+
- Regression test matching the speaker/editor/store failure
|
|
18
|
+
|
|
19
|
+
## Out of scope
|
|
20
|
+
|
|
21
|
+
- Changing Archify itself
|
|
22
|
+
- Full force-directed relayout
|
|
23
|
+
|
|
24
|
+
## Acceptance
|
|
25
|
+
|
|
26
|
+
1. The reproduced IR (speaker→editor, store→gen, 初稿/定稿 labels) renders
|
|
27
|
+
2. Existing same-row reverse-edge test still passes
|
|
28
|
+
3. `npm test` live-archify tests pass
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": "accepted",
|
|
3
|
+
"summary": "Bottom/top via edge labels pin labelAt on the via corridor so 改稿 no longer overlaps artifact.",
|
|
4
|
+
"verification": {
|
|
5
|
+
"commands": ["node --check bin/live-archify.mjs", "node --test test/live-archify.test.mjs"],
|
|
6
|
+
"result": "17 pass / 0 fail"
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Feature Specification: Bottom-via edge labels clear mid-row boxes
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
When a same-row edge detours under the floor, its label must stay on the
|
|
6
|
+
via (below) — not be pulled up with `labelDy: -36` onto mid-row components
|
|
7
|
+
such as `artifact`.
|
|
8
|
+
|
|
9
|
+
## In scope
|
|
10
|
+
|
|
11
|
+
- `repairEdgeLabelPlacement` pins `labelAt` under bottom vias / above top vias
|
|
12
|
+
- Overlap nudge when an offset mid still hits a box
|
|
13
|
+
- Regression for speaker→revise「改稿」 overlapping artifact
|
|
14
|
+
|
|
15
|
+
## Out of scope
|
|
16
|
+
|
|
17
|
+
- Changing Archify itself
|
|
18
|
+
|
|
19
|
+
## Acceptance
|
|
20
|
+
|
|
21
|
+
1. Reproduced IR renders via Archify
|
|
22
|
+
2. `node --test test/live-archify.test.mjs` passes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Feature Specification: Release 0.27.2
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Ship 0.27.2: architecture clean-flow corridor detours, bottom-via label
|
|
6
|
+
placement, unique project create paths, and FDE-08 performance budget.
|
|
7
|
+
Promote develop to main, publish a GitHub Release, and let npm Trusted
|
|
8
|
+
Publishing run.
|
|
9
|
+
|
|
10
|
+
## Acceptance
|
|
11
|
+
|
|
12
|
+
1. `package.json` is `0.27.2`; CHANGELOG has `0.27.2` and an empty Unreleased section.
|
|
13
|
+
2. Tag `v0.27.2` is on `main`; GitHub Release is published.
|
package/AGENTS.md
CHANGED
|
@@ -294,7 +294,9 @@ After normal development:
|
|
|
294
294
|
12. Push only when the user explicitly requested remote publishing for the
|
|
295
295
|
current request
|
|
296
296
|
13. Promote **`develop` → `main`** only when the user explicitly asks to ship /
|
|
297
|
-
go online (see [branching-and-release](docs/agent/branching-and-release.md))
|
|
297
|
+
go online (see [branching-and-release](docs/agent/branching-and-release.md)).
|
|
298
|
+
Fast iteration: bump the **patch** (`0.27.1`, `0.27.2`, …). Do not bump
|
|
299
|
+
the minor on every ship. The next release after `0.27.1` is `0.27.2`.
|
|
298
300
|
|
|
299
301
|
**Production hotfix:** base and merge into **`main`**, then merge the fix into
|
|
300
302
|
**`develop`** so integration does not regress. Then clean up the worktree.
|
|
@@ -350,7 +352,8 @@ git worktree prune
|
|
|
350
352
|
13. Stop worktree services; remove worktree; delete short branch; **handoff**
|
|
351
353
|
restart on `develop` (`duaer handoff [--run]` / `.duaer/handoff.json`)
|
|
352
354
|
14. Push only when explicitly requested
|
|
353
|
-
15. Promote **`develop` → `main`** only when the user explicitly asks to go online
|
|
355
|
+
15. Promote **`develop` → `main`** only when the user explicitly asks to go online.
|
|
356
|
+
Version bump is the patch (`0.27.2` next); see branching-and-release.
|
|
354
357
|
|
|
355
358
|
Development must not begin before isolation steps 1–3 are complete.
|
|
356
359
|
|