@loxtep/sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +152 -5
  2. package/dist/authoring/agent.d.ts +164 -0
  3. package/dist/authoring/agent.d.ts.map +1 -0
  4. package/dist/authoring/agent.js +376 -0
  5. package/dist/authoring/agent.js.map +1 -0
  6. package/dist/authoring/compiler.d.ts +98 -0
  7. package/dist/authoring/compiler.d.ts.map +1 -0
  8. package/dist/authoring/compiler.js +156 -0
  9. package/dist/authoring/compiler.js.map +1 -0
  10. package/dist/authoring/define-data-workflow.d.ts +24 -0
  11. package/dist/authoring/define-data-workflow.d.ts.map +1 -0
  12. package/dist/authoring/define-data-workflow.js +93 -0
  13. package/dist/authoring/define-data-workflow.js.map +1 -0
  14. package/dist/authoring/index.d.ts +19 -0
  15. package/dist/authoring/index.d.ts.map +1 -0
  16. package/dist/authoring/index.js +15 -0
  17. package/dist/authoring/index.js.map +1 -0
  18. package/dist/authoring/toolbox.d.ts +133 -0
  19. package/dist/authoring/toolbox.d.ts.map +1 -0
  20. package/dist/authoring/toolbox.js +166 -0
  21. package/dist/authoring/toolbox.js.map +1 -0
  22. package/dist/authoring/triggers.d.ts +41 -0
  23. package/dist/authoring/triggers.d.ts.map +1 -0
  24. package/dist/authoring/triggers.js +60 -0
  25. package/dist/authoring/triggers.js.map +1 -0
  26. package/dist/authoring/types.d.ts +64 -0
  27. package/dist/authoring/types.d.ts.map +1 -0
  28. package/dist/authoring/types.js +9 -0
  29. package/dist/authoring/types.js.map +1 -0
  30. package/dist/cli/commands/activity-cmd.d.ts +28 -0
  31. package/dist/cli/commands/activity-cmd.d.ts.map +1 -0
  32. package/dist/cli/commands/activity-cmd.js +78 -0
  33. package/dist/cli/commands/activity-cmd.js.map +1 -0
  34. package/dist/cli/commands/attach-cmd.d.ts +38 -0
  35. package/dist/cli/commands/attach-cmd.d.ts.map +1 -0
  36. package/dist/cli/commands/attach-cmd.js +141 -0
  37. package/dist/cli/commands/attach-cmd.js.map +1 -0
  38. package/dist/cli/commands/deploy-cmd.d.ts +101 -0
  39. package/dist/cli/commands/deploy-cmd.d.ts.map +1 -0
  40. package/dist/cli/commands/deploy-cmd.js +461 -0
  41. package/dist/cli/commands/deploy-cmd.js.map +1 -0
  42. package/dist/cli/commands/generate-cmd.d.ts +35 -0
  43. package/dist/cli/commands/generate-cmd.d.ts.map +1 -0
  44. package/dist/cli/commands/generate-cmd.js +134 -0
  45. package/dist/cli/commands/generate-cmd.js.map +1 -0
  46. package/dist/cli/commands/improvements-cmd.d.ts +44 -0
  47. package/dist/cli/commands/improvements-cmd.d.ts.map +1 -0
  48. package/dist/cli/commands/improvements-cmd.js +215 -0
  49. package/dist/cli/commands/improvements-cmd.js.map +1 -0
  50. package/dist/cli/commands/init-cmd.d.ts +78 -0
  51. package/dist/cli/commands/init-cmd.d.ts.map +1 -0
  52. package/dist/cli/commands/init-cmd.js +250 -0
  53. package/dist/cli/commands/init-cmd.js.map +1 -0
  54. package/dist/cli/commands/login.d.ts +4 -4
  55. package/dist/cli/commands/login.js +4 -4
  56. package/dist/cli/commands/login.js.map +1 -1
  57. package/dist/cli/commands/test-cmd.d.ts +89 -0
  58. package/dist/cli/commands/test-cmd.d.ts.map +1 -0
  59. package/dist/cli/commands/test-cmd.js +378 -0
  60. package/dist/cli/commands/test-cmd.js.map +1 -0
  61. package/dist/cli/index.d.ts +1 -1
  62. package/dist/cli/index.js +150 -8
  63. package/dist/cli/index.js.map +1 -1
  64. package/dist/cli/project-context.d.ts +153 -0
  65. package/dist/cli/project-context.d.ts.map +1 -0
  66. package/dist/cli/project-context.js +190 -0
  67. package/dist/cli/project-context.js.map +1 -0
  68. package/dist/client/activity-types.d.ts +66 -0
  69. package/dist/client/activity-types.d.ts.map +1 -0
  70. package/dist/client/activity-types.js +9 -0
  71. package/dist/client/activity-types.js.map +1 -0
  72. package/dist/client/activity.d.ts +22 -0
  73. package/dist/client/activity.d.ts.map +1 -0
  74. package/dist/client/activity.js +43 -0
  75. package/dist/client/activity.js.map +1 -0
  76. package/dist/client/data-products.d.ts.map +1 -1
  77. package/dist/client/data-products.js +4 -98
  78. package/dist/client/data-products.js.map +1 -1
  79. package/dist/client/flow-types.d.ts +4 -2
  80. package/dist/client/flow-types.d.ts.map +1 -1
  81. package/dist/client/flows.d.ts +1 -1
  82. package/dist/client/flows.d.ts.map +1 -1
  83. package/dist/client/flows.js +49 -124
  84. package/dist/client/flows.js.map +1 -1
  85. package/dist/client/improvements-types.d.ts +55 -0
  86. package/dist/client/improvements-types.d.ts.map +1 -0
  87. package/dist/client/improvements-types.js +9 -0
  88. package/dist/client/improvements-types.js.map +1 -0
  89. package/dist/client/improvements.d.ts +29 -0
  90. package/dist/client/improvements.d.ts.map +1 -0
  91. package/dist/client/improvements.js +50 -0
  92. package/dist/client/improvements.js.map +1 -0
  93. package/dist/client/index.d.ts +6 -2
  94. package/dist/client/index.d.ts.map +1 -1
  95. package/dist/client/index.js.map +1 -1
  96. package/dist/client/loxtep-client.d.ts +45 -0
  97. package/dist/client/loxtep-client.d.ts.map +1 -1
  98. package/dist/client/loxtep-client.js +68 -0
  99. package/dist/client/loxtep-client.js.map +1 -1
  100. package/dist/client/projects-types.d.ts +25 -0
  101. package/dist/client/projects-types.d.ts.map +1 -1
  102. package/dist/client/projects.d.ts +2 -1
  103. package/dist/client/projects.d.ts.map +1 -1
  104. package/dist/client/projects.js +17 -0
  105. package/dist/client/projects.js.map +1 -1
  106. package/dist/client/queue-types.d.ts +15 -2
  107. package/dist/client/queue-types.d.ts.map +1 -1
  108. package/dist/client/queues.d.ts.map +1 -1
  109. package/dist/client/queues.js +3 -14
  110. package/dist/client/queues.js.map +1 -1
  111. package/dist/codegen/emit.d.ts +25 -0
  112. package/dist/codegen/emit.d.ts.map +1 -0
  113. package/dist/codegen/emit.js +158 -0
  114. package/dist/codegen/emit.js.map +1 -0
  115. package/dist/codegen/index.d.ts +17 -0
  116. package/dist/codegen/index.d.ts.map +1 -0
  117. package/dist/codegen/index.js +16 -0
  118. package/dist/codegen/index.js.map +1 -0
  119. package/dist/codegen/load-workspace-context.d.ts +30 -0
  120. package/dist/codegen/load-workspace-context.d.ts.map +1 -0
  121. package/dist/codegen/load-workspace-context.js +127 -0
  122. package/dist/codegen/load-workspace-context.js.map +1 -0
  123. package/dist/codegen/normalize.d.ts +35 -0
  124. package/dist/codegen/normalize.d.ts.map +1 -0
  125. package/dist/codegen/normalize.js +77 -0
  126. package/dist/codegen/normalize.js.map +1 -0
  127. package/dist/codegen/types.d.ts +89 -0
  128. package/dist/codegen/types.d.ts.map +1 -0
  129. package/dist/codegen/types.js +9 -0
  130. package/dist/codegen/types.js.map +1 -0
  131. package/dist/codegen/write-artifact.d.ts +40 -0
  132. package/dist/codegen/write-artifact.d.ts.map +1 -0
  133. package/dist/codegen/write-artifact.js +74 -0
  134. package/dist/codegen/write-artifact.js.map +1 -0
  135. package/dist/config/index.d.ts +1 -0
  136. package/dist/config/index.d.ts.map +1 -1
  137. package/dist/config/index.js +1 -0
  138. package/dist/config/index.js.map +1 -1
  139. package/dist/config/workspace-config.d.ts +76 -0
  140. package/dist/config/workspace-config.d.ts.map +1 -0
  141. package/dist/config/workspace-config.js +129 -0
  142. package/dist/config/workspace-config.js.map +1 -0
  143. package/dist/index.d.ts +3 -0
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +3 -0
  146. package/dist/index.js.map +1 -1
  147. package/dist/rstreams/event-bridge.d.ts +16 -2
  148. package/dist/rstreams/event-bridge.d.ts.map +1 -1
  149. package/dist/rstreams/event-bridge.js +38 -5
  150. package/dist/rstreams/event-bridge.js.map +1 -1
  151. package/dist/skills/check-scope.d.ts +42 -0
  152. package/dist/skills/check-scope.d.ts.map +1 -0
  153. package/dist/skills/check-scope.js +84 -0
  154. package/dist/skills/check-scope.js.map +1 -0
  155. package/dist/skills/index.d.ts +14 -0
  156. package/dist/skills/index.d.ts.map +1 -0
  157. package/dist/skills/index.js +12 -0
  158. package/dist/skills/index.js.map +1 -0
  159. package/dist/skills/loader.d.ts +79 -0
  160. package/dist/skills/loader.d.ts.map +1 -0
  161. package/dist/skills/loader.js +102 -0
  162. package/dist/skills/loader.js.map +1 -0
  163. package/dist/skills/types.d.ts +55 -0
  164. package/dist/skills/types.d.ts.map +1 -0
  165. package/dist/skills/types.js +9 -0
  166. package/dist/skills/types.js.map +1 -0
  167. package/dist/skills/validate-references.d.ts +54 -0
  168. package/dist/skills/validate-references.d.ts.map +1 -0
  169. package/dist/skills/validate-references.js +80 -0
  170. package/dist/skills/validate-references.js.map +1 -0
  171. package/package.json +5 -3
@@ -0,0 +1,44 @@
1
+ /**
2
+ * CLI: loxtep improvements list|apply|reject
3
+ *
4
+ * - `list` — list improvements for the authenticated org (R8.3)
5
+ * - `apply <id>` — write proposed_change into the module file atomically, set status to applied (R8.4, R8.7)
6
+ * - `reject <id>` — set status to rejected (R8.5)
7
+ * - Guard unknown-id/non-`proposed` with non-zero exit and no state change (R8.6)
8
+ *
9
+ * Requirements: 8.3, 8.4, 8.5, 8.6, 8.7
10
+ */
11
+ import type { LoxtepClient } from '../../client/loxtep-client.js';
12
+ import { type CliResult } from '../project-context.js';
13
+ /**
14
+ * Execute `loxtep improvements list`.
15
+ *
16
+ * Lists improvements from the API and prints them in a readable format.
17
+ * Requires authentication but does NOT require an attached project.
18
+ */
19
+ export declare function runImprovementsListCommand(client: LoxtepClient, options?: {
20
+ status?: string;
21
+ workflow_name?: string;
22
+ }): Promise<CliResult>;
23
+ /**
24
+ * Execute `loxtep improvements apply <id>`.
25
+ *
26
+ * 1. Fetches the improvement from the API (validates it exists and is `proposed`)
27
+ * 2. Resolves the target workflow module file
28
+ * 3. Writes the `proposed_change` into the file atomically (temp + rename)
29
+ * 4. Calls the API to set status to `applied`
30
+ * 5. On any file-write failure: file stays unchanged, status stays `proposed` (R8.7)
31
+ *
32
+ * Requirements: 8.4, 8.6, 8.7
33
+ */
34
+ export declare function runImprovementsApplyCommand(client: LoxtepClient, id: string, cwd?: string): Promise<CliResult>;
35
+ /**
36
+ * Execute `loxtep improvements reject <id>`.
37
+ *
38
+ * Sets the improvement status to `rejected` on the server.
39
+ * Guards unknown-id and non-`proposed` status with non-zero exit (R8.6).
40
+ *
41
+ * Requirements: 8.5, 8.6
42
+ */
43
+ export declare function runImprovementsRejectCommand(client: LoxtepClient, id: string): Promise<CliResult>;
44
+ //# sourceMappingURL=improvements-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improvements-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/improvements-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAC;AAE/B;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,SAAS,CAAC,CAsCpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,MAAM,EACV,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,CAAC,CAuFpB;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC,CAmBpB"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * CLI: loxtep improvements list|apply|reject
3
+ *
4
+ * - `list` — list improvements for the authenticated org (R8.3)
5
+ * - `apply <id>` — write proposed_change into the module file atomically, set status to applied (R8.4, R8.7)
6
+ * - `reject <id>` — set status to rejected (R8.5)
7
+ * - Guard unknown-id/non-`proposed` with non-zero exit and no state change (R8.6)
8
+ *
9
+ * Requirements: 8.3, 8.4, 8.5, 8.6, 8.7
10
+ */
11
+ import { writeFile, rename, rm } from 'node:fs/promises';
12
+ import { existsSync } from 'node:fs';
13
+ import { join, dirname } from 'node:path';
14
+ import { requireProject, preconditionToCliResult, } from '../project-context.js';
15
+ /**
16
+ * Execute `loxtep improvements list`.
17
+ *
18
+ * Lists improvements from the API and prints them in a readable format.
19
+ * Requires authentication but does NOT require an attached project.
20
+ */
21
+ export async function runImprovementsListCommand(client, options) {
22
+ try {
23
+ const filters = {};
24
+ if (options?.status) {
25
+ if (!['proposed', 'applied', 'rejected'].includes(options.status)) {
26
+ return {
27
+ exitCode: 1,
28
+ stdout: [],
29
+ stderr: [`Invalid status filter: '${options.status}'. Must be one of: proposed, applied, rejected.`],
30
+ };
31
+ }
32
+ filters.status = options.status;
33
+ }
34
+ if (options?.workflow_name) {
35
+ filters.workflow_name = options.workflow_name;
36
+ }
37
+ const result = await client.improvements.list(filters);
38
+ const { improvements } = result;
39
+ if (improvements.length === 0) {
40
+ return { exitCode: 0, stdout: ['No improvements found.'], stderr: [] };
41
+ }
42
+ const lines = [];
43
+ for (const imp of improvements) {
44
+ lines.push(`${imp.id} [${imp.status}] ${imp.workflow_name}`);
45
+ if (imp.rationale) {
46
+ lines.push(` Rationale: ${imp.rationale}`);
47
+ }
48
+ lines.push(` Created: ${imp.created_at}`);
49
+ lines.push('');
50
+ }
51
+ return { exitCode: 0, stdout: lines, stderr: [] };
52
+ }
53
+ catch (err) {
54
+ const message = err instanceof Error ? err.message : String(err);
55
+ return { exitCode: 1, stdout: [], stderr: [`Failed to list improvements: ${message}`] };
56
+ }
57
+ }
58
+ /**
59
+ * Execute `loxtep improvements apply <id>`.
60
+ *
61
+ * 1. Fetches the improvement from the API (validates it exists and is `proposed`)
62
+ * 2. Resolves the target workflow module file
63
+ * 3. Writes the `proposed_change` into the file atomically (temp + rename)
64
+ * 4. Calls the API to set status to `applied`
65
+ * 5. On any file-write failure: file stays unchanged, status stays `proposed` (R8.7)
66
+ *
67
+ * Requirements: 8.4, 8.6, 8.7
68
+ */
69
+ export async function runImprovementsApplyCommand(client, id, cwd) {
70
+ const workingDir = cwd ?? process.cwd();
71
+ // Resolve the project directory (need it to locate workflow files)
72
+ const projectResult = requireProject(workingDir);
73
+ if (!projectResult.ok) {
74
+ return preconditionToCliResult(projectResult.failure);
75
+ }
76
+ const { projectDir } = projectResult;
77
+ // 1. Fetch the improvement from the list endpoint to get its details
78
+ let improvement;
79
+ try {
80
+ const result = await client.improvements.list();
81
+ improvement = result.improvements.find(imp => imp.id === id);
82
+ }
83
+ catch (err) {
84
+ const message = err instanceof Error ? err.message : String(err);
85
+ return { exitCode: 1, stdout: [], stderr: [`Failed to fetch improvement: ${message}`] };
86
+ }
87
+ if (!improvement) {
88
+ return {
89
+ exitCode: 1,
90
+ stdout: [],
91
+ stderr: [`Error: Improvement '${id}' not found.`],
92
+ };
93
+ }
94
+ // R8.6: Guard non-proposed status
95
+ if (improvement.status !== 'proposed') {
96
+ return {
97
+ exitCode: 1,
98
+ stdout: [],
99
+ stderr: [
100
+ `Error: Improvement '${id}' is in status '${improvement.status}', not 'proposed'. Only proposed improvements can be applied.`,
101
+ ],
102
+ };
103
+ }
104
+ // 2. Resolve the target workflow module file
105
+ const workflowFile = resolveWorkflowFilePath(projectDir, improvement.workflow_name);
106
+ if (!workflowFile) {
107
+ return {
108
+ exitCode: 1,
109
+ stdout: [],
110
+ stderr: [
111
+ `Error: Cannot locate workflow module file for '${improvement.workflow_name}'. Write failed — status remains 'proposed'.`,
112
+ ],
113
+ };
114
+ }
115
+ // 3. Write the proposed_change atomically (R8.7: on failure, file unchanged + status stays proposed)
116
+ try {
117
+ await atomicWriteFile(workflowFile, improvement.proposed_change);
118
+ }
119
+ catch (err) {
120
+ const message = err instanceof Error ? err.message : String(err);
121
+ return {
122
+ exitCode: 1,
123
+ stdout: [],
124
+ stderr: [
125
+ `Error: Failed to write proposed change to '${workflowFile}': ${message}. File unchanged — status remains 'proposed'.`,
126
+ ],
127
+ };
128
+ }
129
+ // 4. Set status to 'applied' on the server
130
+ try {
131
+ await client.improvements.apply(id);
132
+ }
133
+ catch (err) {
134
+ // File was already written successfully, but API update failed.
135
+ // Per R8.4, the write happened; per R8.7 failure semantics are about write failure.
136
+ // Since the file was written, report the API error but the file change stands.
137
+ const message = err instanceof Error ? err.message : String(err);
138
+ return {
139
+ exitCode: 1,
140
+ stdout: [],
141
+ stderr: [
142
+ `Warning: Proposed change was written to '${workflowFile}', but failed to update status on server: ${message}`,
143
+ ],
144
+ };
145
+ }
146
+ return {
147
+ exitCode: 0,
148
+ stdout: [`Applied improvement '${id}' — wrote proposed change to '${workflowFile}' and set status to 'applied'.`],
149
+ stderr: [],
150
+ };
151
+ }
152
+ /**
153
+ * Execute `loxtep improvements reject <id>`.
154
+ *
155
+ * Sets the improvement status to `rejected` on the server.
156
+ * Guards unknown-id and non-`proposed` status with non-zero exit (R8.6).
157
+ *
158
+ * Requirements: 8.5, 8.6
159
+ */
160
+ export async function runImprovementsRejectCommand(client, id) {
161
+ try {
162
+ await client.improvements.reject(id);
163
+ }
164
+ catch (err) {
165
+ const message = err instanceof Error ? err.message : String(err);
166
+ // The API returns 404 for unknown id and 409 for non-proposed status.
167
+ // Both are surfaced as errors — no state change (R8.6).
168
+ return {
169
+ exitCode: 1,
170
+ stdout: [],
171
+ stderr: [`Error: Failed to reject improvement '${id}': ${message}`],
172
+ };
173
+ }
174
+ return {
175
+ exitCode: 0,
176
+ stdout: [`Rejected improvement '${id}' — status set to 'rejected'.`],
177
+ stderr: [],
178
+ };
179
+ }
180
+ /**
181
+ * Resolve the file path for a workflow module by name.
182
+ *
183
+ * Searches for `workflows/<workflow_name>.ts` relative to the project directory.
184
+ * Returns the full path if the file exists, or null if not found.
185
+ */
186
+ function resolveWorkflowFilePath(projectDir, workflowName) {
187
+ // Primary: workflows/<name>.ts
188
+ const primary = join(projectDir, 'workflows', `${workflowName}.ts`);
189
+ if (existsSync(primary))
190
+ return primary;
191
+ // Fallback: workflows/<name>/index.ts
192
+ const indexPath = join(projectDir, 'workflows', workflowName, 'index.ts');
193
+ if (existsSync(indexPath))
194
+ return indexPath;
195
+ return null;
196
+ }
197
+ /**
198
+ * Write content to a file atomically using a temp file + rename pattern.
199
+ *
200
+ * On any failure, the original file remains byte-unchanged (R8.7).
201
+ */
202
+ async function atomicWriteFile(filePath, content) {
203
+ const dir = dirname(filePath);
204
+ const tmpPath = join(dir, `.tmp-${Date.now()}-${Math.random().toString(36).slice(2)}`);
205
+ try {
206
+ await writeFile(tmpPath, content, 'utf-8');
207
+ await rename(tmpPath, filePath);
208
+ }
209
+ catch (err) {
210
+ // Best-effort cleanup of temp file
211
+ await rm(tmpPath, { force: true }).catch(() => undefined);
212
+ throw err;
213
+ }
214
+ }
215
+ //# sourceMappingURL=improvements-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improvements-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/improvements-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * `loxtep init [--template <slug>] [--create-repo|--from-repo]`
3
+ *
4
+ * Scaffolds a new Loxtep project:
5
+ * - `.loxtep/project.json` + `domains/` + `connectors/` + `workflows/` + `data-products/`
6
+ * - With `--template <slug>`: resolves from the catalog and materializes full
7
+ * structure incl. `AGENTS.md` + default `.loxtep/skills/<slug>.yaml`.
8
+ * - Repo flags → `github_action` on `create_project`:
9
+ * `--create-repo` → `create_new` (private default),
10
+ * `--from-repo <url>` → `import_existing`,
11
+ * neither → `none`,
12
+ * both → reject (exit 1).
13
+ * - Always prints Getting Started + Quick Reference links (R11.7).
14
+ * - Auto-runs `generate` when authed+attached; fails the whole `init` if
15
+ * `generate` fails (R16.3, R16.4).
16
+ * - Prints login/attach/generate guidance otherwise (R16.5).
17
+ *
18
+ * Requirements: 1.1, 1.2, 11.7, 16.1, 16.2, 16.3, 16.4, 16.5, 17.4, 17.5, 17.6
19
+ */
20
+ import type { CliResult } from '../project-context.js';
21
+ import type { LoxtepClient } from '../../client/loxtep-client.js';
22
+ export type GithubAction = 'create_new' | 'import_existing' | 'none';
23
+ export interface RepoFlagInput {
24
+ createRepo?: string | boolean;
25
+ fromRepo?: string;
26
+ }
27
+ /**
28
+ * Map CLI `--create-repo` / `--from-repo` flags to the `github_action` value
29
+ * for `create_project`.
30
+ *
31
+ * - `--create-repo` → `create_new` (private default) (R17.4)
32
+ * - `--from-repo <url>` → `import_existing` (R17.5)
33
+ * - neither → `none` (R17.6)
34
+ * - both → reject (returns an error string)
35
+ */
36
+ export declare function repoFlagsToGithubAction(flags: RepoFlagInput): {
37
+ ok: true;
38
+ action: GithubAction;
39
+ repoName?: string;
40
+ importUrl?: string;
41
+ } | {
42
+ ok: false;
43
+ error: string;
44
+ };
45
+ export interface InitOptions {
46
+ /** Current working directory to scaffold into. */
47
+ cwd: string;
48
+ /** Template slug to use (`--template <slug>`). */
49
+ templateSlug?: string;
50
+ /** `--create-repo [name]` flag. */
51
+ createRepo?: string | boolean;
52
+ /** `--from-repo <url>` flag. */
53
+ fromRepo?: string;
54
+ /** Project name (defaults to directory basename). */
55
+ name?: string;
56
+ /**
57
+ * Optional pre-authenticated client. When provided and the project is
58
+ * attached, the init will auto-run generate.
59
+ */
60
+ client?: LoxtepClient | null;
61
+ /**
62
+ * Optional instance_id. When provided together with `apiUrl`, the project is
63
+ * considered already attached, enabling auto-generate (R16.3).
64
+ */
65
+ instanceId?: string;
66
+ /**
67
+ * Optional API URL. When provided together with `instanceId`, the project is
68
+ * considered already attached, enabling auto-generate (R16.3).
69
+ */
70
+ apiUrl?: string;
71
+ /**
72
+ * Optional generate function (injected for testability). If provided, called
73
+ * after scaffold when authed+attached. Receives cwd and the client.
74
+ */
75
+ runGenerate?: (cwd: string, client: LoxtepClient) => Promise<CliResult>;
76
+ }
77
+ export declare function runInitCommand(options: InitOptions): Promise<CliResult>;
78
+ //# sourceMappingURL=init-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAelE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,iBAAiB,GAAG,MAAM,CAAC;AAErE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAkB1G;AAMD,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;CACzE;AAqED,wBAAsB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAyJ7E"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * `loxtep init [--template <slug>] [--create-repo|--from-repo]`
3
+ *
4
+ * Scaffolds a new Loxtep project:
5
+ * - `.loxtep/project.json` + `domains/` + `connectors/` + `workflows/` + `data-products/`
6
+ * - With `--template <slug>`: resolves from the catalog and materializes full
7
+ * structure incl. `AGENTS.md` + default `.loxtep/skills/<slug>.yaml`.
8
+ * - Repo flags → `github_action` on `create_project`:
9
+ * `--create-repo` → `create_new` (private default),
10
+ * `--from-repo <url>` → `import_existing`,
11
+ * neither → `none`,
12
+ * both → reject (exit 1).
13
+ * - Always prints Getting Started + Quick Reference links (R11.7).
14
+ * - Auto-runs `generate` when authed+attached; fails the whole `init` if
15
+ * `generate` fails (R16.3, R16.4).
16
+ * - Prints login/attach/generate guidance otherwise (R16.5).
17
+ *
18
+ * Requirements: 1.1, 1.2, 11.7, 16.1, 16.2, 16.3, 16.4, 16.5, 17.4, 17.5, 17.6
19
+ */
20
+ import { join } from 'node:path';
21
+ import { mkdir, writeFile } from 'node:fs/promises';
22
+ import { PROJECT_DIR_NAME, writeProjectConfig, } from '../project-context.js';
23
+ /* ------------------------------------------------------------------ */
24
+ /* Doc links (R11.7) */
25
+ /* ------------------------------------------------------------------ */
26
+ const GETTING_STARTED_URL = 'https://docs.loxtep.io/getting-started';
27
+ const QUICK_REFERENCE_URL = 'https://docs.loxtep.io/quick-reference';
28
+ /**
29
+ * Map CLI `--create-repo` / `--from-repo` flags to the `github_action` value
30
+ * for `create_project`.
31
+ *
32
+ * - `--create-repo` → `create_new` (private default) (R17.4)
33
+ * - `--from-repo <url>` → `import_existing` (R17.5)
34
+ * - neither → `none` (R17.6)
35
+ * - both → reject (returns an error string)
36
+ */
37
+ export function repoFlagsToGithubAction(flags) {
38
+ const hasCreate = flags.createRepo !== undefined && flags.createRepo !== false;
39
+ const hasFrom = flags.fromRepo !== undefined && flags.fromRepo !== '';
40
+ if (hasCreate && hasFrom) {
41
+ return { ok: false, error: 'Cannot specify both --create-repo and --from-repo.' };
42
+ }
43
+ if (hasCreate) {
44
+ const repoName = typeof flags.createRepo === 'string' ? flags.createRepo : undefined;
45
+ return { ok: true, action: 'create_new', repoName };
46
+ }
47
+ if (hasFrom) {
48
+ return { ok: true, action: 'import_existing', importUrl: flags.fromRepo };
49
+ }
50
+ return { ok: true, action: 'none' };
51
+ }
52
+ /* ------------------------------------------------------------------ */
53
+ /* Scaffold helpers */
54
+ /* ------------------------------------------------------------------ */
55
+ const STANDARD_DIRS = ['domains', 'connectors', 'workflows', 'data-products'];
56
+ async function ensureDir(dir) {
57
+ await mkdir(dir, { recursive: true });
58
+ }
59
+ function buildDefaultAgentsMd(templateSlug, template) {
60
+ return `# AGENTS.md — ${template.name || templateSlug}
61
+
62
+ This project was scaffolded from the \`${templateSlug}\` template.
63
+
64
+ ## MCP tools
65
+
66
+ Connect to the Loxtep MCP server for full platform access:
67
+
68
+ \`\`\`json
69
+ { "mcpServers": { "loxtep": { "url": "https://mcp.loxtep.io/ai/mcp/stream" } } }
70
+ \`\`\`
71
+
72
+ ## SDK methods
73
+
74
+ - \`LoxtepClient.fromWorkspace()\` — auto-configure from \`.loxtep/project.json\`
75
+ - \`defineDataWorkflow({ name, triggers, handler })\` — code-first workflow authoring
76
+ - \`workspace.dataProducts.*\` / \`workspace.connectors.*\` — typed constants (after \`loxtep generate\`)
77
+
78
+ ## Skill scope
79
+
80
+ Default skill: \`.loxtep/skills/${templateSlug}.yaml\`
81
+ `;
82
+ }
83
+ function buildDefaultSkillYaml(templateSlug) {
84
+ return `# Default skill for the ${templateSlug} template.
85
+ # Edit scope and permissions to match your project's resources.
86
+ name: ${templateSlug}
87
+ description: Default skill scope for the ${templateSlug} template
88
+ scope:
89
+ data_products: []
90
+ connectors: []
91
+ workflows: []
92
+ domains: []
93
+ queues: []
94
+ permissions:
95
+ data_products:
96
+ - read
97
+ - write
98
+ connectors:
99
+ - read
100
+ workflows:
101
+ - read
102
+ - write
103
+ - create
104
+ domains:
105
+ - read
106
+ queues:
107
+ - read
108
+ `;
109
+ }
110
+ /* ------------------------------------------------------------------ */
111
+ /* Main init logic */
112
+ /* ------------------------------------------------------------------ */
113
+ export async function runInitCommand(options) {
114
+ const { cwd, templateSlug, createRepo, fromRepo, client } = options;
115
+ const stdout = [];
116
+ const stderr = [];
117
+ // --- Validate repo flags (R17.4/R17.5/R17.6: both → reject) ---
118
+ const repoResult = repoFlagsToGithubAction({ createRepo, fromRepo });
119
+ if (!repoResult.ok) {
120
+ return { exitCode: 1, stdout: [], stderr: [repoResult.error] };
121
+ }
122
+ // --- Resolve template when requested (R1.2, R16.1, R16.2) ---
123
+ let template;
124
+ if (templateSlug && client) {
125
+ try {
126
+ // Try to find by slug search first; the catalog may return by id or name
127
+ const templates = await client.templates.list({ search: templateSlug });
128
+ template = templates.items.find((t) => t.name === templateSlug ||
129
+ t.template_id === templateSlug ||
130
+ t.metadata?.slug === templateSlug);
131
+ if (!template) {
132
+ // Fallback: try direct get
133
+ try {
134
+ template = await client.templates.get(templateSlug);
135
+ }
136
+ catch {
137
+ // Could not resolve — proceed without template data but record the slug
138
+ }
139
+ }
140
+ }
141
+ catch {
142
+ // Template lookup failed — proceed without template metadata; scaffold still happens
143
+ }
144
+ }
145
+ // --- Create project on the platform if client is available ---
146
+ let projectId = `proj_local_${Date.now().toString(36)}`;
147
+ let organizationId;
148
+ if (client) {
149
+ try {
150
+ const projectName = options.name || cwd.split('/').pop() || 'loxtep-project';
151
+ const createBody = {
152
+ name: projectName,
153
+ template_slug: templateSlug,
154
+ github_action: repoResult.action,
155
+ };
156
+ if (repoResult.action === 'create_new' && repoResult.repoName) {
157
+ createBody.github_repo_name = repoResult.repoName;
158
+ }
159
+ if (repoResult.action === 'import_existing' && repoResult.importUrl) {
160
+ createBody.github_import_url = repoResult.importUrl;
161
+ }
162
+ const project = await client.projects.create(createBody);
163
+ projectId = project.project_id;
164
+ organizationId = project.organization_id;
165
+ }
166
+ catch (err) {
167
+ // If project creation fails, proceed with local-only scaffold
168
+ const msg = err instanceof Error ? err.message : String(err);
169
+ stderr.push(`Warning: Could not create project on platform: ${msg}`);
170
+ }
171
+ }
172
+ // --- Scaffold standard directories (R1.1) ---
173
+ for (const dir of STANDARD_DIRS) {
174
+ await ensureDir(join(cwd, dir));
175
+ }
176
+ // --- Scaffold .loxtep/ directory + project.json ---
177
+ const loxtepDir = join(cwd, PROJECT_DIR_NAME);
178
+ await ensureDir(loxtepDir);
179
+ const config = {
180
+ project_id: projectId,
181
+ ...(organizationId ? { organization_id: organizationId } : {}),
182
+ ...(templateSlug ? { template_slug: templateSlug } : {}),
183
+ ...(options.instanceId ? { instance_id: options.instanceId } : {}),
184
+ ...(options.apiUrl ? { api_url: options.apiUrl } : {}),
185
+ };
186
+ const projectFilePath = join(loxtepDir, 'project.json');
187
+ await writeProjectConfig(projectFilePath, config);
188
+ // --- Template-specific scaffolding (R16.1, R16.2) ---
189
+ if (templateSlug) {
190
+ // AGENTS.md (R16.1)
191
+ const agentsMdContent = template
192
+ ? buildDefaultAgentsMd(templateSlug, template)
193
+ : buildDefaultAgentsMd(templateSlug, {
194
+ template_id: templateSlug,
195
+ name: templateSlug,
196
+ description: null,
197
+ category: '',
198
+ version: '1.0.0',
199
+ configuration: {},
200
+ validation_rules: {},
201
+ metadata: {},
202
+ is_public: true,
203
+ is_active: true,
204
+ created_at: new Date().toISOString(),
205
+ updated_at: new Date().toISOString(),
206
+ });
207
+ await writeFile(join(cwd, 'AGENTS.md'), agentsMdContent, 'utf-8');
208
+ // Default skill (.loxtep/skills/<slug>.yaml) (R16.2)
209
+ const skillsDir = join(loxtepDir, 'skills');
210
+ await ensureDir(skillsDir);
211
+ await writeFile(join(skillsDir, `${templateSlug}.yaml`), buildDefaultSkillYaml(templateSlug), 'utf-8');
212
+ }
213
+ stdout.push(`Initialized Loxtep project in ${cwd}`);
214
+ if (templateSlug) {
215
+ stdout.push(` Template: ${templateSlug}`);
216
+ }
217
+ stdout.push('');
218
+ // --- Always print Getting Started + Quick Reference links (R11.7) ---
219
+ stdout.push(`Getting Started: ${GETTING_STARTED_URL}`);
220
+ stdout.push(`Quick Reference: ${QUICK_REFERENCE_URL}`);
221
+ stdout.push('');
222
+ // --- Auto-run generate when authed+attached (R16.3, R16.4, R16.5) ---
223
+ const isAttached = config.instance_id && config.api_url;
224
+ if (client && isAttached && options.runGenerate) {
225
+ // Project is authed + attached — run generate
226
+ const genResult = await options.runGenerate(cwd, client);
227
+ if (genResult.exitCode !== 0) {
228
+ // R16.4: if generate fails, the whole init fails
229
+ stderr.push(...genResult.stderr);
230
+ stderr.push('Init failed: generate step failed.');
231
+ return { exitCode: genResult.exitCode, stdout, stderr };
232
+ }
233
+ stdout.push(...genResult.stdout);
234
+ }
235
+ else if (!client) {
236
+ // R16.5: not authenticated — print guidance
237
+ stdout.push('Next steps:');
238
+ stdout.push(' 1. loxtep login');
239
+ stdout.push(' 2. loxtep attach --instance <instance-id>');
240
+ stdout.push(' 3. loxtep generate');
241
+ }
242
+ else if (!isAttached) {
243
+ // Authed but not attached — print attach + generate guidance
244
+ stdout.push('Next steps:');
245
+ stdout.push(' 1. loxtep attach --instance <instance-id>');
246
+ stdout.push(' 2. loxtep generate');
247
+ }
248
+ return { exitCode: 0, stdout, stderr };
249
+ }
250
+ //# sourceMappingURL=init-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/init-cmd.ts"],"names":[],"mappings":"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"}
@@ -8,10 +8,10 @@ export interface LoginOptions {
8
8
  mfa_code?: string;
9
9
  organization_id?: string;
10
10
  /**
11
- * Browser OAuth login: opens browser to the Loxtep app login page with a localhost callback.
12
- * This is the default when no email/password is provided.
11
+ * Force console/terminal login (email + password + optional TOTP prompts).
12
+ * Use for CI/headless environments or when browser is unavailable.
13
13
  */
14
- browser?: boolean;
14
+ console?: boolean;
15
15
  /** For tests: inject fetch to mock API. */
16
16
  fetchFn?: typeof fetch;
17
17
  /** For tests: config file path (default: env/file). */
@@ -24,7 +24,7 @@ export interface LoginOptions {
24
24
  no_open?: boolean;
25
25
  }
26
26
  /**
27
- * Run login: by default opens a browser for OAuth login. Use --email/--password for headless/CI environments.
27
+ * Run login: by default opens a browser for OAuth login. Use --console or --email/--password for headless/CI environments.
28
28
  */
29
29
  export declare function runLogin(options?: LoginOptions): Promise<void>;
30
30
  //# sourceMappingURL=login.d.ts.map