backlot 0.4.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 (64) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +106 -0
  3. package/dist/cli/client.d.ts +22 -0
  4. package/dist/cli/client.js +83 -0
  5. package/dist/cli/client.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.js +308 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/core/events.d.ts +10 -0
  10. package/dist/core/events.js +42 -0
  11. package/dist/core/events.js.map +1 -0
  12. package/dist/core/journal.d.ts +80 -0
  13. package/dist/core/journal.js +186 -0
  14. package/dist/core/journal.js.map +1 -0
  15. package/dist/core/manifest.d.ts +76 -0
  16. package/dist/core/manifest.js +46 -0
  17. package/dist/core/manifest.js.map +1 -0
  18. package/dist/core/paths.d.ts +17 -0
  19. package/dist/core/paths.js +32 -0
  20. package/dist/core/paths.js.map +1 -0
  21. package/dist/core/policy.d.ts +15 -0
  22. package/dist/core/policy.js +45 -0
  23. package/dist/core/policy.js.map +1 -0
  24. package/dist/core/ports.d.ts +3 -0
  25. package/dist/core/ports.js +22 -0
  26. package/dist/core/ports.js.map +1 -0
  27. package/dist/core/retention.d.ts +19 -0
  28. package/dist/core/retention.js +101 -0
  29. package/dist/core/retention.js.map +1 -0
  30. package/dist/core/sync.d.ts +15 -0
  31. package/dist/core/sync.js +150 -0
  32. package/dist/core/sync.js.map +1 -0
  33. package/dist/core/types.d.ts +82 -0
  34. package/dist/core/types.js +6 -0
  35. package/dist/core/types.js.map +1 -0
  36. package/dist/core/upkeep.d.ts +11 -0
  37. package/dist/core/upkeep.js +47 -0
  38. package/dist/core/upkeep.js.map +1 -0
  39. package/dist/core/util.d.ts +36 -0
  40. package/dist/core/util.js +100 -0
  41. package/dist/core/util.js.map +1 -0
  42. package/dist/daemon/engine.d.ts +284 -0
  43. package/dist/daemon/engine.js +858 -0
  44. package/dist/daemon/engine.js.map +1 -0
  45. package/dist/daemon/index.d.ts +2 -0
  46. package/dist/daemon/index.js +183 -0
  47. package/dist/daemon/index.js.map +1 -0
  48. package/dist/daemon/supervisor.d.ts +36 -0
  49. package/dist/daemon/supervisor.js +189 -0
  50. package/dist/daemon/supervisor.js.map +1 -0
  51. package/dist/drivers/datastore-sqlite.d.ts +27 -0
  52. package/dist/drivers/datastore-sqlite.js +83 -0
  53. package/dist/drivers/datastore-sqlite.js.map +1 -0
  54. package/dist/drivers/datastores.d.ts +22 -0
  55. package/dist/drivers/datastores.js +190 -0
  56. package/dist/drivers/datastores.js.map +1 -0
  57. package/dist/drivers/types.d.ts +71 -0
  58. package/dist/drivers/types.js +14 -0
  59. package/dist/drivers/types.js.map +1 -0
  60. package/dist/mcp/index.d.ts +2 -0
  61. package/dist/mcp/index.js +144 -0
  62. package/dist/mcp/index.js.map +1 -0
  63. package/package.json +57 -0
  64. package/schema/stack.schema.json +172 -0
@@ -0,0 +1,172 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/backlot-dev/backlot/main/schema/stack.schema.json",
4
+ "title": "backlot stack manifest (stack.yaml)",
5
+ "description": "What a repo declares so backlot can broker environments for it. Everything {{...}} is injected by the engine (symbolic ports, datastore URLs, service URLs). Policy (pool sizes, TTLs, substrates) never lives here.",
6
+ "type": "object",
7
+ "required": ["name", "services"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "pattern": "^[a-z0-9][a-z0-9-]*$",
13
+ "description": "Stack identity; pools are keyed by repo + this name."
14
+ },
15
+ "services": {
16
+ "type": "object",
17
+ "minProperties": 1,
18
+ "additionalProperties": { "$ref": "#/$defs/service" },
19
+ "description": "Supervised shell commands, one per service. Commands, not containers."
20
+ },
21
+ "datastores": {
22
+ "type": "object",
23
+ "additionalProperties": { "$ref": "#/$defs/datastore" }
24
+ },
25
+ "caches": {
26
+ "type": "array",
27
+ "items": { "type": "string" },
28
+ "description": "Paths (globs allowed) preserved by the bind-time reset: node_modules, **/obj, .angular, ..."
29
+ },
30
+ "sync": {
31
+ "type": "object",
32
+ "additionalProperties": false,
33
+ "properties": {
34
+ "keep": {
35
+ "type": "array",
36
+ "items": { "type": "string" },
37
+ "description": "Generated files preserved across binds even though tracked/derived."
38
+ },
39
+ "include": {
40
+ "type": "array",
41
+ "items": { "type": "string" },
42
+ "description": "Git-ignored files that must ride along with a binding (.env.local)."
43
+ }
44
+ }
45
+ },
46
+ "outputs": {
47
+ "type": "array",
48
+ "items": { "type": "string" },
49
+ "description": "Artifacts produced env-side but owned worktree-side (lockfiles, generated clients). Reported as outputs_changed; copied back only by explicit `backlot pull`."
50
+ },
51
+ "upkeep": {
52
+ "type": "array",
53
+ "items": { "$ref": "#/$defs/upkeepRule" },
54
+ "description": "Closed list of fingerprint->action rules, run at bind time in order (decision 0008)."
55
+ },
56
+ "auth": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "properties": {
60
+ "logins": {
61
+ "type": "object",
62
+ "required": ["user", "password"],
63
+ "additionalProperties": false,
64
+ "properties": {
65
+ "user": { "type": "string" },
66
+ "password": { "type": "string" }
67
+ },
68
+ "description": "A seeded login consumers may use. Dev-grade by definition."
69
+ },
70
+ "token": {
71
+ "type": "string",
72
+ "description": "Command minting an auth token; {{role}} available. Must print JSON."
73
+ }
74
+ }
75
+ },
76
+ "checks": {
77
+ "type": "object",
78
+ "additionalProperties": { "$ref": "#/$defs/check" },
79
+ "description": "Named runnable proofs (e2e, smoke). `backlot run <name>`."
80
+ }
81
+ },
82
+ "$defs": {
83
+ "service": {
84
+ "type": "object",
85
+ "required": ["run"],
86
+ "additionalProperties": false,
87
+ "properties": {
88
+ "run": { "type": "string", "description": "The supervised process. Daemon is its parent." },
89
+ "build": { "type": "string", "description": "Run at bind when fingerprints demand; never during serve." },
90
+ "watch_run": { "type": "string", "description": "Hot-reload alternative to run:, used only by --watch session leases." },
91
+ "cwd": { "type": "string", "description": "Working directory relative to the repo root." },
92
+ "port": {
93
+ "type": "string",
94
+ "pattern": "^[a-z][a-z0-9-]*$",
95
+ "description": "Symbolic port name; the engine allocates the number and injects {{ports.<name>}}. Omit for portless services (workers)."
96
+ },
97
+ "env": {
98
+ "type": "object",
99
+ "additionalProperties": { "type": "string" },
100
+ "description": "Injected environment; values may template {{ports.*}}, {{datastores.*.url}}, {{services.*.url}}."
101
+ },
102
+ "ready": { "$ref": "#/$defs/readiness" },
103
+ "fatal_logs": {
104
+ "type": "string",
105
+ "description": "ERE of log markers that fail a boot in seconds instead of polling readiness to timeout."
106
+ },
107
+ "depends_on": {
108
+ "type": "array",
109
+ "items": { "type": "string" },
110
+ "description": "Services that must be ready before this one starts."
111
+ }
112
+ }
113
+ },
114
+ "readiness": {
115
+ "type": "object",
116
+ "additionalProperties": false,
117
+ "minProperties": 1,
118
+ "properties": {
119
+ "http": { "type": "string", "description": "Path polled on the service's port until 200." },
120
+ "log": { "type": "string", "description": "ERE that must appear in the service log (portless services)." },
121
+ "cmd": { "type": "string", "description": "Command that must exit 0." },
122
+ "timeout": { "type": "number", "default": 120, "description": "Seconds before service-not-ready." }
123
+ }
124
+ },
125
+ "datastore": {
126
+ "type": "object",
127
+ "required": ["driver"],
128
+ "additionalProperties": false,
129
+ "properties": {
130
+ "driver": { "type": "string", "enum": ["sqlite", "postgres", "mssql", "mysql", "redis"] },
131
+ "server": { "type": "string", "enum": ["external"], "default": "external", "description": "backlot never runs datastore servers; it probes them." },
132
+ "probe": { "type": "string", "description": "host:port TCP-probed before anything starts (server drivers). Failure is an infra-error, never code blame." },
133
+ "url": { "type": "string", "description": "Connection-string template handed to services/checks; {{ns}} available. Required for server drivers; ignored for sqlite (the ns IS the file path)." },
134
+ "create": { "type": "string", "description": "Repo command that creates+seeds a namespace; {{ns}} and {{preset}} available." },
135
+ "drop": { "type": "string", "description": "Repo command that drops a namespace; {{ns}} available. Best-effort (run before restore and on recycle)." },
136
+ "template_restore": { "type": "string", "description": "Repo command that clones a baked template namespace into a fresh one; {{template}} and {{ns}} available (e.g. postgres: createdb -T {{template}} {{ns}}). When present, `create` bakes once per seed-content hash and every bind restores in seconds." },
137
+ "presets": { "type": "array", "items": { "type": "string" }, "description": "Named seed states." },
138
+ "default_preset": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "properties": {
142
+ "run": { "type": "string" },
143
+ "session": { "type": "string" }
144
+ }
145
+ },
146
+ "template": { "type": "boolean", "default": false, "description": "sqlite only: bake a template file per seed-content hash and restore by copy. Server drivers use template_restore instead." },
147
+ "ephemeral": { "type": "boolean", "default": false, "description": "No presets; reset-data = flush (Redis-class)." }
148
+ }
149
+ },
150
+ "upkeepRule": {
151
+ "type": "object",
152
+ "required": ["when", "run"],
153
+ "additionalProperties": false,
154
+ "properties": {
155
+ "when": { "type": "string", "description": "A file path or glob(...) whose content hash triggers the rule (direction-agnostic per-env ledger)." },
156
+ "run": { "type": "string", "description": "Repo command, or an engine built-in prefixed with @ (e.g. @rebake-template <datastore>)." }
157
+ }
158
+ },
159
+ "check": {
160
+ "type": "object",
161
+ "required": ["run"],
162
+ "additionalProperties": false,
163
+ "properties": {
164
+ "run": { "type": "string" },
165
+ "cwd": { "type": "string" },
166
+ "env": { "type": "object", "additionalProperties": { "type": "string" } },
167
+ "artifacts": { "type": "array", "items": { "type": "string" }, "description": "Globs collected into the verdict's artifacts dir." },
168
+ "timeout": { "type": "number", "default": 600, "description": "Seconds before the check's whole process group is killed — a hung check must never hold its environment forever." }
169
+ }
170
+ }
171
+ }
172
+ }