lee-spec-kit 0.7.10 โ 0.7.11
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/README.en.md +7 -6
- package/README.md +7 -6
- package/dist/index.js +192 -62
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/en/common/README.md +6 -4
- package/templates/en/common/agents/agents.md +8 -4
- package/templates/en/common/agents/skills/execute-task.md +5 -1
- package/templates/en/common/features/README.md +3 -2
- package/templates/en/common/features/feature-base/spec.md +1 -1
- package/templates/en/common/features/feature-base/tasks.md +6 -3
- package/templates/en/common/ideas/README.md +2 -2
- package/templates/en/common/prd/README.md +2 -2
- package/templates/ko/common/README.md +6 -4
- package/templates/ko/common/agents/agents.md +8 -4
- package/templates/ko/common/agents/skills/execute-task.md +5 -1
- package/templates/ko/common/features/README.md +3 -2
- package/templates/ko/common/features/feature-base/spec.md +1 -1
- package/templates/ko/common/features/feature-base/tasks.md +6 -3
- package/templates/ko/common/ideas/README.md +2 -2
- package/templates/ko/common/prd/README.md +2 -2
package/package.json
CHANGED
|
@@ -16,8 +16,10 @@ npx lee-spec-kit context --json-compact
|
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
- Apply lee-spec-kit workflow only when `isLeeSpecKitProject: true`.
|
|
19
|
+
- Use `context --json-compact` as the read-only state probe, then use `flow` as the default execution/resume entrypoint.
|
|
19
20
|
- Determine approval waiting only from the latest `context --json-compact` / `flow --json-compact`.
|
|
20
|
-
- When `approvalRequest.required=true`,
|
|
21
|
+
- When `approvalRequest.required=true`, keep approval open until it is resolved: briefly restate the current stage from `matchedFeature.currentSubstate*` when available, then show the exact CLI approval lines and wait for user approval (`<LABEL>` or `<LABEL> OK`) before execution.
|
|
22
|
+
- For command execution, default to `npx lee-spec-kit flow <featureRef> --approve <LABEL> --execute`.
|
|
21
23
|
- When `approvalRequest.required=false`, do not invent a separate label approval prompt.
|
|
22
24
|
- If `isLeeSpecKitProject: false`, skip lee-spec-kit-specific flow and continue with normal workflow.
|
|
23
25
|
|
|
@@ -53,17 +55,17 @@ Recommended flow:
|
|
|
53
55
|
|
|
54
56
|
- **PRD (`docs/prd/`)**: requirements SSOT
|
|
55
57
|
- This top-level space is created by `init`; PRD is edited directly here rather than generated by a separate CLI step.
|
|
56
|
-
- Assign stable IDs per requirement: `PRD-FR-001`, `PRD-US-002`, `PRD-NFR-003`
|
|
58
|
+
- Assign stable `PRD-*` IDs per requirement: numeric IDs like `PRD-FR-001`, `PRD-US-002`, `PRD-NFR-003` or semantic keys like `PRD-SCOPE-V1-DESKTOP-EDITOR`
|
|
57
59
|
- Keep IDs stable (prefer marking as Deprecated over deleting; do not renumber).
|
|
58
60
|
- Define PRD IDs in the PRD source first. Do not invent them inside feature docs.
|
|
59
61
|
- **Ideas (`docs/ideas/`)**: pre-Feature SSOT (hypotheses/experiments/candidates)
|
|
60
62
|
- Ideas usually start from PRD requirements and should keep `PRD Refs` when applicable.
|
|
61
|
-
- Put `PRD Refs:` at the top (example: `PRD-FR-001, PRD-US-002`).
|
|
63
|
+
- Put `PRD Refs:` at the top (example: `PRD-FR-001, PRD-US-002` or `PRD-SCOPE-V1-DESKTOP-EDITOR`).
|
|
62
64
|
- Once promoted, the SSOT moves to `docs/features/` and the idea should be archived.
|
|
63
65
|
- **Features (`docs/features/`)**: implementation scope/progress SSOT
|
|
64
66
|
- Features are the executable units that come after PRD and idea refinement.
|
|
65
67
|
- `spec.md`: scope + `PRD Refs` (the PRD IDs this feature covers)
|
|
66
|
-
- `tasks.md`: map each task line to PRD IDs via bracket tags like `[PRD-FR-001]`, or tag non-PRD tasks as `[NON-PRD]`
|
|
68
|
+
- `tasks.md`: map each task line to PRD IDs via bracket tags like `[PRD-FR-001]` or `[PRD-SCOPE-V1-DESKTOP-EDITOR]`, or tag non-PRD tasks as `[NON-PRD]`
|
|
67
69
|
- Use `[NON-PRD]` only for internal work such as refactors, renames, tooling, tests, and cleanup.
|
|
68
70
|
- If a task changes user-facing behavior, acceptance criteria, or feature scope, backfill PRD first and tag the task as `[PRD-...]` instead of leaving it as `[NON-PRD]`.
|
|
69
71
|
- For legacy docs without PRD IDs yet, backfill the source requirements doc first, then link the feature docs.
|
|
@@ -38,15 +38,19 @@ Prohibited:
|
|
|
38
38
|
|
|
39
39
|
## ๐งพ Label Response Contract (SSOT)
|
|
40
40
|
|
|
41
|
-
- Treat approval-waiting as a separate state. Approval-waiting means `context --json-compact`
|
|
41
|
+
- Treat approval-waiting as a separate state. Approval-waiting means the latest `context --json-compact` / `flow --json-compact` (fallback: `context --json` / `flow --json`) shows `approvalRequest.required=true`.
|
|
42
|
+
- Do not infer approval-waiting from conversation tone, action type, or the mere presence of `actionOptions[]`.
|
|
42
43
|
- Use the latest `npx lee-spec-kit context --json-compact` as the default source (fallback: `context --json` or `flow --json` when full detail is required; prefer `flow --json-compact` for default flow output).
|
|
43
44
|
- When using auto results from `flow --json-compact` (or `flow --json`), treat `autoRun.resume.flowCommand` as SSOT for resume (including after context compression/reset).
|
|
44
45
|
- Treat `AUTO_DELEGATED_HANDOFF` as a delegated pause, not a failure. Continue or resume the delegated run path and do not reopen the same approval label.
|
|
45
46
|
- Treat `AUTO_MANUAL_REQUIRED` as an instruction-only automation boundary, not an immediate failure. Re-check `context --json-compact`, then decide stop/report by `approvalRequest.required` (`context --json` only for full-detail debugging fields).
|
|
46
|
-
-
|
|
47
|
+
- Special case: if `matchedFeature.currentSubstateId === "change_request_sync"` or `matchedFeature.pendingChangeRequest` is present, treat that manual boundary as an internal docs-sync step first, not an immediate user-facing stop. Sync docs, clear the pending change field, then continue with fresh `context --json-compact` or `flow`.
|
|
48
|
+
- Treat `AUTO_SELECTION_REQUIRED` as a feature-selection pause, not an execution failure. Resolve the active feature first, then continue with fresh `context --json-compact` or `flow`.
|
|
49
|
+
- In approval-waiting state, if `matchedFeature.currentSubstateId` exists, prepend one brief current-stage recap derived from `matchedFeature.currentSubstateId/currentSubstateOwner/currentSubstatePhase`.
|
|
50
|
+
- Then prefer `approvalRequest.userFacingLines` from `context --json-compact`. If full `--json` is used, fall back to `actionOptions[*].approvalPrompt` plus `approvalRequest.finalPrompt`. Do not add your own rewritten label summary before or between those lines.
|
|
47
51
|
- Prefer `matchedFeature.currentSubstateOwner` plus `agentOrchestration.subAgentHandoff` as the delegation SSOT.
|
|
48
52
|
- In non-approval state, do not append labels or `approvalRequest.finalPrompt` unless the user explicitly asked for current options.
|
|
49
|
-
- If approval is still pending after answering an unrelated question, answer first,
|
|
53
|
+
- If approval is still pending after answering an unrelated question, answer first, re-check `approvalRequest.required`, and if it is still `true`, re-open approval with one brief current-stage recap plus the exact CLI-provided approval lines (`approvalRequest.userFacingLines`, or `actionOptions[*].approvalPrompt` + `approvalRequest.finalPrompt` in full `--json`).
|
|
50
54
|
- If user input does not contain a valid label, do not execute; request label selection again.
|
|
51
55
|
- For non-delegated command options, prefer one-shot `flow --approve <LABEL> --execute`; do not split `context --approve` and `context --execute --ticket` across turns/sessions.
|
|
52
56
|
- If `matchedFeature.currentSubstateOwner="subagent"` and `agentOrchestration.subAgentHandoff.required=true` with `mode="command"`, delegation is mandatory: call `spawn_agent` first. Do not execute that command directly from the main agent.
|
|
@@ -57,7 +61,7 @@ Prohibited:
|
|
|
57
61
|
- Main-agent fallback is allowed only when sub-agent execution is unavailable (for example: tool not available, spawn failed, or sub-agent failed before command execution).
|
|
58
62
|
- When fallback is used, report a one-line fallback reason to the user before running the command in the main agent.
|
|
59
63
|
|
|
60
|
-
Approval-waiting output must reuse the exact CLI-provided prompt lines. Do not invent
|
|
64
|
+
Approval-waiting output must reuse the exact CLI-provided prompt lines. A single concise current-stage recap derived from `matchedFeature.currentSubstate*` is allowed before those lines. Do not invent label-summary wrappers such as `Current status:` / `Available labels:` or paraphrase label meanings.
|
|
61
65
|
|
|
62
66
|
---
|
|
63
67
|
|
|
@@ -41,8 +41,11 @@ Execute exactly one option from `๐ Next Options (Atomic)` as printed by the C
|
|
|
41
41
|
- If auto execution stops, treat `autoRun.resume` from `flow --json-compact` (or `flow --json`) as SSOT. After interruption/compression, resume with `autoRun.resume.flowCommand`; if needed, check current state first with `autoRun.resume.contextCommand`.
|
|
42
42
|
- Treat `AUTO_DELEGATED_HANDOFF` as a delegated pause, not a crash. Reuse the delegated run path and continue the delegated work before asking for a fresh approval label.
|
|
43
43
|
- Treat `AUTO_MANUAL_REQUIRED` as an automation boundary (instruction-only segment), not an immediate crash. Re-check `context --json-compact` and report whether `approvalRequest.required` is now true.
|
|
44
|
+
- Treat `AUTO_SELECTION_REQUIRED` as a feature-selection pause, not a crash. Resolve the active feature first, then rerun `context --json-compact` or `flow`.
|
|
45
|
+
- If `matchedFeature.currentSubstateId === "change_request_sync"` or `matchedFeature.pendingChangeRequest` is present, sync docs before more code work: update `tasks.md` first, add or retag the affected task, and if shipped behavior or scope changed, sync `decisions.md` plus `spec.md` / PRD refs as needed. Clear `Pending Change Request` after syncing, then rerun `context --json-compact` or `flow`.
|
|
44
46
|
- If the CLI prints commands, copy/paste them. (In standalone setups commands may include `git -C ...` and scopes like `project`/`docs`.)
|
|
45
47
|
- Follow `agents.md` **"Label Response Contract (SSOT)"**. Show label prompts only in approval-waiting state, and reuse the exact CLI-provided approval lines instead of paraphrasing them.
|
|
48
|
+
- If you answer a side question while `approvalRequest.required=true`, answer first, then briefly restate `matchedFeature.currentSubstateId/currentSubstateOwner/currentSubstatePhase` when available and re-show the exact CLI approval lines before waiting again.
|
|
46
49
|
- For non-delegated command options, default to `npx lee-spec-kit flow <slug|F001|F001-slug> --approve <LABEL> --execute` and avoid split `context --approve` / `context --execute --ticket` runs across turns.
|
|
47
50
|
- If the current command is delegated (`matchedFeature.currentSubstateOwner="subagent"` and `agentOrchestration.subAgentHandoff.required=true` with `mode="command"`), call `spawn_agent` first and pass the handoff contract instead of executing that command from the main agent.
|
|
48
51
|
- If `flow/context --execute --json` returns `approved_handoff_prepared`, stop re-approving the same label. Complete the delegated work first, then refresh context.
|
|
@@ -53,10 +56,11 @@ Keep `tasks.md` aligned with reality.
|
|
|
53
56
|
|
|
54
57
|
- Do not mark `[DONE]` without actually completing the work and verifying criteria.
|
|
55
58
|
- If you need to change a completed task, add a new task instead of rewriting history.
|
|
56
|
-
- If you need to add a new task, prefer `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-FR-001`. Add `--acceptance` and `--check` inline when you already know the concrete items.
|
|
59
|
+
- If you need to add a new task, prefer `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-*`. Use an existing PRD key such as `PRD-FR-001` or `PRD-SCOPE-V1-DESKTOP-EDITOR`. Add `--acceptance` and `--check` inline when you already know the concrete items.
|
|
57
60
|
- Do not leave placeholder `Acceptance` / `Checklist` items in a newly added task. `task-run` will block until those fields contain concrete execution/verification items.
|
|
58
61
|
- If manual editing is unavoidable, append the new task directly below the last existing task block in the `Task List` section.
|
|
59
62
|
- Do not insert it near the current task or right before `Completion Criteria` / the next `##` heading.
|
|
63
|
+
- When handling a mid-implementation user change request, treat `Pending Change Request` as a temporary sync marker: reflect the request in `tasks.md`, sync supporting docs if the behavior/scope changed, then clear that field before resuming implementation.
|
|
60
64
|
|
|
61
65
|
### Step 3.25: Record decisions (strongly recommended, effectively required)
|
|
62
66
|
|
|
@@ -65,8 +65,8 @@ npx lee-spec-kit status --write
|
|
|
65
65
|
|
|
66
66
|
## PRD Requirement Traceability (Recommended)
|
|
67
67
|
|
|
68
|
-
- Assign stable requirement IDs in PRD docs (`docs/prd/*.md`) like `PRD-FR-001`.
|
|
69
|
-
- Link each task line in `tasks.md` with a tag like `[PRD-FR-001]`. For non-PRD tasks, use `[NON-PRD]`.
|
|
68
|
+
- Assign stable `PRD-*` requirement IDs in PRD docs (`docs/prd/*.md`) like `PRD-FR-001` or `PRD-SCOPE-V1-DESKTOP-EDITOR`.
|
|
69
|
+
- Link each task line in `tasks.md` with a tag like `[PRD-FR-001]` or `[PRD-SCOPE-V1-DESKTOP-EDITOR]`. For non-PRD tasks, use `[NON-PRD]`.
|
|
70
70
|
- Use `[NON-PRD]` only for internal implementation work such as refactors, test-only work, tooling, renames, and cleanup.
|
|
71
71
|
- If a change affects user-facing behavior, acceptance criteria, or scope, update PRD first and retag the task as `[PRD-...]`.
|
|
72
72
|
- Do not invent PRD IDs inside feature docs. Define them in the PRD source first, and backfill legacy docs before linking tasks.
|
|
@@ -79,6 +79,7 @@ npx lee-spec-kit status --write
|
|
|
79
79
|
When things change mid-work, it must be explicit what was updated.
|
|
80
80
|
|
|
81
81
|
- Record changes as **new tasks** (do not edit `[DONE]` tasks; create a new task instead).
|
|
82
|
+
- During that sync, `tasks.md` may temporarily carry `Pending Change Request` as an internal marker. Clear it after the request is reflected in the new task(s) and related docs.
|
|
82
83
|
- Every change task must be tagged as `[PRD-...]` or `[NON-PRD]`. (Recommended: also add `[CHANGE]`.)
|
|
83
84
|
- If a change starts as internal exploration but ends up changing user-visible behavior, do not leave it as `[NON-PRD]`.
|
|
84
85
|
- Backfill/update `docs/prd/*.md`
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
## Related Documents
|
|
56
56
|
|
|
57
57
|
- PRD: `../../prd/`
|
|
58
|
-
- PRD Refs: - (e.g. `PRD-FR-001`, `PRD-US-002`)
|
|
58
|
+
- PRD Refs: - (e.g. `PRD-FR-001`, `PRD-US-002`, `PRD-SCOPE-V1-DESKTOP-EDITOR`)
|
|
59
59
|
- Only list IDs that already exist in the source requirements doc. Do not invent PRD IDs in `spec.md` or `tasks.md`.
|
|
60
60
|
- If this is a legacy requirements doc without PRD IDs yet, backfill IDs in the source first, then update this field and the `tasks.md` task tags together.
|
|
61
61
|
- When requirements/scope change, update PRD docs + this field + `tasks.md` task tags together.
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- If `approvalRequest.required=true`, wait for the exact CLI-provided label reply before changing task state.
|
|
10
10
|
- If `approvalRequest.required=false`, do not invent a separate `OK` approval step; update task state after real completion/verification.
|
|
11
11
|
- `task-complete` rejects `[DONE]` while any item in that task's `Checklist` remains unchecked.
|
|
12
|
-
- **PRD mapping (recommended)**: add
|
|
12
|
+
- **PRD mapping (recommended)**: add an existing PRD requirement ID tag like `[PRD-FR-001]` or `[PRD-SCOPE-V1-DESKTOP-EDITOR]` to each task line, or tag non-PRD tasks as `[NON-PRD]`.
|
|
13
13
|
- Do not invent PRD IDs in `tasks.md`. Only reference IDs that already exist in `docs/prd` or the upstream requirements doc.
|
|
14
14
|
- If this is a legacy feature without PRD IDs yet, backfill IDs in the source requirements doc first, then align `spec.md` `PRD Refs` and task tags together.
|
|
15
15
|
- `[NON-PRD]` is for internal implementation work only. If the task changes user-facing behavior, acceptance criteria, or scope, backfill PRD first and tag it as `[PRD-...]`.
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
- **Repo**: {{projectName}}-{component}
|
|
24
24
|
- **Issue**: #{issue-number}
|
|
25
25
|
- **Branch**: `feat/{issue-number}-{feature-name}`
|
|
26
|
+
- **Pending Change Request**: -
|
|
27
|
+
- Temporary sync marker for a newly accepted user request during implementation
|
|
28
|
+
- Clear it after reflecting the request in `tasks.md` and related docs
|
|
26
29
|
- **PR**: -
|
|
27
30
|
- Example: `#123` or PR URL
|
|
28
31
|
- **PR Status**: -
|
|
@@ -57,7 +60,7 @@
|
|
|
57
60
|
- [ ] (subtask)
|
|
58
61
|
```
|
|
59
62
|
|
|
60
|
-
> `PRD-FR-001` in the example
|
|
63
|
+
> `PRD-FR-001` in the example is just one valid `PRD-*` key. If the key is not defined in the PRD source yet, do not add it to tasks first.
|
|
61
64
|
> If a task began as exploration/internal work but became a product requirement change, update PRD first, then retag the task from `[NON-PRD]` to `[PRD-...]`.
|
|
62
65
|
|
|
63
66
|
---
|
|
@@ -66,7 +69,7 @@
|
|
|
66
69
|
|
|
67
70
|
> Add tasks below. **At least 1 task is required.**
|
|
68
71
|
> Keep tasks as one ordered list. The list order itself is the execution priority.
|
|
69
|
-
> To add a new task, prefer `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-FR-001`. Add `--acceptance` and `--check` inline when you already know the concrete items.
|
|
72
|
+
> To add a new task, prefer `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-*`. Use an existing PRD key such as `PRD-FR-001` or `PRD-SCOPE-V1-DESKTOP-EDITOR`. Add `--acceptance` and `--check` inline when you already know the concrete items.
|
|
70
73
|
> Do not leave placeholder `Acceptance` / `Checklist` content in place. `task-run` will block execution until those items are concrete.
|
|
71
74
|
> If you must edit manually, append it below the last existing task block in `Task List` instead of inserting it near the current task or right before `Completion Criteria`.
|
|
72
75
|
|
|
@@ -17,7 +17,7 @@ Typical flow: PRD defines the requirement, Idea explores or scopes the candidate
|
|
|
17
17
|
- `Idea ID` (`I###` for indexed ideas)
|
|
18
18
|
- Goal / context
|
|
19
19
|
- Rough scope (whatโs in/out)
|
|
20
|
-
- PRD Refs (recommended): `PRD-FR-001, PRD-US-002` (use `NON-PRD` when not tied to PRD)
|
|
20
|
+
- PRD Refs (recommended): `PRD-FR-001, PRD-US-002` or `PRD-SCOPE-V1-DESKTOP-EDITOR` (use `NON-PRD` when not tied to PRD)
|
|
21
21
|
- Target component (optional): `api` / `app` / `worker` / `all`
|
|
22
22
|
- Status: `Active | Featureized | Dropped`
|
|
23
23
|
- Feature: `F###-slug` when promoted
|
|
@@ -32,7 +32,7 @@ Typical flow: PRD defines the requirement, Idea explores or scopes the candidate
|
|
|
32
32
|
3. In the new Feature, record all of the following:
|
|
33
33
|
- The source idea path is stamped into `spec.md` automatically when `--idea` is used.
|
|
34
34
|
- `PRD Refs` still need to be completed in `spec.md`.
|
|
35
|
-
- `tasks.md` still needs PRD mapping tags like `[PRD-FR-001]`.
|
|
35
|
+
- `tasks.md` still needs PRD mapping tags like `[PRD-FR-001]` or `[PRD-SCOPE-V1-DESKTOP-EDITOR]`.
|
|
36
36
|
4. Keep the idea doc for history and update it to `Status: Featureized`, `Feature: F00X-...`
|
|
37
37
|
|
|
38
38
|
> Tip: keeping the source idea doc is usually better than deleting it for traceability (โwhy this feature existsโ).
|
|
@@ -28,9 +28,9 @@ If work starts from a PRD item, keep the relationship visible through `PRD Refs`
|
|
|
28
28
|
|
|
29
29
|
To let the CLI report โwhich PRD items are implementedโ, assign **stable IDs** to PRD requirements.
|
|
30
30
|
|
|
31
|
-
-
|
|
31
|
+
- Use stable `PRD-*` keys. Numeric IDs like `PRD-FR-001`, `PRD-US-002`, `PRD-NFR-003` and semantic keys like `PRD-SCOPE-V1-DESKTOP-EDITOR` are all valid.
|
|
32
32
|
- The ID only needs to appear on the same line (heading/bullet).
|
|
33
|
-
- Reference it from a Feature `tasks.md` task line as a **bracket tag** like `[PRD-FR-001]`.
|
|
33
|
+
- Reference it from a Feature `tasks.md` task line as a **bracket tag** like `[PRD-FR-001]` or `[PRD-SCOPE-V1-DESKTOP-EDITOR]`.
|
|
34
34
|
- For non-PRD tasks, tag them as `[NON-PRD]`.
|
|
35
35
|
- Important: do not invent PRD IDs in `tasks.md` or `spec.md`. Define them in this folder or the upstream requirements source first, then reference them.
|
|
36
36
|
- For legacy PRD/requirements docs without IDs yet, backfill IDs in the source first, then align the Feature `PRD Refs` and task tags.
|
|
@@ -16,8 +16,10 @@ npx lee-spec-kit context --json-compact
|
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
- `isLeeSpecKitProject: true`์ผ ๋๋ง lee-spec-kit ์ํฌํ๋ก์ฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
|
|
19
|
+
- `context --json-compact`๋ read-only ์ํ ํ์ธ์ฉ์ผ๋ก ์ฐ๊ณ , ์ค์ ์คํ/์ฌ๊ฐ ๊ธฐ๋ณธ ์ํธ๋ฆฌํฌ์ธํธ๋ `flow`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
|
|
19
20
|
- ์น์ธ ๋๊ธฐ ์ฌ๋ถ๋ ํญ์ ์ต์ `context --json-compact` / `flow --json-compact`๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋จํฉ๋๋ค.
|
|
20
|
-
- `approvalRequest.required=true`์ผ
|
|
21
|
+
- `approvalRequest.required=true`์ผ ๋๋ ์น์ธ์ด ๋๋ ๋๊น์ง ์น์ธ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ๊ฐ๋ฅํ๋ฉด `matchedFeature.currentSubstate*` ๊ธฐ๋ฐ ํ์ฌ ๋จ๊ณ ํ ์ค ์์ฝ์ ๋จผ์ ๋งํ๊ณ , ๊ทธ ๋ค์ CLI๊ฐ ์ค ์น์ธ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ค ๋ค ์น์ธ(`<LABEL>` ๋๋ `<LABEL> OK`)์ ๋ฐ์ ํ ์คํํฉ๋๋ค.
|
|
22
|
+
- ๋ช
๋ น ์คํ์ ๊ธฐ๋ณธ์ ์ผ๋ก `npx lee-spec-kit flow <featureRef> --approve <LABEL> --execute`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
|
|
21
23
|
- `approvalRequest.required=false`์ด๋ฉด ๋ณ๋ ๋ผ๋ฒจ ์น์ธ ๋ฌธ๊ตฌ๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค.
|
|
22
24
|
- `isLeeSpecKitProject: false`๋ฉด lee-spec-kit ์ ์ฉ ์ ์ฐจ๋ฅผ ๊ฑด๋๋ฐ๊ณ ์ผ๋ฐ ์ํฌํ๋ก์ฐ๋ก ์งํํฉ๋๋ค.
|
|
23
25
|
|
|
@@ -53,17 +55,17 @@ npx lee-spec-kit context --json-compact
|
|
|
53
55
|
|
|
54
56
|
- **PRD (`docs/prd/`)**: ์๊ตฌ์ฌํญ SSOT
|
|
55
57
|
- ์ด ๊ณต๊ฐ์ `init`์ด ๋ง๋ค์ด ์ฃผ๋ฉฐ, ๋ณ๋ ์์ฑ ๋ช
๋ น ์์ด ์ฌ๊ธฐ์์ ์ง์ PRD๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
|
|
56
|
-
- ์๊ตฌ์ฌํญ๋ง๋ค ID๋ฅผ ๋ถ์ฌํฉ๋๋ค: `PRD-FR-001`, `PRD-US-002`, `PRD-NFR-003`
|
|
58
|
+
- ์๊ตฌ์ฌํญ๋ง๋ค ์์ ์ ์ธ `PRD-*` ID๋ฅผ ๋ถ์ฌํฉ๋๋ค: `PRD-FR-001`, `PRD-US-002`, `PRD-NFR-003` ๊ฐ์ numeric ID ๋๋ `PRD-SCOPE-V1-DESKTOP-EDITOR` ๊ฐ์ semantic key
|
|
57
59
|
- ID๋ ์์ ์ ์ผ๋ก ์ ์งํฉ๋๋ค. (์ญ์ ๋์ `Deprecated` ํ๊ธฐ ๊ถ์ฅ, ์ฌ๋ฒํธ ๋ถ์ฌ ๊ธ์ง)
|
|
58
60
|
- PRD ID๋ PRD ์๋ฌธ์ ๋จผ์ ์ ์ํฉ๋๋ค. Feature ๋ฌธ์์์ ์์ ์์ฑํ์ง ์์ต๋๋ค.
|
|
59
61
|
- **Ideas (`docs/ideas/`)**: Feature ์ ๋จ๊ณ SSOT (๊ฐ์ค/์คํ/ํ๋ณด)
|
|
60
62
|
- ๊ฐ๋ฅํ๋ฉด PRD์์ ์ถ๋ฐํ ํ๋ณด๋ผ๋ ์ ์ด ๋ณด์ด๋๋ก `PRD Refs`๋ฅผ ์ ์งํฉ๋๋ค.
|
|
61
|
-
- Idea ๋ฌธ์ ์๋จ์ `PRD Refs:`๋ฅผ ๊ธฐ๋กํฉ๋๋ค. (์: `PRD-FR-001, PRD-US-002`)
|
|
63
|
+
- Idea ๋ฌธ์ ์๋จ์ `PRD Refs:`๋ฅผ ๊ธฐ๋กํฉ๋๋ค. (์: `PRD-FR-001, PRD-US-002` ๋๋ `PRD-SCOPE-V1-DESKTOP-EDITOR`)
|
|
62
64
|
- Feature๋ก ์น๊ฒฉ๋๋ฉด SSOT๋ `docs/features/`๋ก ์ด๋ํ๊ณ , Idea๋ archive๋ก ์ ๋ฆฌํฉ๋๋ค.
|
|
63
65
|
- **Features (`docs/features/`)**: ๊ตฌํ ๋ฒ์/์งํ SSOT
|
|
64
66
|
- Feature๋ PRD์ idea๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ๊ตฌํ์ ์งํํ๋ ์คํ ๋จ์์
๋๋ค.
|
|
65
67
|
- `spec.md`: ๋ฒ์ ์ ์ + `PRD Refs`(๊ธฐ๋ฅ์ด ์ปค๋ฒํ๋ PRD ID ๋ชฉ๋ก)
|
|
66
|
-
- `tasks.md`: ํ์คํฌ ๋จ์๋ก PRD ID๋ฅผ ํ๊ทธ(`[PRD-FR-001]`)๋ก ๋งคํํ๊ฑฐ๋, PRD ๋ฌด๊ด ํ์คํฌ๋ `[NON-PRD]`๋ก ํ์
|
|
68
|
+
- `tasks.md`: ํ์คํฌ ๋จ์๋ก PRD ID๋ฅผ ํ๊ทธ(`[PRD-FR-001]`, `[PRD-SCOPE-V1-DESKTOP-EDITOR]`)๋ก ๋งคํํ๊ฑฐ๋, PRD ๋ฌด๊ด ํ์คํฌ๋ `[NON-PRD]`๋ก ํ์
|
|
67
69
|
- `[NON-PRD]`๋ refactor, rename, tooling, ํ
์คํธ, cleanup ๊ฐ์ ๋ด๋ถ ์์
์๋ง ์ฌ์ฉํฉ๋๋ค.
|
|
68
70
|
- ํ์คํฌ๊ฐ ์ฌ์ฉ์ ๋์, acceptance criteria, ๊ธฐ๋ฅ ๋ฒ์๋ฅผ ๋ฐ๊พธ๊ฒ ๋๋ฉด `[NON-PRD]`๋ก ๋๋ด์ง ๋ง๊ณ PRD๋ฅผ backfillํ ๋ค `[PRD-...]`๋ก ์ฐ๊ฒฐํฉ๋๋ค.
|
|
69
71
|
- ๋ ๊ฑฐ์ ๋ฌธ์์ PRD ID๊ฐ ์๋ค๋ฉด, ๋จผ์ ์๋ฌธ ์๊ตฌ์ฌํญ ๋ฌธ์์ ID๋ฅผ backfillํ ๋ค Feature ๋ฌธ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
|
|
@@ -38,15 +38,19 @@
|
|
|
38
38
|
|
|
39
39
|
## ๐งพ ๋ผ๋ฒจ ์๋ต ๊ณ์ฝ (SSOT)
|
|
40
40
|
|
|
41
|
-
- ์น์ธ ๋๊ธฐ ์ํ๋ฅผ ๋ณ๋ ์ํ๋ก ์ทจ๊ธํฉ๋๋ค. ์น์ธ ๋๊ธฐ๋ `context --json-compact`(
|
|
41
|
+
- ์น์ธ ๋๊ธฐ ์ํ๋ฅผ ๋ณ๋ ์ํ๋ก ์ทจ๊ธํฉ๋๋ค. ์น์ธ ๋๊ธฐ๋ ์ต์ `context --json-compact` / `flow --json-compact`(fallback: `context --json` / `flow --json`)์ `approvalRequest.required=true`๊ฐ ๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
|
|
42
|
+
- ์น์ธ ๋๊ธฐ ์ฌ๋ถ๋ฅผ ๋ํ ๋ถ์๊ธฐ, action type, ๋๋ `actionOptions[]` ์กด์ฌ๋ง์ผ๋ก ์ถ์ ํ์ง ๋ง์ธ์.
|
|
42
43
|
- ๊ธฐ์ค ๋ฐ์ดํฐ๋ ์ต์ `npx lee-spec-kit context --json-compact`๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , ์์ธ ํ๋๊ฐ ํ์ํ ๋๋ง `context --json` ๋๋ `flow --json`์ ์ฌ์ฉํฉ๋๋ค. (`flow`๋ ๊ธฐ๋ณธ์ ์ผ๋ก `--json-compact` ์ฐ์ )
|
|
43
44
|
- `flow --json-compact`(๋๋ `flow --json`)์ auto ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ ๋๋ `autoRun.resume.flowCommand`๋ฅผ ์ฌ๊ฐ SSOT๋ก ์ฌ์ฉํฉ๋๋ค. (์ปจํ
์คํธ ์์ถ/๋ฆฌ์
ํ ๋์ผ ๊ท์น ์ ์ฉ)
|
|
44
45
|
- `AUTO_DELEGATED_HANDOFF`๋ delegated run ์ผ์์ ์ง ์ํ์ด๋ฉฐ ์คํจ๊ฐ ์๋๋๋ค. ๊ฐ์ ์น์ธ ๋ผ๋ฒจ์ ๋ค์ ์ด์ง ๋ง๊ณ delegated ๊ฒฝ๋ก๋ฅผ ์ด์ด์ ์งํํ๊ฑฐ๋ ์ฌ๊ฐํฉ๋๋ค.
|
|
45
46
|
- `AUTO_MANUAL_REQUIRED`๋ instruction-only ์๋ํ ๊ฒฝ๊ณ ์ํ์ด๋ฉฐ ์คํจ ๋จ์ ์ ํธ๊ฐ ์๋๋๋ค. `context --json-compact` ์ฌํ์ธ ํ `approvalRequest.required` ๊ธฐ์ค์ผ๋ก ๋ฉ์ถค/๋ณด๊ณ ๋ฅผ ํ๋จํฉ๋๋ค. (์์ธ ๋๋ฒ๊น
ํ๋๊ฐ ํ์ํ ๋๋ง `context --json`)
|
|
46
|
-
-
|
|
47
|
+
- ์์ธ: `matchedFeature.currentSubstateId === "change_request_sync"`์ด๊ฑฐ๋ `matchedFeature.pendingChangeRequest`๊ฐ ์์ผ๋ฉด, ์ด manual boundary๋ ์ฐ์ ์ฌ์ฉ์ ๋ณด๊ณ ์ฉ ์ ์ง๊ฐ ์๋๋ผ ๋ด๋ถ docs-sync ๋จ๊ณ๋ก ์ทจ๊ธํฉ๋๋ค. ๋ฌธ์๋ฅผ ๋จผ์ ๋๊ธฐํํ๊ณ pending change ํ๋๋ฅผ ๋น์ด ๋ค ์ต์ `context --json-compact` ๋๋ `flow`๋ก ๊ณ์ ์งํํ์ธ์.
|
|
48
|
+
- `AUTO_SELECTION_REQUIRED`๋ feature ์ ํ ๊ฒฝ๊ณ ์ผ์์ ์ง ์ํ์ด๋ฉฐ ์คํ ์คํจ๊ฐ ์๋๋๋ค. ๋จผ์ ํ์ฑ feature ์ ํ์ ํด์ํ ๋ค ์ต์ `context --json-compact` ๋๋ `flow`๋ก ์ด์ด์ ์งํํฉ๋๋ค.
|
|
49
|
+
- ์น์ธ ๋๊ธฐ ์ํ์์ `matchedFeature.currentSubstateId`๊ฐ ์์ผ๋ฉด `matchedFeature.currentSubstateId/currentSubstateOwner/currentSubstatePhase`์์ ๊ฐ์ ธ์จ ํ์ฌ ๋จ๊ณ ํ ์ค ์์ฝ์ ๋จผ์ ๋ถ์
๋๋ค.
|
|
50
|
+
- ๊ทธ ๋ค์ `context --json-compact`์ `approvalRequest.userFacingLines`๋ฅผ ์ฐ์ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ์ธ์. ์ ์ฒด `--json`์ ์ธ ๋๋ง `actionOptions[*].approvalPrompt`์ `approvalRequest.finalPrompt` ์กฐํฉ์ผ๋ก ํด๋ฐฑํฉ๋๋ค. ์ด ์ฌ์ด์ ์์ด์ ํธ๊ฐ ์์๋ก ๋ค์ ์ด ๋ผ๋ฒจ ์์ฝ์ ๋ผ์ ๋ฃ์ง ์์ต๋๋ค.
|
|
47
51
|
- ์์ ํ๋จ SSOT๋ `matchedFeature.currentSubstateOwner`์ `agentOrchestration.subAgentHandoff`๋ฅผ ์ฐ์ ์ฌ์ฉํ์ธ์.
|
|
48
52
|
- ๋น์น์ธ ์ํ์ ์งํ ๋ณด๊ณ /๋ถ์/์ผ๋ฐ ๋ต๋ณ์์๋ ๋ผ๋ฒจ ๋ธ๋ก์ด๋ `approvalRequest.finalPrompt`๋ฅผ ๋ง๋ถ์ด์ง ์์ต๋๋ค. ํ์ฌ ์ต์
์ ์ฌ์ฉ์๊ฐ ์ง์ ๋ฌผ์์ ๋๋ง ์์ธ์
๋๋ค.
|
|
49
|
-
- ๊ด๋ จ ์๋ ์ง๋ฌธ์ ๋จผ์ ๋ตํ ๋ค์๋ ์น์ธ์ด ์ฌ์ ํ ํ์ํ๋ฉด,
|
|
53
|
+
- ๊ด๋ จ ์๋ ์ง๋ฌธ์ ๋จผ์ ๋ตํ ๋ค์๋ ์น์ธ์ด ์ฌ์ ํ ํ์ํ๋ฉด, ๋จผ์ `approvalRequest.required`๋ฅผ ๋ค์ ํ์ธํ๊ณ ์ฌ์ ํ `true`์ผ ๋๋ง ํ์ฌ ๋จ๊ณ ํ ์ค ์์ฝ๊ณผ ํจ๊ป CLI๊ฐ ์ค ์น์ธ ๋ฌธ๊ตฌ(`approvalRequest.userFacingLines`, ๋๋ ์ ์ฒด `--json`์ `actionOptions[*].approvalPrompt` + `approvalRequest.finalPrompt`)๋ฅผ ๋ค์ ์ ์ํฉ๋๋ค.
|
|
50
54
|
- ์ฌ์ฉ์ ์
๋ ฅ์ ์ ํจ ๋ผ๋ฒจ์ด ์์ผ๋ฉด ์คํํ์ง ๋ง๊ณ ๋ผ๋ฒจ ์ ํ์ ๋ค์ ์์ฒญํฉ๋๋ค.
|
|
51
55
|
- ์์ ๋์์ด ์๋ command ์ต์
์ `flow --approve <LABEL> --execute` 1ํ ํธ์ถ์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ฉฐ, `context --approve`์ `context --execute --ticket`๋ฅผ ํด/์ธ์
์ฌ์ด๋ก ๋ถ๋ฆฌํ์ง ์์ต๋๋ค.
|
|
52
56
|
- `matchedFeature.currentSubstateOwner="subagent"`์ด๊ณ `agentOrchestration.subAgentHandoff.required=true`์ด๋ฉฐ `mode="command"`๋ฉด ์์์ด ํ์์
๋๋ค. ๋จผ์ `spawn_agent`๋ฅผ ํธ์ถํ๊ณ , ํด๋น ๋ช
๋ น์ ๋ฉ์ธ ์์ด์ ํธ์์ ์ง์ ์คํํ์ง ์์ต๋๋ค.
|
|
@@ -57,7 +61,7 @@
|
|
|
57
61
|
- ๋ฉ์ธ ์์ด์ ํธ fallback์ ์๋ธ ์์ด์ ํธ ์คํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ(์: ๋๊ตฌ ๋ฏธ์ง์, spawn ์คํจ, ๋ช
๋ น ์คํ ์ ์๋ธ ์์ด์ ํธ ์คํจ)์๋ง ํ์ฉํฉ๋๋ค.
|
|
58
62
|
- fallback์ ์ฌ์ฉํ ๋๋ ๋ฉ์ธ ์คํ ์ ์ fallback ์ฌ์ ๋ฅผ ์ฌ์ฉ์์๊ฒ ํ ์ค๋ก ๋จผ์ ์๋ฆฝ๋๋ค.
|
|
59
63
|
|
|
60
|
-
์น์ธ ๋๊ธฐ ์ํ ์ถ๋ ฅ์ CLI๊ฐ ์ ๊ณตํ ์น์ธ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํด์ผ ํฉ๋๋ค. CLI๊ฐ ์ฃผ์ง ์์ `ํ์ฌ ์ํ:` / `์ ํ ๊ฐ๋ฅ:` ๊ฐ์
|
|
64
|
+
์น์ธ ๋๊ธฐ ์ํ ์ถ๋ ฅ์ CLI๊ฐ ์ ๊ณตํ ์น์ธ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํด์ผ ํฉ๋๋ค. `matchedFeature.currentSubstate*`์์ ๊ฐ์ ธ์จ ๊ฐ๋จํ ํ์ฌ ๋จ๊ณ ํ ์ค ์์ฝ์ ์์ ๋ถ์ผ ์ ์์ง๋ง, ๊ทธ ์ธ์ CLI๊ฐ ์ฃผ์ง ์์ `ํ์ฌ ์ํ:` / `์ ํ ๊ฐ๋ฅ:` ๊ฐ์ ๋ผ๋ฒจ ์์ฝ ๋ํผ๋ฅผ ์์๋ก ๋ง๋ค์ด ๋ถ์ด์ง ๋ง์ธ์.
|
|
61
65
|
|
|
62
66
|
---
|
|
63
67
|
|
|
@@ -41,18 +41,22 @@ CLI๊ฐ ๊ฐ๋ฆฌํค๋ **Active Task** ๋๋ **`๐ Next Options (Atomic)`์ ๋จ
|
|
|
41
41
|
- auto ์คํ์ด ์ค๋จ๋๋ฉด `flow --json-compact`(๋๋ `flow --json`)์ `autoRun.resume`๋ฅผ SSOT๋ก ๋ฐ๋ฆ
๋๋ค. ์ปจํ
์คํธ ์์ถ/๋ฆฌ์
ํ์๋ `autoRun.resume.flowCommand`๋ก ์ฌ๊ฐํ๊ณ , ํ์ ์ `autoRun.resume.contextCommand`๋ก ์ํ๋ฅผ ๋จผ์ ํ์ธํฉ๋๋ค.
|
|
42
42
|
- `AUTO_DELEGATED_HANDOFF`๋ ์คํจ๊ฐ ์๋๋ผ delegated run ์ผ์์ ์ง์
๋๋ค. ์ ์น์ธ ๋ผ๋ฒจ์ ๋ค์ ์ด๊ธฐ ์ ์ delegated ๊ฒฝ๋ก๋ฅผ ์ฌ์ฌ์ฉํด ์์
์ ์ด์ด๊ฐ๋๋ค.
|
|
43
43
|
- `AUTO_MANUAL_REQUIRED`๋ ์คํจ๊ฐ ์๋๋ผ ์๋ํ ๊ฒฝ๊ณ(ํ์ฌ instruction-only ๊ตฌ๊ฐ)์
๋๋ค. ์ฆ์ ์ค๋ฅ๋ก ๋จ์ ํ์ง ๋ง๊ณ ํ์ฌ `context --json-compact`๋ฅผ ๋ค์ ํ์ธํ ๋ค ์น์ธ ํ์ ์ฌ๋ถ(`approvalRequest.required`)๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
|
|
44
|
+
- `AUTO_SELECTION_REQUIRED`๋ ์คํจ๊ฐ ์๋๋ผ feature ์ ํ ๊ฒฝ๊ณ ์ผ์์ ์ง์
๋๋ค. ํ์ฑ feature ์ ํ์ ๋จผ์ ํด์ํ ๋ค `context --json-compact` ๋๋ `flow`๋ฅผ ๋ค์ ์คํํฉ๋๋ค.
|
|
45
|
+
- `matchedFeature.currentSubstateId === "change_request_sync"`์ด๊ฑฐ๋ `matchedFeature.pendingChangeRequest`๊ฐ ์์ผ๋ฉด ์ฝ๋ ์์
๋ณด๋ค ๋ฌธ์ ๋๊ธฐํ๊ฐ ๋จผ์ ์
๋๋ค. `tasks.md`์ ์์ฒญ์ ๋ฐ์ํด ํ์คํฌ๋ฅผ ์ถ๊ฐ/์ฌํ๊น
ํ๊ณ , ์ค์ ์ฌ์ฉ์ ๋์์ด๋ ๋ฒ์๊ฐ ๋ฐ๋๋ฉด `decisions.md`์ `spec.md` / PRD ์ฐธ์กฐ๋ ํจ๊ป ๋ง์ถ ๋ค `๋๊ธฐ ์ค ๋ณ๊ฒฝ ์์ฒญ` ํ๋๋ฅผ ๋น์ฐ๊ณ `context --json-compact` ๋๋ `flow`๋ฅผ ๋ค์ ์คํํ์ธ์.
|
|
44
46
|
- CLI๊ฐ ๋ช
๋ น์ด๋ฅผ ์ถ๋ ฅํ๋ฉด **๊ทธ๋๋ก ๋ณต์ฌํด ์คํ**ํฉ๋๋ค. (standalone ํ๊ฒฝ์์๋ ๋ ํฌ ๊ฒฝ๋ก๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค)
|
|
45
47
|
- ์ฌ์ฉ์ ์๋ต ํฌ๋งท์ `agents.md`์ **"๋ผ๋ฒจ ์๋ต ๊ณ์ฝ (SSOT)"** ์ ๋ฐ๋ฆ
๋๋ค. ๋ผ๋ฒจ ๋ฌธ๊ตฌ๋ ์น์ธ ๋๊ธฐ ์ํ์์๋ง ๋ณด์ฌ์ฃผ๊ณ , CLI๊ฐ ์ค ์น์ธ ๋ฌธ๊ตฌ๋ฅผ ์์๋ก ๋ฐ๊พธ์ง ์์ต๋๋ค.
|
|
48
|
+
- `approvalRequest.required=true`์ธ ์ํ์์ ์ ์ง๋ฌธ์ ๋จผ์ ๋ตํ๋ค๋ฉด, ๋ต๋ณ ํ `matchedFeature.currentSubstateId/currentSubstateOwner/currentSubstatePhase` ๊ธฐ๋ฐ ํ์ฌ ๋จ๊ณ ํ ์ค ์์ฝ์ ์งง๊ฒ ๋ถ์ด๊ณ CLI๊ฐ ์ค ์น์ธ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ๋ค์ ๋ณด์ฌ์ค ๋ค ๋๊ธฐํ์ธ์.
|
|
46
49
|
- ์์ ๋์์ด ์๋ command ์ต์
์คํ์ `npx lee-spec-kit flow <slug|F001|F001-slug> --approve <LABEL> --execute`๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , `context --approve`์ `context --execute --ticket` ๋ถ๋ฆฌ ์คํ์ ์ง์ํฉ๋๋ค.
|
|
47
50
|
- ํ์ฌ command๊ฐ delegated ์ํ(`matchedFeature.currentSubstateOwner="subagent"` + `agentOrchestration.subAgentHandoff.required=true` + `mode="command"`)๋ผ๋ฉด ๋ฉ์ธ ์์ด์ ํธ์์ ์ง์ ์คํํ์ง ๋ง๊ณ ๋จผ์ `spawn_agent`๋ฅผ ํธ์ถํด handoff ๊ณ์ฝ์ ๋๊ธฐ์ธ์.
|
|
48
51
|
- `flow/context --execute --json` ๊ฒฐ๊ณผ๊ฐ `approved_handoff_prepared`์ด๋ฉด ๊ฐ์ ๋ผ๋ฒจ์ ๋ค์ ์น์ธ ๋ฃจํ๋ก ์ด์ง ๋ง๊ณ , ๋จผ์ delegated work๋ฅผ ์๋ฃํ ๋ค context๋ฅผ ์๋ก ํ์ธํฉ๋๋ค.
|
|
49
52
|
|
|
50
53
|
### 3๋จ๊ณ: ๊ธฐ๋ก ๋ฐ ๋ฐ๋ณต (Record & Loop)
|
|
51
54
|
|
|
52
|
-
- ์ ํ์คํฌ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด ์ฐ์ `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-FR-001
|
|
55
|
+
- ์ ํ์คํฌ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด ์ฐ์ `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-*`๋ฅผ ์ฌ์ฉํ์ธ์. `PRD-FR-001`์ด๋ `PRD-SCOPE-V1-DESKTOP-EDITOR`์ฒ๋ผ ์ด๋ฏธ ์ ์๋ PRD key๋ฅผ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ํ์ํ๋ฉด `--acceptance`, `--check`๋ก ๋ฐ๋ก ๊ตฌ์ฒด ํญ๋ชฉ์ ํจ๊ป ์ถ๊ฐํ ์ ์์ต๋๋ค.
|
|
53
56
|
- ์๋ก ์ถ๊ฐํ ํ์คํฌ์ placeholder `Acceptance` / `Checklist`๋ฅผ ๋จ๊ธฐ์ง ๋ง์ธ์. concrete item์ด ์๋๋ฉด `task-run`์ด ์คํ์ ๋ง์ต๋๋ค.
|
|
54
57
|
- ์๋ ํธ์ง์ด ๊ผญ ํ์ํ ๋๋ง `ํ์คํฌ ๋ชฉ๋ก` ์น์
์ ๋ง์ง๋ง ๊ธฐ์กด ํ์คํฌ block ๋ฐ๋ก ์๋์ append ํ์ธ์.
|
|
55
58
|
- ํ์ฌ ์์
์ค์ธ ํ์คํฌ ๊ทผ์ฒ๋ `์๋ฃ ์กฐ๊ฑด`/๋ค์ `##` ํค๋ ์์ ๋ผ์ ๋ฃ์ง ๋ง์ธ์.
|
|
59
|
+
- ๊ตฌํ ๋์ค ์ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ํ ๋๋ `๋๊ธฐ ์ค ๋ณ๊ฒฝ ์์ฒญ`์ ์์ sync marker๋ก ์ทจ๊ธํ์ธ์. ์์ฒญ์ `tasks.md`์ ๋ฐ์ํ๊ณ , ๋์/๋ฒ์ ๋ณ๊ฒฝ์ด๋ฉด ๊ด๋ จ ๋ฌธ์๊น์ง ๋ง์ถ ๋ค ํด๋น ํ๋๋ฅผ ๋น์ฐ๊ณ ๊ตฌํ์ผ๋ก ๋์๊ฐ๋๋ค.
|
|
56
60
|
|
|
57
61
|
#### 3-1) Decision ๊ธฐ๋ก (๋งค์ฐ ๊ถ์ฅ, ์ฌ์ค์ ํ์)
|
|
58
62
|
|
|
@@ -65,8 +65,8 @@ npx lee-spec-kit status --write
|
|
|
65
65
|
|
|
66
66
|
## PRD ์๊ตฌ์ฌํญ ์ถ์ (๊ถ์ฅ)
|
|
67
67
|
|
|
68
|
-
- PRD ๋ฌธ์(`docs/prd/*.md`)์ `PRD-FR-001` ๊ฐ์ ์๊ตฌ์ฌํญ ID๋ฅผ ๋ถ์ฌํ์ธ์.
|
|
69
|
-
- `tasks.md`์ ๊ฐ ํ์คํฌ ๋ผ์ธ์ `[PRD-FR-001]` ํ๊ทธ๋ก ์ฐ๊ฒฐํ์ธ์. PRD์ ๋ฌด๊ดํ ํ์คํฌ๋ `[NON-PRD]`๋ฅผ ์ฌ์ฉํ์ธ์.
|
|
68
|
+
- PRD ๋ฌธ์(`docs/prd/*.md`)์ `PRD-FR-001` ๋๋ `PRD-SCOPE-V1-DESKTOP-EDITOR` ๊ฐ์ `PRD-*` ์๊ตฌ์ฌํญ ID๋ฅผ ๋ถ์ฌํ์ธ์.
|
|
69
|
+
- `tasks.md`์ ๊ฐ ํ์คํฌ ๋ผ์ธ์ `[PRD-FR-001]` ๋๋ `[PRD-SCOPE-V1-DESKTOP-EDITOR]` ํ๊ทธ๋ก ์ฐ๊ฒฐํ์ธ์. PRD์ ๋ฌด๊ดํ ํ์คํฌ๋ `[NON-PRD]`๋ฅผ ์ฌ์ฉํ์ธ์.
|
|
70
70
|
- `[NON-PRD]`๋ refactor, ํ
์คํธ ์ ์ฉ ์์
, tooling, rename, cleanup ๊ฐ์ ๋ด๋ถ ๊ตฌํ ์์
์๋ง ์ฌ์ฉํ์ธ์.
|
|
71
71
|
- ๋ณ๊ฒฝ์ด ์ฌ์ฉ์ ๋์, acceptance criteria, ๋ฒ์๋ฅผ ๋ฐ๊พธ๋ฉด PRD๋ฅผ ๋จผ์ ๊ฐฑ์ ํ๊ณ ํ์คํฌ๋ `[PRD-...]`๋ก ๋ค์ ์ฐ๊ฒฐํ์ธ์.
|
|
72
72
|
- ๋จ, ํ์คํฌ ๋ฌธ์์์ PRD ID๋ฅผ ์์ ์์ฑํ์ง ์์ต๋๋ค. ๋จผ์ PRD ์๋ฌธ์ ์ ์ํ๊ณ , ๋ ๊ฑฐ์ ๋ฌธ์๋ ์๋ฌธ ID backfill ํ ์ฐ๊ฒฐํ์ธ์.
|
|
@@ -79,6 +79,7 @@ npx lee-spec-kit status --write
|
|
|
79
79
|
์ค๊ฐ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด, โ์ด๋๋ฅผ ๊ณ ์ณค๋์งโ์ โ๋ฌด์์ ์
๋ฐ์ดํธํ๋์งโ๊ฐ ๋ฌธ์๋ก ๋จ์์ผ ํฉ๋๋ค.
|
|
80
80
|
|
|
81
81
|
- ๋ณ๊ฒฝ์ **์ ํ์คํฌ๋ก ์ถ๊ฐ**ํฉ๋๋ค. (`[DONE]` ํ์คํฌ๋ฅผ ๊ณ ์น์ง ๋ง๊ณ ์ ํ์คํฌ๋ฅผ ๋ง๋์ธ์)
|
|
82
|
+
- ์ด ๋๊ธฐํ ์ค `tasks.md`์๋ ๋ด๋ถ marker๋ก `๋๊ธฐ ์ค ๋ณ๊ฒฝ ์์ฒญ` ํ๋๊ฐ ์ ์ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. ์ ํ์คํฌ์ ๊ด๋ จ ๋ฌธ์์ ๋ฐ์์ด ๋๋๋ฉด ๊ฐ์ ๋น์ฐ์ธ์.
|
|
82
83
|
- ๋ณ๊ฒฝ ํ์คํฌ์๋ `[PRD-...]` ๋๋ `[NON-PRD]` ํ๊ทธ๋ฅผ ๋ฐ๋์ ๋ถ์
๋๋ค. (๊ถ์ฅ: `[CHANGE]` ํ๊ทธ ์ถ๊ฐ)
|
|
83
84
|
- ๋ด๋ถ ๊ฒํ ๋ก ์์ํ๋๋ผ๋, ์ต์ข
์ ์ผ๋ก ์ฌ์ฉ์ ์๊ตฌ/๋์ ๋ณ๊ฒฝ์ด ๋๋ฉด `[NON-PRD]`๋ก ๋จ๊ธฐ์ง ์์ต๋๋ค.
|
|
84
85
|
- `docs/prd/*.md`๋ฅผ backfill/์์
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
## ๊ด๋ จ ๋ฌธ์
|
|
56
56
|
|
|
57
57
|
- PRD: `../../prd/`
|
|
58
|
-
- PRD Refs: - (์: `PRD-FR-001`, `PRD-US-002`)
|
|
58
|
+
- PRD Refs: - (์: `PRD-FR-001`, `PRD-US-002`, `PRD-SCOPE-V1-DESKTOP-EDITOR`)
|
|
59
59
|
- ์ด๋ฏธ ์๋ฌธ ์๊ตฌ์ฌํญ ๋ฌธ์์ ์ ์๋ ID๋ง ์ ์ผ์ธ์. `spec.md`๋ `tasks.md`์์ ์์๋ก PRD ID๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค.
|
|
60
60
|
- ๋ ๊ฑฐ์ ์๊ตฌ์ฌํญ ๋ฌธ์์ ์์ง PRD ID๊ฐ ์๋ค๋ฉด, ๋จผ์ ์๋ฌธ์ ID๋ฅผ backfillํ ๋ค ์ด ํ๋์ `tasks.md` ํ์คํฌ ํ๊ทธ๋ฅผ ํจ๊ป ๊ฐฑ์ ํ์ธ์.
|
|
61
61
|
- ์๊ตฌ์ฌํญ/์ค์ฝํ ๋ณ๊ฒฝ ์ PRD ๋ฌธ์ + ์ด ํ๋ + `tasks.md` ํ์คํฌ ํ๊ทธ๋ฅผ ํจ๊ป ๊ฐฑ์ ํ์ธ์.
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- `approvalRequest.required=true`์ด๋ฉด CLI๊ฐ ์ ๊ณตํ ๋ผ๋ฒจ ์๋ต์ ๋ฐ์ ๋ค์๋ง ํ์คํฌ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
|
|
10
10
|
- `approvalRequest.required=false`์ด๋ฉด ๋ณ๋ `OK` ์น์ธ ๋จ๊ณ๋ฅผ ๋ง๋ค์ง ๋ง๊ณ , ์ค์ ์๋ฃ/๊ฒ์ฆ ํ ์ํ๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
|
|
11
11
|
- ํด๋น ํ์คํฌ์ `Checklist`์ unchecked ํญ๋ชฉ์ด ๋จ์ ์์ผ๋ฉด `task-complete`๋ `[DONE]` ์ ํ์ ๊ฑฐ๋ถํฉ๋๋ค.
|
|
12
|
-
- **PRD ๋งคํ(๊ถ์ฅ)**: ๊ฐ ํ์คํฌ ๋ผ์ธ์ `[PRD-FR-001]` ๊ฐ์ PRD ์๊ตฌ์ฌํญ ID ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, PRD์ ๋ฌด๊ดํ ํ์คํฌ๋ `[NON-PRD]`๋ก ํ์ํ์ธ์.
|
|
12
|
+
- **PRD ๋งคํ(๊ถ์ฅ)**: ๊ฐ ํ์คํฌ ๋ผ์ธ์ `[PRD-FR-001]` ๋๋ `[PRD-SCOPE-V1-DESKTOP-EDITOR]` ๊ฐ์ ๊ธฐ์กด PRD ์๊ตฌ์ฌํญ ID ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, PRD์ ๋ฌด๊ดํ ํ์คํฌ๋ `[NON-PRD]`๋ก ํ์ํ์ธ์.
|
|
13
13
|
- ๋จ, `tasks.md`์์ PRD ID๋ฅผ ์์๋ก ๋ง๋ค์ง ๋ง์ธ์. `docs/prd` ๋๋ ์์ ์๊ตฌ์ฌํญ ๋ฌธ์์ ๋จผ์ ์ ์๋ ID๋ง ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
|
|
14
14
|
- ๋ ๊ฑฐ์ ๋ฌธ์์ ์์ง PRD ID๊ฐ ์๋ค๋ฉด, ๋จผ์ ์๋ฌธ ์๊ตฌ์ฌํญ ๋ฌธ์์ ID๋ฅผ backfillํ ๋ค `spec.md`์ `PRD Refs`์ ํ์คํฌ ํ๊ทธ๋ฅผ ํจ๊ป ๋ง์ถ์ธ์.
|
|
15
15
|
- `[NON-PRD]`๋ ๋ด๋ถ ๊ตฌํ ์์
์ ์ฉ์
๋๋ค. ์ฌ์ฉ์ ๋์, acceptance criteria, ๋ฒ์๊ฐ ๋ฐ๋๋ ํ์คํฌ๋ผ๋ฉด PRD๋ฅผ ๋จผ์ backfillํ๊ณ `[PRD-...]`๋ก ํ๊น
ํ์ธ์.
|
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
- **๋ ํฌ**: {{projectName}}-{component}
|
|
24
24
|
- **Issue**: #{์ด์๋ฒํธ}
|
|
25
25
|
- **๋ธ๋์น**: `feat/{์ด์๋ฒํธ}-{๊ธฐ๋ฅ๋ช
}`
|
|
26
|
+
- **๋๊ธฐ ์ค ๋ณ๊ฒฝ ์์ฒญ**: -
|
|
27
|
+
- ๊ตฌํ ์ค ์๋ก ์์ฉํ ์ฌ์ฉ์ ์์ฒญ์ ์ ์ ํ์ํ๋ sync marker์
๋๋ค
|
|
28
|
+
- ์์ฒญ์ `tasks.md`์ ๊ด๋ จ ๋ฌธ์์ ๋ฐ์ํ ๋ค ๊ฐ์ ๋น์ฐ์ธ์
|
|
26
29
|
- **PR**: -
|
|
27
30
|
- ์: `#123` ๋๋ PR URL
|
|
28
31
|
- **PR ์ํ**: -
|
|
@@ -57,7 +60,7 @@
|
|
|
57
60
|
- [ ] (์๋ธ ํ์คํฌ)
|
|
58
61
|
```
|
|
59
62
|
|
|
60
|
-
> ์ ์์์ `PRD-FR-001`์
|
|
63
|
+
> ์ ์์์ `PRD-FR-001`์ ๊ฐ๋ฅํ `PRD-*` key ์ค ํ๋์ผ ๋ฟ์
๋๋ค. ์์ง PRD ์๋ฌธ์ ์ ์๋์ง ์์๋ค๋ฉด ํ์คํฌ์ ๋จผ์ ๋ฃ์ง ๋ง์ธ์.
|
|
61
64
|
> ์ฒ์์ ํ์/๋ด๋ถ ์์
์ด์๋๋ผ๋ ์ ํ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ผ๋ก ์ด์ด์ก๋ค๋ฉด, `NON-PRD`๋ก ๋์ง ๋ง๊ณ PRD๋ฅผ ๋จผ์ ๊ฐฑ์ ํ ๋ค `[PRD-...]`๋ก ์ฌํ๊น
ํ์ธ์.
|
|
62
65
|
|
|
63
66
|
---
|
|
@@ -66,7 +69,7 @@
|
|
|
66
69
|
|
|
67
70
|
> ์๋์ ํ์คํฌ๋ฅผ ์ถ๊ฐํ์ธ์. **์ต์ 1๊ฐ๊ฐ ํ์**ํฉ๋๋ค.
|
|
68
71
|
> ํ์คํฌ๋ ํ๋์ ์์ฐจ ๋ฆฌ์คํธ๋ก ์ ์งํ๊ณ , ์์์ ์๋ ์์ ์์ฒด๋ฅผ ์คํ ์ฐ์ ์์๋ก ์ทจ๊ธํ์ธ์.
|
|
69
|
-
> ์ ํ์คํฌ๋ ๊ฐ๊ธ์ `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-FR-001
|
|
72
|
+
> ์ ํ์คํฌ๋ ๊ฐ๊ธ์ `npx lee-spec-kit task add <feature-ref> --title "..." --ref NON-PRD|PRD-*`๋ก ์ถ๊ฐํ์ธ์. `PRD-FR-001`์ด๋ `PRD-SCOPE-V1-DESKTOP-EDITOR`์ฒ๋ผ ์ด๋ฏธ ์ ์๋ PRD key๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ํ์ํ๋ฉด `--acceptance`, `--check`๋ก ๋ฐ๋ก ๊ตฌ์ฒด ํญ๋ชฉ์ ํจ๊ป ์ ์ ์ ์์ต๋๋ค.
|
|
70
73
|
> placeholder ์ํ์ `Acceptance` / `Checklist`๋ฅผ ๊ทธ๋๋ก ๋์ง ๋ง์ธ์. concrete item์ด ์๋๋ฉด `task-run`์ด ์คํ์ ๋ง์ต๋๋ค.
|
|
71
74
|
> ์๋ ํธ์ง์ด ํ์ํ๋ฉด ํ์ฌ ํ์คํฌ ๊ทผ์ฒ๊ฐ ์๋๋ผ `ํ์คํฌ ๋ชฉ๋ก`์ ๋ง์ง๋ง ๊ธฐ์กด ํ์คํฌ block ์๋์๋ง append ํ์ธ์.
|
|
72
75
|
|
|
@@ -17,7 +17,7 @@ Feature๋ก ๋ฐ์ ํ๊ธฐ ์ ์ ์์ด๋์ด / To-do / ์คํ ๊ธฐ๋ก์ ๋ชจ์๋
|
|
|
17
17
|
- `Idea ID` (`I###` ํ์์ indexed idea์ธ ๊ฒฝ์ฐ)
|
|
18
18
|
- ๋ชฉ์ /๋ฐฐ๊ฒฝ
|
|
19
19
|
- ๋๋ต ๋ฒ์(๋ญ ํ ์ง/์ ํ ์ง)
|
|
20
|
-
- PRD Refs(๊ถ์ฅ): `PRD-FR-001, PRD-US-002` (PRD์ ๋ฌด๊ดํ๋ฉด `NON-PRD` ๋ช
์)
|
|
20
|
+
- PRD Refs(๊ถ์ฅ): `PRD-FR-001, PRD-US-002` ๋๋ `PRD-SCOPE-V1-DESKTOP-EDITOR` (PRD์ ๋ฌด๊ดํ๋ฉด `NON-PRD` ๋ช
์)
|
|
21
21
|
- ๋์ ์ปดํฌ๋ํธ(ํ์ ์): `api` / `app` / `worker` / `all`
|
|
22
22
|
- ์ํ: `Active | Featureized | Dropped`
|
|
23
23
|
- Feature: ์น๊ฒฉ๋๋ฉด `F###-slug`
|
|
@@ -32,7 +32,7 @@ Feature๋ก ๋ฐ์ ํ๊ธฐ ์ ์ ์์ด๋์ด / To-do / ์คํ ๊ธฐ๋ก์ ๋ชจ์๋
|
|
|
32
32
|
3. `--idea`๋ฅผ ์ฌ์ฉํ๋ฉด ์ Feature์ `spec.md`์ source idea ๊ฒฝ๋ก๊ฐ ์๋ ๊ธฐ๋ก๋ฉ๋๋ค
|
|
33
33
|
4. ์น๊ฒฉ ํ์๋ ๋ค์์ ์ง์ ์ฑ์์ผ ํฉ๋๋ค
|
|
34
34
|
- `spec.md`์ `PRD Refs`
|
|
35
|
-
- `tasks.md` ํ์คํฌ ๋ผ์ธ์ PRD ID ํ๊ทธ(`[PRD-FR-001]` ๋ฑ)
|
|
35
|
+
- `tasks.md` ํ์คํฌ ๋ผ์ธ์ PRD ID ํ๊ทธ(`[PRD-FR-001]`, `[PRD-SCOPE-V1-DESKTOP-EDITOR]` ๋ฑ)
|
|
36
36
|
5. ์์ด๋์ด ๋ฌธ์๋ ์ญ์ ํ์ง ๋ง๊ณ `Status: Featureized`, `Feature: F00X-...`๋ก ๋จ๊ธฐ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค
|
|
37
37
|
|
|
38
38
|
> ๐ก source idea ๋ฌธ์๋ฅผ ๋จ๊ฒจ๋๋ฉด โ์ ์ด Feature๊ฐ ์๊ฒผ๋์งโ ์ถ์ ํ๊ธฐ ์ฝ์ต๋๋ค.
|
|
@@ -28,9 +28,9 @@ PRD์์ ์์ํ ์์
์ด๋ผ๋ฉด, ์ดํ ๋ฌธ์์์๋ `PRD Refs`์ ํ์ค
|
|
|
28
28
|
|
|
29
29
|
PRD์ โ์ด๋ ์๊ตฌ์ฌํญ์ด ๊ตฌํ๋๋์งโ๋ฅผ CLI๊ฐ ์ง๊ณํ ์ ์๋๋ก, ์๊ตฌ์ฌํญ์ **์์ ์ ์ธ ID**๋ฅผ ๋ถ์ฌํ์ธ์.
|
|
30
30
|
|
|
31
|
-
-
|
|
31
|
+
- ์์ ์ ์ธ `PRD-*` key๋ฅผ ์ฌ์ฉํ์ธ์. `PRD-FR-001`, `PRD-US-002`, `PRD-NFR-003` ๊ฐ์ numeric ID์ `PRD-SCOPE-V1-DESKTOP-EDITOR` ๊ฐ์ semantic key๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
|
|
32
32
|
- ๊ฐ์ ์ค(ํค๋/๋ถ๋ฆฟ) ์์ ID๋ง ํฌํจ๋์ด ์์ผ๋ฉด ๋ฉ๋๋ค.
|
|
33
|
-
- Feature์ `tasks.md` ํ์คํฌ ๋ผ์ธ์ `[PRD-FR-001]`์ฒ๋ผ **๋๊ดํธ ํ๊ทธ**๋ก ์ฐธ์กฐํ์ธ์.
|
|
33
|
+
- Feature์ `tasks.md` ํ์คํฌ ๋ผ์ธ์ `[PRD-FR-001]` ๋๋ `[PRD-SCOPE-V1-DESKTOP-EDITOR]`์ฒ๋ผ **๋๊ดํธ ํ๊ทธ**๋ก ์ฐธ์กฐํ์ธ์.
|
|
34
34
|
- PRD์ ๋ฌด๊ดํ ํ์คํฌ๋ `[NON-PRD]` ํ๊ทธ๋ก ํ์ํ์ธ์.
|
|
35
35
|
- ์ค์ํ ์ : `tasks.md`๋ `spec.md`์์ PRD ID๋ฅผ ์์๋ก ๋ง๋ค์ง ์์ต๋๋ค. ํญ์ ์ด ํด๋๋ ์์ ์๊ตฌ์ฌํญ ์๋ฌธ์ ๋จผ์ ์ ์ํ ๋ค ์ฐธ์กฐํ์ธ์.
|
|
36
36
|
- ๋ ๊ฑฐ์ PRD/์๊ตฌ์ฌํญ ๋ฌธ์์ ์์ง ID๊ฐ ์๋ค๋ฉด, ๋จผ์ ์๋ฌธ ๋ฌธ์์ ID๋ฅผ backfillํ ๋ค Feature์ `PRD Refs`์ ํ์คํฌ ํ๊ทธ๋ฅผ ๋ง์ถ์ธ์.
|