@dromio/product 0.1.49

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 (86) hide show
  1. package/LICENSE +201 -0
  2. package/dist/architectureCheck.d.ts +11 -0
  3. package/dist/architectureCheck.d.ts.map +1 -0
  4. package/dist/architectureCheck.js +269 -0
  5. package/dist/architectureCheck.js.map +1 -0
  6. package/dist/architectureCheckTypes.d.ts +23 -0
  7. package/dist/architectureCheckTypes.d.ts.map +1 -0
  8. package/dist/architectureCheckTypes.js +50 -0
  9. package/dist/architectureCheckTypes.js.map +1 -0
  10. package/dist/architectureEffectCheck.d.ts +4 -0
  11. package/dist/architectureEffectCheck.d.ts.map +1 -0
  12. package/dist/architectureEffectCheck.js +106 -0
  13. package/dist/architectureEffectCheck.js.map +1 -0
  14. package/dist/authoring.d.ts +55 -0
  15. package/dist/authoring.d.ts.map +1 -0
  16. package/dist/authoring.js +308 -0
  17. package/dist/authoring.js.map +1 -0
  18. package/dist/authoringArchitectureTemplates.d.ts +5 -0
  19. package/dist/authoringArchitectureTemplates.d.ts.map +1 -0
  20. package/dist/authoringArchitectureTemplates.js +169 -0
  21. package/dist/authoringArchitectureTemplates.js.map +1 -0
  22. package/dist/authoringManifestTemplates.d.ts +4 -0
  23. package/dist/authoringManifestTemplates.d.ts.map +1 -0
  24. package/dist/authoringManifestTemplates.js +77 -0
  25. package/dist/authoringManifestTemplates.js.map +1 -0
  26. package/dist/authoringPackageJson.d.ts +3 -0
  27. package/dist/authoringPackageJson.d.ts.map +1 -0
  28. package/dist/authoringPackageJson.js +69 -0
  29. package/dist/authoringPackageJson.js.map +1 -0
  30. package/dist/authoringTemplates.d.ts +9 -0
  31. package/dist/authoringTemplates.d.ts.map +1 -0
  32. package/dist/authoringTemplates.js +142 -0
  33. package/dist/authoringTemplates.js.map +1 -0
  34. package/dist/authoringWorkflowTemplates.d.ts +13 -0
  35. package/dist/authoringWorkflowTemplates.d.ts.map +1 -0
  36. package/dist/authoringWorkflowTemplates.js +282 -0
  37. package/dist/authoringWorkflowTemplates.js.map +1 -0
  38. package/dist/build.d.ts +12 -0
  39. package/dist/build.d.ts.map +1 -0
  40. package/dist/build.js +119 -0
  41. package/dist/build.js.map +1 -0
  42. package/dist/check.d.ts +16 -0
  43. package/dist/check.d.ts.map +1 -0
  44. package/dist/check.js +172 -0
  45. package/dist/check.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +93 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/deploymentProfile.d.ts +19 -0
  51. package/dist/deploymentProfile.d.ts.map +1 -0
  52. package/dist/deploymentProfile.js +72 -0
  53. package/dist/deploymentProfile.js.map +1 -0
  54. package/dist/emitFromDefinition.d.ts +14 -0
  55. package/dist/emitFromDefinition.d.ts.map +1 -0
  56. package/dist/emitFromDefinition.js +87 -0
  57. package/dist/emitFromDefinition.js.map +1 -0
  58. package/dist/files.d.ts +13 -0
  59. package/dist/files.d.ts.map +1 -0
  60. package/dist/files.js +77 -0
  61. package/dist/files.js.map +1 -0
  62. package/dist/forbiddenImports.d.ts +7 -0
  63. package/dist/forbiddenImports.d.ts.map +1 -0
  64. package/dist/forbiddenImports.js +31 -0
  65. package/dist/forbiddenImports.js.map +1 -0
  66. package/dist/index.d.ts +11 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +9 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/manifest.d.ts +14 -0
  71. package/dist/manifest.d.ts.map +1 -0
  72. package/dist/manifest.js +49 -0
  73. package/dist/manifest.js.map +1 -0
  74. package/dist/publish.d.ts +29 -0
  75. package/dist/publish.d.ts.map +1 -0
  76. package/dist/publish.js +40 -0
  77. package/dist/publish.js.map +1 -0
  78. package/dist/publishPlan.d.ts +62 -0
  79. package/dist/publishPlan.d.ts.map +1 -0
  80. package/dist/publishPlan.js +204 -0
  81. package/dist/publishPlan.js.map +1 -0
  82. package/dist/schemas.d.ts +141 -0
  83. package/dist/schemas.d.ts.map +1 -0
  84. package/dist/schemas.js +154 -0
  85. package/dist/schemas.js.map +1 -0
  86. package/package.json +49 -0
@@ -0,0 +1,169 @@
1
+ export function architectureScaffoldTemplates(productId) {
2
+ return [
3
+ { relativePath: "src/contracts/task.ts", content: taskContractsTemplate() },
4
+ { relativePath: "src/ports/task-store.ts", content: taskStorePortTemplate() },
5
+ { relativePath: "src/sdk/create-task.ts", content: createTaskSdkTemplate() },
6
+ { relativePath: "src/sdk/index.ts", content: sdkIndexTemplate() },
7
+ { relativePath: "src/adapters/system/task-store/memory.ts", content: memoryTaskStoreTemplate() },
8
+ { relativePath: "src/adapters/http/routes/tasks/create.ts", content: httpCreateTaskRouteTemplate() },
9
+ { relativePath: "src/adapters/cli/commands/create-task.ts", content: cliCreateTaskCommandTemplate() },
10
+ { relativePath: "src/app/index.ts", content: appAdapterTemplate(productId) },
11
+ ];
12
+ }
13
+ function taskContractsTemplate() {
14
+ return `import {
15
+ Schema,
16
+ } from "@effect/schema";
17
+
18
+ export const TaskSchema = Schema.Struct({
19
+ id: Schema.String,
20
+ state: Schema.Literal("open", "in-progress", "done", "archived"),
21
+ title: Schema.String,
22
+ });
23
+
24
+ export type Task = Schema.Schema.Type<typeof TaskSchema>;
25
+
26
+ export const CreateTaskCommand = Schema.Struct({
27
+ title: Schema.String,
28
+ });
29
+
30
+ export type CreateTaskCommand = Schema.Schema.Type<typeof CreateTaskCommand>;
31
+
32
+ export interface CreateTaskResult {
33
+ readonly task: Task;
34
+ readonly taskId: string;
35
+ }
36
+
37
+ export class ProductError extends Schema.TaggedError<ProductError>()("ProductError", {
38
+ message: Schema.String,
39
+ cause: Schema.optional(Schema.Unknown),
40
+ }) {}
41
+ `;
42
+ }
43
+ function taskStorePortTemplate() {
44
+ return `import {
45
+ Context,
46
+ Effect,
47
+ } from "effect";
48
+ import {
49
+ type Task,
50
+ ProductError,
51
+ } from "../contracts/task.js";
52
+
53
+ export class TaskStore extends Context.Tag("TaskStore")<
54
+ TaskStore,
55
+ {
56
+ readonly create: (input: { readonly title: string }) => Effect.Effect<Task, ProductError>;
57
+ readonly findById: (id: string) => Effect.Effect<Task | null, ProductError>;
58
+ }
59
+ >() {}
60
+ `;
61
+ }
62
+ function createTaskSdkTemplate() {
63
+ return `import {
64
+ Effect,
65
+ } from "effect";
66
+ import {
67
+ type CreateTaskCommand,
68
+ type CreateTaskResult,
69
+ ProductError,
70
+ } from "../contracts/task.js";
71
+ import {
72
+ TaskStore,
73
+ } from "../ports/task-store.js";
74
+
75
+ export function createTask(
76
+ command: CreateTaskCommand,
77
+ ): Effect.Effect<CreateTaskResult, ProductError, TaskStore> {
78
+ return Effect.gen(function* () {
79
+ const store = yield* TaskStore;
80
+ const task = yield* store.create({ title: command.title });
81
+ return {
82
+ task,
83
+ taskId: task.id,
84
+ };
85
+ });
86
+ }
87
+ `;
88
+ }
89
+ function sdkIndexTemplate() {
90
+ return `export {
91
+ createTask,
92
+ } from "./create-task.js";
93
+ `;
94
+ }
95
+ function memoryTaskStoreTemplate() {
96
+ return `import {
97
+ Effect,
98
+ Layer,
99
+ } from "effect";
100
+ import {
101
+ type Task,
102
+ } from "../../../contracts/task.js";
103
+ import {
104
+ TaskStore,
105
+ } from "../../../ports/task-store.js";
106
+
107
+ const tasks = new Map<string, Task>();
108
+
109
+ export const MemoryTaskStore = Layer.succeed(
110
+ TaskStore,
111
+ TaskStore.of({
112
+ create(input) {
113
+ const task: Task = {
114
+ id: crypto.randomUUID(),
115
+ state: "open",
116
+ title: input.title,
117
+ };
118
+ tasks.set(task.id, task);
119
+ return Effect.succeed(task);
120
+ },
121
+ findById(id) {
122
+ return Effect.succeed(tasks.get(id) ?? null);
123
+ },
124
+ }),
125
+ );
126
+ `;
127
+ }
128
+ function httpCreateTaskRouteTemplate() {
129
+ return `import {
130
+ Effect,
131
+ } from "effect";
132
+ import {
133
+ createTask,
134
+ } from "../../../../sdk/create-task.js";
135
+ import {
136
+ MemoryTaskStore,
137
+ } from "../../../system/task-store/memory.js";
138
+
139
+ export async function handleCreateTask(input: { readonly title: string }) {
140
+ const program = createTask(input).pipe(Effect.provide(MemoryTaskStore));
141
+ return await Effect.runPromise(program);
142
+ }
143
+ `;
144
+ }
145
+ function cliCreateTaskCommandTemplate() {
146
+ return `import {
147
+ Effect,
148
+ } from "effect";
149
+ import {
150
+ createTask,
151
+ } from "../../../sdk/create-task.js";
152
+ import {
153
+ MemoryTaskStore,
154
+ } from "../../system/task-store/memory.js";
155
+
156
+ export async function runCreateTaskCommand(input: { readonly title: string }) {
157
+ const program = createTask(input).pipe(Effect.provide(MemoryTaskStore));
158
+ return await Effect.runPromise(program);
159
+ }
160
+ `;
161
+ }
162
+ function appAdapterTemplate(productId) {
163
+ return `export const productApp = {
164
+ id: ${JSON.stringify(productId)},
165
+ transport: "http",
166
+ } as const;
167
+ `;
168
+ }
169
+ //# sourceMappingURL=authoringArchitectureTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringArchitectureTemplates.js","sourceRoot":"","sources":["../src/authoringArchitectureTemplates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,6BAA6B,CAC3C,SAAiB;IAEjB,OAAO;QACL,EAAE,YAAY,EAAE,uBAAuB,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;QAC3E,EAAE,YAAY,EAAE,yBAAyB,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;QAC7E,EAAE,YAAY,EAAE,wBAAwB,EAAE,OAAO,EAAE,qBAAqB,EAAE,EAAE;QAC5E,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE;QACjE,EAAE,YAAY,EAAE,0CAA0C,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE;QAChG,EAAE,YAAY,EAAE,0CAA0C,EAAE,OAAO,EAAE,2BAA2B,EAAE,EAAE;QACpG,EAAE,YAAY,EAAE,0CAA0C,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE;QACrG,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,EAAE;KAC7E,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BR,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;;;;;;;;;;;;;;;;CAgBR,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;CAwBR,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO;;;CAGR,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BR,CAAC;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B;IACnC,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;CAGhC,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CreateDromioProductScaffoldPlanOptions } from "./authoring.js";
2
+ export declare function productManifestTemplate(productId: string, productName: string, shape: Pick<CreateDromioProductScaffoldPlanOptions, "capabilities" | "firstConversionSliceId" | "flagshipWorkflowId" | "panels" | "productGoal" | "workflows">): string;
3
+ export declare function environmentManifestTemplate(): string;
4
+ //# sourceMappingURL=authoringManifestTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringManifestTemplates.d.ts","sourceRoot":"","sources":["../src/authoringManifestTemplates.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,sCAAsC,EAIvC,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,IAAI,CACT,sCAAsC,EACtC,cAAc,GAAG,wBAAwB,GAAG,oBAAoB,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,CAC1G,GACA,MAAM,CAyBR;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAcpD"}
@@ -0,0 +1,77 @@
1
+ import { workflowCompileArtifactPath, workflowDocumentPath, } from "./authoringWorkflowTemplates.js";
2
+ export function productManifestTemplate(productId, productName, shape) {
3
+ return `id: ${productId}
4
+ name: ${yamlString(productName)}
5
+ version: 0.1.0
6
+ requires:
7
+ dromio:
8
+ sdk: ">=0.1.0 <0.2.0"
9
+ product: ">=0.1.0 <0.2.0"
10
+ runtime:
11
+ effect: ">=3.0.0"
12
+ "@effect/schema": ">=0.70.0"
13
+ architecture:
14
+ mode: strict
15
+ effect_mode: strict
16
+ source_line_limit: 500
17
+ entry:
18
+ workflows: src/workflows/index.ts
19
+ capabilities: src/capabilities/index.ts
20
+ panels: src/panels/index.ts
21
+ workflows:${workflowManifestEntries(shape.workflows)}
22
+ capabilities:${capabilityManifestEntries(shape.capabilities)}
23
+ panels:${panelManifestEntries(shape.panels)}
24
+ fixtures:
25
+ - fixtures/sample-product-context.json
26
+ `;
27
+ }
28
+ export function environmentManifestTemplate() {
29
+ return `id: dev
30
+ runtime:
31
+ provider: openai
32
+ model: gpt-4.1-mini
33
+ storage: {}
34
+ sandbox:
35
+ filesystem:
36
+ mode: local
37
+ writable:
38
+ - ./.dromio
39
+ approvals:
40
+ writes: required
41
+ `;
42
+ }
43
+ function workflowManifestEntries(workflows) {
44
+ if (!workflows || workflows.length === 0)
45
+ return " []";
46
+ return `\n${workflows
47
+ .map((workflow) => ` - id: ${yamlString(workflow.id)}
48
+ title: ${yamlString(workflow.title)}
49
+ approvalPolicy: ${workflow.approvalPolicy ?? "none"}
50
+ document: ${yamlString(workflowDocumentPath(workflow.id))}
51
+ compileArtifact: ${yamlString(workflowCompileArtifactPath(workflow.id))}`)
52
+ .join("\n")}`;
53
+ }
54
+ function capabilityManifestEntries(capabilities) {
55
+ if (!capabilities || capabilities.length === 0)
56
+ return " []";
57
+ return `\n${capabilities
58
+ .map((capability) => ` - id: ${yamlString(capability.id)}
59
+ mode: ${capability.mode}`)
60
+ .join("\n")}`;
61
+ }
62
+ function panelManifestEntries(panels) {
63
+ if (!panels || panels.length === 0)
64
+ return " []";
65
+ return `\n${panels
66
+ .map((panel) => ` - id: ${yamlString(panel.id)}
67
+ kind: json-render
68
+ title: ${yamlString(panel.title)}
69
+ view:
70
+ type: panel
71
+ title: ${yamlString(panel.title)}`)
72
+ .join("\n")}`;
73
+ }
74
+ function yamlString(value) {
75
+ return JSON.stringify(value);
76
+ }
77
+ //# sourceMappingURL=authoringManifestTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringManifestTemplates.js","sourceRoot":"","sources":["../src/authoringManifestTemplates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAQzC,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,WAAmB,EACnB,KAGC;IAED,OAAO,OAAO,SAAS;QACjB,UAAU,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;YAiBnB,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC;eACrC,yBAAyB,CAAC,KAAK,CAAC,YAAY,CAAC;SACnD,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC;;;CAG1C,CAAC;AACF,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,SAAS,uBAAuB,CAC9B,SAA+D;IAE/D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,OAAO,KAAK,SAAS;SAClB,GAAG,CACF,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;aACzC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;sBACjB,QAAQ,CAAC,cAAc,IAAI,MAAM;gBACvC,UAAU,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;uBACtC,UAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CACxE;SACA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,yBAAyB,CAChC,YAAoE;IAEpE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,KAAK,YAAY;SACrB,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CAAC,WAAW,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,UAAU,CAAC,IAAI,EAAE,CACxB;SACA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAyD;IACrF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,KAAK,MAAM;SACf,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;;aAEnC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;;;eAGrB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CACnC;SACA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DromioProductScaffoldFilePlan } from "./authoring.js";
2
+ export declare function packageJsonFilePlan(productRoot: string, relativePath: string, content: string): Promise<DromioProductScaffoldFilePlan>;
3
+ //# sourceMappingURL=authoringPackageJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringPackageJson.d.ts","sourceRoot":"","sources":["../src/authoringPackageJson.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,6BAA6B,CAAC,CAkCxC"}
@@ -0,0 +1,69 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile } from "node:fs/promises";
3
+ import { resolveProductPath } from "./files.js";
4
+ export async function packageJsonFilePlan(productRoot, relativePath, content) {
5
+ const path = resolveProductPath(productRoot, relativePath);
6
+ if (!existsSync(path)) {
7
+ return {
8
+ content,
9
+ operation: "create",
10
+ path,
11
+ reason: "package manifest missing",
12
+ relativePath,
13
+ };
14
+ }
15
+ const current = await readFile(path, "utf8");
16
+ const existing = parsePackageJson(current, path);
17
+ const desired = parsePackageJson(content, "Dromio package template");
18
+ const merged = mergePackageJson(existing, desired);
19
+ const mergedContent = `${JSON.stringify(merged, null, 2)}\n`;
20
+ if (`${JSON.stringify(existing, null, 2)}\n` === mergedContent) {
21
+ return {
22
+ content: "",
23
+ operation: "skip",
24
+ path,
25
+ reason: "package manifest already has Dromio authoring scripts and dependencies",
26
+ relativePath,
27
+ };
28
+ }
29
+ return {
30
+ content: mergedContent,
31
+ operation: "update",
32
+ path,
33
+ reason: "merge Dromio authoring scripts and dependencies",
34
+ relativePath,
35
+ };
36
+ }
37
+ function parsePackageJson(content, label) {
38
+ const parsed = JSON.parse(content);
39
+ if (!isJsonRecord(parsed)) {
40
+ throw new Error(`${label} must contain a JSON object`);
41
+ }
42
+ return parsed;
43
+ }
44
+ function mergePackageJson(existing, desired) {
45
+ return {
46
+ ...existing,
47
+ name: readNonEmptyString(existing.name) ?? desired.name,
48
+ private: typeof existing.private === "boolean" ? existing.private : desired.private,
49
+ type: readNonEmptyString(existing.type) ?? desired.type,
50
+ scripts: {
51
+ ...readRecord(existing.scripts),
52
+ ...readRecord(desired.scripts),
53
+ },
54
+ dependencies: {
55
+ ...readRecord(existing.dependencies),
56
+ ...readRecord(desired.dependencies),
57
+ },
58
+ };
59
+ }
60
+ function readNonEmptyString(value) {
61
+ return typeof value === "string" && value.trim() !== "" ? value : undefined;
62
+ }
63
+ function readRecord(value) {
64
+ return isJsonRecord(value) ? value : {};
65
+ }
66
+ function isJsonRecord(value) {
67
+ return typeof value === "object" && value !== null && !Array.isArray(value);
68
+ }
69
+ //# sourceMappingURL=authoringPackageJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringPackageJson.js","sourceRoot":"","sources":["../src/authoringPackageJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const DEFAULT_ENV_VALUES: readonly [string, string][];
2
+ export declare const DEFAULT_GITIGNORE_LINES: readonly string[];
3
+ export declare function packageJsonTemplate(productId: string): string;
4
+ export declare function agentsTemplate(productName: string): string;
5
+ export declare function skillTemplate(productName: string): string;
6
+ export declare function envTemplate(): string;
7
+ export declare function gitignoreTemplate(): string;
8
+ export declare function openCodeConfigTemplate(): string;
9
+ //# sourceMappingURL=authoringTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringTemplates.d.ts","sourceRoot":"","sources":["../src/authoringTemplates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAOzD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAKpD,CAAC;AAKF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA0B7D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAuC1D;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiBzD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAyC/C"}
@@ -0,0 +1,142 @@
1
+ export const DEFAULT_ENV_VALUES = [
2
+ ["DROMIO_PRODUCT_ENV", "dev"],
3
+ ["DROMIO_DEPLOYMENT_PROFILE", "public"],
4
+ ["DROMIO_ROUTER_BASE_URL", "https://api.dromio.ai/v1"],
5
+ ["DROMIO_ROUTER_MODEL", "openai-codex:gpt-5.5"],
6
+ ["DROMIO_ROUTER_TOKEN", ""],
7
+ ["DROMIO_AUTH_TOKEN", ""],
8
+ ];
9
+ export const DEFAULT_GITIGNORE_LINES = [
10
+ ".env",
11
+ ".dromio/",
12
+ "build/",
13
+ "node_modules/",
14
+ ];
15
+ const DEFAULT_ROUTER_BASE_URL = "https://api.dromio.ai/v1";
16
+ const DEFAULT_ROUTER_MODEL = "openai-codex:gpt-5.5";
17
+ export function packageJsonTemplate(productId) {
18
+ return `${JSON.stringify({
19
+ name: productId,
20
+ private: true,
21
+ type: "module",
22
+ scripts: {
23
+ "product:doctor": "dromio product doctor",
24
+ "product:check": "dromio product check",
25
+ "product:build": "dromio product build",
26
+ author: "set -a; [ ! -f .env ] || . ./.env; set +a; opencode",
27
+ eval: "dromio eval run",
28
+ },
29
+ dependencies: {
30
+ "@dromio/cli": "^0.1.76",
31
+ "@dromio/evals": "0.1.42",
32
+ "@dromio/product": "0.1.48",
33
+ "@dromio/product-mcp": "0.1.48",
34
+ "@dromio/workflow": "0.2.4",
35
+ "@effect/schema": ">=0.70.0",
36
+ effect: ">=3.0.0",
37
+ },
38
+ }, null, 2)}\n`;
39
+ }
40
+ export function agentsTemplate(productName) {
41
+ return `# ${productName}
42
+
43
+ This is a Dromio product repo.
44
+
45
+ Run:
46
+
47
+ \`\`\`sh
48
+ dromio product init
49
+ npm run author
50
+ dromio product doctor
51
+ \`\`\`
52
+
53
+ OpenCode uses \`opencode.json\` to connect to Dromio Router and launch
54
+ \`@dromio/product-mcp\` from this repo. Set \`DROMIO_ROUTER_TOKEN\` in \`.env\` or
55
+ in your shell before starting OpenCode. The \`npm run author\` script loads
56
+ \`.env\` before launching OpenCode.
57
+
58
+ Verify router access before authoring:
59
+
60
+ \`\`\`sh
61
+ curl -sS "https://api.dromio.ai/v1/chat/completions" \\
62
+ -H "Authorization: Bearer $DROMIO_ROUTER_TOKEN" \\
63
+ -H "Content-Type: application/json" \\
64
+ -d '{"model":"openai-codex:gpt-5.5","messages":[{"role":"user","content":"Reply with only: dromio-ok"}]}'
65
+ \`\`\`
66
+
67
+ Authoring rules:
68
+
69
+ - Read \`dromio://skills/product-authoring\` before proposing product shape.
70
+ - Run Product MCP analysis in this order: \`analyze_repo\`, \`extract_domain_model\`,
71
+ \`identify_product_seams\`, then \`propose_product_shape\`.
72
+ - Pass the user's actual goal as \`productGoal\` to \`propose_product_shape\`.
73
+ - Present a workflow portfolio before choosing a first implementation slice.
74
+ - Do not hand-patch a first slice as if it were the complete product.
75
+ - Preview changes and get approval before writing.
76
+ - Run \`run_product_check\` with \`strictAuthoring: true\` after authoring changes.
77
+ - Do not import workspace-local Dromio source. Use published @dromio/* packages.
78
+ `;
79
+ }
80
+ export function skillTemplate(productName) {
81
+ return `# ${productName} Product Skill
82
+
83
+ Use Dromio Product MCP for product authoring.
84
+
85
+ Required loop:
86
+
87
+ 1. Read \`dromio://skills/product-authoring\`.
88
+ 2. Analyze source and seams.
89
+ 3. Call \`propose_product_shape\` with \`productGoal\`.
90
+ 4. Get approval for the workflow portfolio, flagship workflow, first slice, and
91
+ capability commands.
92
+ 5. Preview scaffold changes, get write approval, then apply.
93
+ 6. Run \`run_product_check\` with \`strictAuthoring: true\`, build, and evals.
94
+
95
+ Do not collapse the workflow portfolio into the first conversion slice.
96
+ `;
97
+ }
98
+ export function envTemplate() {
99
+ return `${DEFAULT_ENV_VALUES.map(([key, value]) => `${key}=${value}`).join("\n")}\n`;
100
+ }
101
+ export function gitignoreTemplate() {
102
+ return `${DEFAULT_GITIGNORE_LINES.join("\n")}\n`;
103
+ }
104
+ export function openCodeConfigTemplate() {
105
+ return `${JSON.stringify({
106
+ $schema: "https://opencode.ai/config.json",
107
+ enabled_providers: ["dromio-router"],
108
+ model: `dromio-router/${DEFAULT_ROUTER_MODEL}`,
109
+ provider: {
110
+ "dromio-router": {
111
+ name: "Dromio Router",
112
+ npm: "@ai-sdk/openai-compatible",
113
+ models: {
114
+ [DEFAULT_ROUTER_MODEL]: {
115
+ id: DEFAULT_ROUTER_MODEL,
116
+ name: "Dromio Router Model",
117
+ tool_call: true,
118
+ reasoning: true,
119
+ temperature: false,
120
+ limit: {
121
+ context: 400000,
122
+ output: 128000,
123
+ },
124
+ },
125
+ },
126
+ options: {
127
+ baseURL: DEFAULT_ROUTER_BASE_URL,
128
+ apiKey: "{env:DROMIO_ROUTER_TOKEN}",
129
+ },
130
+ },
131
+ },
132
+ mcp: {
133
+ "dromio-product": {
134
+ type: "local",
135
+ command: ["npx", "-y", "@dromio/product-mcp"],
136
+ enabled: true,
137
+ timeout: 30000,
138
+ },
139
+ },
140
+ }, null, 2)}\n`;
141
+ }
142
+ //# sourceMappingURL=authoringTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringTemplates.js","sourceRoot":"","sources":["../src/authoringTemplates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface WorkflowTemplateInput {
2
+ readonly approvalPolicy?: "human-confirm-writes" | "none";
3
+ readonly id: string;
4
+ readonly title: string;
5
+ }
6
+ export interface ScaffoldTemplate {
7
+ readonly content: string;
8
+ readonly relativePath: string;
9
+ }
10
+ export declare function workflowArtifactTemplates(productId: string, workflows: readonly WorkflowTemplateInput[] | undefined): readonly ScaffoldTemplate[];
11
+ export declare function workflowDocumentPath(workflowId: string): string;
12
+ export declare function workflowCompileArtifactPath(workflowId: string): string;
13
+ //# sourceMappingURL=authoringWorkflowTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoringWorkflowTemplates.d.ts","sourceRoot":"","sources":["../src/authoringWorkflowTemplates.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,cAAc,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAAC;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,qBAAqB,EAAE,GAAG,SAAS,GACtD,SAAS,gBAAgB,EAAE,CAY7B;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtE"}