pi-harness-runtime 1.1.403 → 1.1.405

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 (165) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/index.ts +275 -1
  3. package/package.json +1 -1
  4. package/packages/a2a-adapter/package.json +1 -1
  5. package/packages/agent-policy/package.json +1 -1
  6. package/packages/architecture-generator/package.json +1 -1
  7. package/packages/auth/package.json +1 -1
  8. package/packages/autonomous-refactor/package.json +1 -1
  9. package/packages/autonomous-runtime/package.json +1 -1
  10. package/packages/cache-strategy/package.json +1 -1
  11. package/packages/capability-registry/package.json +1 -1
  12. package/packages/checkpoint/package.json +1 -1
  13. package/packages/cli-plugin-sdk/package.json +1 -1
  14. package/packages/clipboard/package.json +1 -1
  15. package/packages/clipboard-plugin/package.json +1 -1
  16. package/packages/code-generation/package.json +1 -1
  17. package/packages/code-review/package.json +1 -1
  18. package/packages/codex-adapter/package.json +1 -1
  19. package/packages/codex-watcher/package.json +1 -1
  20. package/packages/config-capture/package.json +1 -1
  21. package/packages/connection-runtime/package.json +1 -1
  22. package/packages/context-compiler/package.json +1 -1
  23. package/packages/context-discovery/package.json +1 -1
  24. package/packages/context-manager/package.json +1 -1
  25. package/packages/contracts/package.json +1 -1
  26. package/packages/cookie-sanitizer/package.json +1 -1
  27. package/packages/cost-optimizer/package.json +1 -1
  28. package/packages/dependency-analyzer/package.json +1 -1
  29. package/packages/django-plugin/package.json +1 -1
  30. package/packages/doc-generator/package.json +1 -1
  31. package/packages/durable-review/package.json +1 -1
  32. package/packages/e2e-tester/package.json +1 -1
  33. package/packages/evaluation-engine/package.json +1 -1
  34. package/packages/evaluation-runner/package.json +1 -1
  35. package/packages/event-bus/package.json +1 -1
  36. package/packages/event-sink/package.json +1 -1
  37. package/packages/event-store/package.json +1 -1
  38. package/packages/experience-replay/package.json +1 -1
  39. package/packages/feedback-collector/package.json +1 -1
  40. package/packages/file-copy-helper/package.json +1 -1
  41. package/packages/framework-detector/package.json +1 -1
  42. package/packages/framework-plugin-sdk/package.json +1 -1
  43. package/packages/frappe-plugin/package.json +1 -1
  44. package/packages/generic-web-plugin/package.json +1 -1
  45. package/packages/health-monitor/package.json +1 -1
  46. package/packages/intent-analyzer/package.json +1 -1
  47. package/packages/jev-judge/dist/auto-continue.d.ts +6 -0
  48. package/packages/jev-judge/dist/auto-continue.d.ts.map +1 -1
  49. package/packages/jev-judge/dist/auto-continue.js +13 -3
  50. package/packages/jev-judge/dist/auto-continue.js.map +1 -1
  51. package/packages/jev-judge/package.json +1 -1
  52. package/packages/jev-judge/src/auto-continue.ts +17 -3
  53. package/packages/jev-judge/tests/auto-continue-context.test.ts +37 -0
  54. package/packages/knowledge-graph/package.json +1 -1
  55. package/packages/knowledge-retrieval/package.json +1 -1
  56. package/packages/laravel-plugin/package.json +1 -1
  57. package/packages/learning-engine/package.json +1 -1
  58. package/packages/logging/package.json +1 -1
  59. package/packages/mcp-adapter/package.json +1 -1
  60. package/packages/memory-engine/package.json +1 -1
  61. package/packages/milestone-manager/package.json +1 -1
  62. package/packages/model-registry/package.json +1 -1
  63. package/packages/nextjs-plugin/package.json +1 -1
  64. package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -1
  65. package/packages/notification/dist/adapters/line-adapter.js +6 -1
  66. package/packages/notification/dist/adapters/line-adapter.js.map +1 -1
  67. package/packages/notification/dist/notification-center.d.ts.map +1 -1
  68. package/packages/notification/dist/notification-center.js +32 -0
  69. package/packages/notification/dist/notification-center.js.map +1 -1
  70. package/packages/notification/dist/telegram-webhook-handler.d.ts +7 -0
  71. package/packages/notification/dist/telegram-webhook-handler.d.ts.map +1 -1
  72. package/packages/notification/dist/telegram-webhook-handler.js +7 -0
  73. package/packages/notification/dist/telegram-webhook-handler.js.map +1 -1
  74. package/packages/notification/dist/types.d.ts +1 -1
  75. package/packages/notification/dist/types.d.ts.map +1 -1
  76. package/packages/notification/package.json +1 -1
  77. package/packages/notification/src/adapters/line-adapter.ts +7 -1
  78. package/packages/notification/src/notification-center.ts +30 -0
  79. package/packages/notification/src/telegram-webhook-handler.ts +7 -0
  80. package/packages/notification/src/types.ts +1 -0
  81. package/packages/notification/test/notification.test.ts +31 -28
  82. package/packages/notification/test/tooling-proposal-payload.test.ts +212 -0
  83. package/packages/observability/package.json +1 -1
  84. package/packages/okf-indexer/package.json +1 -1
  85. package/packages/paperclip-integration/package.json +1 -1
  86. package/packages/performance-optimizer/package.json +1 -1
  87. package/packages/permission-mode/package.json +1 -1
  88. package/packages/privilege-broker/package.json +1 -1
  89. package/packages/project-analyzer/package.json +1 -1
  90. package/packages/project-bootstrap/package.json +1 -1
  91. package/packages/projection-engine/package.json +1 -1
  92. package/packages/prompt-compiler/package.json +1 -1
  93. package/packages/prompt-versioning/package.json +1 -1
  94. package/packages/provider-adapter-sdk/package.json +1 -1
  95. package/packages/provider-router/package.json +1 -1
  96. package/packages/provider-selector/package.json +1 -1
  97. package/packages/providers/package.json +1 -1
  98. package/packages/qdrant-skills/package.json +1 -1
  99. package/packages/quota-manager/package.json +1 -1
  100. package/packages/rate-limiter/package.json +1 -1
  101. package/packages/react-vite-plugin/package.json +1 -1
  102. package/packages/relay/package.json +1 -1
  103. package/packages/release-manager/package.json +1 -1
  104. package/packages/requirement-compiler/package.json +1 -1
  105. package/packages/runtime/package.json +1 -1
  106. package/packages/scheduler/package.json +1 -1
  107. package/packages/scheduler-adapter/package.json +1 -1
  108. package/packages/session/package.json +1 -1
  109. package/packages/session-api/package.json +1 -1
  110. package/packages/session-export/package.json +1 -1
  111. package/packages/shared-context/package.json +1 -1
  112. package/packages/skill-mcp-client/package.json +1 -1
  113. package/packages/skill-registry/package.json +1 -1
  114. package/packages/skills/package.json +1 -1
  115. package/packages/sprint-planner/package.json +1 -1
  116. package/packages/subscription-engine/package.json +1 -1
  117. package/packages/task-compiler/package.json +1 -1
  118. package/packages/telegram/package.json +1 -1
  119. package/packages/tencentdb-memory/package.json +1 -1
  120. package/packages/tencentdb-sync/package.json +1 -1
  121. package/packages/test-data-generator/package.json +1 -1
  122. package/packages/test-generator/package.json +1 -1
  123. package/packages/todo-bd-sync/package.json +1 -1
  124. package/packages/token-estimation/package.json +1 -1
  125. package/packages/token-optimizer/package.json +1 -1
  126. package/packages/tooling-preference/dist/detect.d.ts +62 -0
  127. package/packages/tooling-preference/dist/detect.d.ts.map +1 -0
  128. package/packages/tooling-preference/dist/detect.js +209 -0
  129. package/packages/tooling-preference/dist/detect.js.map +1 -0
  130. package/packages/tooling-preference/dist/index.d.ts +13 -0
  131. package/packages/tooling-preference/dist/index.d.ts.map +1 -0
  132. package/packages/tooling-preference/dist/index.js +13 -0
  133. package/packages/tooling-preference/dist/index.js.map +1 -0
  134. package/packages/tooling-preference/dist/proposal.d.ts +70 -0
  135. package/packages/tooling-preference/dist/proposal.d.ts.map +1 -0
  136. package/packages/tooling-preference/dist/proposal.js +137 -0
  137. package/packages/tooling-preference/dist/proposal.js.map +1 -0
  138. package/packages/tooling-preference/dist/registry.d.ts +50 -0
  139. package/packages/tooling-preference/dist/registry.d.ts.map +1 -0
  140. package/packages/tooling-preference/dist/registry.js +53 -0
  141. package/packages/tooling-preference/dist/registry.js.map +1 -0
  142. package/packages/tooling-preference/dist/store.d.ts +61 -0
  143. package/packages/tooling-preference/dist/store.d.ts.map +1 -0
  144. package/packages/tooling-preference/dist/store.js +129 -0
  145. package/packages/tooling-preference/dist/store.js.map +1 -0
  146. package/packages/tooling-preference/package.json +21 -0
  147. package/packages/tooling-preference/src/detect.ts +251 -0
  148. package/packages/tooling-preference/src/index.ts +44 -0
  149. package/packages/tooling-preference/src/proposal.ts +173 -0
  150. package/packages/tooling-preference/src/registry.ts +79 -0
  151. package/packages/tooling-preference/src/store.ts +162 -0
  152. package/packages/tooling-preference/tests/detect.test.ts +188 -0
  153. package/packages/tooling-preference/tests/proposal.test.ts +107 -0
  154. package/packages/tooling-preference/tests/registry.test.ts +51 -0
  155. package/packages/tooling-preference/tests/store.test.ts +99 -0
  156. package/packages/trajectory/package.json +1 -1
  157. package/packages/tui/package.json +1 -1
  158. package/packages/types/package.json +1 -1
  159. package/packages/voice-api/package.json +1 -1
  160. package/packages/webmcp-tester/package.json +1 -1
  161. package/packages/wiki/package.json +1 -1
  162. package/packages/workflow-events/package.json +1 -1
  163. package/packages/workspace-scanner/package.json +1 -1
  164. package/packages/worktree/package.json +1 -1
  165. package/packages/write-review/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/project-analyzer",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Project analysis system for pi-harness-runtime - detects frameworks, rules, and project structure",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/project-bootstrap",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Project scaffolding from typed ProjectSpec",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/projection-engine",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-compiler",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Deterministic prompt compiler for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-versioning",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Version control for prompts with rollback support (RFC-0019)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/provider-adapter-sdk",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "SDK for building, testing, and registering AI provider adapters",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-router",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
5
5
  "type": "module",
6
6
  "main": "./dist/provider-router.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-selector",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Multi-Provider Selector — route requests by cost, quality, and latency (RFC-0012)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/providers",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — providers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/qdrant-skills",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Qdrant vector search integration for Hermes-style skill system",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/quota-manager",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — quota-manager",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/rate-limiter",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Rate limiting with token bucket algorithm (RFC-0023)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/react-vite-plugin",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "React/Vite framework analysis — components, config, TypeScript setup",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/relay",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Cloud relay for remote access - T3 Connect style for pi-harness",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/release-manager",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Release management for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/requirement-compiler",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Compiles raw requirements into validated CompiledRequirement with ambiguity detection and risk tagging",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/runtime",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/scheduler",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — scheduler",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/scheduler-adapter",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Scheduler Adapter — cron, systemd, launchd, internal adapters for autonomous runtime (RFC-0101 §6)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Session management system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session-api",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/session-export",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/shared-context",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — shared-context",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/skill-mcp-client",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "MCP client for Skills SaaS backend",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/skill-registry",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Skill Registry for pi-harness-runtime — dynamic skill discovery and invocation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/skills",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "File-based skill system with pi.dev compatibility and Hermes self-improvement",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/sprint-planner",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "description": "Sprint planning engine for pi-harness",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/subscription-engine",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/task-compiler",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Task Compiler for pi-harness-runtime — produces deterministic task DAG from CompiledRequirement",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/telegram",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — Telegram inbound/outbound",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/tencentdb-memory",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "TencentDB Agent Memory client - sync skills to centralized knowledge base",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/tencentdb-sync",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Sync SKILL.md skills to TencentDB-Agent-Memory server (RFC-0105/0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/test-data-generator",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Test data generation for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/test-generator",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Auto-Test Generator — generate unit and E2E tests from source code (RFC-0013)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moocoding/todo-bd-sync",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Two-way sync between rpiv-todo overlay and bd issue tracker",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/token-estimation",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "pi-harness-runtime — token-estimation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/token-optimizer",
3
- "version": "1.1.403",
3
+ "version": "1.1.405",
4
4
  "description": "Token Budget Optimizer — maximize prompt value within token limits (RFC-0011)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Tooling detection for a workspace.
3
+ *
4
+ * The proposal ("use Biome.js instead of ESLint + Prettier") is only made
5
+ * for a JavaScript/TypeScript workspace that still uses ESLint or Prettier
6
+ * and does not use Biome yet. The detection reads the workspace itself -
7
+ * it never guesses from the harness.
8
+ */
9
+ export interface ToolingContext {
10
+ /** Absolute workspace root. */
11
+ root: string;
12
+ /** The workspace has a package.json. */
13
+ hasPackageJson: boolean;
14
+ /** The workspace is a JavaScript/TypeScript project. */
15
+ isJavaScriptTypeScript: boolean;
16
+ /** Next.js is in use. */
17
+ isNextJs: boolean;
18
+ /** React is in use. */
19
+ isReact: boolean;
20
+ /** Biome is configured or installed. */
21
+ usesBiome: boolean;
22
+ /** ESLint is configured or installed. */
23
+ usesEslint: boolean;
24
+ /** Prettier is configured or installed. */
25
+ usesPrettier: boolean;
26
+ /** The package manager the workspace uses, if it can be told. */
27
+ packageManager: string | null;
28
+ /** The frameworks that were detected. */
29
+ frameworks: string[];
30
+ }
31
+ interface PackageJson {
32
+ name?: string;
33
+ dependencies?: Record<string, string>;
34
+ devDependencies?: Record<string, string>;
35
+ peerDependencies?: Record<string, string>;
36
+ packageManager?: string;
37
+ }
38
+ /**
39
+ * Which package manager does the workspace use?
40
+ *
41
+ * The `packageManager` field wins; a lockfile decides otherwise.
42
+ */
43
+ export declare function detectPackageManager(root: string, pkg: PackageJson | null): string | null;
44
+ /**
45
+ * Read the tooling facts of a workspace.
46
+ */
47
+ export declare function detectToolingContext(root: string): ToolingContext;
48
+ export interface ProposalEligibility {
49
+ /** May the proposal be sent? */
50
+ eligible: boolean;
51
+ /** Why the proposal is (not) sent - a human wording. */
52
+ reason: string;
53
+ }
54
+ /**
55
+ * May the Biome proposal be sent for this workspace?
56
+ *
57
+ * A workspace that already uses Biome is never asked about Biome, and a
58
+ * workspace without ESLint and Prettier has nothing to replace.
59
+ */
60
+ export declare function evaluateBiomeProposalEligibility(context: ToolingContext): ProposalEligibility;
61
+ export {};
62
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,cAAc;IAC9B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,cAAc,EAAE,OAAO,CAAC;IACxB,wDAAwD;IACxD,sBAAsB,EAAE,OAAO,CAAC;IAChC,yBAAyB;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,YAAY,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,yCAAyC;IACzC,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAsDD,UAAU,WAAW;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAoED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAQzF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAyBjE;AAED,MAAM,WAAW,mBAAmB;IACnC,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,cAAc,GACrB,mBAAmB,CA6BrB"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Tooling detection for a workspace.
3
+ *
4
+ * The proposal ("use Biome.js instead of ESLint + Prettier") is only made
5
+ * for a JavaScript/TypeScript workspace that still uses ESLint or Prettier
6
+ * and does not use Biome yet. The detection reads the workspace itself -
7
+ * it never guesses from the harness.
8
+ */
9
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
10
+ import { join } from "node:path";
11
+ const ESLINT_CONFIGS = [
12
+ ".eslintrc",
13
+ ".eslintrc.js",
14
+ ".eslintrc.cjs",
15
+ ".eslintrc.mjs",
16
+ ".eslintrc.json",
17
+ ".eslintrc.yaml",
18
+ ".eslintrc.yml",
19
+ "eslint.config.js",
20
+ "eslint.config.mjs",
21
+ "eslint.config.cjs",
22
+ "eslint.config.ts",
23
+ ];
24
+ const PRETTIER_CONFIGS = [
25
+ ".prettierrc",
26
+ ".prettierrc.json",
27
+ ".prettierrc.yaml",
28
+ ".prettierrc.yml",
29
+ ".prettierrc.js",
30
+ ".prettierrc.cjs",
31
+ ".prettierrc.mjs",
32
+ "prettier.config.js",
33
+ "prettier.config.cjs",
34
+ "prettier.config.mjs",
35
+ "prettier.config.ts",
36
+ ];
37
+ const BIOME_CONFIGS = ["biome.json", "biome.jsonc", "biome.json5"];
38
+ const NEXT_CONFIGS = [
39
+ "next.config.js",
40
+ "next.config.mjs",
41
+ "next.config.cjs",
42
+ "next.config.ts",
43
+ ];
44
+ const SOURCE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
45
+ const IGNORED_DIRECTORIES = new Set([
46
+ "node_modules",
47
+ "dist",
48
+ "build",
49
+ "out",
50
+ "coverage",
51
+ "vendor",
52
+ ".git",
53
+ ".next",
54
+ ".turbo",
55
+ ".cache",
56
+ ]);
57
+ function readPackageJson(root) {
58
+ const path = join(root, "package.json");
59
+ if (!existsSync(path))
60
+ return null;
61
+ try {
62
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
63
+ if (!parsed || typeof parsed !== "object")
64
+ return null;
65
+ return parsed;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ function allDependencies(pkg) {
72
+ if (!pkg)
73
+ return {};
74
+ return {
75
+ ...(pkg.dependencies ?? {}),
76
+ ...(pkg.devDependencies ?? {}),
77
+ ...(pkg.peerDependencies ?? {}),
78
+ };
79
+ }
80
+ function anyExists(root, names) {
81
+ return names.some((name) => existsSync(join(root, name)));
82
+ }
83
+ /**
84
+ * Is there a JavaScript/TypeScript source file in the workspace?
85
+ *
86
+ * The scan is shallow on purpose: it only answers "does this workspace hold
87
+ * JS/TS code at all", so it stops at the first source file and never walks
88
+ * a build or dependency directory.
89
+ */
90
+ function hasSourceFile(root, maxDepth = 2) {
91
+ const queue = [{ dir: root, depth: 0 }];
92
+ while (queue.length > 0) {
93
+ const current = queue.shift();
94
+ if (!current)
95
+ break;
96
+ let entries;
97
+ try {
98
+ entries = readdirSync(current.dir);
99
+ }
100
+ catch {
101
+ continue;
102
+ }
103
+ for (const entry of entries) {
104
+ if (entry.startsWith("."))
105
+ continue;
106
+ const full = join(current.dir, entry);
107
+ let isDirectory = false;
108
+ try {
109
+ isDirectory = statSync(full).isDirectory();
110
+ }
111
+ catch {
112
+ continue;
113
+ }
114
+ if (isDirectory) {
115
+ if (current.depth < maxDepth && !IGNORED_DIRECTORIES.has(entry)) {
116
+ queue.push({ dir: full, depth: current.depth + 1 });
117
+ }
118
+ continue;
119
+ }
120
+ if (SOURCE_EXTENSIONS.some((extension) => entry.endsWith(extension))) {
121
+ return true;
122
+ }
123
+ }
124
+ }
125
+ return false;
126
+ }
127
+ /**
128
+ * Which package manager does the workspace use?
129
+ *
130
+ * The `packageManager` field wins; a lockfile decides otherwise.
131
+ */
132
+ export function detectPackageManager(root, pkg) {
133
+ const declared = pkg?.packageManager?.split("@")[0]?.trim();
134
+ if (declared)
135
+ return declared;
136
+ if (existsSync(join(root, "pnpm-lock.yaml")))
137
+ return "pnpm";
138
+ if (existsSync(join(root, "yarn.lock")))
139
+ return "yarn";
140
+ if (existsSync(join(root, "bun.lock")) || existsSync(join(root, "bun.lockb")))
141
+ return "bun";
142
+ if (existsSync(join(root, "package-lock.json")))
143
+ return "npm";
144
+ return null;
145
+ }
146
+ /**
147
+ * Read the tooling facts of a workspace.
148
+ */
149
+ export function detectToolingContext(root) {
150
+ const pkg = readPackageJson(root);
151
+ const deps = allDependencies(pkg);
152
+ const hasPackageJson = pkg !== null;
153
+ const hasTsConfig = existsSync(join(root, "tsconfig.json"));
154
+ const isNextJs = Boolean(deps.next) || anyExists(root, NEXT_CONFIGS);
155
+ const isReact = Boolean(deps.react || deps["react-dom"]) || isNextJs;
156
+ const isTypeScript = hasTsConfig || Boolean(deps.typescript) || hasSourceFile(root);
157
+ return {
158
+ root,
159
+ hasPackageJson,
160
+ isJavaScriptTypeScript: hasPackageJson && isTypeScript,
161
+ isNextJs,
162
+ isReact,
163
+ usesBiome: anyExists(root, BIOME_CONFIGS) || Boolean(deps["@biomejs/biome"]),
164
+ usesEslint: anyExists(root, ESLINT_CONFIGS) || Boolean(deps.eslint),
165
+ usesPrettier: anyExists(root, PRETTIER_CONFIGS) || Boolean(deps.prettier),
166
+ packageManager: detectPackageManager(root, pkg),
167
+ frameworks: [
168
+ ...(isNextJs ? ["next"] : []),
169
+ ...(isReact && !isNextJs ? ["react"] : []),
170
+ ],
171
+ };
172
+ }
173
+ /**
174
+ * May the Biome proposal be sent for this workspace?
175
+ *
176
+ * A workspace that already uses Biome is never asked about Biome, and a
177
+ * workspace without ESLint and Prettier has nothing to replace.
178
+ */
179
+ export function evaluateBiomeProposalEligibility(context) {
180
+ if (!context.hasPackageJson) {
181
+ return {
182
+ eligible: false,
183
+ reason: "the workspace has no package.json",
184
+ };
185
+ }
186
+ if (!context.isJavaScriptTypeScript) {
187
+ return {
188
+ eligible: false,
189
+ reason: "the workspace is not a JavaScript/TypeScript project",
190
+ };
191
+ }
192
+ if (context.usesBiome) {
193
+ return {
194
+ eligible: false,
195
+ reason: "Biome is already configured in this workspace",
196
+ };
197
+ }
198
+ if (!context.usesEslint && !context.usesPrettier) {
199
+ return {
200
+ eligible: false,
201
+ reason: "the workspace uses neither ESLint nor Prettier",
202
+ };
203
+ }
204
+ return {
205
+ eligible: true,
206
+ reason: "the workspace uses ESLint and/or Prettier and no Biome",
207
+ };
208
+ }
209
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The JS/TS tooling preference of a workspace.
3
+ *
4
+ * The harness offers the user to replace ESLint and Prettier with Biome.js
5
+ * in a JavaScript/TypeScript workspace. The offer is a decision of its own:
6
+ * it never pauses the work and never travels through the task-approval
7
+ * path.
8
+ */
9
+ export { detectPackageManager, detectToolingContext, evaluateBiomeProposalEligibility, type ProposalEligibility, type ToolingContext, } from "./detect.js";
10
+ export { buildToolingButtons, buildToolingImplementationPrompt, buildToolingProposalMessage, buildToolingRequestId, buildToolingUserKey, parseToolingTarget, TOOLING_ACTION, type ToolingButton, type ToolingChoice, type ToolingPreference, type ToolingTarget, } from "./proposal.js";
11
+ export { harnessRuntimeDir, shouldAskAgain, ToolingPreferenceStore, toolingPreferenceKey, type ToolingPreferenceRecord, } from "./store.js";
12
+ export { ToolingRequestRegistry, type ToolingRequest, type ToolingResolution, } from "./registry.js";
13
+ //# sourceMappingURL=index.d.ts.map