teamcopilot 0.0.1

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 (209) hide show
  1. package/.env.example +10 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +131 -0
  4. package/bin/teamcopilot.js +281 -0
  5. package/dist/auth/index.js +189 -0
  6. package/dist/change-user-role.js +77 -0
  7. package/dist/chat/index.js +849 -0
  8. package/dist/constants.js +2 -0
  9. package/dist/create-user.js +98 -0
  10. package/dist/cronjob/index.js +16 -0
  11. package/dist/cronjob/resource-reconciliation.js +33 -0
  12. package/dist/delete-user.js +66 -0
  13. package/dist/frontend/assets/abap-CRCWOmpq.js +1 -0
  14. package/dist/frontend/assets/apex-DnsZk_dE.js +1 -0
  15. package/dist/frontend/assets/azcli-1IWB1ccx.js +1 -0
  16. package/dist/frontend/assets/bat-DPkNLes8.js +1 -0
  17. package/dist/frontend/assets/bicep-Corcdgou.js +2 -0
  18. package/dist/frontend/assets/cameligo-CGrWLZr3.js +1 -0
  19. package/dist/frontend/assets/clojure-D9WOWImG.js +1 -0
  20. package/dist/frontend/assets/codicon-DCmgc-ay.ttf +0 -0
  21. package/dist/frontend/assets/coffee-B7EJu28W.js +1 -0
  22. package/dist/frontend/assets/cpp-SEyurbux.js +1 -0
  23. package/dist/frontend/assets/csharp-BoL64M5l.js +1 -0
  24. package/dist/frontend/assets/csp-C46ZqvIl.js +1 -0
  25. package/dist/frontend/assets/css-DQU6DXDx.js +3 -0
  26. package/dist/frontend/assets/cssMode-BDT3WbVs.js +4 -0
  27. package/dist/frontend/assets/cypher-D84EuPTj.js +1 -0
  28. package/dist/frontend/assets/dart-D8lhlL1r.js +1 -0
  29. package/dist/frontend/assets/dockerfile-DLk6rpji.js +1 -0
  30. package/dist/frontend/assets/ecl-BO6FnfXk.js +1 -0
  31. package/dist/frontend/assets/editor.worker-B4pQIWZD.js +12 -0
  32. package/dist/frontend/assets/elixir-BRjLKONM.js +1 -0
  33. package/dist/frontend/assets/flow9-Cac8vKd7.js +1 -0
  34. package/dist/frontend/assets/freemarker2-C7-hEgID.js +3 -0
  35. package/dist/frontend/assets/fsharp-fd1GTHhf.js +1 -0
  36. package/dist/frontend/assets/go-O9LJTZXk.js +1 -0
  37. package/dist/frontend/assets/graphql-LQdxqEYJ.js +1 -0
  38. package/dist/frontend/assets/handlebars-4cwTkPir.js +1 -0
  39. package/dist/frontend/assets/hcl-DxDQ3s82.js +1 -0
  40. package/dist/frontend/assets/html-YNfE1Q0A.js +1 -0
  41. package/dist/frontend/assets/htmlMode-opTQ1HoB.js +4 -0
  42. package/dist/frontend/assets/index-DWyaVa1h.js +782 -0
  43. package/dist/frontend/assets/index-lXrsgeTF.css +1 -0
  44. package/dist/frontend/assets/ini-BvajGCUy.js +1 -0
  45. package/dist/frontend/assets/java-SYsfObOQ.js +1 -0
  46. package/dist/frontend/assets/javascript-BEwGzk7T.js +1 -0
  47. package/dist/frontend/assets/jsonMode-CGhIS5Al.js +10 -0
  48. package/dist/frontend/assets/julia-DQXNmw_w.js +1 -0
  49. package/dist/frontend/assets/kotlin-qQ0MG-9I.js +1 -0
  50. package/dist/frontend/assets/less-GGFNNJHn.js +2 -0
  51. package/dist/frontend/assets/lexon-Canl7DCW.js +1 -0
  52. package/dist/frontend/assets/liquid-QekTGCGJ.js +1 -0
  53. package/dist/frontend/assets/lua-D28Ae8-K.js +1 -0
  54. package/dist/frontend/assets/m3-DPitgjJI.js +1 -0
  55. package/dist/frontend/assets/markdown-B811l8j2.js +1 -0
  56. package/dist/frontend/assets/mdx-BAVDaB7v.js +1 -0
  57. package/dist/frontend/assets/mips-CdjsipkG.js +1 -0
  58. package/dist/frontend/assets/msdax-CYqgjx_P.js +1 -0
  59. package/dist/frontend/assets/mysql-BHd6q0vd.js +1 -0
  60. package/dist/frontend/assets/objective-c-B1aVtJYH.js +1 -0
  61. package/dist/frontend/assets/pascal-BhNW15KB.js +1 -0
  62. package/dist/frontend/assets/pascaligo-5jv8CcQD.js +1 -0
  63. package/dist/frontend/assets/perl-DlYyT36c.js +1 -0
  64. package/dist/frontend/assets/pgsql-Dy0bjov7.js +1 -0
  65. package/dist/frontend/assets/php-120yhfDK.js +1 -0
  66. package/dist/frontend/assets/pla-CjnFlu4u.js +1 -0
  67. package/dist/frontend/assets/postiats-CQpG440k.js +1 -0
  68. package/dist/frontend/assets/powerquery-DdJtto1Z.js +1 -0
  69. package/dist/frontend/assets/powershell-Bu_VLpJB.js +1 -0
  70. package/dist/frontend/assets/protobuf-IBS6jZEB.js +2 -0
  71. package/dist/frontend/assets/pug-kFxLfcjb.js +1 -0
  72. package/dist/frontend/assets/python-BQlHw7XO.js +1 -0
  73. package/dist/frontend/assets/qsharp-q7JyzKFN.js +1 -0
  74. package/dist/frontend/assets/r-BIFz-_sK.js +1 -0
  75. package/dist/frontend/assets/razor-Be3Wwc2E.js +1 -0
  76. package/dist/frontend/assets/redis-CHOsPHWR.js +1 -0
  77. package/dist/frontend/assets/redshift-CBifECDb.js +1 -0
  78. package/dist/frontend/assets/restructuredtext-CghPJEOS.js +1 -0
  79. package/dist/frontend/assets/ruby-CYWGW-b1.js +1 -0
  80. package/dist/frontend/assets/rust-DMDD0SHb.js +1 -0
  81. package/dist/frontend/assets/sb-BYAiYHFx.js +1 -0
  82. package/dist/frontend/assets/scala-Bqvq8jcR.js +1 -0
  83. package/dist/frontend/assets/scheme-Dhb-2j9p.js +1 -0
  84. package/dist/frontend/assets/scss-CTwUZ5N7.js +3 -0
  85. package/dist/frontend/assets/shell-CsDZo4DB.js +1 -0
  86. package/dist/frontend/assets/solidity-CME5AdoB.js +1 -0
  87. package/dist/frontend/assets/sophia-RYC1BQQz.js +1 -0
  88. package/dist/frontend/assets/sparql-KEyrF7De.js +1 -0
  89. package/dist/frontend/assets/sql-BdTr02Mf.js +1 -0
  90. package/dist/frontend/assets/st-C7iG7M4S.js +1 -0
  91. package/dist/frontend/assets/swift-D7IUmUK8.js +1 -0
  92. package/dist/frontend/assets/systemverilog-DgMryOEJ.js +1 -0
  93. package/dist/frontend/assets/tcl-PloMZuKG.js +1 -0
  94. package/dist/frontend/assets/tsMode-CIBFoN3z.js +11 -0
  95. package/dist/frontend/assets/twig-BfRIq3la.js +1 -0
  96. package/dist/frontend/assets/typescript-BuV9wEIE.js +1 -0
  97. package/dist/frontend/assets/typespec-CzxlYoT_.js +1 -0
  98. package/dist/frontend/assets/vb-BwAE3J76.js +1 -0
  99. package/dist/frontend/assets/wgsl-B_1kOXbF.js +298 -0
  100. package/dist/frontend/assets/xml-DcDKYaM4.js +1 -0
  101. package/dist/frontend/assets/yaml-CuBNmOuI.js +1 -0
  102. package/dist/frontend/index.html +14 -0
  103. package/dist/frontend/logo.svg +50 -0
  104. package/dist/index.js +169 -0
  105. package/dist/logging.js +30 -0
  106. package/dist/opencode-auth/index.js +122 -0
  107. package/dist/opencode-server.js +91 -0
  108. package/dist/prisma/client.js +38 -0
  109. package/dist/reset-password.js +73 -0
  110. package/dist/rotate-jwt-secret.js +20 -0
  111. package/dist/scripts/prisma-workspace.js +34 -0
  112. package/dist/skills/index.js +311 -0
  113. package/dist/types/permissions.js +2 -0
  114. package/dist/types/shared/permissions.js +17 -0
  115. package/dist/types/shared/skill.js +17 -0
  116. package/dist/types/shared/workflow-files.js +17 -0
  117. package/dist/types/shared/workflow.js +17 -0
  118. package/dist/types/skill.js +2 -0
  119. package/dist/types/workflow-files.js +2 -0
  120. package/dist/types/workflow.js +2 -0
  121. package/dist/users/index.js +22 -0
  122. package/dist/utils/approval-snapshot-common.js +596 -0
  123. package/dist/utils/assert.js +20 -0
  124. package/dist/utils/chat-session.js +44 -0
  125. package/dist/utils/cli-bootstrap.js +26 -0
  126. package/dist/utils/index.js +95 -0
  127. package/dist/utils/jwt-secret.js +63 -0
  128. package/dist/utils/opencode-auth.js +126 -0
  129. package/dist/utils/opencode-client.js +109 -0
  130. package/dist/utils/password-policy.js +12 -0
  131. package/dist/utils/permission-common.js +280 -0
  132. package/dist/utils/redact.js +108 -0
  133. package/dist/utils/resource-access.js +37 -0
  134. package/dist/utils/resource-file-routes.js +115 -0
  135. package/dist/utils/resource-files.js +572 -0
  136. package/dist/utils/runtime-paths.js +61 -0
  137. package/dist/utils/session-abort.js +52 -0
  138. package/dist/utils/skill-approval-snapshot.js +39 -0
  139. package/dist/utils/skill-files.js +17 -0
  140. package/dist/utils/skill-permissions.js +15 -0
  141. package/dist/utils/skill.js +217 -0
  142. package/dist/utils/user-role.js +14 -0
  143. package/dist/utils/workflow-approval-snapshot.js +38 -0
  144. package/dist/utils/workflow-files.js +17 -0
  145. package/dist/utils/workflow-interruption.js +50 -0
  146. package/dist/utils/workflow-permissions.js +27 -0
  147. package/dist/utils/workflow-runner.js +414 -0
  148. package/dist/utils/workflow.js +158 -0
  149. package/dist/utils/workspace-sync.js +204 -0
  150. package/dist/workflows/index.js +751 -0
  151. package/dist/workspace_files/.opencode/opencode.json +17 -0
  152. package/dist/workspace_files/.opencode/package.json +14 -0
  153. package/dist/workspace_files/.opencode/plugins/createSkill.ts +339 -0
  154. package/dist/workspace_files/.opencode/plugins/createWorkflow.ts +345 -0
  155. package/dist/workspace_files/.opencode/plugins/findSimilarWorkflow.ts +173 -0
  156. package/dist/workspace_files/.opencode/plugins/findSkill.ts +211 -0
  157. package/dist/workspace_files/.opencode/plugins/getSkillContent.ts +135 -0
  158. package/dist/workspace_files/.opencode/plugins/honeytoken-protection.ts +64 -0
  159. package/dist/workspace_files/.opencode/plugins/listAvailableSkills.ts +93 -0
  160. package/dist/workspace_files/.opencode/plugins/listAvailableWorkflows.ts +93 -0
  161. package/dist/workspace_files/.opencode/plugins/python-protection.ts +184 -0
  162. package/dist/workspace_files/.opencode/plugins/runWorkflow.ts +168 -0
  163. package/dist/workspace_files/.opencode/tsconfig.json +16 -0
  164. package/dist/workspace_files/AGENTS.md +483 -0
  165. package/dist/workspace_files/package-lock.json +167 -0
  166. package/dist/workspace_files/package.json +5 -0
  167. package/package.json +86 -0
  168. package/prisma/migrations/20260203040755_init/migration.sql +20 -0
  169. package/prisma/migrations/20260204034845_replace_google_auth_with_email_password/migration.sql +25 -0
  170. package/prisma/migrations/20260207022226_add_user_role/migration.sql +25 -0
  171. package/prisma/migrations/20260210161254_add_workflow_runs/migration.sql +16 -0
  172. package/prisma/migrations/20260211050606_adds_workflow_table/migration.sql +40 -0
  173. package/prisma/migrations/20260211050750_adds_fkey_constraint/migration.sql +21 -0
  174. package/prisma/migrations/20260211051912_removes_workflow_table/migration.sql +34 -0
  175. package/prisma/migrations/20260211052238_changes_workflow_id_to_slug/migration.sql +27 -0
  176. package/prisma/migrations/20260212051912_add_output_to_workflow_runs/migration.sql +2 -0
  177. package/prisma/migrations/20260213073006_add_chat_sessions/migration.sql +13 -0
  178. package/prisma/migrations/20260216053202_add_chat_sessions_opencode_session_id_idx/migration.sql +2 -0
  179. package/prisma/migrations/20260216053237_drop_redundant_chat_sessions_opencode_idx/migration.sql +2 -0
  180. package/prisma/migrations/20260219060705_makes/migration.sql +24 -0
  181. package/prisma/migrations/20260222040542_add_workflow_execution_permissions/migration.sql +18 -0
  182. package/prisma/migrations/20260222040815_remove_workflow_execution_permissions/migration.sql +10 -0
  183. package/prisma/migrations/20260222041348_add_workflow_execution_permissions_final/migration.sql +17 -0
  184. package/prisma/migrations/20260222041741_rename_to_tool_execution_permissions/migration.sql +30 -0
  185. package/prisma/migrations/20260222041826_simplify_tool_execution_permissions/migration.sql +29 -0
  186. package/prisma/migrations/20260222041950_add_fields_for_standalone_permissions/migration.sql +32 -0
  187. package/prisma/migrations/20260222042954_simplify_tool_permissions_table/migration.sql +27 -0
  188. package/prisma/migrations/20260223073902_add_workflow_run_permissions_tables/migration.sql +23 -0
  189. package/prisma/migrations/20260225025151_add_workflow_metadata/migration.sql +16 -0
  190. package/prisma/migrations/20260225031035_merge_workflow_permissions_into_metadata/migration.sql +44 -0
  191. package/prisma/migrations/20260225031752_removes_default_for_run_permission_mode/migration.sql +20 -0
  192. package/prisma/migrations/20260225033603_remove_workflow_metadata_user_fkeys/migration.sql +18 -0
  193. package/prisma/migrations/20260225043032_restore_workflow_metadata_user_fkeys/migration.sql +20 -0
  194. package/prisma/migrations/20260225091423_add_workflow_approved_snapshots/migration.sql +28 -0
  195. package/prisma/migrations/20260226032121_add_is_approved_to_workflow_metadata/migration.sql +21 -0
  196. package/prisma/migrations/20260226032444_undoes_last_db_change/migration.sql +26 -0
  197. package/prisma/migrations/20260227120000_remove_snapshot_hash_from_approved_snapshots/migration.sql +16 -0
  198. package/prisma/migrations/20260228071125_adds_workspace_path_to_snapshot_table/migration.sql +22 -0
  199. package/prisma/migrations/20260228071217_modifies_index_and_removes_default_value/migration.sql +22 -0
  200. package/prisma/migrations/20260228071710_undoes_previous/migration.sql +27 -0
  201. package/prisma/migrations/20260228105022_add_must_change_password_first_login/migration.sql +20 -0
  202. package/prisma/migrations/20260301115439_add_workflow_run_log_refs/migration.sql +8 -0
  203. package/prisma/migrations/20260301122557_add_workflow_aborted_sessions/migration.sql +5 -0
  204. package/prisma/migrations/20260302045545_move_workflow_run_log_refs_into_workflow_runs/migration.sql +17 -0
  205. package/prisma/migrations/20260303040318_add_skill_tables/migration.sql +61 -0
  206. package/prisma/migrations/20260303051533_unify_resource_permissions/migration.sql +97 -0
  207. package/prisma/migrations/20260303064255_unify_resource_metadata_and_snapshots/migration.sql +179 -0
  208. package/prisma/migrations/migration_lock.toml +3 -0
  209. package/prisma/schema.prisma +147 -0
@@ -0,0 +1,483 @@
1
+ # TeamCopilot Agent Instructions
2
+
3
+ This document is your operating manual for working within this directory (called workspace). Follow these conventions strictly when creating, updating, or running workflows and custom skills.
4
+
5
+ ---
6
+
7
+ ## Additional Workspace Instructions
8
+
9
+ At session start, TeamCopilot checks whether `USER_INSTRUCTIONS.md` exists at the workspace root.
10
+
11
+ - If it exists and is non-empty, its full contents are automatically appended as the first chat for the new session.
12
+ - If it exists and any instruction conflicts with this file, `USER_INSTRUCTIONS.md` takes precedence.
13
+
14
+ ---
15
+
16
+ ## Required Decision Order (ALWAYS FOLLOW)
17
+
18
+ For every user request, follow this exact sequence:
19
+
20
+ 1. **Look for a relevant custom skill first** using `findSkill` (and `listAvailableSkills` when needed).
21
+ 2. **If no suitable skill is found**, look for a relevant workflow using `findSimilarWorkflow` (and `listAvailableWorkflows` when needed).
22
+ 3. **If neither exists**, then consider creation:
23
+ - Create a new skill using `createSkill` when the need is reusable instruction logic.
24
+ - Create a new workflow using `createWorkflow` when executable automation is needed.
25
+
26
+ Do NOT skip this sequence.
27
+
28
+ ---
29
+
30
+ ## ⚠️ CRITICAL: Never Run Workflow Entrypoints Directly
31
+
32
+ **You must NEVER execute workflow scripts directly using shell commands.**
33
+
34
+ All workflow execution performed by the agent **must** go through the `runWorkflow` tool. This is enforced because:
35
+ - Only workflows that have been **approved by an engineer user** can be executed. This check (among other checks) is performed by the `runWorkflow` tool.
36
+ - The `runWorkflow` can throw an error for various reasons. If it does, read the error message and report it to the user accurately.
37
+
38
+ You may run normal shell commands (including `python`, `pip`, `node`, `npm`, etc.) for setup, dependency management, validation, and non-workflow tasks. The only restricted action is directly executing a workflow entrypoint script from shell.
39
+
40
+ **Forbidden actions (for the agent):**
41
+ - ❌ `python run.py` when inside `workflows/<slug>/`
42
+ - ❌ `cd workflows/<slug> && python run.py`
43
+ - ❌ `python workflows/<slug>/run.py` (or absolute path variants)
44
+ - ❌ `python3 run.py`, `python3.x run.py`, `python2 run.py`, `py run.py`, `pypy run.py` when targeting a workflow `run.py`
45
+ - ❌ Any shell command that executes a workflow entrypoint script directly (instead of using `runWorkflow`)
46
+
47
+ **Required action:**
48
+ - ✅ Use the `runWorkflow` tool to execute any workflow
49
+ - ✅ After `createWorkflow`, immediately create `workflows/<slug>/.venv` using `python -m venv .venv` (or `python3 -m venv .venv`) from inside that workflow folder
50
+
51
+ **Allowed shell commands:**
52
+ - ✅ Any command, except for executing a workflow entrypoint directly from shell.
53
+ - ✅ `cd workflows/<slug> && python -m venv .venv`
54
+ - ✅ `cd workflows/<slug> && python3 -m venv .venv`
55
+
56
+ Violating this constraint bypasses safety checks and is not permitted.
57
+
58
+ ---
59
+
60
+ ## Section 1: Custom Skills
61
+
62
+ Before implementing custom instructions or creating new workflow logic, you MUST first check whether an existing custom skill can fulfill the request.
63
+
64
+ **Required skill tools:**
65
+ - `listAvailableSkills` — list only skills you are allowed to use (editable + approved).
66
+ - `findSkill` — semantically search skills by description/body.
67
+ - `getSkillContent` — read `SKILL.md` for a specific skill (only works when user has access and skill is approved).
68
+ - `createSkill` — create a new skill when no suitable skill exists. This tool requires explicit user permission during execution.
69
+
70
+ **Rule:**
71
+ - Always try `findSkill` before creating a new skill.
72
+ - If a relevant skill exists, use it and follow its `SKILL.md` instructions.
73
+ - If no relevant skill exists, use `createSkill`.
74
+
75
+ ---
76
+
77
+ ### What is a Custom Skill?
78
+
79
+ A **custom skill** is a reusable instruction package for the agent that lives in `custom-skills/<slug>/`.
80
+ Each custom skill:
81
+ - Has a unique slug (lowercase, hyphenated, e.g., `triage-support-ticket`)
82
+ - Uses `SKILL.md` as the canonical manifest/instruction file
83
+ - Must be **approved by an engineer user** before it is considered usable via the skill tools
84
+ - Must only be used when you have access to it through platform permissions
85
+
86
+ ---
87
+
88
+ ## Section 2: Workflows
89
+
90
+ ### What is a Workflow?
91
+
92
+ A **workflow** is a self-contained automation package that lives in `workflows/<slug>/`. Each workflow:
93
+ - Has a unique slug (lowercase, hyphenated, e.g., `failed-stripe-payments`)
94
+ - Is filesystem-first: the folder contents are the source of truth
95
+ - Must be self-contained on disk: **any external additions** required by the workflow (e.g., cloned git repos, downloaded SDKs/assets, vendored scripts, fixtures) **must be placed inside** `workflows/<slug>/` and **must not** be created/checked out anywhere outside the workflow folder
96
+ - Can be triggered manually via the `runWorkflow` tool (by you) or from the UI (by a human)
97
+ - Must be **approved by an engineer user** before it can be executed
98
+ - Internally runs through approved platform runtime entrypoints
99
+ - **Agent execution**: must be invoked via `runWorkflow` (never via shell)
100
+ - **Human execution**: should also go through approved platform tooling
101
+
102
+ ---
103
+
104
+ ### Workflow Package Structure
105
+
106
+ Every workflow folder must follow this structure:
107
+
108
+ ```
109
+ workflows/<slug>/
110
+ ├── workflow.json ← REQUIRED: contract + runtime metadata
111
+ ├── README.md ← REQUIRED: documentation + usage instructions
112
+ ├── run.py ← REQUIRED: entrypoint script
113
+ ├── requirements.txt ← REQUIRED: Python dependencies
114
+ ├── .env ← REQUIRED: runtime secrets
115
+ ├── .env.example ← RECOMMENDED: documented template
116
+ ├── .venv/ ← REQUIRED: per-workflow virtualenv
117
+ ├── requirements.lock.txt ← REQUIRED: records installed versions for reference
118
+ └── data/ ← OPTIONAL: non-secret config/state files
119
+ ```
120
+
121
+ ---
122
+
123
+ ### Required Files
124
+
125
+ ### 1. `workflow.json` — The Workflow Contract
126
+
127
+ This manifest defines what the workflow does and how it runs. The UI and execution layer use this as the contract.
128
+
129
+ ```json
130
+ {
131
+ "intent_summary": "Human-readable description of what this workflow does",
132
+ "inputs": {
133
+ "customer_id": {
134
+ "type": "string",
135
+ "required": true,
136
+ "description": "The Stripe customer ID to check"
137
+ },
138
+ "days_back": {
139
+ "type": "number",
140
+ "required": false,
141
+ "default": 7,
142
+ "description": "Number of days to look back for failed payments"
143
+ }
144
+ },
145
+ "triggers": {
146
+ "manual": true // will always be true.
147
+ },
148
+ "runtime": {
149
+ "timeout_seconds": 300
150
+ }
151
+ }
152
+ ```
153
+
154
+ ### 2. `README.md` — Documentation
155
+
156
+ Document:
157
+ - What the workflow does
158
+ - Required credentials/secrets
159
+ - Input parameters and their meaning
160
+ - Expected outputs
161
+ - Example usage
162
+
163
+ ### 3. `run.py` — Entrypoint Script
164
+
165
+ The main script that executes the workflow logic. It must:
166
+ - Not be run directly with Python from shell; execution must happen via approved platform tooling only
167
+ - Be end-to-end self-contained: it should perform the full workflow (setup (if needed) + inputs → processing → outputs) in one invocation
168
+ - Read inputs via args passed to the script.
169
+ - Write outputs to to the console.
170
+ - Handle errors gracefully
171
+
172
+ Example:
173
+ ```python
174
+ import argparse
175
+
176
+ def main():
177
+ parser = argparse.ArgumentParser()
178
+ parser.add_argument("--customer_id", required=True, help="The Stripe customer ID to check")
179
+ parser.add_argument("--days_back", type=int, default=7, help="Number of days to look back")
180
+ args = parser.parse_args()
181
+
182
+ # Your workflow logic here
183
+
184
+ print(f"Processed customer: {args.customer_id}")
185
+
186
+ if __name__ == "__main__":
187
+ main()
188
+ ```
189
+
190
+ ### 4. `requirements.txt` — Dependencies
191
+
192
+ List all Python dependencies. **Do NOT specify versions** — always use the latest version.
193
+
194
+ ```
195
+ stripe
196
+ requests
197
+ ```
198
+
199
+ **Important:** When adding dependencies:
200
+ - Do NOT add version specifiers in `requirements.txt` (e.g., don't use `stripe>=5.0.0`)
201
+ - Do NOT use `pip install package==version` — just use `pip install package`
202
+ - Always install the latest version available
203
+ - After adding any new dependency, you MUST run: `pip freeze > requirements.lock.txt`
204
+
205
+ ### `requirements.lock.txt` — Locked Dependencies
206
+
207
+ This file records the exact versions of all installed packages. **The only way to modify this file is by running:**
208
+
209
+ ```bash
210
+ pip freeze > requirements.lock.txt
211
+ ```
212
+
213
+ - Run this command every time you add, remove, or update any dependency
214
+ - Never edit this file manually
215
+ - This ensures the lock file accurately reflects what's installed in the virtualenv
216
+
217
+ ---
218
+
219
+ ### Optional Files
220
+
221
+ ### `data/` — Workflow State and Configuration
222
+
223
+ This folder is for storing non-secret state and configuration as JSON files. Use it when your workflow needs to persist data between runs.
224
+
225
+ **Guidelines:**
226
+ - Store state as JSON files (e.g., `last_processed.json`, `cache.json`, `config.json`, `data.json` etc.)
227
+ - Structure the folder however fits your workflow's needs
228
+ - **Document any data structure in `README.md`** — whenever you add a new file, change the schema of an existing file, or modify the folder structure, update the workflow's README to reflect these changes
229
+
230
+ **Example structure:**
231
+ ```
232
+ data/
233
+ ├── last_sync.json # Timestamp of last successful sync
234
+ ├── customer_cache.json # Cached customer data to avoid re-fetching
235
+ └── config.json # Workflow-specific configuration overrides
236
+ ...
237
+ ```
238
+
239
+ **Important:** Always document the purpose and schema of each file in the workflow's `README.md`. This helps future maintainers and AI agents understand what data is being stored and how it's structured.
240
+
241
+ ---
242
+
243
+ ## Shared Conventions
244
+
245
+ ### Custom Skills: Usage Flow
246
+
247
+ 1. **Search skills first** — You MUST use `findSkill` to look for an existing skill that can satisfy the request before creating new skill logic.
248
+ 2. **Inspect matching skills** — Use `getSkillContent` to read candidate `SKILL.md` files and decide whether one applies.
249
+ 3. **Create only when needed** — Use `createSkill` only if no existing approved + accessible skill is a good fit.
250
+ 4. **Use listing when needed** — Use `listAvailableSkills` when you need a quick inventory of usable skills.
251
+
252
+ ### Workflows: Creating a New Workflow
253
+
254
+ 1. **Check for similar workflows first** — You MUST use the `findSimilarWorkflow` tool to search for existing workflows; do NOT use shell or bash commands (for example `grep`, `rg`, or `find`) to search the repository for workflows.
255
+ - If you find a similar workflow, **learn from it**: take relevant business logic from it.
256
+ - If you only want to find an existing workflow to run (not create a new one), you MUST also use the `findSimilarWorkflow` tool rather than searching with shell commands.
257
+ - Use `listAvailableWorkflows` when you need a quick inventory of all accessible workflows before narrowing down.
258
+ 2. **Use the `createWorkflow` tool** — This creates the workflow folder with all required files:
259
+ - `slug`: The workflow name (lowercase, hyphens, e.g., `failed-stripe-payments`)
260
+ - `intent_summary`: Description of what the workflow does
261
+ - `inputs`: (optional) Input parameter schema
262
+ - `timeout_seconds`: (optional, default 300) Max execution time
263
+ 3. **Create the virtual environment immediately** — Right after `createWorkflow`, create a workflow-local virtualenv:
264
+ - `cd workflows/<slug> && python -m venv .venv` (or `python3 -m venv .venv`)
265
+ 4. **Implement the workflow** — After the tool creates the skeleton and `.venv`:
266
+ - Edit `run.py` — Implement the logic with argparse for inputs
267
+ - Edit `requirements.txt` — Add Python dependencies (no version specifiers)
268
+ - Edit `.env` — Add runtime secrets
269
+ - Edit `.env.example` — Document required secrets as a template
270
+ - Edit `README.md` — Document the workflow
271
+ - Create `.venv/` — Create a per-workflow virtualenv
272
+ - Update `requirements.lock.txt` — Run `pip freeze > requirements.lock.txt` after installing deps
273
+ 5. **Optionally create `data/`** — If the workflow needs to persist state between runs (document structure in README)
274
+
275
+ ### Workflows: Updating an Existing Workflow
276
+
277
+ 1. **Read the current files** — Understand existing logic before modifying
278
+ 2. **Re-check the workflow slug** — If you want to change what `run.py` does, you MUST ensure the workflow folder slug (the `workflows/<slug>/` name) is still apt for the workflow’s purpose. If it no longer fits, consider finding a more appropriate existing workflow or creating a new workflow with a better slug instead of overloading the old one.
279
+ 3. **Modify the `run.py` file** to implement the desired functionality.
280
+ 4. **Preserve the contract** — If changing inputs/outputs, update `workflow.json`
281
+ 5. **Keep `workflow.json` aligned with behavior** — If you modify `run.py`, you MUST also update the `intent_summary` in `workflow.json` to match the new/updated behavior.
282
+ 6. **Update documentation** — Keep `README.md` in sync with changes
283
+ 7. **Test locally if possible** — Run the workflow to verify changes
284
+
285
+ ### Workflows: Running Workflows
286
+
287
+ If you simply need to find an existing workflow to run (and are not creating a new workflow), use `findSimilarWorkflow` (and `listAvailableWorkflows` when useful) to locate it; do NOT search using shell commands.
288
+
289
+ **⚠️ CRITICAL: Never run workflows directly via shell commands. Always use the `runWorkflow` tool.**
290
+
291
+ - Workflows are executed via the `runWorkflow` tool (NOT via shell commands)
292
+ - The tool checks if the workflow is approved before execution
293
+ - If not approved, the tool returns an error — you cannot bypass this.
294
+ - Outputs are captured and returned by the tool
295
+ - Each workflow has its own `.venv/` virtualenv (managed by the execution environment)
296
+ - Dependencies are installed from `requirements.txt` (always latest versions) and recorded in `requirements.lock.txt`
297
+
298
+ ### Workflows: Credential Handling
299
+
300
+ - Store secrets in `.env`
301
+ - Always provide `.env.example` with placeholder values
302
+ - Document which secrets are required in `README.md`
303
+ - If the user provides secrets/tokens during execution, you MAY use them to complete the requested task.
304
+ - Prefer storing workflow runtime secrets in that workflow's `.env` when appropriate.
305
+ - Never echo secrets/tokens in tool output summaries or chat responses.
306
+
307
+ ### Workflows: Output and Artifacts
308
+
309
+ - Write outputs to the console (stdout/stderr) — this is captured by the `runWorkflow` tool
310
+ - Use structured formats (JSON) for machine-readable output when appropriate
311
+
312
+ ---
313
+
314
+ ### Workflows: Input Handling
315
+
316
+ When **writing** workflow code, inputs are passed as command-line arguments to `run.py`. Use `argparse` to parse them:
317
+
318
+ ```python
319
+ import argparse
320
+
321
+ parser = argparse.ArgumentParser()
322
+ parser.add_argument("--customer_id", required=True, help="The Stripe customer ID")
323
+ parser.add_argument("--days_back", type=int, default=7, help="Days to look back")
324
+ args = parser.parse_args()
325
+
326
+ # Access inputs
327
+ customer_id = args.customer_id
328
+ days_back = args.days_back
329
+ ```
330
+
331
+ ---
332
+
333
+ ## Shared Best Practices
334
+
335
+ 1. **Never run workflow entrypoints directly from shell** — Always use the `runWorkflow` tool for workflow execution
336
+ 2. **Always check for existing skills first** — you MUST try `findSkill` and check whether a custom skill can fulfill the request before creating new workflow logic.
337
+ 3. **Always check for existing workflows** before creating new ones — you MUST use the `findSimilarWorkflow` tool to do this. Use `listAvailableWorkflows` if you need a full inventory first. Only create new ones if no existing workflow can fit the request. If needed, modify the existing workflow to fit the request WITHOUT losing older functionality.
338
+ - If you find a similar workflow, **study it and follow its business logic and conventions**.
339
+ 4. **Ask the user for help** when unsure.
340
+ - When asking the user questions, ask **just one question at a time**.
341
+ 5. **Keep workflows focused** — one workflow, one purpose
342
+ 6. **Document thoroughly** — future you (and others) will thank you
343
+ 7. **Handle errors gracefully** — workflows should fail cleanly
344
+ 8. **Be idempotent** — workflows may be retried; design for it
345
+ 9. **Respect rate limits** — add appropriate delays for API calls
346
+ 10. **Log meaningfully** — include context in log messages
347
+ 11. **Don’t outgrow the slug** — If you want to change `run.py` meaningfully, re-check that the workflow slug is still apt; otherwise choose/create a workflow whose slug matches the intent.
348
+ 12. **Keep the intent contract current** — Any change to `run.py` requires updating `workflow.json` `intent_summary` accordingly.
349
+ 13. **Keep dependencies/artifacts inside the workflow folder** — If you must add external files (e.g., clone a repo, vendor code, download fixtures), put them under `workflows/<slug>/` and never outside it.
350
+
351
+ ---
352
+
353
+ ## Workflows: Error Handling and Retries
354
+
355
+ - Design workflows to be idempotent when possible
356
+ - Document idempotency expectations in `README.md`
357
+
358
+ ---
359
+
360
+ ## Security & Scope Restrictions (MUST FOLLOW)
361
+
362
+ These rules exist to prevent data loss, secret leakage, and unsafe behavior. Violations are not permitted.
363
+
364
+ ### Scope limitation (workflows and custom skills)
365
+
366
+ - Primary execution scope remains **creating, managing, and running workflows and custom skills** in this workspace.
367
+ - You MAY also handle user requests for requirement gathering, discovery, analysis, and explanation that reference files outside the workspace.
368
+ - For such out-of-workspace requests, treat access as **read-only context gathering** unless the user explicitly asks for broader actions.
369
+
370
+ ### Never delete workflows
371
+
372
+ - You must **NEVER delete a workflow** (folders or files under `workflows/<slug>/`).
373
+ - Workflow deletions are only supposed to happen via the **UI**.
374
+ - If cleanup is requested, prefer **deprecating** (e.g., update README/status/intent) rather than deleting anything.
375
+
376
+ ### Never delete custom skills
377
+
378
+ - You must **NEVER delete a custom skill** (folders or files under `custom-skills/<slug>/`).
379
+ - Custom skill deletions are only supposed to happen via the **UI**.
380
+ - If cleanup is requested, prefer **deprecating** or updating skill instructions rather than deleting anything.
381
+
382
+ ### Approval & execution integrity
383
+
384
+ - Never attempt to bypass workflow approval requirements.
385
+ - Never attempt to bypass custom-skill approval requirements.
386
+ - Never use `getSkillContent` output from unapproved skills to drive execution decisions.
387
+
388
+ ### Secrets & sensitive data handling
389
+
390
+ - You are allowed to use secrets/tokens explicitly provided by the user during execution.
391
+ - UI redaction may mask secrets in the user-visible output, but you must still treat all secrets as sensitive.
392
+ - Never print, log, or exfiltrate secrets or credentials.
393
+ - Do not copy `.env` contents into chat output. But you can read them and use them as part of your execution flow.
394
+ - Do not proactively ask users to paste secrets in chat; prefer asking them to set secrets in the workflow's `.env` and document placeholders in `.env.example`.
395
+ - Only store workflow runtime secrets in `.env`, never in `README.md`, `workflow.json`, `requirements.txt`, `requirements.lock.txt`, `data/`, or `SKILL.md`.
396
+
397
+ ### Filesystem safety boundaries
398
+
399
+ - You MAY read files outside managed workspace areas when needed to understand user requirements, gather context, or answer questions.
400
+ - Keep any cloned repos, downloaded assets, fixtures, or vendored code **inside** `workflows/<slug>/` only.
401
+ - Keep skill artifacts and instruction files inside `custom-skills/<slug>/` only.
402
+
403
+ ### No destructive shell actions
404
+
405
+ - Do not run destructive commands that could delete or corrupt workflows, custom skills, or workspace state (for example `rm`, `rm -rf`, or scripted deletions).
406
+ - When changes are needed, prefer additive edits; avoid irreversible operations.
407
+
408
+ ---
409
+
410
+ ## Example: Creating a New Workflow
411
+
412
+ When asked to "Create a workflow that checks Stripe for failed payments":
413
+
414
+ 1. Use the `findSimilarWorkflow` tool to check for existing payment-related workflows — do NOT search using shell commands (e.g., `grep`, `rg`, `find`).
415
+ 2. If no match, use the `createWorkflow` tool:
416
+ ```
417
+ createWorkflow({
418
+ slug: "failed-stripe-payments",
419
+ intent_summary: "Checks Stripe for failed payments for a given customer",
420
+ inputs: {
421
+ customer_id: { type: "string", required: true, description: "The Stripe customer ID" },
422
+ days_back: { type: "number", required: false, default: 7, description: "Days to look back" }
423
+ }
424
+ })
425
+ ```
426
+ 3. Implement the workflow files:
427
+ - Edit `run.py` — Implement Stripe API logic with argparse for inputs
428
+ - Edit `requirements.txt` — Add `stripe` dependency (no version specifier)
429
+ - Edit `.env` — Add `STRIPE_API_KEY` (never commit)
430
+ - Edit `.env.example` — Template with `STRIPE_API_KEY=sk_test_...`
431
+ - Create `.venv/` immediately after `createWorkflow` — run `cd workflows/failed-stripe-payments && python -m venv .venv` (or `python3 -m venv .venv`)
432
+ - Update `requirements.lock.txt` — Run `pip freeze > requirements.lock.txt` after installing
433
+ - Edit `README.md` — Document usage and required secrets
434
+ 4. If unsure about Stripe API details, ask the user for help or search the web using your tools.
435
+ 5. **Do NOT run the workflow directly** — inform the user that the workflow needs an engineer's approval before it can be executed via `runWorkflow`
436
+
437
+ ## Example: Running an Existing Workflow
438
+
439
+ When asked to "Run the failed-stripe-payments workflow for customer cus_123":
440
+
441
+ 1. **DO NOT** run the workflow entrypoint directly from shell (for example `python run.py` inside `workflows/<slug>/` or `python workflows/<slug>/run.py`)
442
+ 2. Use the `runWorkflow` tool.
443
+ 3. If the workflow is not approved, inform the user about the error and that they need to wait for an engineer's approval
444
+ 4. If the workflow runs successfully, report the output to the user
445
+
446
+ ## Example: Finding a workflow to run
447
+ When the user does not specify a workflow to run, you MUST use the `findSimilarWorkflow` tool to find a workflow to run. You may use `listAvailableWorkflows` first when you need to quickly inspect all accessible options. For example, if the user asks "How many users do I have in my app?"
448
+
449
+ 1. **DO NOT** search using shell commands (for example `grep`, `rg`, or `find`) to search the repository for workflows.
450
+ 2. Use the `findSimilarWorkflow` tool with an argument like "Count number of users in the app", which will return a list of similar workflows based on semantic similarity to the query.
451
+ 3. Inspect each workflow's workflow.json and README.md to determine if it is the correct workflow to run. If unclear, ask the user for clarification.
452
+ 4. Once you have found the correct workflow, run it using the `runWorkflow` tool.
453
+ 5. If no relevant workflow found, then inform the user and ask them if you should create a new workflow to handle the request.
454
+
455
+ ## Example: Listing Available Workflows
456
+
457
+ When you need a quick inventory before semantic search or selection:
458
+
459
+ 1. Use `listAvailableWorkflows` to get all accessible workflows.
460
+ 2. If needed, then use `findSimilarWorkflow` to rank by semantic relevance.
461
+ 3. Choose the best candidate and proceed with `runWorkflow` (or update/create flow as needed).
462
+
463
+ ## Example: Finding and Using a Skill
464
+
465
+ When a user asks for behavior that may already be captured as reusable instructions:
466
+
467
+ 1. Use `findSkill` with a natural-language query for the needed capability.
468
+ 2. For promising matches, use `getSkillContent` to inspect `SKILL.md`.
469
+ 3. If a skill fits, follow that skill's instructions.
470
+ 4. If no approved + accessible skill fits, ask whether to create one and then use `createSkill`.
471
+
472
+ ## Example: Creating a New Skill
473
+
474
+ When asked to create a reusable skill:
475
+
476
+ 1. Use `findSkill` first to avoid duplicates.
477
+ 2. Optionally use `listAvailableSkills` if you need a full inventory before selecting a candidate.
478
+ 3. If no good match exists, use `createSkill` with:
479
+ - `slug`
480
+ - `description`
481
+ - markdown `content`
482
+ 4. Approve the permission prompt when asked during `createSkill` execution.
483
+ 5. Inform the user that the new skill must be engineer-approved before it becomes generally usable through skill lookup flows.
@@ -0,0 +1,167 @@
1
+ {
2
+ "name": "workspace_files",
3
+ "lockfileVersion": 3,
4
+ "requires": true,
5
+ "packages": {
6
+ "": {
7
+ "dependencies": {
8
+ "opencode-ai": "1.1.65"
9
+ }
10
+ },
11
+ "node_modules/opencode-ai": {
12
+ "version": "1.1.65",
13
+ "resolved": "https://registry.npmjs.org/opencode-ai/-/opencode-ai-1.1.65.tgz",
14
+ "integrity": "sha512-GJ2YBt6vchSW/LdB1MvZln4vfl5M9lLGQi4p/ATLk3Ku2S0R5zw1aswYp0b00URpwmknZt652t/7mutBSBuzJg==",
15
+ "hasInstallScript": true,
16
+ "license": "MIT",
17
+ "bin": {
18
+ "opencode": "bin/opencode"
19
+ },
20
+ "optionalDependencies": {
21
+ "opencode-darwin-arm64": "1.1.65",
22
+ "opencode-darwin-x64": "1.1.65",
23
+ "opencode-darwin-x64-baseline": "1.1.65",
24
+ "opencode-linux-arm64": "1.1.65",
25
+ "opencode-linux-arm64-musl": "1.1.65",
26
+ "opencode-linux-x64": "1.1.65",
27
+ "opencode-linux-x64-baseline": "1.1.65",
28
+ "opencode-linux-x64-baseline-musl": "1.1.65",
29
+ "opencode-linux-x64-musl": "1.1.65",
30
+ "opencode-windows-x64": "1.1.65",
31
+ "opencode-windows-x64-baseline": "1.1.65"
32
+ }
33
+ },
34
+ "node_modules/opencode-darwin-arm64": {
35
+ "version": "1.1.65",
36
+ "resolved": "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.1.65.tgz",
37
+ "integrity": "sha512-NR4S0EbyIS93E7viEa68kecDbQ3qB8bfDP8s8uqFR/+oJY5CFlpCXe1eR0ar15r3U7UqoWbQXSQQWk+G0Kv2dA==",
38
+ "cpu": [
39
+ "arm64"
40
+ ],
41
+ "optional": true,
42
+ "os": [
43
+ "darwin"
44
+ ]
45
+ },
46
+ "node_modules/opencode-darwin-x64": {
47
+ "version": "1.1.65",
48
+ "resolved": "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.1.65.tgz",
49
+ "integrity": "sha512-lDNSbK85iETnXfNVs4+PGnSXl61IIL+QkaJVUIo2GwLtPUGq4RZA7MqIn3wwP959+Y9hbgjQhomv1RiMNiq1yg==",
50
+ "cpu": [
51
+ "x64"
52
+ ],
53
+ "optional": true,
54
+ "os": [
55
+ "darwin"
56
+ ]
57
+ },
58
+ "node_modules/opencode-darwin-x64-baseline": {
59
+ "version": "1.1.65",
60
+ "resolved": "https://registry.npmjs.org/opencode-darwin-x64-baseline/-/opencode-darwin-x64-baseline-1.1.65.tgz",
61
+ "integrity": "sha512-ImIMEiUzDkG5kpN5OQPoumIykUfrQem/PTNIrgUDbUthP67MUoNIHq1ff+Rs7RYu6mTmlVM10qvy99aNtTgf7w==",
62
+ "cpu": [
63
+ "x64"
64
+ ],
65
+ "optional": true,
66
+ "os": [
67
+ "darwin"
68
+ ]
69
+ },
70
+ "node_modules/opencode-linux-arm64": {
71
+ "version": "1.1.65",
72
+ "resolved": "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.1.65.tgz",
73
+ "integrity": "sha512-WWWoFJoqnkPvxLUbd59xlSKRWJuAvxKOkZqxnj9AjRD5rexgdfsDbTkL8Vu6peaRK0sqP1erfUGQzNrTleK5YA==",
74
+ "cpu": [
75
+ "arm64"
76
+ ],
77
+ "optional": true,
78
+ "os": [
79
+ "linux"
80
+ ]
81
+ },
82
+ "node_modules/opencode-linux-arm64-musl": {
83
+ "version": "1.1.65",
84
+ "resolved": "https://registry.npmjs.org/opencode-linux-arm64-musl/-/opencode-linux-arm64-musl-1.1.65.tgz",
85
+ "integrity": "sha512-I6Hqn7QXHFLMiVaDIROMPzDdiBayqrBzzbpSjHUswk9XcKdAIyZ8yARh+G42Kq6RoFriqiZbup9WCYjZEFdFWQ==",
86
+ "cpu": [
87
+ "arm64"
88
+ ],
89
+ "optional": true,
90
+ "os": [
91
+ "linux"
92
+ ]
93
+ },
94
+ "node_modules/opencode-linux-x64": {
95
+ "version": "1.1.65",
96
+ "resolved": "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.1.65.tgz",
97
+ "integrity": "sha512-4YVnpvq2QmU/rYcE5DkvMAUP+StgWEFaNqzJhJjDH8wfKv/5oE7WEMs60RwbszKkGZUzHCp/V+Ldp0YYwhQhEA==",
98
+ "cpu": [
99
+ "x64"
100
+ ],
101
+ "optional": true,
102
+ "os": [
103
+ "linux"
104
+ ]
105
+ },
106
+ "node_modules/opencode-linux-x64-baseline": {
107
+ "version": "1.1.65",
108
+ "resolved": "https://registry.npmjs.org/opencode-linux-x64-baseline/-/opencode-linux-x64-baseline-1.1.65.tgz",
109
+ "integrity": "sha512-TB71tNSa6oAsbhSEdQZE4/hM0hD6TZBmWnvbXpQPWntK3NyGcEUjw2b1B5yulGwA/MrXHkwrFhcbknrb4B/RAw==",
110
+ "cpu": [
111
+ "x64"
112
+ ],
113
+ "optional": true,
114
+ "os": [
115
+ "linux"
116
+ ]
117
+ },
118
+ "node_modules/opencode-linux-x64-baseline-musl": {
119
+ "version": "1.1.65",
120
+ "resolved": "https://registry.npmjs.org/opencode-linux-x64-baseline-musl/-/opencode-linux-x64-baseline-musl-1.1.65.tgz",
121
+ "integrity": "sha512-5yqbO3aFax31VeXyg9FmuIXzfSheE2OmLDq1LSfQPI2KrwlilUB+n5oRscUDb/U4PQqRdJajwjqqwV4WTF7pZw==",
122
+ "cpu": [
123
+ "x64"
124
+ ],
125
+ "optional": true,
126
+ "os": [
127
+ "linux"
128
+ ]
129
+ },
130
+ "node_modules/opencode-linux-x64-musl": {
131
+ "version": "1.1.65",
132
+ "resolved": "https://registry.npmjs.org/opencode-linux-x64-musl/-/opencode-linux-x64-musl-1.1.65.tgz",
133
+ "integrity": "sha512-N9caP6J3U9qmtsR2onwUEBWhtbi2URs8Jbbbq71RFSuA/Z1zuksYjmNlO0NZj9lauwEl2zWlsEgmQxAfcZxrOQ==",
134
+ "cpu": [
135
+ "x64"
136
+ ],
137
+ "optional": true,
138
+ "os": [
139
+ "linux"
140
+ ]
141
+ },
142
+ "node_modules/opencode-windows-x64": {
143
+ "version": "1.1.65",
144
+ "resolved": "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.1.65.tgz",
145
+ "integrity": "sha512-RJbkQ7mCpQrlIDax8VjK5tN/7Gi92ERdRpwbxSf9nJx+MaWoV06W6nazDsg+OfqTja6fMy8N1G4eRnOrcbVciQ==",
146
+ "cpu": [
147
+ "x64"
148
+ ],
149
+ "optional": true,
150
+ "os": [
151
+ "win32"
152
+ ]
153
+ },
154
+ "node_modules/opencode-windows-x64-baseline": {
155
+ "version": "1.1.65",
156
+ "resolved": "https://registry.npmjs.org/opencode-windows-x64-baseline/-/opencode-windows-x64-baseline-1.1.65.tgz",
157
+ "integrity": "sha512-sj7+EYkoFsRjpPBBMjI2PKu3eA1xQdGke4V0DvyJCqlq14TvYlY/S4xo7oZBZ9h+cG2Ni99SjeZ187KHq/CtRw==",
158
+ "cpu": [
159
+ "x64"
160
+ ],
161
+ "optional": true,
162
+ "os": [
163
+ "win32"
164
+ ]
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "opencode-ai": "1.1.65"
4
+ }
5
+ }