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,204 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getWorkspaceDirFromEnv = getWorkspaceDirFromEnv;
7
+ exports.getWorkspaceDatabaseUrl = getWorkspaceDatabaseUrl;
8
+ exports.workspaceDatabaseExists = workspaceDatabaseExists;
9
+ exports.ensureWorkspaceDatabaseDirectory = ensureWorkspaceDatabaseDirectory;
10
+ exports.initializeWorkspaceDirectory = initializeWorkspaceDirectory;
11
+ exports.ensureWorkspaceDatabase = ensureWorkspaceDatabase;
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const ignore_1 = __importDefault(require("ignore"));
15
+ const child_process_1 = require("child_process");
16
+ const util_1 = require("util");
17
+ const assert_1 = require("./assert");
18
+ const runtime_paths_1 = require("./runtime-paths");
19
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
20
+ const WORKSPACE_DB_DIRECTORY = ".sqlite";
21
+ const WORKSPACE_DB_FILENAME = "data.db";
22
+ const HONEYTOKEN_UUID = "1f9f0b72-5f9f-4c9b-aef1-2fb2e0f6d8c4";
23
+ const HONEYTOKEN_FILE_NAME = `honeytoken-${HONEYTOKEN_UUID}.txt`;
24
+ function getWorkspaceDirFromEnv() {
25
+ let workspaceDir = (0, assert_1.assertEnv)("WORKSPACE_DIR");
26
+ if (!path_1.default.isAbsolute(workspaceDir)) {
27
+ workspaceDir = path_1.default.resolve(process.cwd(), workspaceDir);
28
+ }
29
+ return workspaceDir;
30
+ }
31
+ function getPrismaCliEntrypoint() {
32
+ return require.resolve("prisma/build/index.js", {
33
+ paths: [(0, runtime_paths_1.getPackageRoot)()],
34
+ });
35
+ }
36
+ function getWorkspaceDatabasePath() {
37
+ return path_1.default.join(getWorkspaceDirFromEnv(), WORKSPACE_DB_DIRECTORY, WORKSPACE_DB_FILENAME);
38
+ }
39
+ function getWorkspaceDatabaseUrl() {
40
+ return `file:${getWorkspaceDatabasePath()}`;
41
+ }
42
+ function workspaceDatabaseExists() {
43
+ return fs_1.default.existsSync(getWorkspaceDatabasePath());
44
+ }
45
+ function ensureWorkspaceDatabaseDirectory() {
46
+ fs_1.default.mkdirSync(path_1.default.dirname(getWorkspaceDatabasePath()), { recursive: true });
47
+ }
48
+ function normalizeRelativePath(relativePath) {
49
+ return relativePath.split(path_1.default.sep).join("/");
50
+ }
51
+ const MANAGED_WORKSPACE_DIRECTORIES = new Set([
52
+ "workflows",
53
+ "custom-skills",
54
+ ]);
55
+ function shouldSkipManagedDirectoryContent(relativePath) {
56
+ const [topLevelSegment] = relativePath.split("/");
57
+ if (MANAGED_WORKSPACE_DIRECTORIES.has(topLevelSegment)) {
58
+ return true;
59
+ }
60
+ if (relativePath === ".opencode/xdg-data" || relativePath.startsWith(".opencode/xdg-data/")) {
61
+ return true;
62
+ }
63
+ return false;
64
+ }
65
+ function evaluateIgnoreRuleSets(relativePath, isDirectory, ruleSets) {
66
+ let isIgnored = false;
67
+ for (const ruleSet of ruleSets) {
68
+ if (ruleSet.basePath.length > 0) {
69
+ if (relativePath !== ruleSet.basePath && !relativePath.startsWith(`${ruleSet.basePath}/`)) {
70
+ continue;
71
+ }
72
+ }
73
+ const relativeToRuleBase = ruleSet.basePath.length > 0
74
+ ? relativePath.slice(ruleSet.basePath.length + 1)
75
+ : relativePath;
76
+ if (!relativeToRuleBase) {
77
+ continue;
78
+ }
79
+ const candidates = isDirectory
80
+ ? [relativeToRuleBase, `${relativeToRuleBase}/`]
81
+ : [relativeToRuleBase];
82
+ for (const candidate of candidates) {
83
+ const result = ruleSet.matcher.test(candidate);
84
+ if (result.ignored) {
85
+ isIgnored = true;
86
+ }
87
+ if (result.unignored) {
88
+ isIgnored = false;
89
+ }
90
+ }
91
+ }
92
+ return isIgnored;
93
+ }
94
+ function readLocalGitignoreRuleSet(sourceDirectory, relativePath) {
95
+ const gitignorePath = path_1.default.join(sourceDirectory, ".gitignore");
96
+ if (!fs_1.default.existsSync(gitignorePath)) {
97
+ return null;
98
+ }
99
+ const matcher = (0, ignore_1.default)();
100
+ matcher.add(fs_1.default.readFileSync(gitignorePath, "utf-8"));
101
+ return {
102
+ basePath: relativePath,
103
+ matcher,
104
+ };
105
+ }
106
+ function mergeGitignoreFile(sourceGitignorePath, targetGitignorePath) {
107
+ const sourceLines = fs_1.default.readFileSync(sourceGitignorePath, "utf-8").split(/\r?\n/);
108
+ if (!fs_1.default.existsSync(targetGitignorePath)) {
109
+ fs_1.default.writeFileSync(targetGitignorePath, `${sourceLines.join("\n").replace(/\n*$/, "\n")}`, "utf-8");
110
+ return;
111
+ }
112
+ const existingContent = fs_1.default.readFileSync(targetGitignorePath, "utf-8");
113
+ const existingLines = existingContent.split(/\r?\n/);
114
+ const existingEntries = new Set(existingLines);
115
+ const linesToAppend = [];
116
+ for (const sourceLine of sourceLines) {
117
+ if (sourceLine.length === 0 || existingEntries.has(sourceLine)) {
118
+ continue;
119
+ }
120
+ existingEntries.add(sourceLine);
121
+ linesToAppend.push(sourceLine);
122
+ }
123
+ if (linesToAppend.length === 0) {
124
+ return;
125
+ }
126
+ const needsSeparator = existingContent.length > 0 && !existingContent.endsWith("\n");
127
+ const prefix = needsSeparator ? "\n" : "";
128
+ const suffix = existingContent.endsWith("\n") || existingContent.length === 0 ? "" : "\n";
129
+ fs_1.default.writeFileSync(targetGitignorePath, `${existingContent}${suffix}${prefix}${linesToAppend.join("\n")}\n`, "utf-8");
130
+ }
131
+ function syncTemplateDirectory(sourceDirectory, targetDirectory, relativePath, inheritedRuleSets) {
132
+ const localRuleSet = readLocalGitignoreRuleSet(sourceDirectory, relativePath);
133
+ const activeRuleSets = localRuleSet ? [...inheritedRuleSets, localRuleSet] : inheritedRuleSets;
134
+ fs_1.default.mkdirSync(targetDirectory, { recursive: true });
135
+ const entries = fs_1.default.readdirSync(sourceDirectory, { withFileTypes: true });
136
+ for (const entry of entries) {
137
+ const sourceEntryPath = path_1.default.join(sourceDirectory, entry.name);
138
+ const targetEntryPath = path_1.default.join(targetDirectory, entry.name);
139
+ const relativeEntryPath = normalizeRelativePath(relativePath.length > 0 ? path_1.default.join(relativePath, entry.name) : entry.name);
140
+ if (shouldSkipManagedDirectoryContent(relativeEntryPath)) {
141
+ continue;
142
+ }
143
+ const isDirectory = entry.isDirectory();
144
+ if (evaluateIgnoreRuleSets(relativeEntryPath, isDirectory, activeRuleSets)) {
145
+ continue;
146
+ }
147
+ if (isDirectory) {
148
+ syncTemplateDirectory(sourceEntryPath, targetEntryPath, relativeEntryPath, activeRuleSets);
149
+ continue;
150
+ }
151
+ if (entry.isFile()) {
152
+ if (entry.name === ".gitignore") {
153
+ mergeGitignoreFile(sourceEntryPath, targetEntryPath);
154
+ continue;
155
+ }
156
+ fs_1.default.copyFileSync(sourceEntryPath, targetEntryPath);
157
+ }
158
+ }
159
+ }
160
+ async function initializeWorkspaceNodeDependencies(workspaceDir) {
161
+ const workspacePackageJsonPath = path_1.default.join(workspaceDir, "package.json");
162
+ const existingPackageJson = fs_1.default.existsSync(workspacePackageJsonPath)
163
+ ? JSON.parse(fs_1.default.readFileSync(workspacePackageJsonPath, "utf-8"))
164
+ : {};
165
+ const dependencies = {
166
+ ...(existingPackageJson.dependencies ?? {}),
167
+ "opencode-ai": "1.1.65",
168
+ };
169
+ const workspacePackageJson = {
170
+ ...existingPackageJson,
171
+ dependencies,
172
+ };
173
+ fs_1.default.writeFileSync(workspacePackageJsonPath, JSON.stringify(workspacePackageJson, null, 2), "utf-8");
174
+ await execFileAsync("npm", ["install"], {
175
+ cwd: workspaceDir,
176
+ env: process.env,
177
+ });
178
+ }
179
+ async function initializeWorkspaceDirectory() {
180
+ const workspaceDir = getWorkspaceDirFromEnv();
181
+ fs_1.default.mkdirSync(workspaceDir, { recursive: true });
182
+ const workflowsDir = path_1.default.join(workspaceDir, "workflows");
183
+ fs_1.default.mkdirSync(workflowsDir, { recursive: true });
184
+ const skillsDir = path_1.default.join(workspaceDir, "custom-skills");
185
+ fs_1.default.mkdirSync(skillsDir, { recursive: true });
186
+ const honeytokenValue = `DO_NOT_EXPOSE:${HONEYTOKEN_UUID}\n`;
187
+ fs_1.default.writeFileSync(path_1.default.join(workflowsDir, HONEYTOKEN_FILE_NAME), honeytokenValue, "utf-8");
188
+ fs_1.default.writeFileSync(path_1.default.join(skillsDir, HONEYTOKEN_FILE_NAME), honeytokenValue, "utf-8");
189
+ const workspaceTemplateDir = (0, runtime_paths_1.getWorkspaceTemplateDirectory)();
190
+ syncTemplateDirectory(workspaceTemplateDir, workspaceDir, "", []);
191
+ await initializeWorkspaceNodeDependencies(workspaceDir);
192
+ }
193
+ async function ensureWorkspaceDatabase() {
194
+ const workspaceDatabaseUrl = getWorkspaceDatabaseUrl();
195
+ ensureWorkspaceDatabaseDirectory();
196
+ process.env.DATABASE_URL = workspaceDatabaseUrl;
197
+ await execFileAsync(process.execPath, [getPrismaCliEntrypoint(), "migrate", "deploy", "--schema", (0, runtime_paths_1.getPrismaSchemaPath)()], {
198
+ cwd: (0, runtime_paths_1.getPackageRoot)(),
199
+ env: {
200
+ ...process.env,
201
+ DATABASE_URL: workspaceDatabaseUrl,
202
+ },
203
+ });
204
+ }