@magnusekdahl/parallix 1.3.1 → 1.3.2

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 (63) hide show
  1. package/README.md +4 -2
  2. package/config/integration-pipelines.json +5 -0
  3. package/docs/adr/0048-fail-closed-harness-defense-against-agent-hallucinations.md +161 -0
  4. package/docs/adr/index.md +2 -0
  5. package/docs/authority-reference.md +8 -5
  6. package/lib/agents/agents.js +3 -1
  7. package/lib/agents/agents.ts +3 -1
  8. package/lib/agents/claude.js +3 -1
  9. package/lib/agents/claude.ts +3 -1
  10. package/lib/agents/codex.js +3 -1
  11. package/lib/agents/codex.ts +3 -1
  12. package/lib/agents/opencode.js +5 -3
  13. package/lib/agents/opencode.ts +5 -3
  14. package/lib/commands/active.js +21 -3
  15. package/lib/commands/active.ts +7 -2
  16. package/lib/commands/config.js +6 -1
  17. package/lib/commands/config.ts +6 -1
  18. package/lib/commands/coverage-gate.js +19 -1
  19. package/lib/commands/coverage-gate.ts +6 -1
  20. package/lib/commands/diff.js +6 -1
  21. package/lib/commands/diff.ts +6 -1
  22. package/lib/commands/draft.js +31 -1
  23. package/lib/commands/draft.ts +6 -1
  24. package/lib/commands/handoff.js +12 -1
  25. package/lib/commands/handoff.ts +6 -1
  26. package/lib/commands/integrate.js +103 -27
  27. package/lib/commands/integrate.ts +67 -31
  28. package/lib/commands/mission-start.js +12 -3
  29. package/lib/commands/mission-start.ts +7 -2
  30. package/lib/commands/rebase.js +10 -2
  31. package/lib/commands/rebase.ts +6 -2
  32. package/lib/commands/repair-handoff.js +13 -3
  33. package/lib/commands/repair-handoff.ts +7 -2
  34. package/lib/commands/resolve-conflict.js +8 -2
  35. package/lib/commands/resolve-conflict.ts +7 -2
  36. package/lib/commands/review.js +6 -1
  37. package/lib/commands/review.ts +6 -1
  38. package/lib/commands/setup-review.js +8 -3
  39. package/lib/commands/setup-review.ts +8 -3
  40. package/lib/commands/setup.js +8 -2
  41. package/lib/commands/setup.ts +7 -2
  42. package/lib/commands/stats-backfill.js +14 -3
  43. package/lib/commands/stats-backfill.ts +7 -2
  44. package/lib/commands/stats.js +33 -1
  45. package/lib/commands/stats.ts +7 -2
  46. package/lib/commands/status.js +8 -1
  47. package/lib/commands/status.ts +6 -1
  48. package/lib/commands/verify.js +11 -2
  49. package/lib/commands/verify.ts +7 -2
  50. package/lib/core/gitignore.js +9 -1
  51. package/lib/core/gitignore.ts +6 -1
  52. package/lib/core/persistent-data-migration.js +4 -2
  53. package/lib/core/persistent-data-migration.ts +4 -2
  54. package/lib/index.js +36 -36
  55. package/lib/index.ts +18 -18
  56. package/lib/review/review-loop.js +12 -7
  57. package/lib/review/review-loop.ts +10 -7
  58. package/lib/review/review.js +51 -1
  59. package/lib/review/review.ts +6 -1
  60. package/lib/tools/setup-review.js +7 -4
  61. package/lib/tools/setup-review.ts +2 -2
  62. package/package.json +1 -1
  63. package/px.js +26 -14
@@ -9,22 +9,68 @@
9
9
  * - review-artifacts.ts (artifact handling and posting)
10
10
  * - review-polling.ts (polling utilities)
11
11
  */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.ReviewState = exports.reviewStateFile = exports.importLegacyHandler = exports.createEventHandler = exports.closeMissionPr = exports.submitReviewRound = exports.commentRound = exports.showReviewStatus = exports.pushRound = exports.readComments = exports.submitForReview = exports.verifyReview = exports.performStaticReview = exports.postStaticReviewComment = exports.formatStaticReviewSuccess = exports.formatStaticReviewFindings = exports.readTextFlag = exports.flagValue = exports.startReviewLoop = exports.persistNormalizedPhaseRepair = exports.applyAgentFallback = exports.rebaseBeforeReviewRound = exports.commitSafeMissionArtifacts = exports.maybeUpdateGraphifyBeforeReview = exports.recordStageStatsSafe = exports.consumeImplementerArtifacts = exports.consumeReviewerArtifacts = exports.postWorkflowReview = exports.postWorkflowComment = exports.normalizeDisposition = exports.normalizeReviewVerdict = exports.deleteArtifactFile = exports.readArtifactFile = exports.reviewArtifactPath = exports.buildMetadataFooter = exports.pollForDisposition = exports.pollForReview = exports.isPollTimeout = exports.formatElapsed = exports.resolvePollTimeoutMs = exports.resolvePollIntervalMs = exports.delay = exports.POLL_TIMEOUT = exports.review = void 0;
12
14
  // Import from review-polling module
13
15
  const review_polling_js_1 = require("./review-polling.js");
16
+ Object.defineProperty(exports, "POLL_TIMEOUT", { enumerable: true, get: function () { return review_polling_js_1.POLL_TIMEOUT; } });
17
+ Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return review_polling_js_1.delay; } });
18
+ Object.defineProperty(exports, "resolvePollIntervalMs", { enumerable: true, get: function () { return review_polling_js_1.resolvePollIntervalMs; } });
19
+ Object.defineProperty(exports, "resolvePollTimeoutMs", { enumerable: true, get: function () { return review_polling_js_1.resolvePollTimeoutMs; } });
20
+ Object.defineProperty(exports, "formatElapsed", { enumerable: true, get: function () { return review_polling_js_1.formatElapsed; } });
21
+ Object.defineProperty(exports, "isPollTimeout", { enumerable: true, get: function () { return review_polling_js_1.isPollTimeout; } });
22
+ Object.defineProperty(exports, "pollForReview", { enumerable: true, get: function () { return review_polling_js_1.pollForReview; } });
23
+ Object.defineProperty(exports, "pollForDisposition", { enumerable: true, get: function () { return review_polling_js_1.pollForDisposition; } });
14
24
  // Import from review-artifacts module
15
25
  const review_artifacts_js_1 = require("./review-artifacts.js");
26
+ Object.defineProperty(exports, "buildMetadataFooter", { enumerable: true, get: function () { return review_artifacts_js_1.buildMetadataFooter; } });
27
+ Object.defineProperty(exports, "reviewArtifactPath", { enumerable: true, get: function () { return review_artifacts_js_1.reviewArtifactPath; } });
28
+ Object.defineProperty(exports, "readArtifactFile", { enumerable: true, get: function () { return review_artifacts_js_1.readArtifactFile; } });
29
+ Object.defineProperty(exports, "deleteArtifactFile", { enumerable: true, get: function () { return review_artifacts_js_1.deleteArtifactFile; } });
30
+ Object.defineProperty(exports, "normalizeReviewVerdict", { enumerable: true, get: function () { return review_artifacts_js_1.normalizeReviewVerdict; } });
31
+ Object.defineProperty(exports, "normalizeDisposition", { enumerable: true, get: function () { return review_artifacts_js_1.normalizeDisposition; } });
32
+ Object.defineProperty(exports, "postWorkflowComment", { enumerable: true, get: function () { return review_artifacts_js_1.postWorkflowComment; } });
33
+ Object.defineProperty(exports, "postWorkflowReview", { enumerable: true, get: function () { return review_artifacts_js_1.postWorkflowReview; } });
34
+ Object.defineProperty(exports, "consumeReviewerArtifacts", { enumerable: true, get: function () { return review_artifacts_js_1.consumeReviewerArtifacts; } });
35
+ Object.defineProperty(exports, "consumeImplementerArtifacts", { enumerable: true, get: function () { return review_artifacts_js_1.consumeImplementerArtifacts; } });
16
36
  // Import from review-loop module
17
37
  const review_loop_js_1 = require("./review-loop.js");
38
+ Object.defineProperty(exports, "maybeUpdateGraphifyBeforeReview", { enumerable: true, get: function () { return review_loop_js_1.maybeUpdateGraphifyBeforeReview; } });
39
+ Object.defineProperty(exports, "commitSafeMissionArtifacts", { enumerable: true, get: function () { return review_loop_js_1.commitSafeMissionArtifacts; } });
40
+ Object.defineProperty(exports, "rebaseBeforeReviewRound", { enumerable: true, get: function () { return review_loop_js_1.rebaseBeforeReviewRound; } });
41
+ Object.defineProperty(exports, "applyAgentFallback", { enumerable: true, get: function () { return review_loop_js_1.applyAgentFallback; } });
42
+ Object.defineProperty(exports, "persistNormalizedPhaseRepair", { enumerable: true, get: function () { return review_loop_js_1.persistNormalizedPhaseRepair; } });
43
+ Object.defineProperty(exports, "startReviewLoop", { enumerable: true, get: function () { return review_loop_js_1.startReviewLoop; } });
44
+ Object.defineProperty(exports, "recordStageStatsSafe", { enumerable: true, get: function () { return review_loop_js_1.recordStageStatsSafe; } });
18
45
  // Import from review-commands module
19
46
  const review_commands_js_1 = require("./review-commands.js");
47
+ Object.defineProperty(exports, "flagValue", { enumerable: true, get: function () { return review_commands_js_1.flagValue; } });
48
+ Object.defineProperty(exports, "readTextFlag", { enumerable: true, get: function () { return review_commands_js_1.readTextFlag; } });
49
+ Object.defineProperty(exports, "formatStaticReviewFindings", { enumerable: true, get: function () { return review_commands_js_1.formatStaticReviewFindings; } });
50
+ Object.defineProperty(exports, "formatStaticReviewSuccess", { enumerable: true, get: function () { return review_commands_js_1.formatStaticReviewSuccess; } });
51
+ Object.defineProperty(exports, "postStaticReviewComment", { enumerable: true, get: function () { return review_commands_js_1.postStaticReviewComment; } });
52
+ Object.defineProperty(exports, "performStaticReview", { enumerable: true, get: function () { return review_commands_js_1.performStaticReview; } });
53
+ Object.defineProperty(exports, "verifyReview", { enumerable: true, get: function () { return review_commands_js_1.verifyReview; } });
54
+ Object.defineProperty(exports, "submitForReview", { enumerable: true, get: function () { return review_commands_js_1.submitForReview; } });
55
+ Object.defineProperty(exports, "readComments", { enumerable: true, get: function () { return review_commands_js_1.readComments; } });
56
+ Object.defineProperty(exports, "pushRound", { enumerable: true, get: function () { return review_commands_js_1.pushRound; } });
57
+ Object.defineProperty(exports, "showReviewStatus", { enumerable: true, get: function () { return review_commands_js_1.showReviewStatus; } });
58
+ Object.defineProperty(exports, "commentRound", { enumerable: true, get: function () { return review_commands_js_1.commentRound; } });
59
+ Object.defineProperty(exports, "submitReviewRound", { enumerable: true, get: function () { return review_commands_js_1.submitReviewRound; } });
60
+ Object.defineProperty(exports, "closeMissionPr", { enumerable: true, get: function () { return review_commands_js_1.closeMissionPr; } });
61
+ Object.defineProperty(exports, "createEventHandler", { enumerable: true, get: function () { return review_commands_js_1.createEventHandler; } });
62
+ Object.defineProperty(exports, "importLegacyHandler", { enumerable: true, get: function () { return review_commands_js_1.importLegacyHandler; } });
20
63
  // Import from review-state module
21
64
  const review_state_js_1 = require("./review-state.js");
65
+ Object.defineProperty(exports, "reviewStateFile", { enumerable: true, get: function () { return review_state_js_1.reviewStateFile; } });
66
+ Object.defineProperty(exports, "ReviewState", { enumerable: true, get: function () { return review_state_js_1.ReviewState; } });
22
67
  // ============================================================================
23
68
  // Module Exports
24
69
  // ============================================================================
25
70
  // Set the module exports to the main review function (for backward compatibility)
26
71
  // then add all other exports as properties
27
72
  const _review = review_commands_js_1.review;
73
+ exports.review = _review;
28
74
  // From review-polling
29
75
  _review.POLL_TIMEOUT = review_polling_js_1.POLL_TIMEOUT;
30
76
  _review.delay = review_polling_js_1.delay;
@@ -73,4 +119,8 @@ _review.importLegacyHandler = review_commands_js_1.importLegacyHandler;
73
119
  // From review-state
74
120
  _review.reviewStateFile = review_state_js_1.reviewStateFile;
75
121
  _review.ReviewState = review_state_js_1.ReviewState;
76
- module.exports = _review;
122
+ // Export the review function as the module exports (CJS-compatible)
123
+ exports.default = _review;
124
+ if (typeof module !== 'undefined') {
125
+ module.exports = _review;
126
+ }
@@ -135,4 +135,9 @@ _review.reviewStateFile = reviewStateFile;
135
135
  _review.ReviewState = ReviewState;
136
136
 
137
137
  // Export the review function as the module exports (CJS-compatible)
138
- export = _review;
138
+ export default _review;
139
+ export { _review as review, POLL_TIMEOUT, delay, resolvePollIntervalMs, resolvePollTimeoutMs, formatElapsed, isPollTimeout, pollForReview, pollForDisposition, buildMetadataFooter, reviewArtifactPath, readArtifactFile, deleteArtifactFile, normalizeReviewVerdict, normalizeDisposition, postWorkflowComment, postWorkflowReview, consumeReviewerArtifacts, consumeImplementerArtifacts, recordStageStatsSafe, maybeUpdateGraphifyBeforeReview, commitSafeMissionArtifacts, rebaseBeforeReviewRound, applyAgentFallback, persistNormalizedPhaseRepair, startReviewLoop, flagValue, readTextFlag, formatStaticReviewFindings, formatStaticReviewSuccess, postStaticReviewComment, performStaticReview, verifyReview, submitForReview, readComments, pushRound, showReviewStatus, commentRound, submitReviewRound, closeMissionPr, createEventHandler, importLegacyHandler, reviewStateFile, ReviewState };
140
+
141
+ // CJS compat: ensure require() returns the function directly
142
+ declare const module: { exports: any } | undefined;
143
+ if (typeof module !== 'undefined') { module.exports = _review; }
@@ -32,6 +32,9 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.standardLayoutDescription = standardLayoutDescription;
37
40
  exports.suggestedForgejoUsers = suggestedForgejoUsers;
@@ -61,14 +64,14 @@ exports.buildNonInteractiveAnswers = buildNonInteractiveAnswers;
61
64
  const fs = __importStar(require("fs"));
62
65
  const path = __importStar(require("path"));
63
66
  const readline = __importStar(require("readline"));
64
- const _cp = require("child_process");
65
- const { spawnSync } = _cp;
67
+ const child_process_1 = __importDefault(require("child_process"));
68
+ const { spawnSync } = child_process_1.default;
66
69
  const fmt = __importStar(require("../core/fmt"));
67
70
  const agents_1 = require("../agents/agents");
68
71
  const product_config_1 = require("../core/product-config");
69
72
  const forgejo_1 = require("./forgejo");
70
73
  const product_config_2 = require("../core/product-config");
71
- const ensureWorkflowGitignore = require("../core/gitignore");
74
+ const gitignore_js_1 = __importDefault(require("../core/gitignore.js"));
72
75
  let tokenNameCounter = 0;
73
76
  const REVIEW_TOKEN_SCOPES = ['write:user', 'write:repository', 'write:issue', 'write:organization'];
74
77
  const PASSWORD_PROMPT_OPTIONS = { hidden: false };
@@ -1036,7 +1039,7 @@ async function setupWizard(_args, options = {}) {
1036
1039
  : await collectWizardAnswers(rootDir, { ...options, promptFn, log });
1037
1040
  const configPath = writeWorkflowConfig(rootDir, buildWorkflowConfig(answers));
1038
1041
  log(fmt.status('PASS', `Wrote ${configPath}`));
1039
- const gitignoreResult = ensureWorkflowGitignore(rootDir, { logFn: log });
1042
+ const gitignoreResult = (0, gitignore_js_1.default)(rootDir, { logFn: log });
1040
1043
  if (gitignoreResult.created) {
1041
1044
  log(fmt.status('PASS', `Created .gitignore with ${gitignoreResult.appended} workflow entries in ${fmt.path(rootDir)}`));
1042
1045
  }
@@ -1,7 +1,7 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import * as readline from 'readline';
4
- import _cp = require('child_process');
4
+ import _cp from 'child_process';
5
5
  const { spawnSync } = _cp;
6
6
  import * as fmt from '../core/fmt';
7
7
  import { eligibleAgentsForStep } from '../agents/agents';
@@ -12,7 +12,7 @@ import {
12
12
  reviewRemoteUrl,
13
13
  } from './forgejo';
14
14
  import { loadWorkflowConfig } from '../core/product-config';
15
- import ensureWorkflowGitignore = require('../core/gitignore');
15
+ import ensureWorkflowGitignore from '../core/gitignore.js';
16
16
 
17
17
  let tokenNameCounter = 0;
18
18
  const REVIEW_TOKEN_SCOPES = ['write:user', 'write:repository', 'write:issue', 'write:organization'];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magnusekdahl/parallix",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "AI mission workflow toolkit with a px CLI — local-first, human-in-the-loop multi-agent development",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "private": false,
package/px.js CHANGED
@@ -46,10 +46,20 @@ exports.run = run;
46
46
  const node_fs_1 = __importDefault(require("node:fs"));
47
47
  const node_path_1 = __importDefault(require("node:path"));
48
48
  const fmt = __importStar(require("./lib/core/fmt.js"));
49
- const missionStart = require("./lib/commands/mission-start.js");
50
- const review_events_js_1 = require("./lib/review/review-events.js");
51
- const workflow = __importStar(require("./index.js"));
52
- const package_json_1 = __importDefault(require("./package.json"));
49
+ const node_module_1 = require("node:module");
50
+ function resolveRuntimePath() {
51
+ if (typeof __filename === 'string' && __filename) {
52
+ return __filename;
53
+ }
54
+ if (typeof process.argv[1] === 'string' && node_path_1.default.isAbsolute(process.argv[1])) {
55
+ return process.argv[1];
56
+ }
57
+ return node_path_1.default.resolve(process.cwd(), 'px.js');
58
+ }
59
+ const runtimePath = resolveRuntimePath();
60
+ const _require = (0, node_module_1.createRequire)(runtimePath);
61
+ const packageJson = _require('./package.json');
62
+ const runtimeDir = node_path_1.default.dirname(runtimePath);
53
63
  function parseArgs(argv, baseCwd = process.cwd()) {
54
64
  const args = [...argv];
55
65
  if (args[0] === '--version' || args[0] === '-v') {
@@ -108,10 +118,10 @@ function shellInit(shell = 'bash') {
108
118
  }
109
119
  function versionInfo() {
110
120
  return {
111
- name: package_json_1.default.name,
112
- version: package_json_1.default.version,
113
- pxPath: __filename,
114
- packageRoot: __dirname,
121
+ name: packageJson.name,
122
+ version: packageJson.version,
123
+ pxPath: runtimePath,
124
+ packageRoot: runtimeDir,
115
125
  node: process.version,
116
126
  };
117
127
  }
@@ -205,11 +215,15 @@ async function run(argv = process.argv.slice(2), options = {}) {
205
215
  return 0;
206
216
  }
207
217
  const previousCwd = process.cwd();
208
- process.chdir(parsed.target);
209
218
  try {
219
+ const missionStartModule = _require('./lib/commands/mission-start.js');
220
+ const missionStart = missionStartModule.default || missionStartModule;
221
+ const { createEvent } = _require('./lib/review/review-events.js');
222
+ const workflow = _require('./index.js');
223
+ process.chdir(parsed.target);
210
224
  if (parsed.command === 'review-event') {
211
225
  const eventArgs = parseReviewEventArgs(parsed.args);
212
- const result = (0, review_events_js_1.createEvent)(eventArgs.slug, eventArgs.type || '', {
226
+ const result = createEvent(eventArgs.slug, eventArgs.type || '', {
213
227
  actor: eventArgs.actor || '',
214
228
  content: eventArgs.content,
215
229
  timestamp: eventArgs.timestamp || undefined,
@@ -245,8 +259,6 @@ async function run(argv = process.argv.slice(2), options = {}) {
245
259
  process.chdir(previousCwd);
246
260
  }
247
261
  }
248
- if (typeof require !== 'undefined' && require.main === module) {
249
- run().then(code => {
250
- process.exitCode = code;
251
- });
262
+ if (typeof require === 'undefined' || require.main === module) {
263
+ run().then(code => { process.exitCode = code; });
252
264
  }