@on-par/factory-core 0.9.5-next.1 → 0.9.5-next.10

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 (84) hide show
  1. package/dist/checkers/design-smells.d.ts +1 -0
  2. package/dist/checkers/design-smells.d.ts.map +1 -1
  3. package/dist/checkers/design-smells.js +24 -5
  4. package/dist/checkers/design-smells.js.map +1 -1
  5. package/dist/checkers/index.d.ts +5 -2
  6. package/dist/checkers/index.d.ts.map +1 -1
  7. package/dist/checkers/index.js +1 -1
  8. package/dist/checkers/index.js.map +1 -1
  9. package/dist/daemon/run-worktree.d.ts +5 -1
  10. package/dist/daemon/run-worktree.d.ts.map +1 -1
  11. package/dist/daemon/run-worktree.js +5 -2
  12. package/dist/daemon/run-worktree.js.map +1 -1
  13. package/dist/events/kinds.d.ts +1 -1
  14. package/dist/events/kinds.d.ts.map +1 -1
  15. package/dist/events/kinds.js +2 -0
  16. package/dist/events/kinds.js.map +1 -1
  17. package/dist/internal.d.ts +11 -2
  18. package/dist/internal.d.ts.map +1 -1
  19. package/dist/internal.js +7 -2
  20. package/dist/internal.js.map +1 -1
  21. package/dist/kpis/defects.js +1 -1
  22. package/dist/kpis/defects.js.map +1 -1
  23. package/dist/models/index.d.ts +6 -0
  24. package/dist/models/index.d.ts.map +1 -1
  25. package/dist/models/index.js +25 -0
  26. package/dist/models/index.js.map +1 -1
  27. package/dist/phases/build.d.ts +2 -0
  28. package/dist/phases/build.d.ts.map +1 -1
  29. package/dist/phases/build.js +5 -2
  30. package/dist/phases/build.js.map +1 -1
  31. package/dist/phases/check.d.ts +2 -0
  32. package/dist/phases/check.d.ts.map +1 -1
  33. package/dist/phases/check.js +2 -1
  34. package/dist/phases/check.js.map +1 -1
  35. package/dist/phases/ship-stack.d.ts +6 -0
  36. package/dist/phases/ship-stack.d.ts.map +1 -1
  37. package/dist/phases/ship-stack.js +25 -6
  38. package/dist/phases/ship-stack.js.map +1 -1
  39. package/dist/phases/stack-check-failure.d.ts +42 -0
  40. package/dist/phases/stack-check-failure.d.ts.map +1 -0
  41. package/dist/phases/stack-check-failure.js +47 -0
  42. package/dist/phases/stack-check-failure.js.map +1 -0
  43. package/dist/phases/stack-fallback.d.ts +33 -0
  44. package/dist/phases/stack-fallback.d.ts.map +1 -0
  45. package/dist/phases/stack-fallback.js +47 -0
  46. package/dist/phases/stack-fallback.js.map +1 -0
  47. package/dist/phases/stack-review-change.d.ts +48 -0
  48. package/dist/phases/stack-review-change.d.ts.map +1 -0
  49. package/dist/phases/stack-review-change.js +73 -0
  50. package/dist/phases/stack-review-change.js.map +1 -0
  51. package/dist/queue/github-queue.d.ts +6 -0
  52. package/dist/queue/github-queue.d.ts.map +1 -1
  53. package/dist/queue/github-queue.js.map +1 -1
  54. package/dist/readiness/slice-plan.d.ts +19 -1
  55. package/dist/readiness/slice-plan.d.ts.map +1 -1
  56. package/dist/readiness/slice-plan.js +55 -3
  57. package/dist/readiness/slice-plan.js.map +1 -1
  58. package/dist/review/routing.d.ts +3 -1
  59. package/dist/review/routing.d.ts.map +1 -1
  60. package/dist/review/routing.js +21 -9
  61. package/dist/review/routing.js.map +1 -1
  62. package/dist/router/index.d.ts +5 -0
  63. package/dist/router/index.d.ts.map +1 -1
  64. package/dist/router/index.js +16 -0
  65. package/dist/router/index.js.map +1 -1
  66. package/dist/run/run-issue.d.ts +3 -1
  67. package/dist/run/run-issue.d.ts.map +1 -1
  68. package/dist/run/run-issue.js +3 -0
  69. package/dist/run/run-issue.js.map +1 -1
  70. package/dist/sim/monte-carlo.js +1 -1
  71. package/dist/sim/monte-carlo.js.map +1 -1
  72. package/dist/utils/claude-config.d.ts +18 -1
  73. package/dist/utils/claude-config.d.ts.map +1 -1
  74. package/dist/utils/claude-config.js +48 -3
  75. package/dist/utils/claude-config.js.map +1 -1
  76. package/dist/utils/local-auth-record.d.ts +29 -0
  77. package/dist/utils/local-auth-record.d.ts.map +1 -0
  78. package/dist/utils/local-auth-record.js +92 -0
  79. package/dist/utils/local-auth-record.js.map +1 -0
  80. package/package.json +7 -7
  81. package/dist/daemon/repo-lane.d.ts +0 -5
  82. package/dist/daemon/repo-lane.d.ts.map +0 -1
  83. package/dist/daemon/repo-lane.js +0 -9
  84. package/dist/daemon/repo-lane.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-auth-record.d.ts","sourceRoot":"","sources":["../../src/utils/local-auth-record.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,wCAAwC;IACxC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,CAAC;IACtB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,mBAAwB,GAAG,MAAM,CAE1E;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAInG;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,GAAE,mBAAwB,GAAG,MAAM,CAKrG;AAkBD,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,GAAE,mBAAwB,GAAG,IAAI,CAkBlG;AAED;;;8FAG8F;AAC9F,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,IAAI,GAAE,mBAAwB,GAC7B,gBAAgB,GAAG,IAAI,CAWzB"}
@@ -0,0 +1,92 @@
1
+ // src/utils/local-auth-record.ts — the last run-time local_auth failure per agent (#2733).
2
+ //
3
+ // A refresh token that is present but already used or revoked looks fine on disk, and doctor
4
+ // must not refresh it to find out (that would burn the token). So when a run hits local_auth,
5
+ // the router records "<agent> failed local_auth at <time>" here, and doctor / models --doctor
6
+ // fail that agent while the failure is newer than its credential file's mtime. A new login
7
+ // rewrites the credential file, which clears the failure without touching this record.
8
+ //
9
+ // Machine-level state under ~/.factory/auth (credentials are per machine, not per repo, and
10
+ // doctor can run outside a repo). Stores only the agent name and a timestamp: never a
11
+ // credential value. Every function here never throws.
12
+ import { mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
13
+ import { homedir as osHomedir } from 'node:os';
14
+ import { dirname, join, resolve } from 'node:path';
15
+ import { claudeConfigDirPath } from './claude-config.js';
16
+ /** `~/.factory/auth/local-auth-failures.json`. */
17
+ export function localAuthRecordPath(deps = {}) {
18
+ return join((deps.homedir ?? osHomedir)(), '.factory', 'auth', 'local-auth-failures.json');
19
+ }
20
+ /** Maps a harness id (or provider) to the agent whose login it uses; undefined for others. */
21
+ export function localAuthAgentFor(harnessOrProvider) {
22
+ if (harnessOrProvider === 'claude-cli' || harnessOrProvider === 'anthropic')
23
+ return 'claude';
24
+ if (harnessOrProvider === 'codex-cli')
25
+ return 'codex';
26
+ return undefined;
27
+ }
28
+ /** Credential file whose mtime marks the agent's latest login. */
29
+ export function localAuthCredentialPath(agent, deps = {}) {
30
+ const env = deps.env ?? process.env;
31
+ const home = (deps.homedir ?? osHomedir)();
32
+ if (agent === 'claude')
33
+ return resolve(claudeConfigDirPath(env, home), '.credentials.json');
34
+ return join(env.CODEX_HOME?.trim() || join(home, '.codex'), 'auth.json');
35
+ }
36
+ function readAll(deps) {
37
+ const readFile = deps.readFile ?? ((p) => readFileSync(p, 'utf8'));
38
+ try {
39
+ const parsed = JSON.parse(readFile(localAuthRecordPath(deps)));
40
+ if (typeof parsed !== 'object' || parsed === null)
41
+ return {};
42
+ const out = {};
43
+ for (const agent of ['claude', 'codex']) {
44
+ const at = parsed[agent]?.at;
45
+ if (typeof at === 'string' && Number.isFinite(Date.parse(at)))
46
+ out[agent] = { agent, at };
47
+ }
48
+ return out;
49
+ }
50
+ catch {
51
+ return {};
52
+ }
53
+ }
54
+ /** Records that `agent` just failed local_auth. Best effort; never throws. */
55
+ export function recordLocalAuthFailure(agent, deps = {}) {
56
+ const now = deps.now ?? Date.now;
57
+ const path = localAuthRecordPath(deps);
58
+ const write = deps.writeFile ??
59
+ ((p, text) => {
60
+ mkdirSync(dirname(p), { recursive: true });
61
+ const tmp = `${p}.${process.pid}.tmp`;
62
+ writeFileSync(tmp, text, { mode: 0o600 });
63
+ renameSync(tmp, p);
64
+ });
65
+ try {
66
+ const all = readAll(deps);
67
+ all[agent] = { agent, at: new Date(now()).toISOString() };
68
+ write(path, `${JSON.stringify(all, null, 2)}\n`);
69
+ }
70
+ catch {
71
+ // bookkeeping only: never fail a run over it
72
+ }
73
+ }
74
+ /** The recorded local_auth failure for `agent` when it is newer than the agent's credential
75
+ * file mtime (no login since), else null. With no credential file (macOS keychain storage,
76
+ * env-token auth) nothing dates the latest login, and a re-login would never clear the
77
+ * failure, so it is not reported (null) rather than failing doctor forever. Never throws. */
78
+ export function localAuthFailureSinceLogin(agent, deps = {}) {
79
+ const failure = readAll(deps)[agent];
80
+ if (!failure)
81
+ return null;
82
+ const mtimeMs = deps.mtimeMs ?? ((p) => statSync(p).mtimeMs);
83
+ let loginAt;
84
+ try {
85
+ loginAt = mtimeMs(localAuthCredentialPath(agent, deps));
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ return Date.parse(failure.at) > loginAt ? failure : null;
91
+ }
92
+ //# sourceMappingURL=local-auth-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-auth-record.js","sourceRoot":"","sources":["../../src/utils/local-auth-record.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@on-par/factory-core",
3
- "version": "0.9.5-next.1",
3
+ "version": "0.9.5-next.10",
4
4
  "description": "Core engine: model router, constitutions, checkers, and pipeline phases for the Software Factory.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -54,18 +54,18 @@
54
54
  "prepack": "node ../../scripts/pack-hygiene-cli.ts prepack"
55
55
  },
56
56
  "dependencies": {
57
- "@on-par/adr-kit": "0.9.5-next.1",
58
- "@on-par/contracts": "0.9.5-next.1",
59
- "@on-par/factory-config": "0.9.5-next.1",
60
- "@on-par/repo-context": "0.9.5-next.1",
57
+ "@on-par/adr-kit": "0.9.5-next.10",
58
+ "@on-par/contracts": "0.9.5-next.10",
59
+ "@on-par/factory-config": "0.9.5-next.10",
60
+ "@on-par/repo-context": "0.9.5-next.10",
61
61
  "@octokit/rest": "^22.0.0",
62
- "execa": "^10.0.1",
62
+ "execa": "^10.1.0",
63
63
  "gray-matter": "^4.0.3",
64
64
  "yaml": "^2.9.0",
65
65
  "zod": "^4.6.5"
66
66
  },
67
67
  "license": "MIT",
68
68
  "devDependencies": {
69
- "@types/node": "^26.6.4"
69
+ "@types/node": "^26.6.5"
70
70
  }
71
71
  }
@@ -1,5 +0,0 @@
1
- import type { RepoSlug } from '../types/index.js';
2
- /** Render a repo slug and lane id as the canonical flat form `owner/name#laneId`,
3
- * e.g. renderRepoLane('owner/example-app', 'lane-2') === 'owner/example-app#lane-2'. */
4
- export declare function renderRepoLane(repo: RepoSlug, laneId: string): string;
5
- //# sourceMappingURL=repo-lane.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo-lane.d.ts","sourceRoot":"","sources":["../../src/daemon/repo-lane.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;yFACyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -1,9 +0,0 @@
1
- // src/daemon/repo-lane.ts — Canonical rendering of a (repo, lane) pair as the
2
- // flat string `owner/name#laneId`. Pure formatter, no I/O; not wired into any
3
- // event/log/URL/SSE path (#969).
4
- /** Render a repo slug and lane id as the canonical flat form `owner/name#laneId`,
5
- * e.g. renderRepoLane('owner/example-app', 'lane-2') === 'owner/example-app#lane-2'. */
6
- export function renderRepoLane(repo, laneId) {
7
- return `${repo}#${laneId}`;
8
- }
9
- //# sourceMappingURL=repo-lane.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repo-lane.js","sourceRoot":"","sources":["../../src/daemon/repo-lane.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,iCAAiC;AAIjC;yFACyF;AACzF,MAAM,UAAU,cAAc,CAAC,IAAc,EAAE,MAAc;IAC3D,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AAC7B,CAAC"}