persona-harness 1.0.0 → 1.1.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.
Files changed (213) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +16 -11
  3. package/dist/cli/context-checkout-binding.d.ts +31 -0
  4. package/dist/cli/context-checkout-binding.js +170 -0
  5. package/dist/cli/context-checkout-binding.js.map +1 -0
  6. package/dist/cli/context-command.js +13 -2
  7. package/dist/cli/context-command.js.map +1 -1
  8. package/dist/cli/context-personalization.d.ts +15 -0
  9. package/dist/cli/context-personalization.js +51 -0
  10. package/dist/cli/context-personalization.js.map +1 -0
  11. package/dist/cli/context-preview.d.ts +2 -1
  12. package/dist/cli/context-preview.js +40 -32
  13. package/dist/cli/context-preview.js.map +1 -1
  14. package/dist/cli/context-scope-command.d.ts +6 -0
  15. package/dist/cli/context-scope-command.js +37 -0
  16. package/dist/cli/context-scope-command.js.map +1 -0
  17. package/dist/cli/context-task-command.d.ts +6 -0
  18. package/dist/cli/context-task-command.js +51 -0
  19. package/dist/cli/context-task-command.js.map +1 -0
  20. package/dist/cli/cooperative-finish-context.js +3 -6
  21. package/dist/cli/cooperative-finish-context.js.map +1 -1
  22. package/dist/cli/host-plugin-context-assets.d.ts +2 -0
  23. package/dist/cli/host-plugin-context-assets.js +35 -0
  24. package/dist/cli/host-plugin-context-assets.js.map +1 -0
  25. package/dist/cli/host-plugin-distribution.js +8 -4
  26. package/dist/cli/host-plugin-distribution.js.map +1 -1
  27. package/dist/cli/host-plugin-reference-assets.d.ts +2 -0
  28. package/dist/cli/host-plugin-reference-assets.js +36 -0
  29. package/dist/cli/host-plugin-reference-assets.js.map +1 -0
  30. package/dist/cli/personalization-file-boundary.d.ts +16 -0
  31. package/dist/cli/personalization-file-boundary.js +106 -0
  32. package/dist/cli/personalization-file-boundary.js.map +1 -0
  33. package/dist/cli/personalization-profile-store.d.ts +2 -16
  34. package/dist/cli/personalization-profile-store.js +82 -232
  35. package/dist/cli/personalization-profile-store.js.map +1 -1
  36. package/dist/cli/personalization-store-io.d.ts +25 -0
  37. package/dist/cli/personalization-store-io.js +144 -0
  38. package/dist/cli/personalization-store-io.js.map +1 -0
  39. package/dist/config/harness-config.js +14 -7
  40. package/dist/config/harness-config.js.map +1 -1
  41. package/dist/context-core/context-envelope-builder.js +2 -1
  42. package/dist/context-core/context-envelope-builder.js.map +1 -1
  43. package/dist/context-core/context-renderer.d.ts +4 -0
  44. package/dist/context-core/context-renderer.js +11 -0
  45. package/dist/context-core/context-renderer.js.map +1 -0
  46. package/dist/context-delivery/context-delivery-store.d.ts +13 -9
  47. package/dist/context-delivery/context-delivery-store.js +18 -43
  48. package/dist/context-delivery/context-delivery-store.js.map +1 -1
  49. package/dist/context-delivery/context-target-selection.d.ts +21 -0
  50. package/dist/context-delivery/context-target-selection.js +79 -0
  51. package/dist/context-delivery/context-target-selection.js.map +1 -0
  52. package/dist/context-delivery/context-tool-targets.d.ts +11 -0
  53. package/dist/context-delivery/context-tool-targets.js +57 -0
  54. package/dist/context-delivery/context-tool-targets.js.map +1 -0
  55. package/dist/context-delivery/opencode-context-hooks.d.ts +11 -1
  56. package/dist/context-delivery/opencode-context-hooks.js +38 -53
  57. package/dist/context-delivery/opencode-context-hooks.js.map +1 -1
  58. package/dist/context-delivery/portable-context-hook.d.ts +26 -0
  59. package/dist/context-delivery/portable-context-hook.js +60 -0
  60. package/dist/context-delivery/portable-context-hook.js.map +1 -0
  61. package/dist/context-delivery/portable-context-main.d.ts +1 -0
  62. package/dist/context-delivery/portable-context-main.js +46 -0
  63. package/dist/context-delivery/portable-context-main.js.map +1 -0
  64. package/dist/context-delivery/portable-context-runtime.mjs +2917 -0
  65. package/dist/context-delivery/portable-context-session.d.ts +2 -0
  66. package/dist/context-delivery/portable-context-session.js +70 -0
  67. package/dist/context-delivery/portable-context-session.js.map +1 -0
  68. package/dist/context-delivery/portable-context-setup.d.ts +1 -0
  69. package/dist/context-delivery/portable-context-setup.js +59 -0
  70. package/dist/context-delivery/portable-context-setup.js.map +1 -0
  71. package/dist/context-delivery/portable-context-setup.mjs +3568 -0
  72. package/dist/io/no-follow-directory-chain.d.ts +1 -1
  73. package/dist/io/no-follow-directory-chain.js +46 -13
  74. package/dist/io/no-follow-directory-chain.js.map +1 -1
  75. package/docs/current/context-program-status.md +22 -0
  76. package/docs/current/personalization-profile-v1.md +118 -0
  77. package/docs/current/portable-host-adapters.md +103 -3
  78. package/docs/current/release/consumer-authority-current-acceptance.json +1 -1
  79. package/docs/current/release/v1.1.0-release-notes.md +82 -0
  80. package/package.json +7 -3
  81. package/packages/host-plugins/antigravity/skills/ast-grep/SKILL.md +1 -1
  82. package/packages/host-plugins/antigravity/skills/debug/SKILL.md +1 -1
  83. package/packages/host-plugins/antigravity/skills/deep-interview/SKILL.md +54 -26
  84. package/packages/host-plugins/antigravity/skills/frontend/SKILL.md +1 -1
  85. package/packages/host-plugins/antigravity/skills/git/SKILL.md +1 -1
  86. package/packages/host-plugins/antigravity/skills/grill-me/SKILL.md +1 -1
  87. package/packages/host-plugins/antigravity/skills/implementation/SKILL.md +1 -1
  88. package/packages/host-plugins/antigravity/skills/lsp-setup/SKILL.md +1 -1
  89. package/packages/host-plugins/antigravity/skills/philosophy-refinement/SKILL.md +17 -6
  90. package/packages/host-plugins/antigravity/skills/philosophy-refinement/references/persistence.md +89 -0
  91. package/packages/host-plugins/antigravity/skills/plan/SKILL.md +1 -1
  92. package/packages/host-plugins/antigravity/skills/programming/SKILL.md +23 -1
  93. package/packages/host-plugins/antigravity/skills/programming/references/java/README.md +211 -0
  94. package/packages/host-plugins/antigravity/skills/programming/references/java/anti-patterns.md +85 -0
  95. package/packages/host-plugins/antigravity/skills/programming/references/java/application-layer.md +200 -0
  96. package/packages/host-plugins/antigravity/skills/programming/references/java/architecture.md +152 -0
  97. package/packages/host-plugins/antigravity/skills/programming/references/java/backend.md +158 -0
  98. package/packages/host-plugins/antigravity/skills/programming/references/java/code-quality-refactoring.md +146 -0
  99. package/packages/host-plugins/antigravity/skills/programming/references/java/concurrency-discipline.md +98 -0
  100. package/packages/host-plugins/antigravity/skills/programming/references/java/domain-model.md +214 -0
  101. package/packages/host-plugins/antigravity/skills/programming/references/java/error-handling.md +179 -0
  102. package/packages/host-plugins/antigravity/skills/programming/references/java/foundations.md +49 -0
  103. package/packages/host-plugins/antigravity/skills/programming/references/java/java-idioms.md +108 -0
  104. package/packages/host-plugins/antigravity/skills/programming/references/java/language-core.md +96 -0
  105. package/packages/host-plugins/antigravity/skills/programming/references/java/method-and-naming.md +164 -0
  106. package/packages/host-plugins/antigravity/skills/programming/references/java/object-collaboration.md +140 -0
  107. package/packages/host-plugins/antigravity/skills/programming/references/java/performance-discipline.md +115 -0
  108. package/packages/host-plugins/antigravity/skills/programming/references/java/repository-pattern.md +181 -0
  109. package/packages/host-plugins/antigravity/skills/programming/references/java/technology-seams.md +96 -0
  110. package/packages/host-plugins/antigravity/skills/programming/references/java/test-design.md +149 -0
  111. package/packages/host-plugins/antigravity/skills/programming/references/java/testing.md +194 -0
  112. package/packages/host-plugins/antigravity/skills/programming/scripts/java/check-no-excuse-rules.sh +193 -0
  113. package/packages/host-plugins/antigravity/skills/ralplan/SKILL.md +1 -1
  114. package/packages/host-plugins/antigravity/skills/refactor/SKILL.md +1 -1
  115. package/packages/host-plugins/antigravity/skills/review/SKILL.md +1 -1
  116. package/packages/host-plugins/antigravity/skills/tdd/SKILL.md +1 -1
  117. package/packages/host-plugins/antigravity/skills/technical-intake/SKILL.md +13 -6
  118. package/packages/host-plugins/antigravity/skills/visual-qa/SKILL.md +1 -1
  119. package/packages/host-plugins/claude/.claude-plugin/plugin.json +2 -2
  120. package/packages/host-plugins/claude/hooks/hooks.json +27 -0
  121. package/packages/host-plugins/claude/scripts/context-runtime.mjs +2917 -0
  122. package/packages/host-plugins/claude/scripts/context-setup.mjs +3568 -0
  123. package/packages/host-plugins/claude/skills/ast-grep/SKILL.md +1 -1
  124. package/packages/host-plugins/claude/skills/debug/SKILL.md +1 -1
  125. package/packages/host-plugins/claude/skills/deep-interview/SKILL.md +54 -26
  126. package/packages/host-plugins/claude/skills/frontend/SKILL.md +1 -1
  127. package/packages/host-plugins/claude/skills/git/SKILL.md +1 -1
  128. package/packages/host-plugins/claude/skills/grill-me/SKILL.md +1 -1
  129. package/packages/host-plugins/claude/skills/implementation/SKILL.md +1 -1
  130. package/packages/host-plugins/claude/skills/lsp-setup/SKILL.md +1 -1
  131. package/packages/host-plugins/claude/skills/philosophy-refinement/SKILL.md +17 -6
  132. package/packages/host-plugins/claude/skills/philosophy-refinement/references/persistence.md +89 -0
  133. package/packages/host-plugins/claude/skills/plan/SKILL.md +1 -1
  134. package/packages/host-plugins/claude/skills/programming/SKILL.md +23 -1
  135. package/packages/host-plugins/claude/skills/programming/references/java/README.md +211 -0
  136. package/packages/host-plugins/claude/skills/programming/references/java/anti-patterns.md +85 -0
  137. package/packages/host-plugins/claude/skills/programming/references/java/application-layer.md +200 -0
  138. package/packages/host-plugins/claude/skills/programming/references/java/architecture.md +152 -0
  139. package/packages/host-plugins/claude/skills/programming/references/java/backend.md +158 -0
  140. package/packages/host-plugins/claude/skills/programming/references/java/code-quality-refactoring.md +146 -0
  141. package/packages/host-plugins/claude/skills/programming/references/java/concurrency-discipline.md +98 -0
  142. package/packages/host-plugins/claude/skills/programming/references/java/domain-model.md +214 -0
  143. package/packages/host-plugins/claude/skills/programming/references/java/error-handling.md +179 -0
  144. package/packages/host-plugins/claude/skills/programming/references/java/foundations.md +49 -0
  145. package/packages/host-plugins/claude/skills/programming/references/java/java-idioms.md +108 -0
  146. package/packages/host-plugins/claude/skills/programming/references/java/language-core.md +96 -0
  147. package/packages/host-plugins/claude/skills/programming/references/java/method-and-naming.md +164 -0
  148. package/packages/host-plugins/claude/skills/programming/references/java/object-collaboration.md +140 -0
  149. package/packages/host-plugins/claude/skills/programming/references/java/performance-discipline.md +115 -0
  150. package/packages/host-plugins/claude/skills/programming/references/java/repository-pattern.md +181 -0
  151. package/packages/host-plugins/claude/skills/programming/references/java/technology-seams.md +96 -0
  152. package/packages/host-plugins/claude/skills/programming/references/java/test-design.md +149 -0
  153. package/packages/host-plugins/claude/skills/programming/references/java/testing.md +194 -0
  154. package/packages/host-plugins/claude/skills/programming/scripts/java/check-no-excuse-rules.sh +193 -0
  155. package/packages/host-plugins/claude/skills/ralplan/SKILL.md +1 -1
  156. package/packages/host-plugins/claude/skills/refactor/SKILL.md +1 -1
  157. package/packages/host-plugins/claude/skills/review/SKILL.md +1 -1
  158. package/packages/host-plugins/claude/skills/tdd/SKILL.md +1 -1
  159. package/packages/host-plugins/claude/skills/technical-intake/SKILL.md +13 -6
  160. package/packages/host-plugins/claude/skills/visual-qa/SKILL.md +1 -1
  161. package/packages/host-plugins/codex/plugins/persona-harness/.codex-plugin/plugin.json +4 -4
  162. package/packages/host-plugins/codex/plugins/persona-harness/hooks/hooks.json +29 -0
  163. package/packages/host-plugins/codex/plugins/persona-harness/scripts/context-runtime.mjs +2917 -0
  164. package/packages/host-plugins/codex/plugins/persona-harness/scripts/context-setup.mjs +3568 -0
  165. package/packages/host-plugins/codex/plugins/persona-harness/skills/ast-grep/SKILL.md +1 -1
  166. package/packages/host-plugins/codex/plugins/persona-harness/skills/debug/SKILL.md +1 -1
  167. package/packages/host-plugins/codex/plugins/persona-harness/skills/deep-interview/SKILL.md +54 -26
  168. package/packages/host-plugins/codex/plugins/persona-harness/skills/frontend/SKILL.md +1 -1
  169. package/packages/host-plugins/codex/plugins/persona-harness/skills/git/SKILL.md +1 -1
  170. package/packages/host-plugins/codex/plugins/persona-harness/skills/grill-me/SKILL.md +1 -1
  171. package/packages/host-plugins/codex/plugins/persona-harness/skills/implementation/SKILL.md +1 -1
  172. package/packages/host-plugins/codex/plugins/persona-harness/skills/lsp-setup/SKILL.md +1 -1
  173. package/packages/host-plugins/codex/plugins/persona-harness/skills/philosophy-refinement/SKILL.md +17 -6
  174. package/packages/host-plugins/codex/plugins/persona-harness/skills/philosophy-refinement/references/persistence.md +89 -0
  175. package/packages/host-plugins/codex/plugins/persona-harness/skills/plan/SKILL.md +1 -1
  176. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/SKILL.md +23 -1
  177. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/README.md +211 -0
  178. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/anti-patterns.md +85 -0
  179. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/application-layer.md +200 -0
  180. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/architecture.md +152 -0
  181. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/backend.md +158 -0
  182. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/code-quality-refactoring.md +146 -0
  183. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/concurrency-discipline.md +98 -0
  184. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/domain-model.md +214 -0
  185. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/error-handling.md +179 -0
  186. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/foundations.md +49 -0
  187. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/java-idioms.md +108 -0
  188. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/language-core.md +96 -0
  189. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/method-and-naming.md +164 -0
  190. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/object-collaboration.md +140 -0
  191. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/performance-discipline.md +115 -0
  192. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/repository-pattern.md +181 -0
  193. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/technology-seams.md +96 -0
  194. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/test-design.md +149 -0
  195. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/references/java/testing.md +194 -0
  196. package/packages/host-plugins/codex/plugins/persona-harness/skills/programming/scripts/java/check-no-excuse-rules.sh +193 -0
  197. package/packages/host-plugins/codex/plugins/persona-harness/skills/ralplan/SKILL.md +1 -1
  198. package/packages/host-plugins/codex/plugins/persona-harness/skills/refactor/SKILL.md +1 -1
  199. package/packages/host-plugins/codex/plugins/persona-harness/skills/review/SKILL.md +1 -1
  200. package/packages/host-plugins/codex/plugins/persona-harness/skills/tdd/SKILL.md +1 -1
  201. package/packages/host-plugins/codex/plugins/persona-harness/skills/technical-intake/SKILL.md +13 -6
  202. package/packages/host-plugins/codex/plugins/persona-harness/skills/visual-qa/SKILL.md +1 -1
  203. package/packages/shared-skills/package.json +1 -1
  204. package/packages/shared-skills/skills/deep-interview/SKILL.md +53 -25
  205. package/packages/shared-skills/skills/philosophy-refinement/SKILL.md +16 -5
  206. package/packages/shared-skills/skills/philosophy-refinement/references/persistence.md +89 -0
  207. package/packages/shared-skills/skills/programming/SKILL.md +22 -0
  208. package/packages/shared-skills/skills/programming/references/java/README.md +16 -2
  209. package/packages/shared-skills/skills/programming/references/java/backend.md +1 -1
  210. package/packages/shared-skills/skills/programming/scripts/java/check-no-excuse-rules.sh +193 -0
  211. package/packages/shared-skills/skills/technical-intake/SKILL.md +12 -5
  212. package/scripts/build-portable-context.mjs +34 -0
  213. package/scripts/package-root-build.mjs +6 -0
package/CHANGELOG.md CHANGED
@@ -8,6 +8,21 @@ preparation alone does not establish stable support or channel state.
8
8
 
9
9
  ## Unreleased
10
10
 
11
+ ## [1.1.0] - 2026-09-07
12
+
13
+ - Bundle consent/setup, targeted Context hooks and Java reference/checker assets
14
+ in the portable Codex and Claude plugins. Reuse approved decisions and ask
15
+ only about unresolved choices that change implementation.
16
+ - Add explicit checkout-local project connections and session-local task
17
+ inspection/resume/Preview/end commands. Preserve profile V1, explicit opt-out,
18
+ unrelated user files and existing Workflow Integrity/Finish authority.
19
+ - Share full PH-block rendering limits between Preview and delivery; preserve
20
+ multi-file snapshots and fail closed on invalid or incomplete selection.
21
+ - Verification evidence includes workspace integration tests, local-tarball
22
+ npm-installed contracts and bounded isolated Codex Luna Max observations.
23
+ It is not registry smoke, universal model compliance or generated-app product
24
+ quality certification. Claude live behavior and token savings are not claimed.
25
+
11
26
  ## [1.0.0] - 2026-09-05
12
27
 
13
28
  - Deliver common authorization-aware skill guidance across portable host
package/README.md CHANGED
@@ -105,9 +105,10 @@ Persona Harness exposes two deliberately separate tracks:
105
105
 
106
106
  - **Workflow Integrity** is the existing evidence and completion-gate product.
107
107
  - **Context Personalization (Experimental)** is a local, default-off path for
108
- targeted convention guidance. When enabled in a project that has the
109
- OpenCode plugin registered, it delivers one bounded Context block only after
110
- a safe observed file target. It grants no completion authority.
108
+ targeted convention guidance. Enabled adapters offer a bounded Context block
109
+ after safe observed file targets. Version 1.1.0 adds
110
+ Codex and Claude plugin hooks alongside OpenCode; this does not establish
111
+ live model receipt or grant completion authority.
111
112
 
112
113
  ### Context Boundary
113
114
 
@@ -117,13 +118,15 @@ Persona Harness exposes two deliberately separate tracks:
117
118
  verification authority.
118
119
  - **Isolation:** Context-only paths do not execute project commands or contact
119
120
  GitHub/network.
120
- - **No inferred skill route:** a Context-only or partial `.persona` directory
121
+ - **No inferred skill route:** for the existing OpenCode route, a Context-only or partial `.persona` directory
121
122
  without the regular manifest created by `ph init` does not enable automatic
122
123
  shared-skill routing or an interview. Resolve the project state explicitly
123
124
  before enabling those routes.
124
125
  - **Host:** `ph init` installs static skill adapters for Codex, Claude Code,
125
- OpenCode, and Antigravity. Context delivery is currently implemented only by
126
- the optional OpenCode adapter and remains a separate, unobserved boundary.
126
+ OpenCode, and Antigravity. The packaged Codex/Claude hooks add
127
+ bounded session guidance and targeted Context transport after host trust.
128
+ Actual delivery and behavior remain separate observations; see the
129
+ [portable host boundary](docs/current/portable-host-adapters.md).
127
130
  - **Evidence:** Context usefulness remains `INCONCLUSIVE` until independent
128
131
  external evidence exists.
129
132
  - **Product focus:** the productized workflow focus is Java/Spring. The
@@ -208,12 +211,14 @@ the previous tracked configuration through your normal version-control flow.
208
211
  These lifecycle actions do not enable `features.runtimeInjection`, and they do
209
212
  not create workflow, evidence, or authority state or use network or GitHub.
210
213
 
211
- With Context enabled, the OpenCode adapter accepts only a safe observed
212
- project-relative target from a read or edit tool. It resolves the local
213
- envelope, rejects invalid/unsafe/budget-exceeding input without delivery, and
214
+ With Context enabled, the OpenCode adapter collects safe observed
215
+ project-relative targets from supported file tools, including multi-file patches.
216
+ It resolves one current profile snapshot for the entire pending batch,
217
+ rejects invalid/unsafe/budget-exceeding input without a rule payload, and
214
218
  prepends the selected bounded capsule content to the next user message for the
215
- same session. It suppresses the same digest until that session is compacted or
216
- deleted. It does not infer a target from the prompt, inject a full skill
219
+ same session. It suppresses a duplicate only when the exact synthetic block is
220
+ visible in the current model input; it does not assume retained delivery from
221
+ an earlier transform. It does not infer a target from the prompt, inject a full skill
217
222
  catalog, access the network, execute shell commands, or write workflow,
218
223
  evidence, or authority records. The adapter's actual behavior in a live
219
224
  OpenCode release remains a separate host-observation boundary.
@@ -0,0 +1,31 @@
1
+ import { type PersonalizationStoreOptions } from "./personalization-store-io.js";
2
+ type ScopeBindingOptions = PersonalizationStoreOptions & {
3
+ readonly taskSession?: string;
4
+ };
5
+ export type ContextScopeBinding = {
6
+ readonly status: "unbound";
7
+ } | {
8
+ readonly status: "bound";
9
+ readonly scopeKey: string;
10
+ };
11
+ export type CheckoutProjectBinding = {
12
+ readonly status: "unbound";
13
+ } | {
14
+ readonly status: "bound";
15
+ readonly projectKey: string;
16
+ };
17
+ export declare class ContextScopeError extends Error {
18
+ readonly code: "context-scope-unavailable" | "context-scope-invalid" | "context-scope-existing-binding" | "context-scope-key-mismatch";
19
+ constructor(code: "context-scope-unavailable" | "context-scope-invalid" | "context-scope-existing-binding" | "context-scope-key-mismatch");
20
+ }
21
+ export declare function readCheckoutProjectBinding(projectDir: string, options?: PersonalizationStoreOptions): CheckoutProjectBinding;
22
+ export declare function changeCheckoutProjectBinding(projectDir: string, change: {
23
+ readonly action: "bind" | "unbind";
24
+ readonly projectKey: string;
25
+ }, options?: PersonalizationStoreOptions): CheckoutProjectBinding;
26
+ export declare function readContextScopeBinding(projectDir: string, options: ScopeBindingOptions): ContextScopeBinding;
27
+ export declare function changeContextScopeBinding(projectDir: string, change: {
28
+ readonly action: "bind" | "unbind";
29
+ readonly scopeKey: string;
30
+ }, options: ScopeBindingOptions): ContextScopeBinding;
31
+ export {};
@@ -0,0 +1,170 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { closeSync, constants, fstatSync, fsyncSync, linkSync, lstatSync, openSync, realpathSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ import { isRecord } from "../config/jsonc.js";
5
+ import { canonicalContextDigest } from "../context-core/context-digest.js";
6
+ import { withNoFollowDirectoryChain } from "../io/no-follow-directory-chain.js";
7
+ import { captureNoFollowDirectory, noFollowPathIdentityFromStat, readNoFollowProjectFile, sameNoFollowPathLocation } from "../io/no-follow-file.js";
8
+ import { personalizationStorePath } from "./personalization-store-io.js";
9
+ const MAX_BYTES = 4_096;
10
+ export class ContextScopeError extends Error {
11
+ code;
12
+ constructor(code) {
13
+ super(code);
14
+ this.code = code;
15
+ this.name = "ContextScopeError";
16
+ }
17
+ }
18
+ export function readCheckoutProjectBinding(projectDir, options = {}) {
19
+ const result = readContextScopeBinding(projectDir, options);
20
+ return result.status === "bound" ? { status: "bound", projectKey: result.scopeKey } : result;
21
+ }
22
+ export function changeCheckoutProjectBinding(projectDir, change, options = {}) {
23
+ const result = changeContextScopeBinding(projectDir, { action: change.action, scopeKey: change.projectKey }, options);
24
+ return result.status === "bound" ? { status: "bound", projectKey: result.scopeKey } : result;
25
+ }
26
+ export function readContextScopeBinding(projectDir, options) {
27
+ const location = bindingLocation(projectDir, options);
28
+ const file = readNoFollowProjectFile(location.root, location.relativePath, MAX_BYTES);
29
+ switch (file.kind) {
30
+ case "absent": return { status: "unbound" };
31
+ case "blocked": throw new ContextScopeError("context-scope-unavailable");
32
+ case "ready": return parseBinding(file.value.bytes, location);
33
+ default: return assertNever(file);
34
+ }
35
+ }
36
+ export function changeContextScopeBinding(projectDir, change, options) {
37
+ const checkoutPath = resolve(projectDir);
38
+ const location = bindingLocation(checkoutPath, options);
39
+ const root = captureNoFollowDirectory(location.root);
40
+ if (root.kind !== "ready")
41
+ throw new ContextScopeError("context-scope-unavailable");
42
+ const existing = readContextScopeBinding(checkoutPath, options);
43
+ if (existing.status === "bound" && existing.scopeKey !== change.scopeKey) {
44
+ throw new ContextScopeError(change.action === "bind" ? "context-scope-existing-binding" : "context-scope-key-mismatch");
45
+ }
46
+ if (existing.status === "unbound" && change.action === "unbind")
47
+ return existing;
48
+ if (existing.status === "bound" && change.action === "bind")
49
+ return existing;
50
+ const result = withNoFollowDirectoryChain(join(location.root, location.directory), 0o700, () => {
51
+ const parent = captureNoFollowDirectory("..");
52
+ if (parent.kind !== "ready" || !sameNoFollowPathLocation(root.value, parent.value)
53
+ || bindingLocation(checkoutPath, options).bindingDigest !== location.bindingDigest) {
54
+ throw new ContextScopeError("context-scope-unavailable");
55
+ }
56
+ const leaf = basename(location.relativePath);
57
+ const lock = `${leaf}.lock`;
58
+ const lockDescriptor = openSync(lock, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
59
+ try {
60
+ const latest = readContextScopeBinding(checkoutPath, options);
61
+ if (latest.status === "bound" && latest.scopeKey !== change.scopeKey) {
62
+ throw new ContextScopeError(change.action === "bind" ? "context-scope-existing-binding" : "context-scope-key-mismatch");
63
+ }
64
+ if (latest.status === "unbound" && change.action === "unbind")
65
+ return latest;
66
+ if (latest.status === "bound" && change.action === "bind")
67
+ return latest;
68
+ switch (change.action) {
69
+ case "bind": {
70
+ const temporary = `.binding-${randomUUID()}.tmp`;
71
+ const descriptor = openSync(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
72
+ let temporaryPresent = true;
73
+ try {
74
+ writeFileSync(descriptor, `${JSON.stringify({ schemaVersion: location.schema, [location.digestField]: location.bindingDigest, [location.keyField]: change.scopeKey })}\n`);
75
+ fsyncSync(descriptor);
76
+ // Publish complete bytes without replacing any existing binding.
77
+ linkSync(temporary, leaf);
78
+ unlinkSync(temporary);
79
+ temporaryPresent = false;
80
+ const opened = fstatSync(descriptor, { bigint: true });
81
+ const current = lstatSync(leaf, { bigint: true });
82
+ if (!opened.isFile() || opened.nlink !== 1n || current.isSymbolicLink()
83
+ || !sameNoFollowPathLocation(noFollowPathIdentityFromStat(opened), noFollowPathIdentityFromStat(current))) {
84
+ throw new ContextScopeError("context-scope-unavailable");
85
+ }
86
+ }
87
+ finally {
88
+ closeSync(descriptor);
89
+ if (temporaryPresent)
90
+ unlinkSync(temporary);
91
+ }
92
+ return { status: "bound", scopeKey: change.scopeKey };
93
+ }
94
+ case "unbind": {
95
+ const file = readNoFollowProjectFile(location.root, location.relativePath, MAX_BYTES);
96
+ if (file.kind !== "ready" || parseBinding(file.value.bytes, location).scopeKey !== change.scopeKey) {
97
+ throw new ContextScopeError("context-scope-unavailable");
98
+ }
99
+ unlinkSync(leaf);
100
+ return { status: "unbound" };
101
+ }
102
+ default: return assertNever(change.action);
103
+ }
104
+ }
105
+ finally {
106
+ closeSync(lockDescriptor);
107
+ unlinkSync(lock);
108
+ }
109
+ });
110
+ if (result === undefined)
111
+ throw new ContextScopeError("context-scope-unavailable");
112
+ return result;
113
+ }
114
+ function bindingLocation(projectDir, options) {
115
+ if (options.taskSession !== undefined && !/^[a-f0-9]{64}$/u.test(options.taskSession))
116
+ throw new ContextScopeError("context-scope-invalid");
117
+ const projectPath = resolve(projectDir);
118
+ const captured = captureNoFollowDirectory(projectPath);
119
+ if (captured.kind !== "ready")
120
+ throw new ContextScopeError("context-scope-unavailable");
121
+ let canonicalPath;
122
+ let birthtime;
123
+ try {
124
+ canonicalPath = realpathSync.native(projectPath);
125
+ const stat = lstatSync(canonicalPath, { bigint: true });
126
+ if (!stat.isDirectory() || !sameNoFollowPathLocation(captured.value, noFollowPathIdentityFromStat(stat))) {
127
+ throw new ContextScopeError("context-scope-unavailable");
128
+ }
129
+ birthtime = stat.birthtimeNs.toString();
130
+ }
131
+ catch (error) {
132
+ if (error instanceof ContextScopeError)
133
+ throw error;
134
+ throw new ContextScopeError("context-scope-unavailable");
135
+ }
136
+ const checkoutDigest = canonicalContextDigest({ path: canonicalPath, dev: captured.value.dev, ino: captured.value.ino, birthtime });
137
+ const root = dirname(personalizationStorePath(options));
138
+ const task = options.taskSession !== undefined;
139
+ const bindingDigest = task ? canonicalContextDigest({ checkoutDigest, sessionHandle: options.taskSession }) : checkoutDigest;
140
+ const directory = task ? "task-bindings" : "project-bindings";
141
+ return {
142
+ root, bindingDigest, directory, relativePath: `${directory}/${bindingDigest}.json`,
143
+ schema: task ? "persona-context-task-binding.1" : "persona-context-checkout-binding.1",
144
+ digestField: task ? "bindingDigest" : "checkoutDigest",
145
+ keyField: task ? "taskKey" : "projectKey",
146
+ };
147
+ }
148
+ function parseBinding(bytes, location) {
149
+ let value;
150
+ try {
151
+ value = JSON.parse(bytes.toString("utf8"));
152
+ }
153
+ catch (error) {
154
+ if (error instanceof SyntaxError)
155
+ throw new ContextScopeError("context-scope-invalid");
156
+ throw error;
157
+ }
158
+ if (!isRecord(value) || Object.keys(value).length !== 3
159
+ || value.schemaVersion !== location.schema || value[location.digestField] !== location.bindingDigest) {
160
+ throw new ContextScopeError("context-scope-invalid");
161
+ }
162
+ const scopeKey = value[location.keyField];
163
+ if (typeof scopeKey !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,119}$/u.test(scopeKey))
164
+ throw new ContextScopeError("context-scope-invalid");
165
+ return { status: "bound", scopeKey };
166
+ }
167
+ function assertNever(value) {
168
+ throw new ContextScopeError("context-scope-invalid");
169
+ }
170
+ //# sourceMappingURL=context-checkout-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-checkout-binding.js","sourceRoot":"","sources":["../../src/cli/context-checkout-binding.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import process from "node:process";
2
2
  import { runContextExplainCommand } from "./context-explain.js";
3
3
  import { runContextInitCommand } from "./context-init.js";
4
4
  import { runContextPreviewCommand } from "./context-preview.js";
5
+ import { runContextScopeCommand } from "./context-scope-command.js";
6
+ import { runContextTaskCommand } from "./context-task-command.js";
5
7
  import { renderContextDoctor } from "./context-doctor.js";
6
8
  import { readContextStatus, renderContextStatus } from "./context-status.js";
7
9
  export function runContextCommand(args, invocationName = "ph", options = {}) {
@@ -12,6 +14,12 @@ export function runContextCommand(args, invocationName = "ph", options = {}) {
12
14
  if (command === "init") {
13
15
  return runContextInitCommand(args.slice(1), options.projectDir ?? process.cwd());
14
16
  }
17
+ if (command === "scope") {
18
+ return runContextScopeCommand(args.slice(1), options.projectDir ?? process.cwd(), options.personalization);
19
+ }
20
+ if (command === "task") {
21
+ return runContextTaskCommand(args.slice(1), options.projectDir ?? process.cwd(), options.personalization);
22
+ }
15
23
  if (command === "status") {
16
24
  if (args.length !== 1)
17
25
  return invalidArguments(invocationName);
@@ -36,7 +44,7 @@ export function runContextCommand(args, invocationName = "ph", options = {}) {
36
44
  }
37
45
  export function contextUsage(invocationName) {
38
46
  return [
39
- `Usage: ${invocationName} context <init|status|preview|explain|doctor>`,
47
+ `Usage: ${invocationName} context <init|status|preview|explain|doctor|scope|task>`,
40
48
  "",
41
49
  "Context Personalization (Experimental, default-off)",
42
50
  "",
@@ -46,8 +54,11 @@ export function contextUsage(invocationName) {
46
54
  " preview <target-file> [--json] [--project <key>] [--task <key>] [--topic <topic>]",
47
55
  " explain <target-file> [--project <key>] [--task <key>] [--topic <topic>]",
48
56
  " doctor Diagnose only the local Context track.",
57
+ " scope [bind|unbind --project <key>] Inspect or explicitly change this checkout's project binding.",
58
+ " task --session <handle> [resume|end --task <key>] Inspect or explicitly change a session's task connection.",
59
+ " task --session <handle> preview <target-file> [--json] [--topic <topic>]",
49
60
  "",
50
- "Preview and explanation are read-only; init writes only with explicit --enable.",
61
+ "Preview, explanation and scope/task inspection are read-only. Scope bind/unbind and task resume/end are explicit local writes; init requires --enable.",
51
62
  ].join("\n");
52
63
  }
53
64
  function invalidArguments(invocationName) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-command.js","sourceRoot":"","sources":["../../src/cli/context-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-command.js","sourceRoot":"","sources":["../../src/cli/context-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ContextEnvelope, ContextWarning } from "../context-core/context-envelope.js";
2
+ import type { ContextRelevance, ContextRule, ContextScope } from "../context-core/rule-types.js";
3
+ import { type PersonalizationStoreOptions } from "./personalization-store-io.js";
4
+ export type ContextPersonalization = {
5
+ readonly personalRules: readonly ContextRule[];
6
+ readonly projectContracts: readonly ContextRule[];
7
+ readonly taskDecisions: readonly ContextRule[];
8
+ readonly warnings: readonly ContextWarning[];
9
+ };
10
+ export declare function readContextPersonalization(options?: PersonalizationStoreOptions, scopeKeys?: Pick<ContextRelevance, "projectKey" | "taskKey">): ContextPersonalization;
11
+ export declare function withPersonalizationWarnings(envelope: ContextEnvelope, profile: ContextPersonalization, scopeKeys?: Pick<ContextRelevance, "projectKey" | "taskKey">): ContextEnvelope;
12
+ export declare function contextScope(scope: {
13
+ readonly key: string;
14
+ readonly kind: "personal" | "project" | "task";
15
+ } | null | undefined): ContextScope | undefined;
@@ -0,0 +1,51 @@
1
+ import { canonicalContextDigest } from "../context-core/context-digest.js";
2
+ import { renderContextEnvelope } from "../context-core/context-renderer.js";
3
+ import { readPersonalizationStoreSnapshot } from "./personalization-store-io.js";
4
+ export function readContextPersonalization(options, scopeKeys = {}) {
5
+ const snapshot = readPersonalizationStoreSnapshot(options);
6
+ const rules = snapshot.document.profile.activeRules;
7
+ const warnings = snapshot.status === "missing"
8
+ ? [{ code: "personal-profile-missing", message: "No personal profile is initialized; defaults are not approved personal philosophy." }]
9
+ : rules.length === 0
10
+ ? [{ code: "personal-profile-empty", message: "The personal profile contains no active approved rules." }]
11
+ : [];
12
+ if (scopeKeys.projectKey === undefined && rules.some((rule) => rule.scope.kind === "project")) {
13
+ warnings.push({ code: "project-scope-unbound", message: "Project-scoped rules exist, but no project identity was supplied; those rules were not applied." });
14
+ }
15
+ if (scopeKeys.taskKey === undefined && rules.some((rule) => rule.scope.kind === "task")) {
16
+ warnings.push({ code: "task-scope-unbound", message: "Task-scoped rules exist, but no task identity was supplied; those rules were not applied." });
17
+ }
18
+ return {
19
+ personalRules: rules.filter((rule) => rule.scope.kind === "personal").map(toContextRule),
20
+ projectContracts: rules.filter((rule) => rule.scope.kind === "project").map(toContextRule),
21
+ taskDecisions: rules.filter((rule) => rule.scope.kind === "task").map(toContextRule),
22
+ warnings,
23
+ };
24
+ }
25
+ export function withPersonalizationWarnings(envelope, profile, scopeKeys = {}) {
26
+ const warnings = profile.warnings.filter((warning) => !(warning.code === "project-scope-unbound" && scopeKeys.projectKey !== undefined)
27
+ && !(warning.code === "task-scope-unbound" && scopeKeys.taskKey !== undefined));
28
+ if (warnings.length === 0)
29
+ return envelope;
30
+ const { digest: _digest, ...body } = envelope;
31
+ const payload = { ...body, warnings: [...body.warnings, ...warnings] };
32
+ if (payload.status === "blocked")
33
+ return { ...payload, digest: canonicalContextDigest(payload) };
34
+ const usedChars = renderContextEnvelope({ ...payload, digest: "" }).length;
35
+ const budget = { ...payload.budget, usedChars };
36
+ if (usedChars > budget.maxChars) {
37
+ const blocked = { ...payload, budget, status: "blocked", blockReason: "budget-exceeded", selected: [] };
38
+ return { ...blocked, digest: canonicalContextDigest(blocked) };
39
+ }
40
+ const resolved = { ...payload, budget };
41
+ return { ...resolved, digest: canonicalContextDigest(resolved) };
42
+ }
43
+ function toContextRule(rule) {
44
+ return { id: rule.ruleId, rule: rule.rule, scope: contextScope(rule.scope), status: "active", topic: rule.topic };
45
+ }
46
+ export function contextScope(scope) {
47
+ if (scope === undefined || scope === null || scope.kind === "personal")
48
+ return undefined;
49
+ return { key: scope.key, kind: scope.kind };
50
+ }
51
+ //# sourceMappingURL=context-personalization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-personalization.js","sourceRoot":"","sources":["../../src/cli/context-personalization.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ export type ContextPreviewCommandResult = {
5
5
  readonly stderr: string;
6
6
  readonly stdout: string;
7
7
  };
8
- export type ContextPreviewFailureCode = "context-config-invalid" | "context-config-unavailable" | "context-personal-profile-unavailable" | "context-target-invalid" | "context-target-required" | "context-team-profile-invalid" | "context-topic-unavailable" | "context-preview-arguments-invalid";
8
+ export type ContextPreviewFailureCode = "context-config-invalid" | "context-config-unavailable" | "context-personal-profile-unavailable" | "context-target-invalid" | "context-target-required" | "context-team-profile-invalid" | "context-topic-unavailable" | "context-preview-arguments-invalid" | "context-scope-unavailable";
9
9
  export type ContextTargetDetection = {
10
10
  readonly fileRole: string;
11
11
  readonly language: string;
@@ -28,3 +28,4 @@ export type ContextPreviewReadResult = {
28
28
  };
29
29
  export declare function runContextPreviewCommand(args: readonly string[], projectDir: string, options?: ContextPreviewOptions): ContextPreviewCommandResult;
30
30
  export declare function readContextPreview(args: readonly string[], projectDir: string, options?: ContextPreviewOptions): ContextPreviewReadResult;
31
+ export declare function createContextPreviewReader(projectDir: string, options?: ContextPreviewOptions): (args: readonly string[]) => ContextPreviewReadResult;
@@ -1,8 +1,10 @@
1
1
  import { buildContextEnvelope, createProductSafetyInvariants, createStarterProfileDefaults, resolveEffectiveContext, } from "../context-core/index.js";
2
2
  import { isContextPersonalizationEnabled, loadHarnessConfigResult } from "../config/harness-config.js";
3
3
  import { loadTeamProfile, toTeamContextRules } from "../context-profile/team-profile-store.js";
4
- import { PersonalizationStoreError, readPersonalizationStore, } from "./personalization-profile-store.js";
4
+ import { PersonalizationStoreError, } from "./personalization-profile-store.js";
5
+ import { contextScope, readContextPersonalization, withPersonalizationWarnings } from "./context-personalization.js";
5
6
  import { parseContextPreviewRequest } from "./context-preview-request.js";
7
+ import { ContextScopeError, readCheckoutProjectBinding } from "./context-checkout-binding.js";
6
8
  export function runContextPreviewCommand(args, projectDir, options = {}) {
7
9
  const result = readContextPreview(args, projectDir, options);
8
10
  if (result.status === "blocked")
@@ -14,9 +16,20 @@ export function runContextPreviewCommand(args, projectDir, options = {}) {
14
16
  : success(renderPreview(contextEnabled, detected, envelope));
15
17
  }
16
18
  export function readContextPreview(args, projectDir, options = {}) {
17
- const parsed = parseContextPreviewRequest(args);
18
- if (parsed.status === "blocked")
19
- return blocked(parsed.code);
19
+ return createContextPreviewReader(projectDir, options)(args);
20
+ }
21
+ // A reader owns one immutable batch snapshot; create a new reader for the next request.
22
+ export function createContextPreviewReader(projectDir, options = {}) {
23
+ let sources;
24
+ return (args) => {
25
+ const parsed = parseContextPreviewRequest(args);
26
+ if (parsed.status === "blocked")
27
+ return blocked(parsed.code);
28
+ sources ??= readContextPreviewSources(projectDir, options);
29
+ return sources.status === "blocked" ? sources : previewFromSources(parsed.request, sources);
30
+ };
31
+ }
32
+ function readContextPreviewSources(projectDir, options) {
20
33
  const configResult = loadHarnessConfigResult(projectDir);
21
34
  if (!configResult.safe)
22
35
  return blocked("context-config-unavailable");
@@ -25,47 +38,56 @@ export function readContextPreview(args, projectDir, options = {}) {
25
38
  const teamResult = loadTeamProfile(projectDir);
26
39
  if (teamResult.status === "invalid")
27
40
  return blocked("context-team-profile-invalid");
28
- let personalRules;
41
+ let personalization;
42
+ let binding;
29
43
  try {
30
- personalRules = readPersonalizationStore(options.personalization).profile.activeRules;
44
+ personalization = readContextPersonalization(options.personalization);
45
+ binding = readCheckoutProjectBinding(projectDir, options.personalization);
31
46
  }
32
47
  catch (error) {
48
+ if (error instanceof ContextScopeError)
49
+ return blocked("context-scope-unavailable");
33
50
  if (error instanceof PersonalizationStoreError)
34
51
  return blocked("context-personal-profile-unavailable");
35
52
  throw error;
36
53
  }
37
- const detected = detectTarget(parsed.request.targetPath);
54
+ return { status: "ready", configResult, teamResult, personalization, binding };
55
+ }
56
+ function previewFromSources(request, sources) {
57
+ const { configResult, teamResult, personalization } = sources;
58
+ const projectKey = request.projectKey ?? (sources.binding.status === "bound" ? sources.binding.projectKey : undefined);
59
+ const detected = detectTarget(request.targetPath);
38
60
  const teamRules = teamResult.status === "available" ? toTeamContextRules(teamResult.profile) : [];
39
61
  const productInvariants = invariantRules();
40
62
  const commonDefaults = starterRules();
41
- const personalContextRules = toPersonalContextRules(personalRules);
42
63
  const allRules = [
43
64
  ...productInvariants,
44
65
  ...commonDefaults,
45
66
  ...teamRules,
46
- ...personalContextRules,
67
+ ...personalization.personalRules,
68
+ ...personalization.projectContracts,
69
+ ...personalization.taskDecisions,
47
70
  ];
48
- const topics = selectedTopics(parsed.request, allRules);
71
+ const topics = selectedTopics(request, allRules);
49
72
  if (topics === undefined)
50
73
  return blocked("context-topic-unavailable");
51
74
  const resolution = resolveEffectiveContext({
52
75
  commonDefaults,
53
76
  languageDefaults: [],
54
77
  maxCapsules: configResult.config.context.maxCapsules,
55
- personalProfileAvailable: true,
56
- personalRules: personalContextRules,
78
+ personalRules: personalization.personalRules,
57
79
  productInvariants,
58
- projectContracts: [],
80
+ projectContracts: personalization.projectContracts,
59
81
  relevance: {
60
82
  fileRole: detected.fileRole,
61
83
  language: detected.language,
62
- projectKey: parsed.request.projectKey,
84
+ projectKey,
63
85
  skillIds: [],
64
- taskKey: parsed.request.taskKey,
86
+ taskKey: request.taskKey,
65
87
  teamKey: teamResult.status === "available" ? teamResult.profile.teamKey : undefined,
66
88
  topics,
67
89
  },
68
- taskDecisions: [],
90
+ taskDecisions: personalization.taskDecisions,
69
91
  teamContracts: teamRules,
70
92
  });
71
93
  const envelope = buildContextEnvelope({
@@ -77,14 +99,14 @@ export function readContextPreview(args, projectDir, options = {}) {
77
99
  target: {
78
100
  fileRole: detected.fileRole,
79
101
  language: detected.language,
80
- path: parsed.request.targetPath,
102
+ path: request.targetPath,
81
103
  },
82
104
  });
83
105
  return {
84
106
  preview: {
85
107
  contextEnabled: isContextPersonalizationEnabled(configResult),
86
108
  detected,
87
- envelope,
109
+ envelope: withPersonalizationWarnings(envelope, personalization, { ...request, projectKey }),
88
110
  resolution,
89
111
  },
90
112
  status: "ready",
@@ -107,20 +129,6 @@ function toContextRule(rule) {
107
129
  topic: rule.topic,
108
130
  };
109
131
  }
110
- function toPersonalContextRules(rules) {
111
- return rules.map((rule) => ({
112
- id: rule.ruleId,
113
- rule: rule.rule,
114
- scope: contextScope(rule.scope),
115
- status: "active",
116
- topic: rule.topic,
117
- }));
118
- }
119
- function contextScope(scope) {
120
- if (scope === undefined || scope === null || scope.kind === "personal")
121
- return undefined;
122
- return { key: scope.key, kind: scope.kind };
123
- }
124
132
  function selectedTopics(request, rules) {
125
133
  const available = new Set(rules.map((rule) => rule.topic));
126
134
  if (request.topics.length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"context-preview.js","sourceRoot":"","sources":["../../src/cli/context-preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-preview.js","sourceRoot":"","sources":["../../src/cli/context-preview.ts"],"names":[],"mappings":"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"}