persona-harness 0.3.8-alpha.2 → 0.3.8-alpha.4
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/.persona/rules/backend/gradle-bootstrap.md +2 -2
- package/.persona/rules/backend/java-backend-bootstrap.md +1 -1
- package/CHANGELOG.md +64 -0
- package/README.ja.md +3 -4
- package/README.ko.md +13 -9
- package/README.md +17 -12
- package/README.zh-cn.md +3 -4
- package/dist/cli/backend-shape-report-status.d.ts +1 -0
- package/dist/cli/backend-shape-report-status.js +20 -0
- package/dist/cli/backend-shape-report-status.js.map +1 -0
- package/dist/cli/backend-shape.d.ts +2 -0
- package/dist/cli/backend-shape.js +111 -16
- package/dist/cli/backend-shape.js.map +1 -1
- package/dist/cli/bearshell.js +6 -0
- package/dist/cli/bearshell.js.map +1 -1
- package/dist/cli/bootstrap.js +15 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/cli-usage.js +2 -2
- package/dist/cli/cli-usage.js.map +1 -1
- package/dist/cli/doctor-command-detection.d.ts +12 -0
- package/dist/cli/doctor-command-detection.js +110 -0
- package/dist/cli/doctor-command-detection.js.map +1 -0
- package/dist/cli/doctor.d.ts +5 -0
- package/dist/cli/doctor.js +26 -26
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +4 -41
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-output.js +11 -9
- package/dist/cli/init-output.js.map +1 -1
- package/dist/cli/java-role-read-coverage.d.ts +7 -0
- package/dist/cli/java-role-read-coverage.js +152 -0
- package/dist/cli/java-role-read-coverage.js.map +1 -0
- package/dist/cli/plan-next.js +12 -0
- package/dist/cli/plan-next.js.map +1 -1
- package/dist/cli/plan-prompts.js +10 -2
- package/dist/cli/plan-prompts.js.map +1 -1
- package/dist/cli/plan.js +5 -1
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/stack-alignment-profile.d.ts +9 -0
- package/dist/cli/stack-alignment-profile.js +79 -0
- package/dist/cli/stack-alignment-profile.js.map +1 -0
- package/dist/cli/stack-alignment.d.ts +8 -0
- package/dist/cli/stack-alignment.js +164 -0
- package/dist/cli/stack-alignment.js.map +1 -0
- package/dist/cli/workflow-command.js +30 -2
- package/dist/cli/workflow-command.js.map +1 -1
- package/dist/cli/workflow-finish-reasons.d.ts +3 -0
- package/dist/cli/workflow-finish-reasons.js +28 -0
- package/dist/cli/workflow-finish-reasons.js.map +1 -0
- package/dist/cli/workflow-output.js +16 -9
- package/dist/cli/workflow-output.js.map +1 -1
- package/dist/cli/workflow-status.d.ts +3 -0
- package/dist/cli/workflow-status.js +14 -43
- package/dist/cli/workflow-status.js.map +1 -1
- package/dist/cli/workflow-ticket-summary.js +7 -1
- package/dist/cli/workflow-ticket-summary.js.map +1 -1
- package/docs/current/persona-harness-detailed-usage.md +16 -13
- package/docs/current/release/v0.3.2-alpha.2-release-notes.md +1 -1
- package/docs/current/release/v0.3.3-alpha.0-release-notes.md +1 -0
- package/docs/current/release/v0.3.4-alpha.0-release-notes.md +1 -0
- package/docs/current/release/v0.3.5-alpha.0-release-notes.md +5 -5
- package/docs/current/release/v0.3.8-alpha.3-release-notes.md +106 -0
- package/docs/current/release/v0.3.8-alpha.4-release-notes.md +98 -0
- package/package.json +1 -1
- package/packages/shared-skills/skills/programming/references/java/README.md +4 -2
- package/packages/shared-skills/skills/programming/references/java/backend.md +2 -2
- package/packages/shared-skills/skills/programming/references/java/technology-seams.md +3 -1
|
@@ -18,9 +18,9 @@ enforcement: inject_only
|
|
|
18
18
|
|
|
19
19
|
# Gradle Bootstrap
|
|
20
20
|
|
|
21
|
-
- Gradle build file에서는 Java/Spring Boot backend 기준을 유지하고 Maven `pom.xml`을 생성하지 않는다.
|
|
21
|
+
- Gradle build file에서는 Java/Spring Boot backend 기준을 유지하고 Maven `pom.xml`을 생성하지 않는다. Hard rule: `gradle test`, `gradle build`, `bootRun` 결과를 Node/JS/Python/shell shim이나 `tools/gradle-shim.js` 같은 fake Gradle script로 흉내 내지 않는다. Gradle wrapper와 system Gradle이 모두 없으면 성공처럼 말하지 말고 toolchain/environment issue인 환경 문제로 보고한다.
|
|
22
22
|
- `settings.gradle` 또는 `settings.gradle.kts`는 하나의 Spring Boot application root project 이름을 명확히 둔다.
|
|
23
|
-
- `build.gradle` 또는 `build.gradle.kts`는 Spring Boot backend를 만들기 위한 최소 plugin/dependency/source compatibility만 다루며, 호환되는 Spring Boot plugin / Gradle launcher or wrapper / JDK toolchain 조합을 먼저 선택하고 그 선택을 build file에 명시한다. 가능하면 Gradle wrapper(`gradlew`, `gradlew.bat`, `gradle/wrapper/`)를 포함해 `./gradlew test`, `./gradlew build`, `./gradlew bootRun
|
|
23
|
+
- Default guidance: `build.gradle` 또는 `build.gradle.kts`는 Spring Boot backend를 만들기 위한 최소 plugin/dependency/source compatibility만 다루며, 호환되는 Spring Boot plugin / Gradle launcher or wrapper / JDK toolchain 조합을 먼저 선택하고 그 선택을 build file에 명시한다. system Gradle이 없으면 wrapper를 우선 생성/사용하며, 가능하면 Gradle wrapper(`gradlew`, `gradlew.bat`, `gradle/wrapper/`)를 포함해 macOS/Linux `./gradlew test`, `./gradlew build`, `./gradlew bootRun`, Windows에서는 `./gradlew.bat test` 또는 `gradlew.bat test`로 검증할 수 있게 한다. JUnit Platform 실행에는 `testRuntimeOnly "org.junit.platform:junit-platform-launcher"` 또는 동등한 runtime launcher를 포함한다.
|
|
24
24
|
- 실행 가능한 Spring Boot app에서는 `bootJar`를 끄지 않는다. `tasks.named("bootJar") { enabled = false }` 또는 동등한 설정은 plain Java library로 명시된 프로젝트가 아니면 사용하지 않는다. `gradle build` 출력에 `:bootJar SKIPPED`가 나오면 실행 가능한 Spring Boot app 검증을 통과한 것으로 기록하지 않는다. `bootJar`가 `CopyProcessingSpec.getDirMode()` 같은 호환성 오류로 실패하면, `bootJar`를 비활성화하지 말고 Spring Boot plugin을 현재 Gradle과 호환되는 line으로 올리거나 Gradle wrapper를 해당 plugin이 지원하는 line으로 고정한다.
|
|
25
25
|
- 로컬 launcher가 Gradle 9.x이면 Spring Boot 3.3.x 같은 오래된 plugin line을 기본으로 섞지 않는다. 호환 여부가 불명확하면 executable app 기준으로 `gradle test`, `gradle build`, `gradle bootRun`이 모두 통과하는 line을 선택한다.
|
|
26
26
|
- build 설정은 presentation/application/domain/infrastructure package 구조를 대신하지 않는다.
|
|
@@ -14,7 +14,7 @@ enforcement: inject_only
|
|
|
14
14
|
|
|
15
15
|
# Java Backend Bootstrap
|
|
16
16
|
|
|
17
|
-
- 0-start 요구사항을 먼저 backend product code shape 계획으로 변환하고 Gradle 기반 Spring Boot backend project로 구현한다. Maven 파일은 생성하지 않는다.
|
|
17
|
+
- 0-start 요구사항을 먼저 backend product code shape 계획으로 변환하고 Gradle 기반 Spring Boot backend project로 구현한다. Maven 파일은 생성하지 않는다. Hard rule: Gradle 없는 환경에서 Node/JS/Python/shell shim 또는 `tools/gradle-shim.js` 같은 fake Gradle script로 `gradle test`, `gradle build`, `bootRun`을 흉내 내지 않는다. Gradle wrapper와 system Gradle이 모두 없으면 성공처럼 말하지 말고 toolchain/environment issue로 보고한다. Default guidance: Gradle project라면 `gradlew`, `gradlew.bat`, `gradle/wrapper/`를 만들거나 실제 Gradle launcher 사용 가능성을 확인하고, system Gradle이 없으면 wrapper를 우선 사용한다. 검증 명령은 macOS/Linux `./gradlew test`, Windows에서는 `./gradlew.bat test` 또는 `gradlew.bat test`를 우선 예시로 든다. Project-choice: Spring/Gradle/JPA/database profile이면 HttpServer/InMemory/Node shim으로 우회하지 말고 실제 Spring Boot/Gradle/JPA 구조를 만들며, DB/JPA/Flyway 선택은 profile 또는 project-choice를 따른다.
|
|
18
18
|
- 구현 전에 package structure plan을 작성한다. root package 바로 아래에 `global`과 `root/<domain>`을 같은 depth로 두고, `feature/features/module/modules` 같은 wrapper package를 추가하지 않는다.
|
|
19
19
|
- 도메인 package 내부는 presentation/application/domain/infrastructure 흐름을 기본으로 두고 `root/<domain>/presentation`, `root/<domain>/application`, `root/<domain>/domain`, `root/<domain>/infrastructure`로 배치한다.
|
|
20
20
|
- `root/<domain>/controller`, `root/<domain>/service`, `root/<domain>/repository`, `root/<domain>/dto` 또는 `book/controller`, `book/service`, `book/repository`, `book/dto/request` 같은 역할명 package로 대체하지 않는다. Controller는 `presentation`, Service는 `application`, Repository interface는 `domain`, Repository 구현체는 `infrastructure`, HTTP DTO는 `presentation/dto`, Command/Result는 `application/dto`에 둔다.
|
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,70 @@ 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.8-alpha.4] - 2026-06-25
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Clarified pending review continuation guidance so template review reports and pending `req-*` tickets keep agents on the continuation path instead of allowing premature completion claims.
|
|
16
|
+
- Updated Java/Spring verification guidance to prefer a real Gradle wrapper first, then system Gradle only when appropriate, without suggesting fake Gradle shim workarounds.
|
|
17
|
+
- Reduced backend-shape false positives for repository ports, repository adapters, and flat DTO names such as `TaskRepository`, `JdbcTaskRepository implements TaskRepository`, `CreateTaskRequest`, and `TaskResponse`.
|
|
18
|
+
- Normalized backend-shape path handling so Windows path separators do not hide generated Java evidence.
|
|
19
|
+
|
|
20
|
+
### External Smoke
|
|
21
|
+
|
|
22
|
+
- Windows backend-shape fixture-v2 recheck succeeded from a local current `npm pack` install at HEAD `31fb91a` with package version `0.3.8-alpha.3`.
|
|
23
|
+
- `npx ph review backend-shape` exited 0 and generated a backend-shape report.
|
|
24
|
+
- The report passed:
|
|
25
|
+
- Domain repository port evidence with `TaskRepository.java`;
|
|
26
|
+
- Infrastructure repository adapter evidence with `JdbcTaskRepository.java`;
|
|
27
|
+
- DTO boundary evidence with `CreateTaskRequest.java` and `TaskResponse.java`.
|
|
28
|
+
- The previous Windows path separator false positive was not reproduced.
|
|
29
|
+
- Remaining WARN items were limited to the narrow fixture shape: missing application/controller/service examples and missing Gradle runtime. Those are outside this recheck's success criteria.
|
|
30
|
+
- This release is still workflow/check/report guidance hardening. It does not certify generated app product quality, and full OpenCode end-to-end implementation quality remains a separate smoke target.
|
|
31
|
+
|
|
32
|
+
### Verification
|
|
33
|
+
|
|
34
|
+
- `npm test` passed: scope/docs diagnostics PASS, 55 files, 342 tests.
|
|
35
|
+
- `npm run typecheck` passed.
|
|
36
|
+
- `npm run build` passed.
|
|
37
|
+
- `npm pack --dry-run` passed for `persona-harness@0.3.8-alpha.4` with 329 files.
|
|
38
|
+
- `npm run check:docs` passed.
|
|
39
|
+
|
|
40
|
+
## [0.3.8-alpha.3] - 2026-06-25
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- Added Windows-aware doctor command detection so `ph doctor` can report OpenCode runtime readiness more reliably on Windows.
|
|
45
|
+
- Added stack-alignment checks for generated backend projects and made `ph workflow finish implement` block on stack mismatch.
|
|
46
|
+
- Added Java role read coverage gating so implementation finish can require generated Controller, Service, Repository, DTO, Domain, and related Java files to have been read.
|
|
47
|
+
- Added backend-shape review reporting to summarize generated backend structure evidence.
|
|
48
|
+
- Added Windows-safe and vendor-safe bearshell/read/search guidance for workflow prompts.
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- Clarified `ph init` as the minimal harness/OpenCode integration step and `ph bootstrap backend` as the backend-ready bootstrap path.
|
|
53
|
+
- Strengthened Java guidance to forbid fake Gradle shims and HTTP-server/CommonJS style workarounds for Java/Spring backend targets.
|
|
54
|
+
- Bounded Windows search guidance to README/project files instead of unsafe recursive vendor scans.
|
|
55
|
+
|
|
56
|
+
### External Smoke
|
|
57
|
+
|
|
58
|
+
- Windows P0/P1 smoke was partially successful:
|
|
59
|
+
- doctor and runtime readiness passed;
|
|
60
|
+
- init/bootstrap output matched generated artifacts;
|
|
61
|
+
- `profileSummaryInjected` was confirmed;
|
|
62
|
+
- backend-shape report generation was observed;
|
|
63
|
+
- fake Gradle shim, `HttpServer`, and CommonJS workarounds were not observed.
|
|
64
|
+
- OpenCode full finish still timed out/continued with pending work, so full implementation completion and generated product quality are not certified.
|
|
65
|
+
- Windows vendor-safe bearshell search smoke succeeded for README-only `Select-String -Path README.md -Pattern TODO` guidance, output, and command execution; unsafe recursive/vendor search guidance was not observed.
|
|
66
|
+
|
|
67
|
+
### Verification
|
|
68
|
+
|
|
69
|
+
- `npm test` passed: scope/docs diagnostics PASS, 55 files, 337 tests.
|
|
70
|
+
- `npm run typecheck` passed.
|
|
71
|
+
- `npm run build` passed.
|
|
72
|
+
- `npm pack --dry-run` passed for `persona-harness@0.3.8-alpha.3` with 328 files.
|
|
73
|
+
- `npm run check:docs` passed.
|
|
74
|
+
|
|
11
75
|
## [0.3.8-alpha.2] - 2026-06-24
|
|
12
76
|
|
|
13
77
|
### Added
|
package/README.ja.md
CHANGED
|
@@ -60,8 +60,7 @@ Model ID は `provider/model` 形式です。例: `openai/gpt-5.4-mini-fast`.
|
|
|
60
60
|
```bash
|
|
61
61
|
npm install -D persona-harness@alpha
|
|
62
62
|
npx ph init
|
|
63
|
-
npx ph
|
|
64
|
-
npx ph plan --auto-accept
|
|
63
|
+
npx ph bootstrap backend
|
|
65
64
|
```
|
|
66
65
|
|
|
67
66
|
Persona Harness 自体を開発する場合は local install を使います。
|
|
@@ -69,8 +68,7 @@ Persona Harness 自体を開発する場合は local install を使います。
|
|
|
69
68
|
```bash
|
|
70
69
|
npm install -D /absolute/path/to/persona-harness
|
|
71
70
|
npx ph init
|
|
72
|
-
npx ph
|
|
73
|
-
npx ph plan --auto-accept
|
|
71
|
+
npx ph bootstrap backend
|
|
74
72
|
```
|
|
75
73
|
|
|
76
74
|
まず OpenCode に plan だけを作らせます。
|
|
@@ -126,6 +124,7 @@ opencode run --dir . --model <model> --dangerously-skip-permissions \
|
|
|
126
124
|
## 提供するもの
|
|
127
125
|
|
|
128
126
|
- `ph init`: `.persona/rules`, `.persona/harness.jsonc`, OpenCode plugin config を作成
|
|
127
|
+
- `ph bootstrap backend`: `AGENTS.md`, backend profile, policy overlay, accepted plan, report template を準備
|
|
129
128
|
- `ph intake --interactive`: backend planning 質問を行い `.persona/project-profile.jsonc` を作成
|
|
130
129
|
- `ph policy init`: company/personal backend policy overlay を作成
|
|
131
130
|
- `ph plan`: `blackbear` planning role 用 `.persona/workflow/plan.md` を作成
|
package/README.ko.md
CHANGED
|
@@ -64,8 +64,7 @@ opencode auth list
|
|
|
64
64
|
```bash
|
|
65
65
|
npm install -D persona-harness@alpha
|
|
66
66
|
npx ph init
|
|
67
|
-
npx ph
|
|
68
|
-
npx ph plan --auto-accept
|
|
67
|
+
npx ph bootstrap backend
|
|
69
68
|
```
|
|
70
69
|
|
|
71
70
|
Persona Harness 자체를 개발 중이면 local install을 사용합니다.
|
|
@@ -73,10 +72,13 @@ Persona Harness 자체를 개발 중이면 local install을 사용합니다.
|
|
|
73
72
|
```bash
|
|
74
73
|
npm install -D /absolute/path/to/persona-harness
|
|
75
74
|
npx ph init
|
|
76
|
-
npx ph
|
|
77
|
-
npx ph plan --auto-accept
|
|
75
|
+
npx ph bootstrap backend
|
|
78
76
|
```
|
|
79
77
|
|
|
78
|
+
`npx ph init`은 최소 설치/연동 단계입니다. `.persona/harness.jsonc`, `.persona/rules/`, `.opencode/opencode.json`, `.gitignore`만 준비하고, `AGENTS.md`, `.persona/project-profile.jsonc`, plan/report template은 만들지 않습니다.
|
|
79
|
+
|
|
80
|
+
backend-ready 상태가 필요하면 `npx ph bootstrap backend`를 실행합니다. 이 명령은 `AGENTS.md`, 기본 backend profile, policy overlay, accepted plan, implementation/review report template, harness/OpenCode config 상태를 준비합니다.
|
|
81
|
+
|
|
80
82
|
초기 설정 이후에는 사용자가 모든 명령어를 외울 필요가 없습니다. 먼저 OpenCode에게 계획만 완성하게 합니다.
|
|
81
83
|
|
|
82
84
|
```bash
|
|
@@ -84,18 +86,19 @@ opencode run --dir . --model <model> --dangerously-skip-permissions \
|
|
|
84
86
|
"$(npx ph plan --prompt)"
|
|
85
87
|
```
|
|
86
88
|
|
|
87
|
-
빠른 alpha smoke에서는
|
|
89
|
+
이미 `npx ph bootstrap backend`를 실행한 빠른 alpha smoke에서는 준비된 backend profile과 accepted plan을 확인할 수 있습니다.
|
|
88
90
|
|
|
89
91
|
```bash
|
|
90
92
|
npx ph doctor
|
|
91
|
-
npx ph
|
|
92
|
-
npx ph plan --auto-accept
|
|
93
|
+
npx ph workflow check
|
|
93
94
|
```
|
|
94
95
|
|
|
95
|
-
프로젝트 조건을 직접 정하고 싶으면
|
|
96
|
+
프로젝트 조건을 직접 정하고 싶으면 수동 profile 흐름을 사용합니다.
|
|
96
97
|
|
|
97
98
|
```bash
|
|
98
99
|
npx ph intake --interactive --force
|
|
100
|
+
# 또는 비대화형 기본 profile만 필요하면:
|
|
101
|
+
npx ph intake --default backend
|
|
99
102
|
npx ph policy init
|
|
100
103
|
npx ph plan
|
|
101
104
|
npx ph plan --accept
|
|
@@ -152,7 +155,8 @@ opencode run --dir . --model <model> --dangerously-skip-permissions \
|
|
|
152
155
|
## 제공하는 것
|
|
153
156
|
|
|
154
157
|
- 아래 명령어들은 사용자가 직접 외우는 CLI라기보다, OpenCode/Codex-style 세션에서 AI가 호출하기 쉽게 만든 workflow surface입니다.
|
|
155
|
-
- `ph init`: `.persona/rules`, `.persona/harness.jsonc`, OpenCode plugin config 설치
|
|
158
|
+
- `ph init`: `.persona/rules`, `.persona/harness.jsonc`, OpenCode plugin config, `.gitignore` 설치
|
|
159
|
+
- `ph bootstrap backend`: `AGENTS.md`, ready 기본 backend profile, policy overlay, accepted plan, report template, harness/OpenCode config 준비
|
|
156
160
|
- `ph intake`: 수정 가능한 draft backend profile 생성
|
|
157
161
|
- `ph intake --default backend`: 대화형 터미널 없이 ready 기본 backend profile 생성
|
|
158
162
|
- `ph intake --interactive`: backend planning 질문 후 `.persona/project-profile.jsonc` 생성
|
package/README.md
CHANGED
|
@@ -151,29 +151,34 @@ EOF
|
|
|
151
151
|
|
|
152
152
|
You can use a different domain. For cleaner feedback, avoid the older `reservation`, `roomescape`, or `book loan` examples when testing the current alpha.
|
|
153
153
|
|
|
154
|
-
## 4.
|
|
154
|
+
## 4. Choose The Setup Path
|
|
155
155
|
|
|
156
|
-
`npx ph init`
|
|
157
|
-
The interview writes `.persona/project-profile.jsonc`; that profile is the planning context used before implementation.
|
|
158
|
-
The interview requires an interactive terminal. If an AI/TUI non-TTY shell runs `npx ph init`, the harness installs files but stops before writing a default profile and points the agent to `npx ph bootstrap backend`.
|
|
156
|
+
`npx ph init` is the minimal install and OpenCode integration step. It installs `.persona/harness.jsonc`, `.persona/rules/`, `.opencode/opencode.json`, and `.gitignore` entries, then exits with next-step guidance.
|
|
159
157
|
|
|
160
|
-
|
|
158
|
+
`npx ph init` does not create `AGENTS.md`, `.persona/project-profile.jsonc`, policy overlay files, an accepted plan, or workflow report templates.
|
|
159
|
+
|
|
160
|
+
For the normal backend-ready external tester flow:
|
|
161
161
|
|
|
162
162
|
```bash
|
|
163
163
|
npx ph doctor
|
|
164
164
|
npx ph init
|
|
165
|
-
npx ph
|
|
166
|
-
npx ph plan --auto-accept
|
|
165
|
+
npx ph bootstrap backend
|
|
167
166
|
npx ph workflow check
|
|
168
167
|
```
|
|
169
168
|
|
|
170
|
-
|
|
169
|
+
`npx ph bootstrap backend` prepares the backend workflow for AI implementation. It fills missing `AGENTS.md`, `.persona/project-profile.jsonc`, policy overlay files, an accepted `.persona/workflow/plan.md`, implementation/review report templates, harness config, and OpenCode config.
|
|
170
|
+
|
|
171
|
+
If you want to choose the profile manually instead of using the backend-ready bootstrap path:
|
|
171
172
|
|
|
172
173
|
```bash
|
|
173
|
-
npx ph
|
|
174
|
+
npx ph intake --interactive
|
|
175
|
+
# or, without an interactive terminal:
|
|
176
|
+
npx ph intake --default backend
|
|
177
|
+
npx ph policy init
|
|
178
|
+
npx ph plan --auto-accept
|
|
174
179
|
```
|
|
175
180
|
|
|
176
|
-
Use
|
|
181
|
+
Use the bootstrap path for AI agent shells where interactive prompts are unreliable. Use the intake path when a human wants to choose project profile answers directly in a terminal.
|
|
177
182
|
|
|
178
183
|
If `.persona/project-profile.jsonc` is missing, draft, malformed, or incomplete, `ph plan` and `ph workflow implement` stop and ask for `ph intake` first. Before implementation, `npx ph workflow check` usually reports `WARN` because implementation and review reports are still templates. That is normal.
|
|
179
184
|
|
|
@@ -325,11 +330,11 @@ For generated code shape, look for:
|
|
|
325
330
|
|
|
326
331
|
These commands are intentionally visible so AI agents can call them from OpenCode/Codex-style sessions.
|
|
327
332
|
|
|
328
|
-
- `ph init`: installs `.persona/rules`, `.persona/harness.jsonc`, OpenCode plugin config, and
|
|
333
|
+
- `ph init`: installs `.persona/rules`, `.persona/harness.jsonc`, OpenCode plugin config, and `.gitignore` entries only.
|
|
329
334
|
- `ph intake`: creates an editable draft backend profile.
|
|
330
335
|
- `ph intake --default backend`: creates a ready default backend profile without an interactive terminal.
|
|
331
336
|
- `ph intake --interactive`: asks backend planning questions and writes `.persona/project-profile.jsonc`.
|
|
332
|
-
- `ph bootstrap backend`:
|
|
337
|
+
- `ph bootstrap backend`: backend-ready path that fills `AGENTS.md`, the default backend profile, policy overlay, accepted plan, report templates, harness config, and OpenCode config.
|
|
333
338
|
- `ph policy init`: creates company and personal backend policy overlay files.
|
|
334
339
|
- `ph plan`: creates `.persona/workflow/plan.md`.
|
|
335
340
|
- `ph plan --auto-accept`: creates workflow plan/report templates and marks the plan accepted for a fast smoke.
|
package/README.zh-cn.md
CHANGED
|
@@ -60,8 +60,7 @@ Model ID 使用 `provider/model` 格式,例如 `openai/gpt-5.4-mini-fast`.
|
|
|
60
60
|
```bash
|
|
61
61
|
npm install -D persona-harness@alpha
|
|
62
62
|
npx ph init
|
|
63
|
-
npx ph
|
|
64
|
-
npx ph plan --auto-accept
|
|
63
|
+
npx ph bootstrap backend
|
|
65
64
|
```
|
|
66
65
|
|
|
67
66
|
如果你正在开发 Persona Harness 本身,请使用 local install。
|
|
@@ -69,8 +68,7 @@ npx ph plan --auto-accept
|
|
|
69
68
|
```bash
|
|
70
69
|
npm install -D /absolute/path/to/persona-harness
|
|
71
70
|
npx ph init
|
|
72
|
-
npx ph
|
|
73
|
-
npx ph plan --auto-accept
|
|
71
|
+
npx ph bootstrap backend
|
|
74
72
|
```
|
|
75
73
|
|
|
76
74
|
先让 OpenCode 只完成计划:
|
|
@@ -126,6 +124,7 @@ opencode run --dir . --model <model> --dangerously-skip-permissions \
|
|
|
126
124
|
## 提供内容
|
|
127
125
|
|
|
128
126
|
- `ph init`: 安装 `.persona/rules`, `.persona/harness.jsonc`, OpenCode plugin config
|
|
127
|
+
- `ph bootstrap backend`: 准备 `AGENTS.md`, backend profile, policy overlay, accepted plan, report template
|
|
129
128
|
- `ph intake --interactive`: 询问 backend planning 问题并写入 `.persona/project-profile.jsonc`
|
|
130
129
|
- `ph policy init`: 创建 company/personal backend policy overlay
|
|
131
130
|
- `ph plan`: 创建 `blackbear` planning role 的 `.persona/workflow/plan.md`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function backendShapeReportStatus(projectDir: string): string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { BACKEND_SHAPE_REPORT_PATH } from "./backend-shape.js";
|
|
4
|
+
export function backendShapeReportStatus(projectDir) {
|
|
5
|
+
const reportPath = join(projectDir, BACKEND_SHAPE_REPORT_PATH);
|
|
6
|
+
if (!existsSync(reportPath)) {
|
|
7
|
+
return "missing (report-only; run `npx ph review backend-shape`)";
|
|
8
|
+
}
|
|
9
|
+
const report = readFileSync(reportPath, "utf8");
|
|
10
|
+
const warnCount = report.split(/\r?\n/).filter((line) => /\|\s*WARN\s*\|/.test(line)).length;
|
|
11
|
+
const failCount = report.split(/\r?\n/).filter((line) => /\|\s*FAIL\s*\|/.test(line)).length;
|
|
12
|
+
if (failCount > 0) {
|
|
13
|
+
return `FAIL findings: ${failCount}; WARN findings: ${warnCount}; see ${BACKEND_SHAPE_REPORT_PATH}`;
|
|
14
|
+
}
|
|
15
|
+
if (warnCount > 0) {
|
|
16
|
+
return `WARN findings: ${warnCount}; see ${BACKEND_SHAPE_REPORT_PATH}`;
|
|
17
|
+
}
|
|
18
|
+
return `PASS; see ${BACKEND_SHAPE_REPORT_PATH}`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=backend-shape-report-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-shape-report-status.js","sourceRoot":"","sources":["../../src/cli/backend-shape-report-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE9D,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAA;IAC9D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,0DAA0D,CAAA;IACnE,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5F,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IAC5F,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,kBAAkB,SAAS,oBAAoB,SAAS,SAAS,yBAAyB,EAAE,CAAA;IACrG,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,kBAAkB,SAAS,SAAS,yBAAyB,EAAE,CAAA;IACxE,CAAC;IACD,OAAO,aAAa,yBAAyB,EAAE,CAAA;AACjD,CAAC"}
|
|
@@ -2,5 +2,7 @@ import type { CliRunResult } from "./bearshell.js";
|
|
|
2
2
|
type BackendShapeOptions = {
|
|
3
3
|
readonly projectDir?: string;
|
|
4
4
|
};
|
|
5
|
+
export declare const BACKEND_SHAPE_REPORT_PATH = ".persona/workflow/backend-shape-report.md";
|
|
6
|
+
export declare function normalizeBackendShapePathForTest(filePath: string): string;
|
|
5
7
|
export declare function runBackendShapeReview(options?: BackendShapeOptions): CliRunResult;
|
|
6
8
|
export {};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
1
2
|
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
3
|
import { dirname, join, resolve } from "node:path";
|
|
3
4
|
import process from "node:process";
|
|
4
|
-
const
|
|
5
|
+
export const BACKEND_SHAPE_REPORT_PATH = ".persona/workflow/backend-shape-report.md";
|
|
6
|
+
const FAKE_SHIM_FILES = ["gradle-shim.js", join("tools", "gradle-shim.js")];
|
|
5
7
|
function listFiles(dirPath) {
|
|
6
8
|
if (!existsSync(dirPath)) {
|
|
7
9
|
return [];
|
|
@@ -22,40 +24,111 @@ function listFiles(dirPath) {
|
|
|
22
24
|
function relative(projectDir, filePath) {
|
|
23
25
|
return filePath.slice(projectDir.length + 1).replace(/\\/g, "/");
|
|
24
26
|
}
|
|
27
|
+
function normalizeBackendShapePath(filePath) {
|
|
28
|
+
return filePath.replace(/\\/g, "/");
|
|
29
|
+
}
|
|
30
|
+
export function normalizeBackendShapePathForTest(filePath) {
|
|
31
|
+
return normalizeBackendShapePath(filePath);
|
|
32
|
+
}
|
|
25
33
|
function hasPathPart(files, part) {
|
|
26
|
-
return files.some((filePath) => filePath.includes(`/${part}/`));
|
|
34
|
+
return files.some((filePath) => normalizeBackendShapePath(filePath).includes(`/${part}/`));
|
|
35
|
+
}
|
|
36
|
+
function hasAnyPathPart(filePath, parts) {
|
|
37
|
+
const normalized = normalizeBackendShapePath(filePath);
|
|
38
|
+
return parts.some((part) => normalized.includes(`/${part}/`));
|
|
39
|
+
}
|
|
40
|
+
function fileName(filePath) {
|
|
41
|
+
return normalizeBackendShapePath(filePath).split("/").at(-1) ?? filePath;
|
|
27
42
|
}
|
|
28
43
|
function javaFiles(projectDir) {
|
|
29
44
|
return listFiles(join(projectDir, "src", "main", "java")).filter((filePath) => filePath.endsWith(".java"));
|
|
30
45
|
}
|
|
46
|
+
function readBuildText(projectDir) {
|
|
47
|
+
return [join(projectDir, "build.gradle"), join(projectDir, "build.gradle.kts")]
|
|
48
|
+
.filter((buildPath) => existsSync(buildPath))
|
|
49
|
+
.map((buildPath) => readFileSync(buildPath, "utf8"))
|
|
50
|
+
.join("\n");
|
|
51
|
+
}
|
|
31
52
|
function pass(criterion, evidence) {
|
|
32
53
|
return { criterion, result: "PASS", evidence };
|
|
33
54
|
}
|
|
34
55
|
function warn(criterion, evidence) {
|
|
35
56
|
return { criterion, result: "WARN", evidence };
|
|
36
57
|
}
|
|
58
|
+
function springBootApp(projectDir, files) {
|
|
59
|
+
const buildText = readBuildText(projectDir);
|
|
60
|
+
const hasSpringBuildSignal = /org\.springframework\.boot|spring-boot-starter/.test(buildText);
|
|
61
|
+
const appFiles = files.filter((filePath) => /Application\.java$/.test(filePath));
|
|
62
|
+
const hasSpringBootApplication = appFiles.some((filePath) => readFileSync(filePath, "utf8").includes("@SpringBootApplication"));
|
|
63
|
+
return hasSpringBuildSignal && hasSpringBootApplication
|
|
64
|
+
? pass("Spring Boot app", appFiles.map((filePath) => relative(projectDir, filePath)).join(", "))
|
|
65
|
+
: warn("Spring Boot app", "missing Spring Boot build signal or @SpringBootApplication");
|
|
66
|
+
}
|
|
67
|
+
function gradleExecutableAvailable(projectDir) {
|
|
68
|
+
const result = spawnSync("gradle", ["--version"], { cwd: projectDir, encoding: "utf8", timeout: 3_000 });
|
|
69
|
+
return result.status === 0;
|
|
70
|
+
}
|
|
71
|
+
function gradleRuntime(projectDir) {
|
|
72
|
+
const hasWrapper = existsSync(join(projectDir, "gradlew")) || existsSync(join(projectDir, "gradlew.bat"));
|
|
73
|
+
if (hasWrapper) {
|
|
74
|
+
return pass("Gradle runtime", "Gradle wrapper present");
|
|
75
|
+
}
|
|
76
|
+
return gradleExecutableAvailable(projectDir)
|
|
77
|
+
? pass("Gradle runtime", "system Gradle executable available")
|
|
78
|
+
: warn("Gradle runtime", "Gradle wrapper missing and system Gradle unavailable");
|
|
79
|
+
}
|
|
37
80
|
function gradleOnly(projectDir) {
|
|
38
81
|
const hasGradle = existsSync(join(projectDir, "build.gradle")) || existsSync(join(projectDir, "build.gradle.kts"));
|
|
39
82
|
const hasSettings = existsSync(join(projectDir, "settings.gradle")) || existsSync(join(projectDir, "settings.gradle.kts"));
|
|
40
83
|
const hasMaven = existsSync(join(projectDir, "pom.xml"));
|
|
41
84
|
return hasGradle && hasSettings && !hasMaven ? pass("Gradle only", "Gradle files present and pom.xml absent") : warn("Gradle only", "Gradle/settings missing or pom.xml present");
|
|
42
85
|
}
|
|
86
|
+
function mavenAbsent(projectDir) {
|
|
87
|
+
return existsSync(join(projectDir, "pom.xml"))
|
|
88
|
+
? warn("Maven pom.xml absent", "pom.xml present")
|
|
89
|
+
: pass("Maven pom.xml absent", "pom.xml absent");
|
|
90
|
+
}
|
|
91
|
+
function fakeBuildShimAbsent(projectDir) {
|
|
92
|
+
const shims = FAKE_SHIM_FILES.filter((shimPath) => existsSync(join(projectDir, shimPath)));
|
|
93
|
+
return shims.length === 0 ? pass("Fake build shim absent", "no fake Gradle shim observed") : warn("Fake build shim absent", shims.join(", "));
|
|
94
|
+
}
|
|
43
95
|
function layerStructure(files) {
|
|
44
|
-
const required = [
|
|
45
|
-
|
|
46
|
-
|
|
96
|
+
const required = [
|
|
97
|
+
{ label: "presentation", parts: ["presentation", "controller", "web"] },
|
|
98
|
+
{ label: "application", parts: ["application", "service"] },
|
|
99
|
+
{ label: "domain", parts: ["domain"] },
|
|
100
|
+
{ label: "infrastructure", parts: ["infrastructure", "infra", "adapter", "persistence"] },
|
|
101
|
+
];
|
|
102
|
+
const missing = required.filter((entry) => !files.some((filePath) => hasAnyPathPart(filePath, entry.parts))).map((entry) => entry.label);
|
|
103
|
+
const evidence = required.map((entry) => `${entry.label}=${entry.parts.join("/")}`).join(", ");
|
|
104
|
+
return missing.length === 0 ? pass("Layer/package structure", evidence) : warn("Layer/package structure", `missing: ${missing.join(", ")}`);
|
|
105
|
+
}
|
|
106
|
+
function boundaryShape(files) {
|
|
107
|
+
const hasController = files.some((filePath) => filePath.endsWith("Controller.java") || filePath.includes("/presentation/"));
|
|
108
|
+
const hasService = files.some((filePath) => filePath.endsWith("Service.java") || filePath.includes("/application/"));
|
|
109
|
+
const hasRepository = files.some((filePath) => filePath.endsWith("Repository.java"));
|
|
110
|
+
const hasDto = files.some((filePath) => filePath.includes("/dto/"));
|
|
111
|
+
const hasDomain = files.some((filePath) => filePath.includes("/domain/") && !filePath.endsWith("Repository.java"));
|
|
112
|
+
const missing = [
|
|
113
|
+
...(!hasController ? ["Controller"] : []),
|
|
114
|
+
...(!hasService ? ["Service"] : []),
|
|
115
|
+
...(!hasRepository ? ["Repository"] : []),
|
|
116
|
+
...(!hasDto ? ["DTO"] : []),
|
|
117
|
+
...(!hasDomain ? ["Domain"] : []),
|
|
118
|
+
];
|
|
119
|
+
return missing.length === 0 ? pass("Controller/Service/Repository/DTO/Domain boundary", "role files observed") : warn("Controller/Service/Repository/DTO/Domain boundary", `missing: ${missing.join(", ")}`);
|
|
47
120
|
}
|
|
48
121
|
function repositoryPort(projectDir, files) {
|
|
49
|
-
const ports = files.filter((filePath) => filePath
|
|
122
|
+
const ports = files.filter((filePath) => hasPathPart([filePath], "domain") && filePath.endsWith("Repository.java"));
|
|
50
123
|
return ports.length > 0 ? pass("Domain repository port", ports.map((filePath) => relative(projectDir, filePath)).join(", ")) : warn("Domain repository port", "no domain *Repository.java");
|
|
51
124
|
}
|
|
52
125
|
function repositoryAdapter(projectDir, files) {
|
|
53
126
|
const repositoryPorts = files
|
|
54
|
-
.filter((filePath) => filePath
|
|
55
|
-
.map((filePath) => filePath
|
|
127
|
+
.filter((filePath) => hasPathPart([filePath], "domain") && filePath.endsWith("Repository.java"))
|
|
128
|
+
.map((filePath) => fileName(filePath).replace(/\.java$/, ""))
|
|
56
129
|
.filter((name) => name !== undefined);
|
|
57
130
|
const adapters = files.filter((filePath) => {
|
|
58
|
-
if (!filePath
|
|
131
|
+
if (!hasAnyPathPart(filePath, ["infrastructure", "infra", "adapter", "persistence"])) {
|
|
59
132
|
return false;
|
|
60
133
|
}
|
|
61
134
|
if (filePath.endsWith("Repository.java")) {
|
|
@@ -64,7 +137,7 @@ function repositoryAdapter(projectDir, files) {
|
|
|
64
137
|
const content = readFileSync(filePath, "utf8");
|
|
65
138
|
return repositoryPorts.some((port) => new RegExp(`\\bimplements\\s+[\\w\\s,]*\\b${port}\\b`).test(content));
|
|
66
139
|
});
|
|
67
|
-
return adapters.length > 0 ? pass("Infrastructure repository adapter", adapters.map((filePath) => relative(projectDir, filePath)).join(", ")) : warn("Infrastructure repository adapter", "no infrastructure *Repository.java or *Repository implementation");
|
|
140
|
+
return adapters.length > 0 ? pass("Infrastructure repository adapter", adapters.map((filePath) => relative(projectDir, filePath)).join(", ")) : warn("Infrastructure repository adapter", "no infrastructure/infra *Repository.java or *Repository implementation");
|
|
68
141
|
}
|
|
69
142
|
function serviceStorage(projectDir, files) {
|
|
70
143
|
const serviceFiles = files.filter((filePath) => filePath.endsWith("Service.java"));
|
|
@@ -81,7 +154,7 @@ function serviceStorage(projectDir, files) {
|
|
|
81
154
|
return hits.length === 0 ? pass("Service storage/id sequence ownership", "no Map/List/AtomicLong/nextId/idCounter in *Service.java") : warn("Service storage/id sequence ownership", hits.join(", "));
|
|
82
155
|
}
|
|
83
156
|
function domainBehavior(projectDir, files) {
|
|
84
|
-
const domainFiles = files.filter((filePath) => filePath
|
|
157
|
+
const domainFiles = files.filter((filePath) => hasPathPart([filePath], "domain") && !filePath.endsWith("Repository.java"));
|
|
85
158
|
const records = domainFiles.filter((filePath) => /\brecord\s+\w+/.test(readFileSync(filePath, "utf8")));
|
|
86
159
|
if (records.length > 0) {
|
|
87
160
|
return warn("Domain behavior", `domain record: ${records.map((filePath) => relative(projectDir, filePath)).join(", ")}`);
|
|
@@ -90,9 +163,23 @@ function domainBehavior(projectDir, files) {
|
|
|
90
163
|
return hasBehavior ? pass("Domain behavior", "domain class contains behavior method") : warn("Domain behavior", "no domain behavior method observed");
|
|
91
164
|
}
|
|
92
165
|
function dtoBoundary(files) {
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
return
|
|
166
|
+
const requestFiles = files.filter((filePath) => hasPathPart([filePath], "request") || (hasPathPart([filePath], "dto") && fileName(filePath).endsWith("Request.java")));
|
|
167
|
+
const responseFiles = files.filter((filePath) => hasPathPart([filePath], "response") || (hasPathPart([filePath], "dto") && fileName(filePath).endsWith("Response.java")));
|
|
168
|
+
return requestFiles.length > 0 && responseFiles.length > 0
|
|
169
|
+
? pass("DTO boundary", [...requestFiles, ...responseFiles].map((filePath) => fileName(filePath)).join(", "))
|
|
170
|
+
: warn("DTO boundary", "request/response DTO package or *Request/*Response DTO file missing");
|
|
171
|
+
}
|
|
172
|
+
function entityDirectExposure(projectDir, files) {
|
|
173
|
+
const domainNames = files
|
|
174
|
+
.filter((filePath) => hasPathPart([filePath], "domain") && !filePath.endsWith("Repository.java"))
|
|
175
|
+
.map((filePath) => fileName(filePath).replace(/\.java$/, ""))
|
|
176
|
+
.filter((name) => name !== undefined);
|
|
177
|
+
const controllerFiles = files.filter((filePath) => filePath.endsWith("Controller.java") || hasPathPart([filePath], "presentation"));
|
|
178
|
+
const hits = controllerFiles.flatMap((filePath) => {
|
|
179
|
+
const content = readFileSync(filePath, "utf8");
|
|
180
|
+
return domainNames.filter((domainName) => new RegExp(`\\b${domainName}\\b`).test(content)).map((domainName) => `${relative(projectDir, filePath)} exposes ${domainName}`);
|
|
181
|
+
});
|
|
182
|
+
return hits.length === 0 ? pass("Entity direct exposure", "no controller domain entity exposure observed") : warn("Entity direct exposure", hits.join(", "));
|
|
96
183
|
}
|
|
97
184
|
function bootJar(projectDir) {
|
|
98
185
|
const buildPath = existsSync(join(projectDir, "build.gradle")) ? join(projectDir, "build.gradle") : join(projectDir, "build.gradle.kts");
|
|
@@ -119,20 +206,28 @@ function verificationReport(projectDir) {
|
|
|
119
206
|
function createReport(projectDir) {
|
|
120
207
|
const files = javaFiles(projectDir);
|
|
121
208
|
const findings = [
|
|
209
|
+
springBootApp(projectDir, files),
|
|
210
|
+
gradleRuntime(projectDir),
|
|
122
211
|
gradleOnly(projectDir),
|
|
212
|
+
mavenAbsent(projectDir),
|
|
213
|
+
fakeBuildShimAbsent(projectDir),
|
|
123
214
|
layerStructure(files),
|
|
215
|
+
boundaryShape(files),
|
|
124
216
|
repositoryPort(projectDir, files),
|
|
125
217
|
repositoryAdapter(projectDir, files),
|
|
126
218
|
serviceStorage(projectDir, files),
|
|
127
219
|
domainBehavior(projectDir, files),
|
|
128
220
|
dtoBoundary(files),
|
|
221
|
+
entityDirectExposure(projectDir, files),
|
|
129
222
|
bootJar(projectDir),
|
|
130
223
|
verificationReport(projectDir),
|
|
131
224
|
];
|
|
132
225
|
return [
|
|
133
226
|
"# Backend Shape Report",
|
|
134
227
|
"",
|
|
135
|
-
"Report-only observation for Java/Spring backend
|
|
228
|
+
"Report-only workflow/structure observation report for Java/Spring backend shape.",
|
|
229
|
+
"",
|
|
230
|
+
"This is not enforcement/linter output and not generated app product-quality certification.",
|
|
136
231
|
"",
|
|
137
232
|
"| Criterion | Result | Evidence |",
|
|
138
233
|
"| --- | --- | --- |",
|
|
@@ -148,7 +243,7 @@ function createReport(projectDir) {
|
|
|
148
243
|
}
|
|
149
244
|
export function runBackendShapeReview(options = {}) {
|
|
150
245
|
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
151
|
-
const reportPath = join(projectDir,
|
|
246
|
+
const reportPath = join(projectDir, BACKEND_SHAPE_REPORT_PATH);
|
|
152
247
|
mkdirSync(dirname(reportPath), { recursive: true });
|
|
153
248
|
writeFileSync(reportPath, createReport(projectDir));
|
|
154
249
|
return { status: 0, stdout: `Backend shape report written: ${reportPath}\n`, stderr: "" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-shape.js","sourceRoot":"","sources":["../../src/cli/backend-shape.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backend-shape.js","sourceRoot":"","sources":["../../src/cli/backend-shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACnG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,OAAO,MAAM,cAAc,CAAA;AAclC,MAAM,CAAC,MAAM,yBAAyB,GAAG,2CAA2C,CAAA;AACpF,MAAM,eAAe,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAU,CAAA;AAEpF,SAAS,SAAS,CAAC,OAAe;IAChC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;QACrC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,UAAkB,EAAE,QAAgB;IACpD,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAClE,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB;IACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,QAAgB;IAC/D,OAAO,yBAAyB,CAAC,QAAQ,CAAC,CAAA;AAC5C,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB,EAAE,IAAY;IACzD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;AAC5F,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAwB;IAChE,MAAM,UAAU,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,OAAO,yBAAyB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAA;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB;IACnC,OAAO,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;AAC5G,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;SAC5E,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;SACnD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,SAAS,IAAI,CAAC,SAAiB,EAAE,QAAgB;IAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AAChD,CAAC;AAED,SAAS,IAAI,CAAC,SAAiB,EAAE,QAAgB;IAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;AAChD,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,KAAwB;IACjE,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,oBAAoB,GAAG,gDAAgD,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC7F,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChF,MAAM,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAA;IAC/H,OAAO,oBAAoB,IAAI,wBAAwB;QACrD,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,4DAA4D,CAAC,CAAA;AAC3F,CAAC;AAED,SAAS,yBAAyB,CAAC,UAAkB;IACnD,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IACxG,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAA;IACzG,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,yBAAyB,CAAC,UAAU,CAAC;QAC1C,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,sDAAsD,CAAC,CAAA;AACpF,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB;IACpC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAClH,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAA;IAC1H,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAA;IACxD,OAAO,SAAS,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,yCAAyC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,4CAA4C,CAAC,CAAA;AACnL,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAkB;IAC7C,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC1F,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,8BAA8B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/I,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,MAAM,QAAQ,GAAG;QACf,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE;QACvE,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE;QAC3D,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;QACtC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE;KACjF,CAAA;IACV,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxI,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9F,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC7I,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC3H,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAA;IACpH,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACpF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IACnE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAClH,MAAM,OAAO,GAAG;QACd,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAA;IACD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mDAAmD,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mDAAmD,EAAE,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC9M,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,KAAwB;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACnH,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,4BAA4B,CAAC,CAAA;AAC7L,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAkB,EAAE,KAAwB;IACrE,MAAM,eAAe,GAAG,KAAK;SAC1B,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;SAC/F,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;SAC5D,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QACzC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;YACrF,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,iCAAiC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC7G,CAAC,CAAC,CAAA;IACF,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAmC,EAAE,wEAAwE,CAAC,CAAA;AACrQ,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,KAAwB;IAClE,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;IAClF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,CAAA;YACX,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;YACxG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uCAAuC,EAAE,0DAA0D,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uCAAuC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACvM,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,KAAwB;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAC1H,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IACvG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC1H,CAAC;IACD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oFAAoF,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7K,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,oCAAoC,CAAC,CAAA;AACvJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB;IAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;IACtK,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACzK,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QACxD,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5G,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,qEAAqE,CAAC,CAAA;AACjG,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,KAAwB;IACxE,MAAM,WAAW,GAAG,KAAK;SACtB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;SAChG,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;SAC5D,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IACvD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC,CAAA;IACnI,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,UAAU,EAAE,CAAC,CAAA;IAC3K,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,+CAA+C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC9J,CAAC;AAED,SAAS,OAAO,CAAC,UAAkB;IACjC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;IACxI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;IAC9C,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC/C,OAAO,2DAA2D,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;AAClK,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,0BAA0B,CAAC;QACpE,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,CAAC;KAC7D,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;IAChD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,qBAAqB,EAAE,sCAAsC,CAAC,CAAA;IAC5E,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5F,MAAM,WAAW,GACf,kDAAkD,CAAC,IAAI,CAAC,OAAO,CAAC;QAChE,mDAAmD,CAAC,IAAI,CAAC,OAAO,CAAC;QACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAC7B,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,qCAAqC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,4CAA4C,CAAC,CAAA;AACrK,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG;QACf,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC;QAChC,aAAa,CAAC,UAAU,CAAC;QACzB,UAAU,CAAC,UAAU,CAAC;QACtB,WAAW,CAAC,UAAU,CAAC;QACvB,mBAAmB,CAAC,UAAU,CAAC;QAC/B,cAAc,CAAC,KAAK,CAAC;QACrB,aAAa,CAAC,KAAK,CAAC;QACpB,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC;QACjC,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC;QACpC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC;QACjC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC;QACjC,WAAW,CAAC,KAAK,CAAC;QAClB,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC;QACvC,OAAO,CAAC,UAAU,CAAC;QACnB,kBAAkB,CAAC,UAAU,CAAC;KAC/B,CAAA;IACD,OAAO;QACL,wBAAwB;QACxB,EAAE;QACF,kFAAkF;QAClF,EAAE;QACF,4FAA4F;QAC5F,EAAE;QACF,mCAAmC;QACnC,qBAAqB;QACrB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,QAAQ,IAAI,CAAC;QAClG,EAAE;QACF,gBAAgB;QAChB,EAAE;QACF,uCAAuC;QACvC,oDAAoD;QACpD,oDAAoD;QACpD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA+B,EAAE;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAA;IAC9D,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,aAAa,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAA;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,iCAAiC,UAAU,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AAC3F,CAAC"}
|
package/dist/cli/bearshell.js
CHANGED
|
@@ -13,6 +13,12 @@ export function bearshellUsage(invocation = "ph") {
|
|
|
13
13
|
"Runs a bounded shell-native command helper for Persona Harness.",
|
|
14
14
|
"Shell metacharacters are interpreted only with explicit --shell opt-in.",
|
|
15
15
|
"",
|
|
16
|
+
"Windows PowerShell pipelines: prefer no `--shell`.",
|
|
17
|
+
"- Pass PowerShell as the command so pipes stay inside PowerShell.",
|
|
18
|
+
'- `npx ph bearshell powershell -NoProfile -Command "Select-String -Path README.md -Pattern TODO"`',
|
|
19
|
+
"- Avoid project-root or `.persona` root recursive search; it can traverse node_modules or package/vendor files.",
|
|
20
|
+
"- Do not wrap Windows PowerShell pipelines in Unix-style single quotes.",
|
|
21
|
+
"",
|
|
16
22
|
"Environment:",
|
|
17
23
|
"- PH_BEARSHELL_CONDENSE=0 disables output condensation.",
|
|
18
24
|
"- PH_BEARSHELL_CONDENSE_BUDGET overrides the default condensation budget.",
|