@slope-dev/slope 1.15.0 → 1.16.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 (116) hide show
  1. package/dist/cli/commands/docs.d.ts +5 -0
  2. package/dist/cli/commands/docs.d.ts.map +1 -0
  3. package/dist/cli/commands/docs.js +303 -0
  4. package/dist/cli/commands/docs.js.map +1 -0
  5. package/dist/cli/commands/guard.d.ts.map +1 -1
  6. package/dist/cli/commands/guard.js +2 -0
  7. package/dist/cli/commands/guard.js.map +1 -1
  8. package/dist/cli/commands/init.d.ts.map +1 -1
  9. package/dist/cli/commands/init.js +56 -0
  10. package/dist/cli/commands/init.js.map +1 -1
  11. package/dist/cli/commands/loop.d.ts +2 -0
  12. package/dist/cli/commands/loop.d.ts.map +1 -0
  13. package/dist/cli/commands/loop.js +388 -0
  14. package/dist/cli/commands/loop.js.map +1 -0
  15. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  16. package/dist/cli/commands/roadmap.js +51 -2
  17. package/dist/cli/commands/roadmap.js.map +1 -1
  18. package/dist/cli/commands/session.d.ts.map +1 -1
  19. package/dist/cli/commands/session.js +2 -0
  20. package/dist/cli/commands/session.js.map +1 -1
  21. package/dist/cli/commands/vision.d.ts.map +1 -1
  22. package/dist/cli/commands/vision.js +104 -7
  23. package/dist/cli/commands/vision.js.map +1 -1
  24. package/dist/cli/guards/stop-check.d.ts +5 -0
  25. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  26. package/dist/cli/guards/stop-check.js +72 -5
  27. package/dist/cli/guards/stop-check.js.map +1 -1
  28. package/dist/cli/guards/worktree-check.d.ts +14 -0
  29. package/dist/cli/guards/worktree-check.d.ts.map +1 -0
  30. package/dist/cli/guards/worktree-check.js +137 -0
  31. package/dist/cli/guards/worktree-check.js.map +1 -0
  32. package/dist/cli/index.js +16 -0
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/loop/analyze.d.ts +8 -0
  35. package/dist/cli/loop/analyze.d.ts.map +1 -0
  36. package/dist/cli/loop/analyze.js +62 -0
  37. package/dist/cli/loop/analyze.js.map +1 -0
  38. package/dist/cli/loop/backlog.d.ts +26 -0
  39. package/dist/cli/loop/backlog.d.ts.map +1 -0
  40. package/dist/cli/loop/backlog.js +95 -0
  41. package/dist/cli/loop/backlog.js.map +1 -0
  42. package/dist/cli/loop/config.d.ts +10 -0
  43. package/dist/cli/loop/config.d.ts.map +1 -0
  44. package/dist/cli/loop/config.js +75 -0
  45. package/dist/cli/loop/config.js.map +1 -0
  46. package/dist/cli/loop/continuous.d.ts +6 -0
  47. package/dist/cli/loop/continuous.d.ts.map +1 -0
  48. package/dist/cli/loop/continuous.js +108 -0
  49. package/dist/cli/loop/continuous.js.map +1 -0
  50. package/dist/cli/loop/executor.d.ts +8 -0
  51. package/dist/cli/loop/executor.d.ts.map +1 -0
  52. package/dist/cli/loop/executor.js +600 -0
  53. package/dist/cli/loop/executor.js.map +1 -0
  54. package/dist/cli/loop/guard-runner.d.ts +14 -0
  55. package/dist/cli/loop/guard-runner.d.ts.map +1 -0
  56. package/dist/cli/loop/guard-runner.js +53 -0
  57. package/dist/cli/loop/guard-runner.js.map +1 -0
  58. package/dist/cli/loop/logger.d.ts +9 -0
  59. package/dist/cli/loop/logger.d.ts.map +1 -0
  60. package/dist/cli/loop/logger.js +37 -0
  61. package/dist/cli/loop/logger.js.map +1 -0
  62. package/dist/cli/loop/model-selector.d.ts +14 -0
  63. package/dist/cli/loop/model-selector.d.ts.map +1 -0
  64. package/dist/cli/loop/model-selector.js +59 -0
  65. package/dist/cli/loop/model-selector.js.map +1 -0
  66. package/dist/cli/loop/parallel.d.ts +6 -0
  67. package/dist/cli/loop/parallel.d.ts.map +1 -0
  68. package/dist/cli/loop/parallel.js +109 -0
  69. package/dist/cli/loop/parallel.js.map +1 -0
  70. package/dist/cli/loop/pr-lifecycle.d.ts +26 -0
  71. package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -0
  72. package/dist/cli/loop/pr-lifecycle.js +244 -0
  73. package/dist/cli/loop/pr-lifecycle.js.map +1 -0
  74. package/dist/cli/loop/types.d.ts +98 -0
  75. package/dist/cli/loop/types.d.ts.map +1 -0
  76. package/dist/cli/loop/types.js +37 -0
  77. package/dist/cli/loop/types.js.map +1 -0
  78. package/dist/cli/loop/worktree.d.ts +30 -0
  79. package/dist/cli/loop/worktree.d.ts.map +1 -0
  80. package/dist/cli/loop/worktree.js +134 -0
  81. package/dist/cli/loop/worktree.js.map +1 -0
  82. package/dist/cli/registry.d.ts.map +1 -1
  83. package/dist/cli/registry.js +3 -0
  84. package/dist/cli/registry.js.map +1 -1
  85. package/dist/core/analyzers/stack.d.ts +2 -0
  86. package/dist/core/analyzers/stack.d.ts.map +1 -1
  87. package/dist/core/analyzers/stack.js +9 -6
  88. package/dist/core/analyzers/stack.js.map +1 -1
  89. package/dist/core/constants.d.ts +2 -0
  90. package/dist/core/constants.d.ts.map +1 -1
  91. package/dist/core/constants.js +2 -0
  92. package/dist/core/constants.js.map +1 -1
  93. package/dist/core/docs.d.ts +50 -0
  94. package/dist/core/docs.d.ts.map +1 -0
  95. package/dist/core/docs.js +67 -0
  96. package/dist/core/docs.js.map +1 -0
  97. package/dist/core/generators/roadmap.d.ts +6 -1
  98. package/dist/core/generators/roadmap.d.ts.map +1 -1
  99. package/dist/core/generators/roadmap.js +150 -0
  100. package/dist/core/generators/roadmap.js.map +1 -1
  101. package/dist/core/guard.d.ts +1 -1
  102. package/dist/core/guard.d.ts.map +1 -1
  103. package/dist/core/guard.js +8 -0
  104. package/dist/core/guard.js.map +1 -1
  105. package/dist/core/index.d.ts +5 -2
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/core/index.js +5 -2
  108. package/dist/core/index.js.map +1 -1
  109. package/dist/core/vision.d.ts +10 -0
  110. package/dist/core/vision.d.ts.map +1 -1
  111. package/dist/core/vision.js +37 -0
  112. package/dist/core/vision.js.map +1 -1
  113. package/dist/mcp/registry.d.ts.map +1 -1
  114. package/dist/mcp/registry.js +29 -0
  115. package/dist/mcp/registry.js.map +1 -1
  116. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/analyze.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD1F"}
@@ -0,0 +1,62 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { resolveLoopConfig } from './config.js';
5
+ import { createLogger } from './logger.js';
6
+ /**
7
+ * Mine scorecards to generate analysis.json + backlog.json.
8
+ * Delegates to the existing analyze-scorecards.ts script which
9
+ * has mature analysis logic (temporal weighting, hotspot detection,
10
+ * 5-strategy backlog generation).
11
+ */
12
+ export async function runAnalyze(flags, cwd) {
13
+ const config = resolveLoopConfig(cwd);
14
+ const log = createLogger('loop:analyze');
15
+ const regenerate = flags.regenerate === 'true';
16
+ const backlogPath = join(cwd, config.backlogPath);
17
+ const analysisPath = join(cwd, 'slope-loop/analysis.json');
18
+ const scriptPath = join(cwd, 'slope-loop/analyze-scorecards.ts');
19
+ if (!existsSync(scriptPath)) {
20
+ log.error(`Analysis script not found: ${scriptPath}`);
21
+ process.exit(1);
22
+ }
23
+ if (existsSync(backlogPath) && !regenerate) {
24
+ log.info('Backlog already exists. Use --regenerate to rebuild.');
25
+ log.info(` Backlog: ${backlogPath}`);
26
+ if (existsSync(analysisPath)) {
27
+ log.info(` Analysis: ${analysisPath}`);
28
+ }
29
+ return;
30
+ }
31
+ // Build first (the script imports from dist/)
32
+ log.info('Building project (required for analysis)...');
33
+ try {
34
+ execSync('pnpm build', { cwd, stdio: 'pipe', timeout: 120_000 });
35
+ }
36
+ catch {
37
+ log.error('Build failed — cannot run analysis');
38
+ process.exit(1);
39
+ }
40
+ log.info('Running scorecard analysis...');
41
+ try {
42
+ const output = execSync(`npx tsx "${scriptPath}"`, {
43
+ cwd,
44
+ encoding: 'utf8',
45
+ stdio: ['pipe', 'pipe', 'pipe'],
46
+ timeout: 120_000,
47
+ });
48
+ console.log(output);
49
+ }
50
+ catch (err) {
51
+ const error = err;
52
+ log.error(`Analysis failed: ${error.stderr ?? error.message}`);
53
+ process.exit(1);
54
+ }
55
+ if (existsSync(backlogPath)) {
56
+ log.info(`Backlog generated: ${backlogPath}`);
57
+ }
58
+ if (existsSync(analysisPath)) {
59
+ log.info(`Analysis written: ${analysisPath}`);
60
+ }
61
+ }
62
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/loop/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAA6B,EAAE,GAAW;IACzE,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC;IAE/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAC;IAEjE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO;IACT,CAAC;IAED,8CAA8C;IAC9C,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,QAAQ,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,UAAU,GAAG,EAAE;YACjD,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAA2C,CAAC;QAC1D,GAAG,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { BacklogFile, BacklogSprint, BacklogTicket, LoopConfig } from './types.js';
2
+ import type { Logger } from './logger.js';
3
+ /** Load and parse backlog.json */
4
+ export declare function loadBacklog(cwd: string, config: LoopConfig): BacklogFile;
5
+ /**
6
+ * Select the next unscored sprint and atomically lock it.
7
+ * Uses mkdir for TOCTOU-safe atomic locking — lock is acquired in the same
8
+ * function as selection, not separately.
9
+ *
10
+ * @returns The selected sprint, or null if all sprints are completed.
11
+ */
12
+ export declare function selectNextSprint(backlog: BacklogFile, cwd: string, config: LoopConfig): BacklogSprint | null;
13
+ /** Select a specific sprint by ID */
14
+ export declare function selectSprintById(backlog: BacklogFile, sprintId: string): BacklogSprint | null;
15
+ /** Release the lock for a sprint */
16
+ export declare function releaseLock(cwd: string, config: LoopConfig, sprintId: string): void;
17
+ /**
18
+ * Validate that tickets have at least one module file present on disk.
19
+ * Returns the validated (usable) tickets.
20
+ */
21
+ export declare function validateTickets(tickets: BacklogTicket[], cwd: string, log: Logger): BacklogTicket[];
22
+ /** Check if the backlog needs enrichment (version < 1) */
23
+ export declare function needsEnrichment(backlog: BacklogFile): boolean;
24
+ /** Get remaining (unscored) sprint IDs from backlog */
25
+ export declare function getRemainingSprintIds(backlog: BacklogFile, cwd: string, config: LoopConfig): string[];
26
+ //# sourceMappingURL=backlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/backlog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,kCAAkC;AAClC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CAOxE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,GACjB,aAAa,GAAG,IAAI,CAuBtB;AAED,qCAAqC;AACrC,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,GACf,aAAa,GAAG,IAAI,CAEtB;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOnF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EAAE,EACxB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,aAAa,EAAE,CA4BjB;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAG7D;AAED,uDAAuD;AACvD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,GACjB,MAAM,EAAE,CAKV"}
@@ -0,0 +1,95 @@
1
+ import { readFileSync, existsSync, mkdirSync, rmdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /** Load and parse backlog.json */
4
+ export function loadBacklog(cwd, config) {
5
+ const backlogPath = join(cwd, config.backlogPath);
6
+ if (!existsSync(backlogPath)) {
7
+ throw new Error(`Backlog not found: ${backlogPath}. Run: slope loop analyze --regenerate`);
8
+ }
9
+ const raw = JSON.parse(readFileSync(backlogPath, 'utf8'));
10
+ return raw;
11
+ }
12
+ /**
13
+ * Select the next unscored sprint and atomically lock it.
14
+ * Uses mkdir for TOCTOU-safe atomic locking — lock is acquired in the same
15
+ * function as selection, not separately.
16
+ *
17
+ * @returns The selected sprint, or null if all sprints are completed.
18
+ */
19
+ export function selectNextSprint(backlog, cwd, config) {
20
+ const resultsDir = join(cwd, config.resultsDir);
21
+ if (!existsSync(resultsDir))
22
+ mkdirSync(resultsDir, { recursive: true });
23
+ for (const sprint of backlog.sprints) {
24
+ const lockDir = join(resultsDir, `${sprint.id}.lock`);
25
+ const resultFile = join(resultsDir, `${sprint.id}.json`);
26
+ // Already completed
27
+ if (existsSync(resultFile))
28
+ continue;
29
+ // Atomic lock: mkdir fails if another process already locked this sprint
30
+ try {
31
+ mkdirSync(lockDir);
32
+ }
33
+ catch {
34
+ // Lock exists (another process claimed it), skip
35
+ continue;
36
+ }
37
+ return sprint;
38
+ }
39
+ return null;
40
+ }
41
+ /** Select a specific sprint by ID */
42
+ export function selectSprintById(backlog, sprintId) {
43
+ return backlog.sprints.find(s => s.id === sprintId) ?? null;
44
+ }
45
+ /** Release the lock for a sprint */
46
+ export function releaseLock(cwd, config, sprintId) {
47
+ const lockDir = join(cwd, config.resultsDir, `${sprintId}.lock`);
48
+ try {
49
+ rmdirSync(lockDir);
50
+ }
51
+ catch {
52
+ // Lock already removed or never existed
53
+ }
54
+ }
55
+ /**
56
+ * Validate that tickets have at least one module file present on disk.
57
+ * Returns the validated (usable) tickets.
58
+ */
59
+ export function validateTickets(tickets, cwd, log) {
60
+ const valid = [];
61
+ for (const ticket of tickets) {
62
+ if (!ticket.modules || ticket.modules.length === 0) {
63
+ log.warn(`SKIP ${ticket.key}: no modules specified`);
64
+ continue;
65
+ }
66
+ let found = false;
67
+ for (const mod of ticket.modules) {
68
+ // Check absolute path first
69
+ if (existsSync(join(cwd, mod))) {
70
+ found = true;
71
+ break;
72
+ }
73
+ }
74
+ if (!found) {
75
+ log.warn(`SKIP ${ticket.key}: no module files found on disk`);
76
+ continue;
77
+ }
78
+ log.info(`VALID ${ticket.key}: ${ticket.title}`);
79
+ valid.push(ticket);
80
+ }
81
+ return valid;
82
+ }
83
+ /** Check if the backlog needs enrichment (version < 1) */
84
+ export function needsEnrichment(backlog) {
85
+ const version = backlog._enrichMeta?.version ?? 0;
86
+ return version < 1;
87
+ }
88
+ /** Get remaining (unscored) sprint IDs from backlog */
89
+ export function getRemainingSprintIds(backlog, cwd, config) {
90
+ const resultsDir = join(cwd, config.resultsDir);
91
+ return backlog.sprints
92
+ .filter(s => !existsSync(join(resultsDir, `${s.id}.json`)))
93
+ .map(s => s.id);
94
+ }
95
+ //# sourceMappingURL=backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../../src/cli/loop/backlog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { LoopConfig, ConfigWithSources } from './types.js';
2
+ /**
3
+ * Load loop config with full source tracking.
4
+ * Chain: env vars → .slope/loop.config.json → hardcoded defaults.
5
+ * Env vars have highest priority.
6
+ */
7
+ export declare function loadLoopConfig(cwd?: string): ConfigWithSources;
8
+ /** Shorthand: load just the config without sources */
9
+ export declare function resolveLoopConfig(cwd?: string): LoopConfig;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAgB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA8C9E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,iBAAiB,CAsB7E;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,UAAU,CAEzE"}
@@ -0,0 +1,75 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { DEFAULT_LOOP_CONFIG, ENV_VAR_MAP } from './types.js';
4
+ const CONFIG_FILE = '.slope/loop.config.json';
5
+ /** Parse a boolean-like env var value */
6
+ function parseBool(val) {
7
+ return val === 'true' || val === '1';
8
+ }
9
+ /** Parse a numeric env var value, returning undefined if invalid */
10
+ function parseNum(val) {
11
+ const n = Number(val);
12
+ return Number.isFinite(n) ? n : undefined;
13
+ }
14
+ /** Load file-based config from .slope/loop.config.json */
15
+ function loadFileConfig(cwd) {
16
+ const configPath = join(cwd, CONFIG_FILE);
17
+ if (!existsSync(configPath))
18
+ return {};
19
+ try {
20
+ return JSON.parse(readFileSync(configPath, 'utf8'));
21
+ }
22
+ catch {
23
+ return {};
24
+ }
25
+ }
26
+ /** Load env-based overrides. Returns only keys that have env vars set. */
27
+ function loadEnvConfig() {
28
+ const result = {};
29
+ for (const [envName, configKey] of Object.entries(ENV_VAR_MAP)) {
30
+ const val = process.env[envName];
31
+ if (val === undefined)
32
+ continue;
33
+ const defaultVal = DEFAULT_LOOP_CONFIG[configKey];
34
+ if (typeof defaultVal === 'boolean') {
35
+ result[configKey] = parseBool(val);
36
+ }
37
+ else if (typeof defaultVal === 'number') {
38
+ const n = parseNum(val);
39
+ if (n !== undefined)
40
+ result[configKey] = n;
41
+ }
42
+ else {
43
+ result[configKey] = val;
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ /**
49
+ * Load loop config with full source tracking.
50
+ * Chain: env vars → .slope/loop.config.json → hardcoded defaults.
51
+ * Env vars have highest priority.
52
+ */
53
+ export function loadLoopConfig(cwd = process.cwd()) {
54
+ const fileConfig = loadFileConfig(cwd);
55
+ const envConfig = loadEnvConfig();
56
+ const config = { ...DEFAULT_LOOP_CONFIG };
57
+ const sources = {};
58
+ for (const key of Object.keys(DEFAULT_LOOP_CONFIG)) {
59
+ sources[key] = 'default';
60
+ if (key in fileConfig) {
61
+ config[key] = fileConfig[key];
62
+ sources[key] = 'file';
63
+ }
64
+ if (key in envConfig) {
65
+ config[key] = envConfig[key];
66
+ sources[key] = 'env';
67
+ }
68
+ }
69
+ return { config, sources };
70
+ }
71
+ /** Shorthand: load just the config without sources */
72
+ export function resolveLoopConfig(cwd = process.cwd()) {
73
+ return loadLoopConfig(cwd).config;
74
+ }
75
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/loop/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Multi-sprint continuous loop with backlog auto-regeneration.
3
+ * Mirrors slope-loop/continuous.sh behavior.
4
+ */
5
+ export declare function runContinuous(flags: Record<string, string>, cwd: string): Promise<void>;
6
+ //# sourceMappingURL=continuous.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuous.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/continuous.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgF7F"}
@@ -0,0 +1,108 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { resolveLoopConfig } from './config.js';
5
+ import { loadBacklog, getRemainingSprintIds } from './backlog.js';
6
+ import { runSprint, isShuttingDown } from './executor.js';
7
+ import { createLogger } from './logger.js';
8
+ /**
9
+ * Multi-sprint continuous loop with backlog auto-regeneration.
10
+ * Mirrors slope-loop/continuous.sh behavior.
11
+ */
12
+ export async function runContinuous(flags, cwd) {
13
+ const config = resolveLoopConfig(cwd);
14
+ const maxSprints = parseInt(flags.max ?? '10', 10);
15
+ const pauseSeconds = parseInt(flags.pause ?? '30', 10);
16
+ const dryRun = flags['dry-run'] === 'true';
17
+ mkdirSync(join(cwd, config.resultsDir), { recursive: true });
18
+ mkdirSync(join(cwd, config.logDir), { recursive: true });
19
+ const log = createLogger('loop:continuous', join(cwd, config.logDir, 'continuous.log'));
20
+ log.info('=== Continuous Loop Starting ===');
21
+ log.info(`Max sprints: ${maxSprints}`);
22
+ log.info(`Pause between sprints: ${pauseSeconds}s`);
23
+ if (dryRun)
24
+ log.info('DRY RUN mode');
25
+ let completed = 0;
26
+ let failures = 0;
27
+ while (completed < maxSprints) {
28
+ if (isShuttingDown()) {
29
+ log.warn('Shutdown requested — stopping loop');
30
+ break;
31
+ }
32
+ // Check remaining sprints
33
+ let backlog = loadBacklogSafe(cwd, config, log);
34
+ let remaining = backlog ? getRemainingSprintIds(backlog, cwd, config) : [];
35
+ if (remaining.length === 0) {
36
+ log.info('Backlog exhausted — regenerating...');
37
+ if (!regenerateBacklog(cwd, log)) {
38
+ log.warn('Backlog regeneration failed. Stopping.');
39
+ break;
40
+ }
41
+ backlog = loadBacklogSafe(cwd, config, log);
42
+ remaining = backlog ? getRemainingSprintIds(backlog, cwd, config) : [];
43
+ if (remaining.length === 0) {
44
+ log.info('No sprints in regenerated backlog. Nothing to do.');
45
+ break;
46
+ }
47
+ }
48
+ const nextSprint = remaining[0];
49
+ log.info(`── Sprint ${completed + 1}/${maxSprints}: ${nextSprint} ──`);
50
+ try {
51
+ const runFlags = { sprint: nextSprint };
52
+ if (dryRun)
53
+ runFlags['dry-run'] = 'true';
54
+ const result = await runSprint(runFlags, cwd);
55
+ if (result) {
56
+ log.info(`Sprint ${nextSprint} completed successfully`);
57
+ failures = 0;
58
+ }
59
+ else {
60
+ log.warn(`Sprint ${nextSprint} returned no result`);
61
+ failures++;
62
+ }
63
+ }
64
+ catch (err) {
65
+ log.error(`Sprint ${nextSprint} failed: ${err.message}`);
66
+ failures++;
67
+ }
68
+ if (failures >= 3) {
69
+ log.error('3+ consecutive failures — stopping continuous loop for investigation');
70
+ break;
71
+ }
72
+ completed++;
73
+ // Pause between sprints (skip on last or dry-run)
74
+ if (completed < maxSprints && !dryRun && !isShuttingDown()) {
75
+ log.info(`Pausing ${pauseSeconds}s before next sprint...`);
76
+ await sleep(pauseSeconds * 1000);
77
+ }
78
+ }
79
+ log.info('=== Continuous Loop Complete ===');
80
+ log.info(`Sprints attempted: ${completed}`);
81
+ log.info(`Failures: ${failures}`);
82
+ }
83
+ function loadBacklogSafe(cwd, config, log) {
84
+ try {
85
+ return loadBacklog(cwd, config);
86
+ }
87
+ catch {
88
+ log.warn('No backlog found');
89
+ return null;
90
+ }
91
+ }
92
+ function regenerateBacklog(cwd, log) {
93
+ try {
94
+ log.info('Regenerating backlog from scorecard analysis...');
95
+ execSync('pnpm build', { cwd, stdio: 'pipe', timeout: 120_000 });
96
+ execSync('npx tsx slope-loop/analyze-scorecards.ts', { cwd, stdio: 'pipe', timeout: 120_000 });
97
+ log.info('Backlog regenerated');
98
+ return true;
99
+ }
100
+ catch {
101
+ log.error('Backlog regeneration failed');
102
+ return false;
103
+ }
104
+ }
105
+ function sleep(ms) {
106
+ return new Promise(resolve => setTimeout(resolve, ms));
107
+ }
108
+ //# sourceMappingURL=continuous.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continuous.js","sourceRoot":"","sources":["../../../src/cli/loop/continuous.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SprintResult } from './types.js';
2
+ export declare function isShuttingDown(): boolean;
3
+ /**
4
+ * Run a single sprint end-to-end.
5
+ * Main entry point for `slope loop run`.
6
+ */
7
+ export declare function runSprint(flags: Record<string, string>, cwd: string): Promise<SprintResult | null>;
8
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/executor.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAA0D,YAAY,EAAE,MAAM,YAAY,CAAC;AAMvG,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA8LxG"}