persona-harness 0.3.2-alpha.3 → 0.3.4-alpha.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/CHANGELOG.md CHANGED
@@ -8,6 +8,69 @@ This project uses npm prerelease versions for tester-facing alpha builds. During
8
8
 
9
9
  No unreleased changes yet.
10
10
 
11
+ ## [0.3.4-alpha.0] - 2026-06-23
12
+
13
+ ### Added
14
+
15
+ - Strengthened continuation workflow for long README implementations.
16
+ - Added explicit continuation fields to the implementation report template:
17
+ - completed requirements;
18
+ - incomplete requirements;
19
+ - last completed requirement/file;
20
+ - remaining README/plan range;
21
+ - remaining implementation scope;
22
+ - interruption reason;
23
+ - next command/action;
24
+ - next prompt hint.
25
+ - Added `ph plan --next` behavior that prefers `npx ph workflow continue` when a filled implementation report still records remaining scope.
26
+ - Added plan unchecked checklist output to the continuation prompt so agents can resume from the accepted plan and previous report evidence.
27
+
28
+ ### Changed
29
+
30
+ - Refactored workflow report template generation into `src/cli/workflow-templates.ts` to keep the plan CLI smaller and easier to review.
31
+
32
+ ### Verification
33
+
34
+ - Long README smoke created a 260-line README and simulated an interrupted first pass that completed Step 1-40 and left Step 41-260.
35
+ - Observed `ph plan --next` recommend `npx ph workflow continue` with continuation evidence.
36
+ - Observed `ph workflow continue` print remaining README range, incomplete requirements, interruption reason, next action, next prompt hint, and unchecked plan items.
37
+ - `npm test`, `npm run typecheck`, `npm run build`, and `npm pack --dry-run` passed before publish.
38
+
39
+ ### Known Gaps
40
+
41
+ - Continuation workflow is still an AI-facing rail. It does not automatically execute OpenCode or certify generated app quality.
42
+ - It depends on the agent filling continuation evidence honestly when a run stops early.
43
+ - Full TDD workflow remains future scope.
44
+
45
+ ## [0.3.3-alpha.0] - 2026-06-23
46
+
47
+ ### Added
48
+
49
+ - Added Existing Project Adaptation Mode to `ph plan`, with automatic `greenfield` versus `existing-code` project mode output.
50
+ - Added existing Java source discovery for package root and layer/style hints so brownfield projects can prefer their current package, naming, repository, DTO, and domain flow.
51
+ - Added plan/prompt/workflow guidance that existing code wins over greenfield guidance.
52
+ - Added README read coverage fallback from `.persona/evidence` when filled workflow reports omit explicit README ranges.
53
+ - Added existing Spring-style role discovery coverage for Controller, Service, Repository, DTO, Domain, Exception, and Test files.
54
+
55
+ ### Changed
56
+
57
+ - Changed Java Role Read Follow-up to ask for representative role files instead of every discovered Java file, while still recording full role-discovery evidence.
58
+ - Relaxed workflow finish classification when raw-shell checklist text remains but final verification was rerun through `npx ph bearshell`.
59
+
60
+ ### Verification
61
+
62
+ - Existing Spring-style smoke used a current local tarball install, `npx ph init`, accepted plan workflow, and OpenCode `openai/gpt-5.4-mini-fast` with the short prompt `README.md 보고 구현해줘`.
63
+ - Observed `Mode: existing-code`, package root `com.acme.todo`, layer hints `domain, dto, repository, service, web`.
64
+ - Generated code stayed in the existing `web/service/repository/dto/domain` package flow rather than forcing `presentation/application/domain/infrastructure`.
65
+ - Java role discovery evidence covered Controller, Service, Repository, DTO, Domain, and Test files.
66
+ - `gradle test`, `gradle build`, and HTTP smoke passed through the generated project.
67
+
68
+ ### Known Gaps
69
+
70
+ - OpenCode may still inspect package metadata such as `node_modules/persona-harness/package.json` before settling into the workflow rail.
71
+ - Agents may still perform an initial raw shell probe before rerunning final verification through `npx ph bearshell`.
72
+ - Long README continuation remains the next product gap; full TDD workflow is still future scope.
73
+
11
74
  ## [0.3.2-alpha.3] - 2026-06-23
12
75
 
13
76
  ### Added
@@ -13,11 +13,23 @@ const READ_COVERAGE_LABELS = [
13
13
  "Read evidence notes",
14
14
  ];
15
15
  const CONTINUATION_LABELS = [
16
+ "완료한 요구사항",
17
+ "미완료 요구사항",
16
18
  "마지막으로 완료한 요구사항/파일",
17
19
  "남은 README/plan 범위",
18
20
  "남은 구현 범위",
21
+ "중단 이유",
19
22
  "다음에 이어서 실행할 명령/작업",
23
+ "다음 프롬프트 힌트",
20
24
  ];
25
+ const REMAINING_SCOPE_LABELS = [
26
+ "미완료 요구사항",
27
+ "남은 README/plan 범위",
28
+ "남은 구현 범위",
29
+ "다음에 이어서 실행할 명령/작업",
30
+ "다음 프롬프트 힌트",
31
+ ];
32
+ const EMPTY_CONTINUATION_VALUE_PATTERN = /^(?:없음|없다|none|n\/a|na|-|완료|complete|completed|all done)$/i;
21
33
  function projectDirFor(options) {
22
34
  return resolve(options.projectDir ?? process.cwd());
23
35
  }
@@ -36,6 +48,10 @@ function reportStatus(projectDir, relativePath) {
36
48
  }
37
49
  return "unknown";
38
50
  }
51
+ function reportText(projectDir, relativePath) {
52
+ const reportPath = join(projectDir, relativePath);
53
+ return existsSync(reportPath) ? readFileSync(reportPath, "utf8") : undefined;
54
+ }
39
55
  function workflowSnapshot(options) {
40
56
  const projectDir = projectDirFor(options);
41
57
  let planStatus;
@@ -52,6 +68,7 @@ function workflowSnapshot(options) {
52
68
  planStatus,
53
69
  implementationStatus: reportStatus(projectDir, IMPLEMENTATION_REPORT_PATH),
54
70
  reviewStatus: reportStatus(projectDir, REVIEW_REPORT_PATH),
71
+ implementationReportText: reportText(projectDir, IMPLEMENTATION_REPORT_PATH),
55
72
  };
56
73
  }
57
74
  function nextActionLines(snapshot) {
@@ -81,6 +98,14 @@ function nextActionLines(snapshot) {
81
98
  if (snapshot.implementationStatus !== "filled") {
82
99
  return ["Implementation is next.", "Next command: npx ph workflow implement"];
83
100
  }
101
+ if (snapshot.implementationReportText !== undefined && hasRemainingScope(snapshot.implementationReportText)) {
102
+ return [
103
+ "Continuation is next.",
104
+ "Next command: npx ph workflow continue",
105
+ "Continuation evidence:",
106
+ ...evidenceLines(snapshot.implementationReportText).map((line) => ` ${line}`),
107
+ ];
108
+ }
84
109
  if (snapshot.reviewStatus !== "filled") {
85
110
  return [
86
111
  "Review is next.",
@@ -96,6 +121,7 @@ function nextActionLines(snapshot) {
96
121
  }
97
122
  export function runNextCommand(options = {}) {
98
123
  const snapshot = workflowSnapshot(options);
124
+ const nextLines = nextActionLines(snapshot);
99
125
  const stdout = [
100
126
  "Persona Harness next action",
101
127
  "",
@@ -105,7 +131,7 @@ export function runNextCommand(options = {}) {
105
131
  `Review report status: ${snapshot.reviewStatus}`,
106
132
  "",
107
133
  "Next:",
108
- ...nextActionLines(snapshot).map((line) => `- ${line}`),
134
+ ...nextLines.map((line) => line.startsWith(" ") ? line : `- ${line}`),
109
135
  ].join("\n") + "\n";
110
136
  return { status: 0, stdout, stderr: "" };
111
137
  }
@@ -126,6 +152,27 @@ function valueForLabel(reportText, label) {
126
152
  }
127
153
  return undefined;
128
154
  }
155
+ function isFilledContinuationValue(value) {
156
+ return value.length > 0 && !EMPTY_CONTINUATION_VALUE_PATTERN.test(value);
157
+ }
158
+ function hasRemainingScope(reportText) {
159
+ return REMAINING_SCOPE_LABELS.some((label) => {
160
+ const value = valueForLabel(reportText, label);
161
+ return value !== undefined && isFilledContinuationValue(value);
162
+ });
163
+ }
164
+ function planUncheckedItems(projectDir) {
165
+ const planPath = join(projectDir, PLAN_PATH);
166
+ if (!existsSync(planPath)) {
167
+ return [];
168
+ }
169
+ return readFileSync(planPath, "utf8")
170
+ .split(/\r?\n/)
171
+ .flatMap((line) => {
172
+ const match = /^-\s*\[\s\]\s+(.+)$/.exec(line);
173
+ return match?.[1] === undefined ? [] : [`- ${match[1]}`];
174
+ });
175
+ }
129
176
  function evidenceLines(reportText) {
130
177
  const lines = [...READ_COVERAGE_LABELS, ...CONTINUATION_LABELS].flatMap((label) => {
131
178
  const value = valueForLabel(reportText, label);
@@ -135,6 +182,7 @@ function evidenceLines(reportText) {
135
182
  }
136
183
  function resumePrompt(snapshot, reportText) {
137
184
  const hasEvidence = evidenceLines(reportText).some((line) => !line.includes("No filled continuation evidence found."));
185
+ const uncheckedItems = planUncheckedItems(snapshot.projectDir);
138
186
  return [
139
187
  "Persona Harness resume prompt",
140
188
  "",
@@ -147,6 +195,9 @@ function resumePrompt(snapshot, reportText) {
147
195
  hasEvidence ? "Continue from this recorded state:" : "No filled continuation evidence found.",
148
196
  ...evidenceLines(reportText),
149
197
  "",
198
+ "Plan unchecked items:",
199
+ ...(uncheckedItems.length > 0 ? uncheckedItems : ["- No unchecked plan checklist items found."]),
200
+ "",
150
201
  "Required action:",
151
202
  "- Read README.md, .persona/project-profile.jsonc, .persona/policies, and .persona/workflow/plan.md.",
152
203
  "- Use the Read Coverage fields to avoid claiming unread ranges as complete.",
@@ -1 +1 @@
1
- {"version":3,"file":"plan-next.js","sourceRoot":"","sources":["../../src/cli/plan-next.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-next.js","sourceRoot":"","sources":["../../src/cli/plan-next.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@ export function createPlanOnlyPrompt() {
10
10
  "긴 README.md나 plan은 한 번에 다 읽었다고 가정하지 말고, Read 출력이 잘리면 `npx ph bearshell --shell 'sed -n \"1,220p\" README.md'`, `npx ph bearshell --shell 'sed -n \"221,440p\" README.md'`처럼 범위를 나눠 끝까지 읽어줘.",
11
11
  "",
12
12
  "계획에는 요구사항 요약, Java/Spring Gradle 기술 선택, package/layer 구조, storage/persistence 선택, repository boundary, DTO boundary, domain behavior 기준을 포함해줘.",
13
+ "기존 Java/Spring 코드가 있으면 먼저 package/layer/naming/repository/DTO/domain style을 발견하고, existing code wins over greenfield guidance 원칙으로 그 구조에 맞춘 계획을 작성해줘.",
14
+ "새 프로젝트처럼 기존 코드가 없을 때만 0% -> 80% greenfield baseline package flow를 기본값으로 사용해줘.",
13
15
  "",
14
16
  "계획이 불확실하면 구현하지 말고 질문이나 가정을 .persona/workflow/plan.md에 명확히 남겨줘.",
15
17
  "",
@@ -33,6 +35,8 @@ export function createImplementationPrompt() {
33
35
  "구현 보고서의 Read Coverage에는 체크만 하지 말고 `README read method`, `README ranges read`, `Plan read method`, `Plan ranges read`, `Unread ranges`를 실제 실행 증거 기준으로 적어줘.",
34
36
  "",
35
37
  "구현 중에는 Java/Spring Gradle backend Clean Code 범위를 유지하고, plan에 없는 frontend/infra/desktop 범위로 확장하지 마.",
38
+ "기존 Java/Spring 코드가 있으면 먼저 package/layer/naming/repository/DTO/domain style을 읽고, existing code wins over greenfield guidance 원칙으로 현재 프로젝트 흐름에 맞춰 구현해줘.",
39
+ "새 프로젝트처럼 기존 코드가 없을 때만 0% -> 80% greenfield baseline package flow를 기본값으로 사용해줘.",
36
40
  "실행 가능한 Spring Boot 앱이면 `bootJar`를 비활성화하지 마. `gradle build` 출력에 `:bootJar SKIPPED`가 나오면 build 통과로 기록하지 말고, Spring Boot plugin / Gradle wrapper / JDK toolchain 호환성을 맞춰 다시 검증해줘.",
37
41
  "가능하면 생성 프로젝트에 Gradle wrapper를 포함하고, 검증은 `./gradlew test`, `./gradlew build`, `./gradlew bootRun` 또는 Windows `gradlew.bat` 기준으로 기록해줘.",
38
42
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"plan-prompts.js","sourceRoot":"","sources":["../../src/cli/plan-prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,yIAAyI;QACzI,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,4HAA4H;QAC5H,EAAE;QACF,6LAA6L;QAC7L,EAAE;QACF,gJAAgJ;QAChJ,EAAE;QACF,gEAAgE;QAChE,EAAE;QACF,8HAA8H;QAC9H,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,mFAAmF;QACnF,EAAE;QACF,sLAAsL;QACtL,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,6IAA6I;QAC7I,EAAE;QACF,6LAA6L;QAC7L,2JAA2J;QAC3J,EAAE;QACF,oGAAoG;QACpG,gLAAgL;QAChL,sIAAsI;QACtI,EAAE;QACF,0GAA0G;QAC1G,EAAE;QACF,mIAAmI;QACnI,EAAE;QACF,iMAAiM;QACjM,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"plan-prompts.js","sourceRoot":"","sources":["../../src/cli/plan-prompts.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,yIAAyI;QACzI,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,4HAA4H;QAC5H,EAAE;QACF,6LAA6L;QAC7L,EAAE;QACF,gJAAgJ;QAChJ,uJAAuJ;QACvJ,+EAA+E;QAC/E,EAAE;QACF,gEAAgE;QAChE,EAAE;QACF,8HAA8H;QAC9H,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,mFAAmF;QACnF,EAAE;QACF,sLAAsL;QACtL,EAAE;QACF,8GAA8G;QAC9G,uGAAuG;QACvG,EAAE;QACF,6IAA6I;QAC7I,EAAE;QACF,6LAA6L;QAC7L,2JAA2J;QAC3J,EAAE;QACF,oGAAoG;QACpG,uJAAuJ;QACvJ,+EAA+E;QAC/E,gLAAgL;QAChL,sIAAsI;QACtI,EAAE;QACF,0GAA0G;QAC1G,EAAE;QACF,mIAAmI;QACnI,EAAE;QACF,iMAAiM;QACjM,EAAE;QACF,6FAA6F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
package/dist/cli/plan.js CHANGED
@@ -1,8 +1,9 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
2
  import { join, resolve } from "node:path";
3
3
  import process from "node:process";
4
4
  import { loadBackendPolicyOverlay } from "../phase0/policy-overlay.js";
5
5
  import { loadBackendProjectProfileSummary, readBackendProjectProfileState } from "../phase0/project-profile.js";
6
+ import { createImplementationReportTemplate, createReviewReportTemplate } from "./workflow-templates.js";
6
7
  export class PlanDraftError extends Error {
7
8
  constructor(message) {
8
9
  super(message);
@@ -13,6 +14,8 @@ export const PLAN_PATH = ".persona/workflow/plan.md";
13
14
  export const IMPLEMENTATION_REPORT_PATH = ".persona/workflow/implementation-report.md";
14
15
  export const REVIEW_REPORT_PATH = ".persona/workflow/review-report.md";
15
16
  const README_PATH = "README.md";
17
+ const EXISTING_CODE_SCAN_ROOTS = ["src/main/java", "src/test/java"];
18
+ const EXISTING_CODE_SCAN_LIMIT = 40;
16
19
  function readReadmeHeading(projectDir) {
17
20
  const readmePath = join(projectDir, README_PATH);
18
21
  if (!existsSync(readmePath)) {
@@ -52,6 +55,93 @@ function readmeLines(projectDir) {
52
55
  heading === undefined ? "README status: missing" : `README heading: ${heading}`,
53
56
  ];
54
57
  }
58
+ function collectJavaSourceFiles(projectDir) {
59
+ const javaFiles = [];
60
+ const visit = (relativeDir) => {
61
+ if (javaFiles.length >= EXISTING_CODE_SCAN_LIMIT) {
62
+ return;
63
+ }
64
+ const absoluteDir = join(projectDir, relativeDir);
65
+ if (!existsSync(absoluteDir)) {
66
+ return;
67
+ }
68
+ for (const entry of readdirSync(absoluteDir).sort()) {
69
+ const relativePath = `${relativeDir}/${entry}`;
70
+ const absolutePath = join(projectDir, relativePath);
71
+ const stat = statSync(absolutePath);
72
+ if (stat.isDirectory()) {
73
+ visit(relativePath);
74
+ continue;
75
+ }
76
+ if (stat.isFile() && entry.endsWith(".java")) {
77
+ javaFiles.push(relativePath);
78
+ }
79
+ }
80
+ };
81
+ for (const root of EXISTING_CODE_SCAN_ROOTS) {
82
+ visit(root);
83
+ }
84
+ return javaFiles;
85
+ }
86
+ function packageNameFromJavaFile(projectDir, relativePath) {
87
+ const match = /^package\s+([^;]+);/m.exec(readFileSync(join(projectDir, relativePath), "utf8"));
88
+ return match?.[1]?.trim();
89
+ }
90
+ function commonPackagePrefix(packages) {
91
+ if (packages.length === 0) {
92
+ return undefined;
93
+ }
94
+ const segments = packages[0]?.split(".") ?? [];
95
+ let prefixLength = segments.length;
96
+ for (const packageName of packages.slice(1)) {
97
+ const current = packageName.split(".");
98
+ while (prefixLength > 0 && segments.slice(0, prefixLength).join(".") !== current.slice(0, prefixLength).join(".")) {
99
+ prefixLength -= 1;
100
+ }
101
+ }
102
+ return prefixLength > 0 ? segments.slice(0, prefixLength).join(".") : undefined;
103
+ }
104
+ function layerNamesFromJavaFiles(files) {
105
+ const layerCandidates = new Set();
106
+ for (const file of files) {
107
+ for (const segment of file.split("/")) {
108
+ if (/^(presentation|application|domain|infrastructure|controller|service|repository|dto|web|global|config|exception)$/i.test(segment)) {
109
+ layerCandidates.add(segment);
110
+ }
111
+ }
112
+ }
113
+ return [...layerCandidates].sort();
114
+ }
115
+ function projectModeLines(projectDir) {
116
+ const javaFiles = collectJavaSourceFiles(projectDir);
117
+ if (javaFiles.length === 0) {
118
+ return [
119
+ "## Project Mode",
120
+ "",
121
+ "Mode: greenfield",
122
+ "",
123
+ "- Goal: create a consistent 0% -> 80% Java/Spring backend baseline for a new project.",
124
+ "- Use the Java/Spring backend baseline package flow when README/profile do not define an existing convention.",
125
+ "- Keep the baseline advisory: user requirements and explicit instructions still win.",
126
+ ];
127
+ }
128
+ const packages = javaFiles
129
+ .map((file) => packageNameFromJavaFile(projectDir, file))
130
+ .filter((packageName) => packageName !== undefined);
131
+ const packageRoot = commonPackagePrefix(packages);
132
+ const layers = layerNamesFromJavaFiles(javaFiles);
133
+ return [
134
+ "## Project Mode",
135
+ "",
136
+ "Mode: existing-code",
137
+ "",
138
+ `- Existing source files detected: ${javaFiles.length}`,
139
+ packageRoot === undefined ? "- Existing package root: unknown" : `- Existing package root: ${packageRoot}`,
140
+ layers.length === 0 ? "- Existing layer/style hints: none detected" : `- Existing layer/style hints: ${layers.join(", ")}`,
141
+ "- existing code wins over greenfield guidance: follow current package, naming, layer, repository, DTO, and domain style before introducing the baseline structure.",
142
+ "- If current code conflicts with profile guidance, record the conflict in this plan before implementation.",
143
+ ];
144
+ }
55
145
  function createPlanDraft(projectDir) {
56
146
  const policyOverlaySummary = policyOverlayLines(projectDir);
57
147
  return [
@@ -67,6 +157,8 @@ function createPlanDraft(projectDir) {
67
157
  ...profileSummaryLines(projectDir),
68
158
  ...(policyOverlaySummary.length > 0 ? ["", ...policyOverlaySummary] : []),
69
159
  "",
160
+ ...projectModeLines(projectDir),
161
+ "",
70
162
  "## Architecture / Technology Plan",
71
163
  "",
72
164
  "- [ ] 요구사항의 핵심 유스케이스를 README 기준으로 정리한다.",
@@ -93,118 +185,6 @@ function createPlanDraft(projectDir) {
93
185
  "",
94
186
  ].join("\n");
95
187
  }
96
- function createImplementationReportTemplate(projectDir) {
97
- return [
98
- "# Jaeki Implementation Report",
99
- "",
100
- "Role: `jaeki`",
101
- "Status: template",
102
- "",
103
- "## Inputs",
104
- "",
105
- ...readmeLines(projectDir),
106
- "",
107
- "Plan source: `.persona/workflow/plan.md`",
108
- "",
109
- "## Read Coverage",
110
- "",
111
- "- README read method:",
112
- "- README ranges read:",
113
- "- Plan read method:",
114
- "- Plan ranges read:",
115
- "- Java role discovery method:",
116
- "- Java role files discovered:",
117
- "- Java role files read:",
118
- "- Unread ranges:",
119
- "- Read evidence notes:",
120
- "",
121
- "## Implemented Files",
122
- "",
123
- "- [ ] 작성/수정한 production files",
124
- "- [ ] 작성/수정한 configuration files",
125
- "- [ ] 작성/수정한 test files",
126
- "",
127
- "## Verification",
128
- "",
129
- "- [ ] `npx ph bearshell gradle test`",
130
- "- [ ] `npx ph bearshell gradle build`",
131
- "- [ ] 실행 가능한 Spring Boot 앱에서 `:bootJar SKIPPED`가 나오면 build 통과로 기록하지 않는다.",
132
- "- [ ] `bootJar`가 실패하면 `bootJar`를 끄지 말고 Spring Boot plugin / Gradle wrapper / JDK toolchain 호환성을 맞춘다.",
133
- "- [ ] 실행 가능한 Spring Boot 앱이면 `npx ph bearshell --shell 'gradle bootRun --args=\"--server.port=<port>\"'`",
134
- "- [ ] raw shell을 직접 썼다면 `npx ph bearshell`을 쓰지 못한 이유를 기록한다.",
135
- "",
136
- "## Manual QA",
137
- "",
138
- "- [ ] HTTP happy path를 curl 또는 동등한 HTTP client로 실행했다.",
139
- "- [ ] HTTP failure path를 curl 또는 동등한 HTTP client로 실행했다.",
140
- "- [ ] Manual QA가 불가능하면 사유와 stderr/핵심 로그를 기록한다.",
141
- "",
142
- "## Status Lifecycle",
143
- "",
144
- "- 채운 뒤에는 `npx ph plan --report-filled implementation`을 실행한다.",
145
- "",
146
- "## Notes",
147
- "",
148
- "- 구현 중 바뀐 결정:",
149
- "- 남은 한계:",
150
- "",
151
- "## Continuation",
152
- "",
153
- "- 중간에 멈추면 이 섹션을 채우고 완료했다고 말하지 않는다.",
154
- "- 마지막으로 완료한 요구사항/파일:",
155
- "- 남은 README/plan 범위:",
156
- "- 남은 구현 범위:",
157
- "- 다음에 이어서 실행할 명령/작업:",
158
- "",
159
- ].join("\n");
160
- }
161
- function createReviewReportTemplate(projectDir) {
162
- return [
163
- "# Roach Review Report",
164
- "",
165
- "Role: `roach`",
166
- "Status: template",
167
- "",
168
- "## Inputs",
169
- "",
170
- ...readmeLines(projectDir),
171
- "",
172
- "Plan source: `.persona/workflow/plan.md`",
173
- "Implementation report: `.persona/workflow/implementation-report.md`",
174
- "",
175
- "## Requirements Check",
176
- "",
177
- "- [ ] README/plan read method와 ranges가 implementation report에 남아 있다.",
178
- "- [ ] README 요구사항이 구현 결과와 대응된다.",
179
- "- [ ] 미구현 요구사항이 있으면 명시한다.",
180
- "",
181
- "## Boundary Review",
182
- "",
183
- "- [ ] Controller는 HTTP request/response와 Service 위임만 담당한다.",
184
- "- [ ] Application Service는 use-case 흐름만 조율한다.",
185
- "- [ ] Repository port는 domain에 있고 구현체는 infrastructure에 있다.",
186
- "- [ ] Request/Response DTO와 Command/Result DTO 경계가 분리된다.",
187
- "- [ ] Domain model은 자신의 상태 판단/행동을 스스로 가진다.",
188
- "",
189
- "## Verification Review",
190
- "",
191
- "- [ ] `npx ph bearshell gradle test` 결과를 확인했다.",
192
- "- [ ] `npx ph bearshell gradle build` 결과를 확인했다.",
193
- "- [ ] 실행 가능한 Spring Boot 앱에서 `:bootJar SKIPPED` 없이 build가 통과했는지 확인했다.",
194
- "- [ ] 실행 가능한 Spring Boot 앱이면 `npx ph bearshell --shell 'gradle bootRun --args=\"--server.port=<port>\"'` 결과를 확인했다.",
195
- "- [ ] HTTP happy path / failure path manual QA evidence를 확인했다.",
196
- "",
197
- "## Status Lifecycle",
198
- "",
199
- "- 채운 뒤에는 `npx ph plan --report-filled review`를 실행한다.",
200
- "",
201
- "## Remaining Limits",
202
- "",
203
- "- product-quality 보증이 아닌 smoke/review evidence로 남긴다.",
204
- "- 남은 리스크:",
205
- "",
206
- ].join("\n");
207
- }
208
188
  function existingWorkflowPaths(projectDir) {
209
189
  return [PLAN_PATH, IMPLEMENTATION_REPORT_PATH, REVIEW_REPORT_PATH].filter((path) => existsSync(join(projectDir, path)));
210
190
  }
@@ -229,8 +209,9 @@ export function initializeWorkflowPlan(options = {}, force = false) {
229
209
  }
230
210
  mkdirSync(workflowDir, { recursive: true });
231
211
  writeFileSync(planPath, createPlanDraft(projectDir));
232
- writeFileSync(implementationReportPath, createImplementationReportTemplate(projectDir));
233
- writeFileSync(reviewReportPath, createReviewReportTemplate(projectDir));
212
+ const inputLines = readmeLines(projectDir);
213
+ writeFileSync(implementationReportPath, createImplementationReportTemplate(inputLines));
214
+ writeFileSync(reviewReportPath, createReviewReportTemplate(inputLines));
234
215
  return planPath;
235
216
  }
236
217
  //# sourceMappingURL=plan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/cli/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAE,gCAAgC,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAA;AAI/G,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,2BAA2B,CAAA;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,4CAA4C,CAAA;AACtF,MAAM,CAAC,MAAM,kBAAkB,GAAG,oCAAoC,CAAA;AACtE,MAAM,WAAW,GAAG,WAAW,CAAA;AAE/B,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IAChD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QACxC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAkB;IAC7C,MAAM,OAAO,GAAG,gCAAgC,CAAC,UAAU,CAAC,CAAA;IAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO;QACL,cAAc;QACd,aAAa;QACb,EAAE;QACF,YAAY;QACZ,kDAAkD;QAClD,kCAAkC;QAClC,oDAAoD;KACrD,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC,YAAY,CAAA;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB;IACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAC7C,OAAO;QACL,0BAA0B,WAAW,IAAI;QACzC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,mBAAmB,OAAO,EAAE;KAChF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB;IACzC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAC3D,OAAO;QACL,+BAA+B;QAC/B,EAAE;QACF,mBAAmB;QACnB,eAAe;QACf,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,WAAW,CAAC,UAAU,CAAC;QAC1B,EAAE;QACF,GAAG,mBAAmB,CAAC,UAAU,CAAC;QAClC,GAAG,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,EAAE;QACF,mCAAmC;QACnC,EAAE;QACF,yCAAyC;QACzC,2CAA2C;QAC3C,8BAA8B;QAC9B,yDAAyD;QACzD,8CAA8C;QAC9C,EAAE;QACF,cAAc;QACd,EAAE;QACF,0BAA0B;QAC1B,0CAA0C;QAC1C,iCAAiC;QACjC,yBAAyB;QACzB,gCAAgC;QAChC,EAAE;QACF,eAAe;QACf,EAAE;QACF,0EAA0E;QAC1E,uCAAuC;QACvC,wGAAwG;QACxG,iEAAiE;QACjE,wDAAwD;QACxD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,kCAAkC,CAAC,UAAkB;IAC5D,OAAO;QACL,+BAA+B;QAC/B,EAAE;QACF,eAAe;QACf,kBAAkB;QAClB,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,WAAW,CAAC,UAAU,CAAC;QAC1B,EAAE;QACF,0CAA0C;QAC1C,EAAE;QACF,kBAAkB;QAClB,EAAE;QACF,uBAAuB;QACvB,uBAAuB;QACvB,qBAAqB;QACrB,qBAAqB;QACrB,+BAA+B;QAC/B,+BAA+B;QAC/B,yBAAyB;QACzB,kBAAkB;QAClB,wBAAwB;QACxB,EAAE;QACF,sBAAsB;QACtB,EAAE;QACF,+BAA+B;QAC/B,kCAAkC;QAClC,yBAAyB;QACzB,EAAE;QACF,iBAAiB;QACjB,EAAE;QACF,sCAAsC;QACtC,uCAAuC;QACvC,0EAA0E;QAC1E,sGAAsG;QACtG,0GAA0G;QAC1G,6DAA6D;QAC7D,EAAE;QACF,cAAc;QACd,EAAE;QACF,uDAAuD;QACvD,yDAAyD;QACzD,gDAAgD;QAChD,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,8DAA8D;QAC9D,EAAE;QACF,UAAU;QACV,EAAE;QACF,eAAe;QACf,UAAU;QACV,EAAE;QACF,iBAAiB;QACjB,EAAE;QACF,oCAAoC;QACpC,sBAAsB;QACtB,sBAAsB;QACtB,aAAa;QACb,sBAAsB;QACtB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,0BAA0B,CAAC,UAAkB;IACpD,OAAO;QACL,uBAAuB;QACvB,EAAE;QACF,eAAe;QACf,kBAAkB;QAClB,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,WAAW,CAAC,UAAU,CAAC;QAC1B,EAAE;QACF,0CAA0C;QAC1C,qEAAqE;QACrE,EAAE;QACF,uBAAuB;QACvB,EAAE;QACF,sEAAsE;QACtE,iCAAiC;QACjC,2BAA2B;QAC3B,EAAE;QACF,oBAAoB;QACpB,EAAE;QACF,4DAA4D;QAC5D,+CAA+C;QAC/C,4DAA4D;QAC5D,0DAA0D;QAC1D,4CAA4C;QAC5C,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,gDAAgD;QAChD,iDAAiD;QACjD,uEAAuE;QACvE,oHAAoH;QACpH,gEAAgE;QAChE,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,sDAAsD;QACtD,EAAE;QACF,qBAAqB;QACrB,EAAE;QACF,sDAAsD;QACtD,WAAW;QACX,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB;IAC/C,OAAO,CAAC,SAAS,EAAE,0BAA0B,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AACzH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAuB,EAAE,EAAE,KAAK,GAAG,KAAK;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,YAAY,GAAG,8BAA8B,CAAC,UAAU,CAAC,CAAA;IAC/D,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,IAAI,cAAc,CACtB;YACE,8CAA8C;YAC9C,YAAY,CAAC,OAAO;YACpB,2DAA2D;YAC3D,yDAAyD;SAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IAC5C,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAA;IAC7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;IAE7D,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IACvD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,IAAI,cAAc,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACpH,CAAC;IAED,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAA;IACpD,aAAa,CAAC,wBAAwB,EAAE,kCAAkC,CAAC,UAAU,CAAC,CAAC,CAAA;IACvF,aAAa,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC,CAAA;IACvE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/cli/plan.ts"],"names":[],"mappings":"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"}
@@ -98,6 +98,11 @@ export function passedImplementOutput() {
98
98
  "4. Continue 220-line ranges until the README line count is covered.",
99
99
  "5. Record README ranges read in `.persona/workflow/implementation-report.md`.",
100
100
  "",
101
+ "Project mode:",
102
+ "- If existing Java/Spring source files already exist, discover their package/layer/naming/repository/DTO/domain style first.",
103
+ "- existing code wins over greenfield guidance: match the current project before introducing the baseline package flow.",
104
+ "- If no source files exist, use the Java/Spring greenfield 0% -> 80% baseline.",
105
+ "",
101
106
  "Required context:",
102
107
  "- README.md",
103
108
  "- .persona/project-profile.jsonc",
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-output.js","sourceRoot":"","sources":["../../src/cli/workflow-output.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,0BAA0B;IACxC,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE;YACN,kCAAkC;YAClC,EAAE;YACF,gCAAgC;YAChC,EAAE;YACF,qGAAqG;YACrG,8EAA8E;YAC9E,EAAE;YACF,YAAY;YACZ,iBAAiB;YACjB,8BAA8B;YAC9B,8CAA8C;YAC9C,EAAE;YACF,QAAQ;YACR,iBAAiB;YACjB,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACnB,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B,EAAE,OAA0B;IACxF,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,EAAE;QACV,MAAM,EAAE;YACN,0BAA0B,SAAS,EAAE;YACrC,EAAE;YACF,iBAAiB;YACjB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;YACzC,EAAE;YACF,wFAAwF;SACzF,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;KACpB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAA4B,EAC5B,UAA8B,EAC9B,OAA0B;IAE1B,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,EAAE;QACV,MAAM,EAAE;YACN,YAAY,MAAM,YAAY,UAAU,EAAE;YAC1C,EAAE;YACF,iBAAiB;YACjB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC;YACzC,EAAE;YACF,6FAA6F;SAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;KACpB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAA8B;IAC9D,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE;YACN,mCAAmC,UAAU,EAAE;YAC/C,EAAE;YACF,oBAAoB;YACpB,EAAE;YACF,6BAA6B;YAC7B,iJAAiJ;YACjJ,EAAE;YACF,mCAAmC;YACnC,8BAA8B;YAC9B,8GAA8G;YAC9G,wGAAwG;YACxG,wFAAwF;YACxF,sCAAsC;YACtC,mDAAmD;YACnD,uDAAuD;YACvD,sDAAsD;YACtD,sEAAsE;YACtE,+CAA+C;YAC/C,6CAA6C;YAC7C,mFAAmF;YACnF,EAAE;YACF,QAAQ;YACR,2BAA2B;YAC3B,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACnB,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE;YACN,oCAAoC;YACpC,EAAE;YACF,kCAAkC;YAClC,EAAE;YACF,2FAA2F;YAC3F,EAAE;YACF,kDAAkD;YAClD,iDAAiD;YACjD,6DAA6D;YAC7D,oHAAoH;YACpH,qEAAqE;YACrE,+EAA+E;YAC/E,EAAE;YACF,mBAAmB;YACnB,aAAa;YACb,kCAAkC;YAClC,qBAAqB;YACrB,6BAA6B;YAC7B,EAAE;YACF,qGAAqG;YACrG,4GAA4G;YAC5G,EAAE;YACF,2BAA2B;YAC3B,sCAAsC;YACtC,2MAA2M;YAC3M,gHAAgH;YAChH,8JAA8J;YAC9J,qHAAqH;YACrH,mDAAmD;YACnD,8KAA8K;YAC9K,sDAAsD;YACtD,sEAAsE;YACtE,+CAA+C;YAC/C,6CAA6C;YAC7C,mFAAmF;YACnF,EAAE;YACF,QAAQ;YACR,2BAA2B;YAC3B,2EAA2E;SAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACnB,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAA8B;IAC/D,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE;YACN,oCAAoC,UAAU,EAAE;YAChD,EAAE;YACF,qBAAqB;YACrB,8DAA8D;YAC9D,EAAE;YACF,OAAO;YACP,yEAAyE;YACzE,EAAE;YACF,QAAQ;YACR,2BAA2B;YAC3B,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACnB,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B;IAC5D,MAAM,QAAQ,GACZ,SAAS,KAAK,WAAW;QACvB,CAAC,CAAC,mGAAmG;QACrG,CAAC,CAAC,8DAA8D,CAAA;IACpE,OAAO;QACL,MAAM,EAAE,CAAC;QACT,MAAM,EAAE;YACN,mCAAmC,SAAS,EAAE;YAC9C,EAAE;YACF,oBAAoB;YACpB,QAAQ;YACR,EAAE;YACF,QAAQ;YACR,sCAAsC;YACtC,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACnB,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"workflow-output.js","sourceRoot":"","sources":["../../src/cli/workflow-output.ts"],"names":[],"mappings":"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"}