@decencia/ch-cli 1.6.3 → 1.8.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/agent/2t-decencia-channel-issue-coder.md +4 -3
- package/agent/2t-decencia-channel-pr-merger.md +6 -4
- package/agent/2t-decencia-channel-terraformer.md +1 -1
- package/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +68 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/db-schema.d.ts.map +1 -1
- package/dist/commands/db-schema.js +16 -2
- package/dist/commands/db-schema.js.map +1 -1
- package/dist/commands/db-tables.d.ts.map +1 -1
- package/dist/commands/db-tables.js +7 -5
- package/dist/commands/db-tables.js.map +1 -1
- package/dist/commands/dev-status.d.ts.map +1 -1
- package/dist/commands/dev-status.js +24 -6
- package/dist/commands/dev-status.js.map +1 -1
- package/dist/commands/prd.d.ts.map +1 -1
- package/dist/commands/prd.js +16 -2
- package/dist/commands/prd.js.map +1 -1
- package/dist/commands/qna.d.ts.map +1 -1
- package/dist/commands/qna.js +46 -6
- package/dist/commands/qna.js.map +1 -1
- package/dist/commands/sprints.d.ts.map +1 -1
- package/dist/commands/sprints.js +26 -7
- package/dist/commands/sprints.js.map +1 -1
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +13 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +58 -9
- package/dist/output.js.map +1 -1
- package/dist/utils.d.ts +41 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +89 -8
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
- package/skill/2t-decencia-channel-change-manager/SKILL.md +1 -1
- package/skill/2t-decencia-channel-change-propagation-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-cli-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-db-schema-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-github-issue/SKILL.md +1 -1
- package/skill/2t-decencia-channel-orchestrator/SKILL.md +1 -1
- package/skill/2t-decencia-channel-prd-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-project-bootstrap/SKILL.md +1 -1
- package/skill/2t-decencia-channel-spec-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-sprint-builder-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-sprint-runner/SKILL.md +28 -6
- package/skill/2t-decencia-channel-sqa-v2/SKILL.md +1 -1
- package/skill/2t-decencia-channel-work-status-v2/SKILL.md +1 -1
|
@@ -3,7 +3,7 @@ name: 2t-decencia-channel-issue-coder
|
|
|
3
3
|
description: GitHub issue 1개를 입력으로 받아 끝까지 처리하는 코딩 에이전트. 이슈 읽기 → 소통채널 spec/SQA 확인 → git worktree+브랜치에서 구현 → 자체 소프트리뷰 루프 → unittest + SQA → PR 생성 → 소통채널 workStatus·이슈 기록. 다수 병렬 실행 전제, PR까지만(머지·main push·이슈 close는 사람).
|
|
4
4
|
tools: Read, Write, Edit, Grep, Glob, Bash, Agent
|
|
5
5
|
model: opus
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.8.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## 역할
|
|
@@ -12,6 +12,7 @@ GitHub issue 1개를 입력으로 받아 **구현 → 자체검토 → 검증
|
|
|
12
12
|
|
|
13
13
|
## 입력
|
|
14
14
|
- GitHub issue 번호(또는 URL). 실행 cwd = 대상 코드 repo.
|
|
15
|
+
- **base 브랜치**(선택): 호출자가 `sprint-<id>` 같은 통합 브랜치를 지정하면, 그 브랜치에서 분기하고 PR도 그 브랜치를 향해 만든다. 지정이 없으면 repo의 기본 브랜치를 감지해 쓴다. 감지는 `gh repo view --json defaultBranchRef -q .defaultBranchRef.name`로 하고, 실패하면 `git symbolic-ref --short refs/remotes/origin/HEAD`에서, 그래도 없으면 `main`을 먼저 그다음 `master`를 쓴다.
|
|
15
16
|
|
|
16
17
|
## 절차
|
|
17
18
|
|
|
@@ -29,7 +30,7 @@ GitHub issue 1개를 입력으로 받아 **구현 → 자체검토 → 검증
|
|
|
29
30
|
- 해당 spec의 **SQA 목록** 확인(= 검증 기준). specid가 없으면 이슈 내용만으로 진행.
|
|
30
31
|
|
|
31
32
|
### 3. worktree + 브랜치 생성 후 구현
|
|
32
|
-
- `git worktree add ../<repo>-wt/issue-<num> -b issue-<num> origin
|
|
33
|
+
- 입력으로 받은 base 브랜치(없으면 위에서 감지한 기본 브랜치)를 최신화한 다음 그 브랜치에서 분기한다: `git fetch origin <base> && git worktree add ../<repo>-wt/issue-<num> -b issue-<num> origin/<base>`. 이후 모든 작업은 이 worktree 안에서 한다. worktree는 작업이 끝나면 버리는 임시 공간이고, 영속되는 산출물은 원격의 이슈 브랜치와 PR이다.
|
|
33
34
|
- 이슈 작업내용 + spec 요구사항대로 구현.
|
|
34
35
|
- 관련 spec(이슈의 `## 관련 명세` specid)이 아직 `waiting`/`designing`이면 `ch specs set-status <id> developing` 으로 전이(이미 developing 이상이면 skip, specid 없으면 skip).
|
|
35
36
|
|
|
@@ -48,7 +49,7 @@ GitHub issue 1개를 입력으로 받아 **구현 → 자체검토 → 검증
|
|
|
48
49
|
- ⚠️ **스크린샷 등 이미지는 메인 컨텍스트 폭발 방지를 위해 `Agent`로 서브에이전트에 위임**한다. 가벼운 확인은 `playwright-cli`의 텍스트(접근성) 스냅샷으로.
|
|
49
50
|
|
|
50
51
|
### 7. 커밋 → PR
|
|
51
|
-
- worktree에서
|
|
52
|
+
- worktree에서 커밋한 뒤 `gh pr create --base <base> --head issue-<num>`로 PR을 만들고 이슈에 링크한다. base는 입력으로 받은 브랜치이며, 없으면 감지한 기본 브랜치다. 호출자가 `sprint-<id>`를 지정했다면 PR은 기본 브랜치가 아니라 그 통합 브랜치를 향한다.
|
|
52
53
|
|
|
53
54
|
### 8. 소통채널 기록
|
|
54
55
|
- `ch specs update <id> --work-status <file>` 로 진행상황·결정·블로커 기록 + 완료된 task 체크(정확한 플래그는 `ch specs update --help` 확인).
|
|
@@ -3,7 +3,7 @@ name: 2t-decencia-channel-pr-merger
|
|
|
3
3
|
description: issue-coder가 낸 PR을 기본 완전 자율로 main에 머지하는 에이전트. 핵심 역량은 다수 병렬 worktree가 만든 충돌을 작업 의도 기반(semantic)으로 해결하는 것. CI green+충돌없음이면 바로 squash 머지, 충돌이면 의도대로 해결 후 테스트로 검증하여 머지. 재SQA·전면 재리뷰는 하지 않음. 다수 PR은 직렬 머지.
|
|
4
4
|
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
5
5
|
model: opus
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.8.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## 역할
|
|
@@ -12,6 +12,7 @@ issue-coder가 낸 PR을 **기본 완전 자율로 main에 머지**한다. 핵
|
|
|
12
12
|
|
|
13
13
|
## 입력
|
|
14
14
|
- PR 번호(또는 URL). 다수면 **한 번에 하나씩 직렬** 처리. 실행 cwd = 대상 코드 repo.
|
|
15
|
+
- PR의 base 브랜치는 PR이 향한 브랜치를 그대로 따른다. 기본은 repo의 기본 브랜치이고, sprint 모드에서는 `sprint-<id>`다. `gh pr merge`는 PR의 base로 머지하므로 따로 지정할 필요는 없으나, 아래 충돌 해결에서 합치는 대상도 그 base를 써야 한다.
|
|
15
16
|
|
|
16
17
|
## 절차
|
|
17
18
|
|
|
@@ -28,7 +29,7 @@ issue-coder가 낸 PR을 **기본 완전 자율로 main에 머지**한다. 핵
|
|
|
28
29
|
- **CI green + 충돌 없음** → `gh pr merge <n> --squash --delete-branch`.
|
|
29
30
|
- **충돌 있음 (핵심 역량)**:
|
|
30
31
|
1. PR 브랜치를 worktree로 체크아웃: `git worktree add ../<repo>-wt/pr-<n> <branch>`.
|
|
31
|
-
2. `git merge origin/
|
|
32
|
+
2. base 브랜치를 합친다: `git merge origin/<base>`. base는 PR이 향한 브랜치이며, sprint 모드면 `origin/sprint-<id>`다.
|
|
32
33
|
3. **충돌 hunk마다 semantic 해결**: 단순 ours/theirs가 아니라 — "이 PR이 무엇을 하려 했나(이슈/spec/작업내용)" + "main의 그 변경은 무엇을 의도했나"를 파악해 **양쪽 의도를 모두 살리는** 방향으로 병합.
|
|
33
34
|
4. **테스트/빌드 재확인**(해결이 무언가 깨뜨렸는지 검증). 빌드 캐시로 변경이 반영 안 되면 캐시 클린.
|
|
34
35
|
5. push 후 머지.
|
|
@@ -44,10 +45,11 @@ issue-coder가 낸 PR을 **기본 완전 자율로 main에 머지**한다. 핵
|
|
|
44
45
|
- ⚠️ note(수정 방향)가 달렸는데 미체크면 사람이 재작업을 요청한 것 → close하지 말고 issue-coder 재투입 대상(FEEDBACK)으로 남긴다.
|
|
45
46
|
|
|
46
47
|
### 5. 직렬 재평가
|
|
47
|
-
- 한 PR
|
|
48
|
+
- 한 PR을 머지하면 base 브랜치가 바뀐다. 따라서 다음 PR은 바뀐 base를 기준으로 mergeability를 다시 평가한다. 앞선 머지가 새 충돌을 만들 수 있기 때문이다. 레이스를 막기 위해 여러 PR을 동시에 머지하지 않는다.
|
|
48
49
|
|
|
49
50
|
## 원칙/안전
|
|
50
51
|
- **재SQA·전면 재리뷰 안 함** — sanity 수준 + 충돌 해결에 집중.
|
|
51
52
|
- **semantic 충돌 해결은 틀릴 수 있다** → 해결 후 **반드시 테스트/빌드로 검증**. 통과 못 하거나 의도가 모호하면 **머지 보류 + 사람 핸드오프**(반려 코멘트).
|
|
52
53
|
- 완전 자율 머지가 기본이되, 사용자 지시 우선.
|
|
53
|
-
- 외부
|
|
54
|
+
- 외부 스킬은 쓰지 않는다. 머지 방식은 squash와 `--delete-branch`이며, base는 PR이 향한 브랜치(기본은 repo 기본 브랜치, sprint 모드면 `sprint-<id>`)다. 본문은 마크다운으로 작성한다.
|
|
55
|
+
- sprint 브랜치를 기본 브랜치로 올리는 최종 머지는 하지 않는다. 그 머지는 배포를 일으키므로 sprint-runner의 사람 게이트에서 유저가 실행한다. 머저는 이슈 PR을 그 base 브랜치에 모으는 데까지만 책임진다.
|
|
@@ -3,7 +3,7 @@ name: 2t-decencia-channel-terraformer
|
|
|
3
3
|
description: 소통채널을 쓰지 않던 기존 코드베이스를 역분석하여 소통채널 프로젝트로 편입(terraforming)하는 자율 에이전트. 코드가 single source of truth — 코드를 읽어 DB 스키마 → 기능명세(spec) → PRD를 bottom-up으로 역생성한다(SQA 제외). 대량 분석은 서브에이전트 병렬, 코드로 못 메우는 의도는 [추정]으로 채우고 "사람확인 질문 리스트"를 산출물로 남긴다. PR/머지·이슈 발행은 하지 않음.
|
|
4
4
|
tools: Read, Write, Edit, Grep, Glob, Bash, Agent
|
|
5
5
|
model: opus
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.8.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## 역할
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { AxiosInstance } from 'axios';
|
|
2
2
|
import { ProjectContext } from './config';
|
|
3
|
+
/**
|
|
4
|
+
* Thrown (and rejected) when a request that needs a project context is issued
|
|
5
|
+
* with none resolved. For mutating requests it aborts BEFORE the request leaves
|
|
6
|
+
* the process so nothing stray is created in a default/empty project (RC3).
|
|
7
|
+
*/
|
|
8
|
+
export declare class ProjectContextRequiredError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
3
11
|
export interface ClientOptions {
|
|
4
12
|
apiKey?: string;
|
|
5
13
|
projectId?: string;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAA0C,MAAM,OAAO,CAAC;AACrF,OAAO,EAKL,cAAc,EACf,MAAM,UAAU,CAAC;AAKlB;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,qBAAqB,IAAI,cAAc,GAAG,IAAI,CAE7D;AAwDD,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,aAAa,CAuGvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,aAAkB,GAAG,aAAa,CA8B7E"}
|
package/dist/client.js
CHANGED
|
@@ -3,16 +3,69 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ProjectContextRequiredError = void 0;
|
|
6
7
|
exports.getLastProjectContext = getLastProjectContext;
|
|
7
8
|
exports.createClient = createClient;
|
|
8
9
|
exports.createUnauthClient = createUnauthClient;
|
|
9
10
|
const axios_1 = __importDefault(require("axios"));
|
|
10
11
|
const config_1 = require("./config");
|
|
11
12
|
const output_1 = require("./output");
|
|
13
|
+
const MUTATING_METHODS = new Set(['post', 'put', 'patch', 'delete']);
|
|
14
|
+
/**
|
|
15
|
+
* Thrown (and rejected) when a request that needs a project context is issued
|
|
16
|
+
* with none resolved. For mutating requests it aborts BEFORE the request leaves
|
|
17
|
+
* the process so nothing stray is created in a default/empty project (RC3).
|
|
18
|
+
*/
|
|
19
|
+
class ProjectContextRequiredError extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'ProjectContextRequiredError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.ProjectContextRequiredError = ProjectContextRequiredError;
|
|
12
26
|
let _lastProjectContext = null;
|
|
13
27
|
function getLastProjectContext() {
|
|
14
28
|
return _lastProjectContext;
|
|
15
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Non-silent project context resolution.
|
|
32
|
+
*
|
|
33
|
+
* Resolved → announce projectId + source to stderr (once per request that
|
|
34
|
+
* actually needs a project), never to stdout (keeps --json clean).
|
|
35
|
+
* Unresolved → warn to stderr and set a non-zero exit code (no silent "0건"),
|
|
36
|
+
* and for mutating requests refuse the request entirely (RC3).
|
|
37
|
+
*
|
|
38
|
+
* Account-level routes (`/auth/*`, `/projects` collection) work with only the
|
|
39
|
+
* account-scoped API key and are intentionally exempt — see
|
|
40
|
+
* pathRequiresProjectContext().
|
|
41
|
+
*/
|
|
42
|
+
function enforceProjectContext(req, projectCtx, state) {
|
|
43
|
+
const url = req.url || '';
|
|
44
|
+
if (!(0, config_1.pathRequiresProjectContext)(url)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const method = (req.method || 'get').toLowerCase();
|
|
48
|
+
if (projectCtx) {
|
|
49
|
+
if (!state.announced) {
|
|
50
|
+
state.announced = true;
|
|
51
|
+
console.error(`프로젝트 컨텍스트: ${projectCtx.projectId} (출처: ${(0, config_1.describeContextSource)(projectCtx.source)})`);
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Unresolved context.
|
|
56
|
+
process.exitCode = 1;
|
|
57
|
+
if (MUTATING_METHODS.has(method)) {
|
|
58
|
+
const msg = '프로젝트가 선택되지 않아 쓰기 작업을 거부합니다. ' +
|
|
59
|
+
'--project <projectId> 를 지정하거나, .ch-project / ~/.ch/config.json 에 projectId를 설정하세요.';
|
|
60
|
+
(0, output_1.printError)(msg);
|
|
61
|
+
throw new ProjectContextRequiredError(msg);
|
|
62
|
+
}
|
|
63
|
+
if (!state.announced) {
|
|
64
|
+
state.announced = true;
|
|
65
|
+
(0, output_1.printError)('프로젝트가 선택되지 않았습니다(미해석). 결과가 비어 보일 수 있습니다. ' +
|
|
66
|
+
'--project <projectId> 또는 .ch-project / ~/.ch/config.json 로 프로젝트를 지정하세요.');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
16
69
|
function createClient(options = {}) {
|
|
17
70
|
const config = (0, config_1.loadConfig)();
|
|
18
71
|
const apiKey = options.apiKey || config?.apiKey;
|
|
@@ -31,12 +84,16 @@ function createClient(options = {}) {
|
|
|
31
84
|
'Content-Type': 'application/json',
|
|
32
85
|
},
|
|
33
86
|
});
|
|
34
|
-
//
|
|
87
|
+
// Per-client announcement state (announce context at most once per command).
|
|
88
|
+
const ctxState = { announced: false };
|
|
89
|
+
// Request interceptor: inject auth headers + non-silent context enforcement.
|
|
35
90
|
instance.interceptors.request.use((req) => {
|
|
36
91
|
req.headers['Authorization'] = `Bearer ${apiKey}`;
|
|
37
92
|
if (projectId) {
|
|
38
93
|
req.headers['X-Project-Id'] = projectId;
|
|
39
94
|
}
|
|
95
|
+
// Announce resolved context / warn (and possibly refuse) on unresolved.
|
|
96
|
+
enforceProjectContext(req, projectCtx, ctxState);
|
|
40
97
|
if (options.verbose) {
|
|
41
98
|
const method = (req.method || 'GET').toUpperCase();
|
|
42
99
|
const url = `${req.baseURL}${req.url}`;
|
|
@@ -52,10 +109,18 @@ function createClient(options = {}) {
|
|
|
52
109
|
});
|
|
53
110
|
// Response error interceptor
|
|
54
111
|
instance.interceptors.response.use((response) => response, (error) => {
|
|
112
|
+
// A request we aborted for missing context: already reported + exit set.
|
|
113
|
+
if (error instanceof ProjectContextRequiredError) {
|
|
114
|
+
return Promise.reject(error);
|
|
115
|
+
}
|
|
55
116
|
if (!error.response) {
|
|
56
117
|
(0, output_1.printError)('서버에 연결할 수 없습니다. API URL과 네트워크 상태를 확인하세요.');
|
|
57
118
|
process.exit(1);
|
|
58
119
|
}
|
|
120
|
+
// HTTP 4xx/5xx: report AND make the process exit non-zero so callers can
|
|
121
|
+
// tell success from failure by exit code (RC2). Connection/unauth errors
|
|
122
|
+
// above keep their hard process.exit(1).
|
|
123
|
+
process.exitCode = 1;
|
|
59
124
|
const status = error.response.status;
|
|
60
125
|
const data = error.response.data;
|
|
61
126
|
const serverMessage = data?.message || data?.error || '';
|
|
@@ -106,6 +171,8 @@ function createUnauthClient(options = {}) {
|
|
|
106
171
|
(0, output_1.printError)('서버에 연결할 수 없습니다.');
|
|
107
172
|
process.exit(1);
|
|
108
173
|
}
|
|
174
|
+
// HTTP 4xx/5xx → non-zero exit code (RC2), same contract as createClient.
|
|
175
|
+
process.exitCode = 1;
|
|
109
176
|
const status = error.response.status;
|
|
110
177
|
const data = error.response.data;
|
|
111
178
|
const serverMessage = data?.message || data?.error || '';
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;;AAiCA,sDAEC;AAwDD,oCAuGC;AAKD,gDA8BC;AArOD,kDAAqF;AACrF,qCAMkB;AAClB,qCAAsC;AAEtC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAErE;;;;GAIG;AACH,MAAa,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AALD,kEAKC;AASD,IAAI,mBAAmB,GAA0B,IAAI,CAAC;AAEtD,SAAgB,qBAAqB;IACnC,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,qBAAqB,CAC5B,GAA+B,EAC/B,UAAiC,EACjC,KAA6B;IAE7B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAA,mCAA0B,EAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAEnD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,KAAK,CACX,cAAc,UAAU,CAAC,SAAS,SAAS,IAAA,8BAAqB,EAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CACvF,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IAErB,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,GAAG,GACP,8BAA8B;YAC9B,oFAAoF,CAAC;QACvF,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,2BAA2B,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QACvB,IAAA,mBAAU,EACR,2CAA2C;YACzC,yEAAyE,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,MAAM,CAAC;IAChD,MAAM,UAAU,GAAG,IAAA,0BAAiB,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,mBAAmB,GAAG,UAAU,CAAC;IACjC,MAAM,SAAS,GAAG,UAAU,EAAE,SAAS,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,MAAM,IAAI,qDAAqD,CAAC;IAEzG,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,mBAAU,EAAC,mDAAmD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,eAAK,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAEtC,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACxC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;QAClD,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;QAC1C,CAAC;QAED,wEAAwE;QACxE,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,WAAW,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;YAC1C,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAChC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAuD,EAAE,EAAE;QAC1D,yEAAyE;QACzE,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAA,mBAAU,EAAC,0CAA0C,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,yEAAyE;QACzE,yEAAyE;QACzE,yCAAyC;QACzC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QAErB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,MAAM,aAAa,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAEzD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,cAAc,aAAa,EAAE,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;gBACjE,MAAM;YACR,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,aAAa,aAAa,EAAE,CAAC,CAAC;gBACzC,MAAM;YACR,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;gBAC/C,MAAM;YACR,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,OAAO,aAAa,EAAE,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,QAAQ,aAAa,EAAE,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,GAAG;gBACN,IAAA,mBAAU,EAAC,aAAa,aAAa,EAAE,CAAC,CAAC;gBACzC,MAAM;YACR;gBACE,IAAA,mBAAU,EAAC,OAAO,MAAM,MAAM,aAAa,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,UAAyB,EAAE;IAC5D,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,MAAM,IAAI,qDAAqD,CAAC;IAEzG,MAAM,QAAQ,GAAG,eAAK,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAChC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAuD,EAAE,EAAE;QAC1D,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAA,mBAAU,EAAC,iBAAiB,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,0EAA0E;QAC1E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,MAAM,aAAa,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACzD,IAAA,mBAAU,EAAC,OAAO,MAAM,MAAM,aAAa,EAAE,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-schema.d.ts","sourceRoot":"","sources":["../../src/commands/db-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"db-schema.d.ts","sourceRoot":"","sources":["../../src/commands/db-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkF9D"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerDbSchemaCommand = registerDbSchemaCommand;
|
|
4
4
|
const client_1 = require("../client");
|
|
5
5
|
const output_1 = require("../output");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
6
7
|
function registerDbSchemaCommand(program) {
|
|
7
8
|
const dbSchema = program
|
|
8
9
|
.command('db-schema')
|
|
@@ -31,7 +32,8 @@ function registerDbSchemaCommand(program) {
|
|
|
31
32
|
.command('set')
|
|
32
33
|
.description('DB 스키마 생성/수정')
|
|
33
34
|
.requiredOption('--title <title>', 'DB 스키마 제목')
|
|
34
|
-
.
|
|
35
|
+
.option('--content <content>', 'DB 스키마 본문 (마크다운) — --file/stdin 대안 가능')
|
|
36
|
+
.option('--file <path>', 'DB 스키마 본문을 파일에서 읽기 (대용량/멀티라인·CRLF 안전, stdin도 가능)')
|
|
35
37
|
.option('--db-type <dbType>', 'DB 유형 (firestore, supabase, mysql, generic)', 'generic')
|
|
36
38
|
.option('--no-version', '버전 기록 없이 수정 (기본: 항상 새 버전 기록)')
|
|
37
39
|
.action(async (options) => {
|
|
@@ -41,13 +43,25 @@ function registerDbSchemaCommand(program) {
|
|
|
41
43
|
(0, output_1.printInfo)(`[DRY-RUN] DB 스키마 "${options.title}" 생성/수정 요청`);
|
|
42
44
|
return;
|
|
43
45
|
}
|
|
46
|
+
let content;
|
|
47
|
+
try {
|
|
48
|
+
content = (0, utils_1.readContentInput)({ file: options.file, content: options.content }, '--file');
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
(0, output_1.printError)(e?.message ?? String(e));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (content === undefined) {
|
|
55
|
+
(0, output_1.printError)('본문을 지정하세요 — --content <문자열>, --file <경로>, 또는 stdin 파이프.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
44
58
|
const client = (0, client_1.createClient)({ projectId: globalOpts.project });
|
|
45
59
|
const params = {};
|
|
46
60
|
if (options.version === false)
|
|
47
61
|
params.newVersion = 'false';
|
|
48
62
|
const { data } = await client.put('/db-schema', {
|
|
49
63
|
title: options.title,
|
|
50
|
-
content
|
|
64
|
+
content,
|
|
51
65
|
dbType: options.dbType,
|
|
52
66
|
}, { params });
|
|
53
67
|
(0, output_1.formatOutput)(data, globalOpts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-schema.js","sourceRoot":"","sources":["../../src/commands/db-schema.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"db-schema.js","sourceRoot":"","sources":["../../src/commands/db-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-tables.d.ts","sourceRoot":"","sources":["../../src/commands/db-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"db-tables.d.ts","sourceRoot":"","sources":["../../src/commands/db-tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoN9D"}
|
|
@@ -24,15 +24,17 @@ function registerDbTablesCommand(program) {
|
|
|
24
24
|
const client = (0, client_1.createClient)({ projectId: globalOpts.project });
|
|
25
25
|
const { data } = await client.get('/db-tables');
|
|
26
26
|
const items = Array.isArray(data) ? data : data?.data ?? [];
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
// JSON/CSV/quiet 모드는 기본 포맷에 위임
|
|
27
|
+
// JSON/CSV/quiet(기계 모드)는 기본 포맷에 위임 — 빈값 안내(printInfo)보다
|
|
28
|
+
// 앞에 둬서 빈 결과도 stdout에 빈 배열([])로 나가고 사람용 안내문이
|
|
29
|
+
// stdout(JSON)을 오염시키지 않게 한다. (PLAT-003, 이슈 #50)
|
|
32
30
|
if (globalOpts.json || globalOpts.csv || globalOpts.quiet) {
|
|
33
31
|
(0, output_1.formatOutput)(items, globalOpts);
|
|
34
32
|
return;
|
|
35
33
|
}
|
|
34
|
+
if (!items.length) {
|
|
35
|
+
(0, output_1.printInfo)('등록된 DB 테이블이 없습니다.');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
36
38
|
// 기본 테이블 출력: name / id / columns수 / indexes수 / 보안규칙 요약 / 연관 spec수
|
|
37
39
|
(0, output_1.printTable)(['name', 'id', 'columns', 'indexes', 'security', 'specs'], items.map((t) => {
|
|
38
40
|
const sec = t?.securityRules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-tables.js","sourceRoot":"","sources":["../../src/commands/db-tables.ts"],"names":[],"mappings":";;AAWA,
|
|
1
|
+
{"version":3,"file":"db-tables.js","sourceRoot":"","sources":["../../src/commands/db-tables.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-status.d.ts","sourceRoot":"","sources":["../../src/commands/dev-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"dev-status.d.ts","sourceRoot":"","sources":["../../src/commands/dev-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4K/D"}
|
|
@@ -63,7 +63,8 @@ function registerDevStatusCommand(program) {
|
|
|
63
63
|
.command('create')
|
|
64
64
|
.description('개발현황 문서 생성')
|
|
65
65
|
.requiredOption('--title <title>', '문서 제목')
|
|
66
|
-
.option('--content <content>', '본문 (
|
|
66
|
+
.option('--content <content>', '본문 (마크다운) — --file/stdin 대안 가능')
|
|
67
|
+
.option('--file <path>', '본문을 파일에서 읽기 (대용량/멀티라인·CRLF 안전, stdin도 가능)')
|
|
67
68
|
.option('--sprints <sprintIds>', '관련 스프린트 ID (쉼표 구분)')
|
|
68
69
|
.option('--specs <specIds>', '관련 기능명세 ID (쉼표 구분)')
|
|
69
70
|
.action(async (options) => {
|
|
@@ -73,12 +74,20 @@ function registerDevStatusCommand(program) {
|
|
|
73
74
|
(0, output_1.printInfo)(`[DRY-RUN] 개발현황 문서 "${options.title}" 생성 요청`);
|
|
74
75
|
return;
|
|
75
76
|
}
|
|
77
|
+
let content;
|
|
78
|
+
try {
|
|
79
|
+
content = (0, utils_1.readContentInput)({ file: options.file, content: options.content }, '--file');
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
(0, output_1.printError)(e?.message ?? String(e));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
76
85
|
const client = (0, client_1.createClient)({ projectId: globalOpts.project });
|
|
77
86
|
const body = {
|
|
78
87
|
title: options.title,
|
|
79
88
|
};
|
|
80
|
-
if (
|
|
81
|
-
body.content =
|
|
89
|
+
if (content !== undefined)
|
|
90
|
+
body.content = content;
|
|
82
91
|
if (options.sprints)
|
|
83
92
|
body.relatedSprintIds = (0, utils_1.parseCommaSeparated)(options.sprints);
|
|
84
93
|
if (options.specs)
|
|
@@ -96,7 +105,8 @@ function registerDevStatusCommand(program) {
|
|
|
96
105
|
.command('update <docId>')
|
|
97
106
|
.description('개발현황 문서 수정')
|
|
98
107
|
.option('--title <title>', '문서 제목')
|
|
99
|
-
.option('--content <content>', '본문 (
|
|
108
|
+
.option('--content <content>', '본문 (마크다운) — --file/stdin 대안 가능')
|
|
109
|
+
.option('--file <path>', '본문을 파일에서 읽기 (대용량/멀티라인·CRLF 안전, stdin도 가능)')
|
|
100
110
|
.option('--sprints <sprintIds>', '관련 스프린트 ID (쉼표 구분)')
|
|
101
111
|
.option('--specs <specIds>', '관련 기능명세 ID (쉼표 구분)')
|
|
102
112
|
.option('--change-note <note>', '변경 사유')
|
|
@@ -108,12 +118,20 @@ function registerDevStatusCommand(program) {
|
|
|
108
118
|
(0, output_1.printInfo)(`[DRY-RUN] 개발현황 문서 "${docId}" 수정 요청`);
|
|
109
119
|
return;
|
|
110
120
|
}
|
|
121
|
+
let content;
|
|
122
|
+
try {
|
|
123
|
+
content = (0, utils_1.readContentInput)({ file: options.file, content: options.content }, '--file');
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
(0, output_1.printError)(e?.message ?? String(e));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
111
129
|
const client = (0, client_1.createClient)({ projectId: globalOpts.project });
|
|
112
130
|
const body = {};
|
|
113
131
|
if (options.title)
|
|
114
132
|
body.title = options.title;
|
|
115
|
-
if (
|
|
116
|
-
body.content =
|
|
133
|
+
if (content !== undefined)
|
|
134
|
+
body.content = content;
|
|
117
135
|
if (options.sprints)
|
|
118
136
|
body.relatedSprintIds = (0, utils_1.parseCommaSeparated)(options.sprints);
|
|
119
137
|
if (options.specs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-status.js","sourceRoot":"","sources":["../../src/commands/dev-status.ts"],"names":[],"mappings":";;AAKA,
|
|
1
|
+
{"version":3,"file":"dev-status.js","sourceRoot":"","sources":["../../src/commands/dev-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgFzD"}
|
package/dist/commands/prd.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerPrdCommand = registerPrdCommand;
|
|
4
4
|
const client_1 = require("../client");
|
|
5
5
|
const output_1 = require("../output");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
6
7
|
function registerPrdCommand(program) {
|
|
7
8
|
const prd = program
|
|
8
9
|
.command('prd')
|
|
@@ -31,7 +32,8 @@ function registerPrdCommand(program) {
|
|
|
31
32
|
.command('set')
|
|
32
33
|
.description('PRD 생성/수정')
|
|
33
34
|
.requiredOption('--title <title>', 'PRD 제목')
|
|
34
|
-
.
|
|
35
|
+
.option('--content <content>', 'PRD 본문 (마크다운) — --file/stdin 대안 가능')
|
|
36
|
+
.option('--file <path>', 'PRD 본문을 파일에서 읽기 (대용량/멀티라인·CRLF 안전, stdin도 가능)')
|
|
35
37
|
.option('--no-version', '버전 기록 없이 수정 (기본: 항상 새 버전 기록)')
|
|
36
38
|
.action(async (options) => {
|
|
37
39
|
const globalOpts = program.opts();
|
|
@@ -40,13 +42,25 @@ function registerPrdCommand(program) {
|
|
|
40
42
|
(0, output_1.printInfo)(`[DRY-RUN] PRD "${options.title}" 생성/수정 요청`);
|
|
41
43
|
return;
|
|
42
44
|
}
|
|
45
|
+
let content;
|
|
46
|
+
try {
|
|
47
|
+
content = (0, utils_1.readContentInput)({ file: options.file, content: options.content }, '--file');
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
(0, output_1.printError)(e?.message ?? String(e));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (content === undefined) {
|
|
54
|
+
(0, output_1.printError)('본문을 지정하세요 — --content <문자열>, --file <경로>, 또는 stdin 파이프.');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
43
57
|
const client = (0, client_1.createClient)({ projectId: globalOpts.project });
|
|
44
58
|
const params = {};
|
|
45
59
|
if (options.version === false)
|
|
46
60
|
params.newVersion = 'false';
|
|
47
61
|
const { data } = await client.put('/prd', {
|
|
48
62
|
title: options.title,
|
|
49
|
-
content
|
|
63
|
+
content,
|
|
50
64
|
}, { params });
|
|
51
65
|
(0, output_1.formatOutput)(data, globalOpts);
|
|
52
66
|
(0, output_1.printSuccess)(data.message || 'PRD가 저장되었습니다.');
|
package/dist/commands/prd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qna.d.ts","sourceRoot":"","sources":["../../src/commands/qna.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"qna.d.ts","sourceRoot":"","sources":["../../src/commands/qna.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4OzD"}
|