@orgloop/cli 0.1.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 (94) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/commands/add.d.ts +8 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +363 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/apply.d.ts +9 -0
  7. package/dist/commands/apply.d.ts.map +1 -0
  8. package/dist/commands/apply.js +289 -0
  9. package/dist/commands/apply.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +45 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +346 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/env.d.ts +23 -0
  15. package/dist/commands/env.d.ts.map +1 -0
  16. package/dist/commands/env.js +230 -0
  17. package/dist/commands/env.js.map +1 -0
  18. package/dist/commands/hook.d.ts +16 -0
  19. package/dist/commands/hook.d.ts.map +1 -0
  20. package/dist/commands/hook.js +80 -0
  21. package/dist/commands/hook.js.map +1 -0
  22. package/dist/commands/init.d.ts +42 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +532 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/inspect.d.ts +8 -0
  27. package/dist/commands/inspect.d.ts.map +1 -0
  28. package/dist/commands/inspect.js +177 -0
  29. package/dist/commands/inspect.js.map +1 -0
  30. package/dist/commands/install-service.d.ts +8 -0
  31. package/dist/commands/install-service.d.ts.map +1 -0
  32. package/dist/commands/install-service.js +182 -0
  33. package/dist/commands/install-service.js.map +1 -0
  34. package/dist/commands/logs.d.ts +8 -0
  35. package/dist/commands/logs.d.ts.map +1 -0
  36. package/dist/commands/logs.js +197 -0
  37. package/dist/commands/logs.js.map +1 -0
  38. package/dist/commands/plan.d.ts +9 -0
  39. package/dist/commands/plan.d.ts.map +1 -0
  40. package/dist/commands/plan.js +200 -0
  41. package/dist/commands/plan.js.map +1 -0
  42. package/dist/commands/routes.d.ts +37 -0
  43. package/dist/commands/routes.d.ts.map +1 -0
  44. package/dist/commands/routes.js +167 -0
  45. package/dist/commands/routes.js.map +1 -0
  46. package/dist/commands/service.d.ts +9 -0
  47. package/dist/commands/service.d.ts.map +1 -0
  48. package/dist/commands/service.js +178 -0
  49. package/dist/commands/service.js.map +1 -0
  50. package/dist/commands/status.d.ts +8 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +176 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/commands/stop.d.ts +8 -0
  55. package/dist/commands/stop.d.ts.map +1 -0
  56. package/dist/commands/stop.js +102 -0
  57. package/dist/commands/stop.js.map +1 -0
  58. package/dist/commands/test.d.ts +8 -0
  59. package/dist/commands/test.d.ts.map +1 -0
  60. package/dist/commands/test.js +236 -0
  61. package/dist/commands/test.js.map +1 -0
  62. package/dist/commands/validate.d.ts +33 -0
  63. package/dist/commands/validate.d.ts.map +1 -0
  64. package/dist/commands/validate.js +501 -0
  65. package/dist/commands/validate.js.map +1 -0
  66. package/dist/commands/version.d.ts +8 -0
  67. package/dist/commands/version.d.ts.map +1 -0
  68. package/dist/commands/version.js +42 -0
  69. package/dist/commands/version.js.map +1 -0
  70. package/dist/config.d.ts +27 -0
  71. package/dist/config.d.ts.map +1 -0
  72. package/dist/config.js +169 -0
  73. package/dist/config.js.map +1 -0
  74. package/dist/env-metadata.d.ts +12 -0
  75. package/dist/env-metadata.d.ts.map +1 -0
  76. package/dist/env-metadata.js +39 -0
  77. package/dist/env-metadata.js.map +1 -0
  78. package/dist/index.d.ts +8 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +86 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/module-resolver.d.ts +42 -0
  83. package/dist/module-resolver.d.ts.map +1 -0
  84. package/dist/module-resolver.js +134 -0
  85. package/dist/module-resolver.js.map +1 -0
  86. package/dist/output.d.ts +36 -0
  87. package/dist/output.d.ts.map +1 -0
  88. package/dist/output.js +142 -0
  89. package/dist/output.js.map +1 -0
  90. package/dist/resolve-connectors.d.ts +27 -0
  91. package/dist/resolve-connectors.d.ts.map +1 -0
  92. package/dist/resolve-connectors.js +94 -0
  93. package/dist/resolve-connectors.js.map +1 -0
  94. package/package.json +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * orgloop plan — Show what would change.
3
+ *
4
+ * Compares desired state (YAML config) vs current running state.
5
+ * Shows: + new, ~ changed, = unchanged, - removed.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function registerPlanCommand(program: Command): void;
9
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgMzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwC1D"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * orgloop plan — Show what would change.
3
+ *
4
+ * Compares desired state (YAML config) vs current running state.
5
+ * Shows: + new, ~ changed, = unchanged, - removed.
6
+ */
7
+ import { readFile } from 'node:fs/promises';
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { loadCliConfig, resolveConfigPath } from '../config.js';
11
+ import * as output from '../output.js';
12
+ async function loadRunningState() {
13
+ const stateFile = join(homedir(), '.orgloop', 'state.json');
14
+ try {
15
+ const content = await readFile(stateFile, 'utf-8');
16
+ return JSON.parse(content);
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function computePlan(config, running) {
23
+ const sources = [];
24
+ const actors = [];
25
+ const routes = [];
26
+ const transforms = [];
27
+ const loggers = [];
28
+ let add = 0;
29
+ let change = 0;
30
+ let remove = 0;
31
+ // Sources
32
+ const runSources = running?.sources ?? {};
33
+ for (const s of config.sources) {
34
+ if (!runSources[s.id]) {
35
+ const interval = s.poll?.interval ? `poll every ${s.poll.interval}` : 'hook';
36
+ sources.push({ name: s.id, action: 'add', detail: `new — ${interval}` });
37
+ add++;
38
+ }
39
+ else {
40
+ // Simple change detection: compare connector + poll interval
41
+ const rs = runSources[s.id];
42
+ if (rs.connector !== s.connector || rs.poll_interval !== s.poll?.interval) {
43
+ sources.push({ name: s.id, action: 'change', detail: 'changed' });
44
+ change++;
45
+ }
46
+ else {
47
+ sources.push({ name: s.id, action: 'unchanged', detail: 'unchanged' });
48
+ }
49
+ }
50
+ }
51
+ for (const id of Object.keys(runSources)) {
52
+ if (!config.sources.find((s) => s.id === id)) {
53
+ sources.push({ name: id, action: 'remove', detail: 'removed' });
54
+ remove++;
55
+ }
56
+ }
57
+ // Actors
58
+ const runActors = running?.actors ?? {};
59
+ for (const a of config.actors) {
60
+ if (!runActors[a.id]) {
61
+ actors.push({ name: a.id, action: 'add', detail: 'new' });
62
+ add++;
63
+ }
64
+ else {
65
+ const ra = runActors[a.id];
66
+ if (ra.connector !== a.connector) {
67
+ actors.push({ name: a.id, action: 'change', detail: 'changed' });
68
+ change++;
69
+ }
70
+ else {
71
+ actors.push({ name: a.id, action: 'unchanged', detail: 'unchanged' });
72
+ }
73
+ }
74
+ }
75
+ for (const id of Object.keys(runActors)) {
76
+ if (!config.actors.find((a) => a.id === id)) {
77
+ actors.push({ name: id, action: 'remove', detail: 'removed' });
78
+ remove++;
79
+ }
80
+ }
81
+ // Routes
82
+ const runRoutes = running?.routes ?? {};
83
+ for (const r of config.routes) {
84
+ if (!runRoutes[r.name]) {
85
+ routes.push({ name: r.name, action: 'add', detail: 'new' });
86
+ add++;
87
+ }
88
+ else {
89
+ const rr = runRoutes[r.name];
90
+ if (rr.source !== r.when.source || rr.actor !== r.then.actor) {
91
+ routes.push({ name: r.name, action: 'change', detail: 'changed' });
92
+ change++;
93
+ }
94
+ else {
95
+ routes.push({ name: r.name, action: 'unchanged', detail: 'unchanged' });
96
+ }
97
+ }
98
+ }
99
+ for (const name of Object.keys(runRoutes)) {
100
+ if (!config.routes.find((r) => r.name === name)) {
101
+ routes.push({ name, action: 'remove', detail: 'removed' });
102
+ remove++;
103
+ }
104
+ }
105
+ // Transforms
106
+ const runTransforms = running?.transforms ?? {};
107
+ for (const t of config.transforms) {
108
+ if (!runTransforms[t.name]) {
109
+ transforms.push({ name: t.name, action: 'add', detail: `new — ${t.type}` });
110
+ add++;
111
+ }
112
+ else {
113
+ transforms.push({ name: t.name, action: 'unchanged', detail: 'unchanged' });
114
+ }
115
+ }
116
+ for (const name of Object.keys(runTransforms)) {
117
+ if (!config.transforms.find((t) => t.name === name)) {
118
+ transforms.push({ name, action: 'remove', detail: 'removed' });
119
+ remove++;
120
+ }
121
+ }
122
+ // Loggers
123
+ const runLoggers = running?.loggers ?? {};
124
+ for (const l of config.loggers) {
125
+ if (!runLoggers[l.name]) {
126
+ loggers.push({ name: l.name, action: 'add', detail: 'new' });
127
+ add++;
128
+ }
129
+ else {
130
+ loggers.push({ name: l.name, action: 'unchanged', detail: 'unchanged' });
131
+ }
132
+ }
133
+ for (const name of Object.keys(runLoggers)) {
134
+ if (!config.loggers.find((l) => l.name === name)) {
135
+ loggers.push({ name, action: 'remove', detail: 'removed' });
136
+ remove++;
137
+ }
138
+ }
139
+ return { sources, actors, routes, transforms, loggers, summary: { add, change, remove } };
140
+ }
141
+ // ─── Display ─────────────────────────────────────────────────────────────────
142
+ function displayPlanSection(label, items) {
143
+ if (items.length === 0)
144
+ return;
145
+ output.subheading(label);
146
+ for (const item of items) {
147
+ const detail = item.detail ? ` (${item.detail})` : '';
148
+ const text = `${item.name.padEnd(24)}${detail}`;
149
+ switch (item.action) {
150
+ case 'add':
151
+ output.planAdd(text);
152
+ break;
153
+ case 'change':
154
+ output.planChange(text);
155
+ break;
156
+ case 'unchanged':
157
+ output.planUnchanged(text);
158
+ break;
159
+ case 'remove':
160
+ output.planRemove(text);
161
+ break;
162
+ }
163
+ }
164
+ }
165
+ // ─── Command registration ────────────────────────────────────────────────────
166
+ export function registerPlanCommand(program) {
167
+ program
168
+ .command('plan')
169
+ .description('Show what would change (dry run)')
170
+ .action(async (_opts, cmd) => {
171
+ try {
172
+ const globalOpts = cmd.parent?.opts() ?? {};
173
+ const config = await loadCliConfig({ configPath: globalOpts.config });
174
+ const running = await loadRunningState();
175
+ const plan = computePlan(config, running);
176
+ if (output.isJsonMode()) {
177
+ output.json(plan);
178
+ return;
179
+ }
180
+ output.blank();
181
+ output.heading(`OrgLoop Plan — ${config.project.name}`);
182
+ displayPlanSection('Sources', plan.sources);
183
+ displayPlanSection('Actors', plan.actors);
184
+ displayPlanSection('Routes', plan.routes);
185
+ displayPlanSection('Transforms', plan.transforms);
186
+ displayPlanSection('Loggers', plan.loggers);
187
+ output.blank();
188
+ output.info(`Plan: ${plan.summary.add} to add, ${plan.summary.change} to change, ${plan.summary.remove} to remove.`);
189
+ output.blank();
190
+ if (plan.summary.add > 0 || plan.summary.change > 0 || plan.summary.remove > 0) {
191
+ output.info('Run `orgloop apply` to execute this plan.');
192
+ }
193
+ }
194
+ catch (err) {
195
+ output.error(`Plan failed: ${err instanceof Error ? err.message : String(err)}`);
196
+ process.exitCode = 1;
197
+ }
198
+ });
199
+ }
200
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * orgloop routes — Visualize the routing topology.
3
+ *
4
+ * Reads the project config and displays an ASCII graph of
5
+ * sources -> routes (with filters/transforms) -> actors.
6
+ * Highlights unrouted sources and unreachable actors.
7
+ *
8
+ * Supports --json for machine-readable graph output.
9
+ */
10
+ import type { OrgLoopConfig } from '@orgloop/sdk';
11
+ import type { Command } from 'commander';
12
+ export interface RouteEdge {
13
+ route: string;
14
+ description?: string;
15
+ source: string;
16
+ actor: string;
17
+ events: string[];
18
+ filter?: Record<string, unknown>;
19
+ transforms: string[];
20
+ }
21
+ export interface RouteGraphWarning {
22
+ kind: 'unrouted-source' | 'unreachable-actor' | 'orphan-transform';
23
+ id: string;
24
+ message: string;
25
+ }
26
+ export interface RouteGraph {
27
+ project: string;
28
+ sources: string[];
29
+ actors: string[];
30
+ transforms: string[];
31
+ edges: RouteEdge[];
32
+ warnings: RouteGraphWarning[];
33
+ }
34
+ export declare function buildRouteGraph(config: OrgLoopConfig): RouteGraph;
35
+ export declare function renderRouteGraph(graph: RouteGraph): string;
36
+ export declare function registerRoutesCommand(program: Command): void;
37
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/commands/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAEX,aAAa,EAIb,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAID,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CA8DjE;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAoF1D;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4B5D"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * orgloop routes — Visualize the routing topology.
3
+ *
4
+ * Reads the project config and displays an ASCII graph of
5
+ * sources -> routes (with filters/transforms) -> actors.
6
+ * Highlights unrouted sources and unreachable actors.
7
+ *
8
+ * Supports --json for machine-readable graph output.
9
+ */
10
+ import chalk from 'chalk';
11
+ import { loadCliConfig, resolveConfigPath } from '../config.js';
12
+ import * as output from '../output.js';
13
+ // ─── Graph building ───────────────────────────────────────────────────────────
14
+ export function buildRouteGraph(config) {
15
+ const sourceIds = config.sources.map((s) => s.id);
16
+ const actorIds = config.actors.map((a) => a.id);
17
+ const transformNames = config.transforms.map((t) => t.name);
18
+ const edges = config.routes.map((route) => ({
19
+ route: route.name,
20
+ description: route.description,
21
+ source: route.when.source,
22
+ actor: route.then.actor,
23
+ events: route.when.events,
24
+ filter: route.when.filter,
25
+ transforms: route.transforms?.map((t) => t.ref) ?? [],
26
+ }));
27
+ // Detect warnings
28
+ const warnings = [];
29
+ const routedSources = new Set(config.routes.map((r) => r.when.source));
30
+ const reachedActors = new Set(config.routes.map((r) => r.then.actor));
31
+ const usedTransforms = new Set(config.routes.flatMap((r) => r.transforms?.map((t) => t.ref) ?? []));
32
+ for (const id of sourceIds) {
33
+ if (!routedSources.has(id)) {
34
+ warnings.push({
35
+ kind: 'unrouted-source',
36
+ id,
37
+ message: `Source "${id}" has no routes`,
38
+ });
39
+ }
40
+ }
41
+ for (const id of actorIds) {
42
+ if (!reachedActors.has(id)) {
43
+ warnings.push({
44
+ kind: 'unreachable-actor',
45
+ id,
46
+ message: `Actor "${id}" is not targeted by any route`,
47
+ });
48
+ }
49
+ }
50
+ for (const name of transformNames) {
51
+ if (!usedTransforms.has(name)) {
52
+ warnings.push({
53
+ kind: 'orphan-transform',
54
+ id: name,
55
+ message: `Transform "${name}" is not used by any route`,
56
+ });
57
+ }
58
+ }
59
+ return {
60
+ project: config.project.name,
61
+ sources: sourceIds,
62
+ actors: actorIds,
63
+ transforms: transformNames,
64
+ edges,
65
+ warnings,
66
+ };
67
+ }
68
+ // ─── ASCII rendering ──────────────────────────────────────────────────────────
69
+ function formatFilter(filter) {
70
+ return Object.entries(filter)
71
+ .map(([k, v]) => `${k}: ${String(v)}`)
72
+ .join(', ');
73
+ }
74
+ export function renderRouteGraph(graph) {
75
+ const lines = [];
76
+ lines.push(chalk.bold(`OrgLoop Routes \u2014 ${graph.project}`));
77
+ lines.push('');
78
+ if (graph.edges.length === 0 && graph.warnings.length === 0) {
79
+ lines.push(chalk.dim(' No routes defined.'));
80
+ return lines.join('\n');
81
+ }
82
+ // Group edges by source for a cleaner display
83
+ const edgesBySource = new Map();
84
+ for (const edge of graph.edges) {
85
+ const existing = edgesBySource.get(edge.source) ?? [];
86
+ existing.push(edge);
87
+ edgesBySource.set(edge.source, existing);
88
+ }
89
+ // Render routed sources
90
+ for (const [source, edges] of edgesBySource) {
91
+ for (const edge of edges) {
92
+ const arrow = chalk.dim('\u2500\u2500\u25B6');
93
+ const routeName = chalk.cyan(edge.route);
94
+ const actorName = chalk.green(edge.actor);
95
+ lines.push(` ${chalk.yellow(source)} ${arrow} ${routeName} ${arrow} ${actorName}`);
96
+ // Filter line
97
+ if (edge.events.length > 0 || edge.filter) {
98
+ const parts = [];
99
+ if (edge.events.length > 0) {
100
+ parts.push(edge.events.join(', '));
101
+ }
102
+ if (edge.filter) {
103
+ parts.push(formatFilter(edge.filter));
104
+ }
105
+ lines.push(chalk.dim(` \u2514\u2500 filter: ${parts.join(', ')}`));
106
+ }
107
+ // Transforms line
108
+ if (edge.transforms.length > 0) {
109
+ lines.push(chalk.dim(` \u2514\u2500 transform: ${edge.transforms.join(' \u2192 ')}`));
110
+ }
111
+ }
112
+ lines.push('');
113
+ }
114
+ // Render unrouted sources
115
+ const routedSources = new Set(graph.edges.map((e) => e.source));
116
+ const unroutedSources = graph.sources.filter((s) => !routedSources.has(s));
117
+ for (const source of unroutedSources) {
118
+ lines.push(` ${chalk.yellow(source)} ${chalk.dim('\u2500\u2500\u25B6')} ${chalk.yellow('(no routes)')} ${chalk.yellow('\u26A0')} unrouted source`);
119
+ lines.push('');
120
+ }
121
+ // Render unreachable actors
122
+ const reachedActors = new Set(graph.edges.map((e) => e.actor));
123
+ const unreachableActors = graph.actors.filter((a) => !reachedActors.has(a));
124
+ if (unreachableActors.length > 0) {
125
+ for (const actor of unreachableActors) {
126
+ lines.push(` ${chalk.yellow('\u26A0')} ${chalk.green(actor)} ${chalk.yellow('\u2014 unreachable actor (no routes target this actor)')}`);
127
+ }
128
+ lines.push('');
129
+ }
130
+ // Summary
131
+ const warningCount = graph.warnings.length;
132
+ if (warningCount > 0) {
133
+ lines.push(`${graph.edges.length} route${graph.edges.length !== 1 ? 's' : ''}, ${warningCount} warning${warningCount !== 1 ? 's' : ''}`);
134
+ }
135
+ else {
136
+ lines.push(chalk.dim(`${graph.edges.length} route${graph.edges.length !== 1 ? 's' : ''}, 0 warnings`));
137
+ }
138
+ return lines.join('\n');
139
+ }
140
+ // ─── Command registration ────────────────────────────────────────────────────
141
+ export function registerRoutesCommand(program) {
142
+ program
143
+ .command('routes')
144
+ .description('Visualize the routing topology')
145
+ .action(async (_opts, cmd) => {
146
+ try {
147
+ const globalOpts = cmd.parent?.opts() ?? {};
148
+ const configPath = resolveConfigPath(globalOpts.config);
149
+ const config = await loadCliConfig({ configPath });
150
+ const graph = buildRouteGraph(config);
151
+ if (output.isJsonMode()) {
152
+ output.json(graph);
153
+ return;
154
+ }
155
+ output.blank();
156
+ output.info(renderRouteGraph(graph));
157
+ if (graph.warnings.length > 0) {
158
+ output.info(chalk.dim('Next: run `orgloop validate` for detailed config checks.'));
159
+ }
160
+ }
161
+ catch (err) {
162
+ output.error(`Failed to load routes: ${err instanceof Error ? err.message : String(err)}`);
163
+ process.exitCode = 1;
164
+ }
165
+ });
166
+ }
167
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/commands/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * orgloop service — Manage the installed service.
3
+ *
4
+ * Thin wrappers around platform tools (launchctl/systemctl).
5
+ * Subcommands: start, stop, status, logs.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function registerServiceCommand(program: Command): void;
9
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwI7D"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * orgloop service — Manage the installed service.
3
+ *
4
+ * Thin wrappers around platform tools (launchctl/systemctl).
5
+ * Subcommands: start, stop, status, logs.
6
+ */
7
+ import { execFile } from 'node:child_process';
8
+ import { access } from 'node:fs/promises';
9
+ import { homedir } from 'node:os';
10
+ import { join } from 'node:path';
11
+ import { promisify } from 'node:util';
12
+ import * as output from '../output.js';
13
+ const exec = promisify(execFile);
14
+ async function fileExists(path) {
15
+ try {
16
+ await access(path);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ async function detectPlatform() {
24
+ const launchdPath = join(homedir(), 'Library', 'LaunchAgents', 'com.orgloop.daemon.plist');
25
+ const systemdPath = join(homedir(), '.config', 'systemd', 'user', 'orgloop.service');
26
+ if (await fileExists(launchdPath)) {
27
+ return { platform: 'launchd', servicePath: launchdPath };
28
+ }
29
+ if (await fileExists(systemdPath)) {
30
+ return { platform: 'systemd', servicePath: systemdPath };
31
+ }
32
+ return { platform: 'unknown', servicePath: '' };
33
+ }
34
+ async function runCommand(cmd, args) {
35
+ try {
36
+ return await exec(cmd, args);
37
+ }
38
+ catch (err) {
39
+ const e = err;
40
+ return { stdout: e.stdout ?? '', stderr: e.stderr ?? e.message ?? 'Command failed' };
41
+ }
42
+ }
43
+ // ─── Command registration ────────────────────────────────────────────────────
44
+ export function registerServiceCommand(program) {
45
+ const serviceCmd = program.command('service').description('Manage the installed OrgLoop service');
46
+ serviceCmd
47
+ .command('start')
48
+ .description('Start the OrgLoop service')
49
+ .action(async () => {
50
+ const { platform, servicePath } = await detectPlatform();
51
+ if (platform === 'unknown') {
52
+ output.error('No OrgLoop service found. Run `orgloop install-service` first.');
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ if (platform === 'launchd') {
57
+ const { stderr } = await runCommand('launchctl', ['load', servicePath]);
58
+ if (stderr && !stderr.includes('already loaded')) {
59
+ output.error(stderr);
60
+ process.exitCode = 1;
61
+ }
62
+ else {
63
+ output.success('OrgLoop service started (launchd).');
64
+ }
65
+ }
66
+ else {
67
+ const { stderr } = await runCommand('systemctl', ['--user', 'start', 'orgloop']);
68
+ if (stderr) {
69
+ output.error(stderr);
70
+ process.exitCode = 1;
71
+ }
72
+ else {
73
+ output.success('OrgLoop service started (systemd).');
74
+ }
75
+ }
76
+ });
77
+ serviceCmd
78
+ .command('stop')
79
+ .description('Stop the OrgLoop service')
80
+ .action(async () => {
81
+ const { platform, servicePath } = await detectPlatform();
82
+ if (platform === 'unknown') {
83
+ output.error('No OrgLoop service found.');
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ if (platform === 'launchd') {
88
+ const { stderr } = await runCommand('launchctl', ['unload', servicePath]);
89
+ if (stderr) {
90
+ output.error(stderr);
91
+ process.exitCode = 1;
92
+ }
93
+ else {
94
+ output.success('OrgLoop service stopped (launchd).');
95
+ }
96
+ }
97
+ else {
98
+ const { stderr } = await runCommand('systemctl', ['--user', 'stop', 'orgloop']);
99
+ if (stderr) {
100
+ output.error(stderr);
101
+ process.exitCode = 1;
102
+ }
103
+ else {
104
+ output.success('OrgLoop service stopped (systemd).');
105
+ }
106
+ }
107
+ });
108
+ serviceCmd
109
+ .command('status')
110
+ .description('Show OrgLoop service status')
111
+ .action(async () => {
112
+ const { platform, servicePath } = await detectPlatform();
113
+ if (platform === 'unknown') {
114
+ output.info('No OrgLoop service installed.');
115
+ output.info('Run `orgloop install-service` to set up a service.');
116
+ return;
117
+ }
118
+ if (platform === 'launchd') {
119
+ const { stdout } = await runCommand('launchctl', ['list']);
120
+ const lines = stdout.split('\n').filter((l) => l.includes('com.orgloop'));
121
+ if (lines.length > 0) {
122
+ output.info('OrgLoop service (launchd):');
123
+ for (const line of lines) {
124
+ output.info(` ${line.trim()}`);
125
+ }
126
+ }
127
+ else {
128
+ output.info('OrgLoop service is not loaded.');
129
+ output.info(`Service file: ${servicePath}`);
130
+ }
131
+ }
132
+ else {
133
+ const { stdout } = await runCommand('systemctl', ['--user', 'status', 'orgloop']);
134
+ output.info(stdout || 'OrgLoop service is not running.');
135
+ }
136
+ });
137
+ serviceCmd
138
+ .command('logs')
139
+ .description('Show OrgLoop service logs')
140
+ .action(async () => {
141
+ const { platform } = await detectPlatform();
142
+ if (platform === 'unknown') {
143
+ output.error('No OrgLoop service found.');
144
+ process.exitCode = 1;
145
+ return;
146
+ }
147
+ const stdoutLog = join(homedir(), '.orgloop', 'logs', 'daemon.stdout.log');
148
+ const stderrLog = join(homedir(), '.orgloop', 'logs', 'daemon.stderr.log');
149
+ if (platform === 'launchd') {
150
+ output.info('Service logs:');
151
+ output.info(` stdout: ${stdoutLog}`);
152
+ output.info(` stderr: ${stderrLog}`);
153
+ output.blank();
154
+ output.info('Tail with:');
155
+ output.info(` tail -f ${stdoutLog}`);
156
+ }
157
+ else {
158
+ const { stdout } = await runCommand('journalctl', [
159
+ '--user',
160
+ '-u',
161
+ 'orgloop',
162
+ '-n',
163
+ '50',
164
+ '--no-pager',
165
+ ]);
166
+ if (stdout) {
167
+ output.info(stdout);
168
+ }
169
+ else {
170
+ output.info('No logs found. Service may not have started.');
171
+ output.info('Fallback log files:');
172
+ output.info(` stdout: ${stdoutLog}`);
173
+ output.info(` stderr: ${stderrLog}`);
174
+ }
175
+ }
176
+ });
177
+ }
178
+ //# sourceMappingURL=service.js.map