@coreframe/scripts 0.1.49 → 0.1.50
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.
- package/dist/coreframe.d.ts +233 -41
- package/dist/coreframe.js +13 -2
- package/package.json +16 -30
- package/dist/_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js +0 -1
- package/dist/assets/contracts.d.ts +0 -187
- package/dist/assets/contracts.js +0 -1
- package/dist/assets/credentials.d.ts +0 -35
- package/dist/assets/credentials.js +0 -1
- package/dist/assets/images.d.ts +0 -32
- package/dist/assets/images.js +0 -1
- package/dist/assets/media.d.ts +0 -42
- package/dist/assets/media.js +0 -1
- package/dist/assets/project.d.ts +0 -54
- package/dist/assets/project.js +0 -3
- package/dist/assets/storage.d.ts +0 -60
- package/dist/assets/storage.js +0 -1
- package/dist/assets/workflows.d.ts +0 -69
- package/dist/assets/workflows.js +0 -1
- package/dist/assets.d.ts +0 -4
- package/dist/assets.js +0 -1
- package/dist/config.d.ts +0 -49
- package/dist/config.js +0 -1
- package/dist/db/apply-seed.d.ts +0 -8
- package/dist/db/apply-seed.js +0 -1
- package/dist/db/client.d.ts +0 -30
- package/dist/db/client.js +0 -1
- package/dist/db/config.d.ts +0 -24
- package/dist/db/config.js +0 -1
- package/dist/db/drizzle-kit.d.ts +0 -10
- package/dist/db/drizzle-kit.js +0 -2
- package/dist/db/ensure.d.ts +0 -9
- package/dist/db/ensure.js +0 -2
- package/dist/db/error.d.ts +0 -4
- package/dist/db/error.js +0 -1
- package/dist/db/local-postgres.d.ts +0 -65
- package/dist/db/local-postgres.js +0 -1
- package/dist/db/migrate-held.d.ts +0 -16
- package/dist/db/migrate-held.js +0 -10
- package/dist/db/migrate.d.ts +0 -9
- package/dist/db/migrate.js +0 -2
- package/dist/db/project.d.ts +0 -23
- package/dist/db/project.js +0 -1
- package/dist/db/reset.d.ts +0 -9
- package/dist/db/reset.js +0 -2
- package/dist/db/schema-check.d.ts +0 -11
- package/dist/db/schema-check.js +0 -2
- package/dist/db/schema-push.d.ts +0 -22
- package/dist/db/schema-push.js +0 -1
- package/dist/db/seed.d.ts +0 -19
- package/dist/db/seed.js +0 -2
- package/dist/db/setup.d.ts +0 -11
- package/dist/db/setup.js +0 -2
- package/dist/deploy/access-token-secret.d.ts +0 -39
- package/dist/deploy/access-token-secret.js +0 -1
- package/dist/deploy/check-migrations.d.ts +0 -4
- package/dist/deploy/check-migrations.js +0 -2
- package/dist/deploy/checks.d.ts +0 -8
- package/dist/deploy/checks.js +0 -1
- package/dist/deploy/config.d.ts +0 -68
- package/dist/deploy/config.js +0 -1
- package/dist/deploy/migrations.d.ts +0 -24
- package/dist/deploy/migrations.js +0 -4
- package/dist/deploy/pending-migrations.d.ts +0 -9
- package/dist/deploy/pending-migrations.js +0 -1
- package/dist/deploy/tauri-release.d.ts +0 -106
- package/dist/deploy/tauri-release.js +0 -1
- package/dist/deploy/version.d.ts +0 -24
- package/dist/deploy/version.js +0 -1
- package/dist/deploy.d.ts +0 -21
- package/dist/deploy.js +0 -3
- package/dist/dev-device.d.ts +0 -34
- package/dist/dev-device.js +0 -1
- package/dist/dev-https.d.ts +0 -17
- package/dist/dev-https.js +0 -1
- package/dist/dev-lock.d.ts +0 -28
- package/dist/dev-lock.js +0 -1
- package/dist/dev-timing.d.ts +0 -25
- package/dist/dev-timing.js +0 -1
- package/dist/dev.d.ts +0 -39
- package/dist/dev.js +0 -3
- package/dist/environment.d.ts +0 -27
- package/dist/environment.js +0 -1
- package/dist/i18n/catalogs.d.ts +0 -60
- package/dist/i18n/catalogs.js +0 -1
- package/dist/i18n/contracts.d.ts +0 -60
- package/dist/i18n/contracts.js +0 -1
- package/dist/i18n/paths.d.ts +0 -12
- package/dist/i18n/paths.js +0 -1
- package/dist/i18n/storage.d.ts +0 -117
- package/dist/i18n/storage.js +0 -1
- package/dist/i18n/workflows.d.ts +0 -46
- package/dist/i18n/workflows.js +0 -1
- package/dist/managed-dev-protocol.d.ts +0 -135
- package/dist/managed-dev-protocol.js +0 -1
- package/dist/managed-dev.d.ts +0 -48
- package/dist/managed-dev.js +0 -5
- package/dist/private-object-store.d.ts +0 -28
- package/dist/private-object-store.js +0 -1
- package/dist/project.d.ts +0 -5
- package/dist/project.js +0 -1
- package/dist/recipes/apply.d.ts +0 -26
- package/dist/recipes/apply.js +0 -2
- package/dist/recipes/list.d.ts +0 -14
- package/dist/recipes/list.js +0 -1
- package/dist/recipes/manifest.d.ts +0 -14
- package/dist/recipes/manifest.js +0 -1
- package/dist/recipes/source.d.ts +0 -22
- package/dist/recipes/source.js +0 -1
- package/dist/runner.d.ts +0 -20
- package/dist/runner.js +0 -1
- package/dist/staging.d.ts +0 -33
- package/dist/staging.js +0 -3
- package/dist/tauri-dev-output.d.ts +0 -21
- package/dist/tauri-dev-output.js +0 -2
- package/dist/typecheck.d.ts +0 -4
- package/dist/typecheck.js +0 -2
- package/dist/upgrade/check-skill-current.d.ts +0 -11
- package/dist/upgrade/check-skill-current.js +0 -2
- package/dist/upgrade/ensure-template-remote.d.ts +0 -13
- package/dist/upgrade/ensure-template-remote.js +0 -2
- package/dist/upgrade/fast-forward-template-files.d.ts +0 -9
- package/dist/upgrade/fast-forward-template-files.js +0 -2
- package/dist/upgrade/sync-coreframe-packages.d.ts +0 -8
- package/dist/upgrade/sync-coreframe-packages.js +0 -4
- package/dist/upgrade/template-ref.d.ts +0 -6
- package/dist/upgrade/template-ref.js +0 -1
- package/dist/user-preferences.d.ts +0 -8
- package/dist/user-preferences.js +0 -1
- package/dist/worker-environment.d.ts +0 -95
- package/dist/worker-environment.js +0 -1
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
//#region managed-dev-protocol.d.ts
|
|
2
|
-
declare const managedDevEnv = "COREFRAME_MANAGED_DEV";
|
|
3
|
-
declare const managedDevEvents: {
|
|
4
|
-
readonly action: "coreframe:managed-dev:action";
|
|
5
|
-
readonly actionResult: "coreframe:managed-dev:action-result";
|
|
6
|
-
readonly codex: "coreframe:managed-dev:codex";
|
|
7
|
-
readonly status: "coreframe:managed-dev:status";
|
|
8
|
-
readonly statusRequest: "coreframe:managed-dev:status-request";
|
|
9
|
-
};
|
|
10
|
-
type ManagedDevTarget = {
|
|
11
|
-
commit: string;
|
|
12
|
-
shortCommit: string;
|
|
13
|
-
source: "dev" | "upstream";
|
|
14
|
-
subject: string;
|
|
15
|
-
};
|
|
16
|
-
type ManagedDevDraft = {
|
|
17
|
-
fingerprint: string;
|
|
18
|
-
tracked: boolean;
|
|
19
|
-
untracked: string[];
|
|
20
|
-
};
|
|
21
|
-
type ManagedDevCheck = {
|
|
22
|
-
command: "pnpm test" | "pnpm typecheck";
|
|
23
|
-
dismissed?: boolean;
|
|
24
|
-
failureId?: string;
|
|
25
|
-
output?: string;
|
|
26
|
-
status: "failed" | "passed" | "pending" | "running";
|
|
27
|
-
};
|
|
28
|
-
type ManagedDevCheckTrigger = "database-recovery" | "dependency-recovery" | "synchronization";
|
|
29
|
-
type ManagedDevChecks = {
|
|
30
|
-
commit: string;
|
|
31
|
-
commands: ManagedDevCheck[];
|
|
32
|
-
trigger: ManagedDevCheckTrigger;
|
|
33
|
-
};
|
|
34
|
-
type ManagedDevSetupFailure = {
|
|
35
|
-
command: "pnpm db migrate" | "pnpm db setup" | "pnpm install --frozen-lockfile";
|
|
36
|
-
commit: string;
|
|
37
|
-
message: string;
|
|
38
|
-
output: string;
|
|
39
|
-
restartRequired: boolean;
|
|
40
|
-
stage: "dependencies" | "migration";
|
|
41
|
-
};
|
|
42
|
-
type ManagedDevStatus = {
|
|
43
|
-
busy?: string;
|
|
44
|
-
checks?: ManagedDevChecks;
|
|
45
|
-
codexCompletion?: ManagedDevCodexCompletion;
|
|
46
|
-
currentCommit?: string;
|
|
47
|
-
draft?: ManagedDevDraft;
|
|
48
|
-
message?: string;
|
|
49
|
-
mode: "error" | "managed" | "unmanaged" | "waiting";
|
|
50
|
-
proposal?: string;
|
|
51
|
-
setupFailure?: ManagedDevSetupFailure;
|
|
52
|
-
target?: ManagedDevTarget;
|
|
53
|
-
warnings: string[];
|
|
54
|
-
};
|
|
55
|
-
type ManagedDevAction = {
|
|
56
|
-
id: string;
|
|
57
|
-
type: "acknowledge-codex";
|
|
58
|
-
} | {
|
|
59
|
-
failureId: string;
|
|
60
|
-
type: "dismiss-check";
|
|
61
|
-
} | {
|
|
62
|
-
type: "apply";
|
|
63
|
-
fingerprint?: string;
|
|
64
|
-
message?: string;
|
|
65
|
-
target: string;
|
|
66
|
-
untracked?: string[];
|
|
67
|
-
} | {
|
|
68
|
-
type: "commit";
|
|
69
|
-
fingerprint: string;
|
|
70
|
-
message: string;
|
|
71
|
-
untracked: string[];
|
|
72
|
-
} | {
|
|
73
|
-
type: "message";
|
|
74
|
-
fingerprint: string;
|
|
75
|
-
untracked: string[];
|
|
76
|
-
} | {
|
|
77
|
-
type: "prepare";
|
|
78
|
-
target: string;
|
|
79
|
-
} | {
|
|
80
|
-
type: "reject";
|
|
81
|
-
} | {
|
|
82
|
-
type: "reset-database";
|
|
83
|
-
} | {
|
|
84
|
-
type: "retry-install";
|
|
85
|
-
};
|
|
86
|
-
type ManagedDevActionResult = {
|
|
87
|
-
status: ManagedDevStatus;
|
|
88
|
-
};
|
|
89
|
-
type ManagedDevCodexMessage = {
|
|
90
|
-
kind: "agent" | "thought" | "user";
|
|
91
|
-
text: string;
|
|
92
|
-
};
|
|
93
|
-
type ManagedDevRebasedCommit = {
|
|
94
|
-
commit: string;
|
|
95
|
-
shortCommit: string;
|
|
96
|
-
subject: string;
|
|
97
|
-
};
|
|
98
|
-
type ManagedDevCodexCompletion = {
|
|
99
|
-
commits?: ManagedDevRebasedCommit[];
|
|
100
|
-
finalMessage: string;
|
|
101
|
-
id: string;
|
|
102
|
-
messages: ManagedDevCodexMessage[];
|
|
103
|
-
};
|
|
104
|
-
type ManagedDevCodexEvent = {
|
|
105
|
-
commits: ManagedDevRebasedCommit[];
|
|
106
|
-
message: ManagedDevCodexMessage;
|
|
107
|
-
phase: "start";
|
|
108
|
-
} | {
|
|
109
|
-
message: ManagedDevCodexMessage;
|
|
110
|
-
phase: "message";
|
|
111
|
-
} | {
|
|
112
|
-
finalMessage: string;
|
|
113
|
-
phase: "complete";
|
|
114
|
-
} | {
|
|
115
|
-
commits: ManagedDevRebasedCommit[];
|
|
116
|
-
phase: "progress";
|
|
117
|
-
} | {
|
|
118
|
-
phase: "error";
|
|
119
|
-
};
|
|
120
|
-
type ManagedDevActionRequest = {
|
|
121
|
-
action: ManagedDevAction;
|
|
122
|
-
requestId: string;
|
|
123
|
-
};
|
|
124
|
-
type ManagedDevActionResponse = Partial<ManagedDevActionResult> & {
|
|
125
|
-
error?: string;
|
|
126
|
-
requestId: string;
|
|
127
|
-
};
|
|
128
|
-
type ManagedDevCodexResponse = ManagedDevCodexEvent & {
|
|
129
|
-
requestId: string;
|
|
130
|
-
};
|
|
131
|
-
type ManagedDevStatusResponse = {
|
|
132
|
-
status: ManagedDevStatus;
|
|
133
|
-
};
|
|
134
|
-
//#endregion
|
|
135
|
-
export { ManagedDevAction, ManagedDevActionRequest, ManagedDevActionResponse, ManagedDevActionResult, ManagedDevCheck, ManagedDevCheckTrigger, ManagedDevChecks, ManagedDevCodexCompletion, ManagedDevCodexEvent, ManagedDevCodexMessage, ManagedDevCodexResponse, ManagedDevDraft, ManagedDevRebasedCommit, ManagedDevSetupFailure, ManagedDevStatus, ManagedDevStatusResponse, ManagedDevTarget, managedDevEnv, managedDevEvents };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=`COREFRAME_MANAGED_DEV`,t={action:`coreframe:managed-dev:action`,actionResult:`coreframe:managed-dev:action-result`,codex:`coreframe:managed-dev:codex`,status:`coreframe:managed-dev:status`,statusRequest:`coreframe:managed-dev:status-request`};export{e as managedDevEnv,t as managedDevEvents};
|
package/dist/managed-dev.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { CoreframeConfig } from "./config.js";
|
|
2
|
-
import { ManagedDevAction, ManagedDevActionResult, ManagedDevCodexEvent, ManagedDevStatus } from "./managed-dev-protocol.js";
|
|
3
|
-
import { FSWatcher } from "node:fs";
|
|
4
|
-
|
|
5
|
-
//#region managed-dev.d.ts
|
|
6
|
-
type ManagedDevSessionOptions = {
|
|
7
|
-
config: CoreframeConfig;
|
|
8
|
-
cwd?: string;
|
|
9
|
-
env?: NodeJS.ProcessEnv;
|
|
10
|
-
localCheckInterval?: number;
|
|
11
|
-
onRestart?(): void;
|
|
12
|
-
onStatusChange?(status: ManagedDevStatus): void;
|
|
13
|
-
remoteCheckInterval?: number;
|
|
14
|
-
runCheck?(script: ManagedDevCheckScript): Promise<void>;
|
|
15
|
-
watchState?(state: GitState, onChange: () => void): Promise<FSWatcher[]>;
|
|
16
|
-
};
|
|
17
|
-
type ManagedDevCheckScript = "test" | "typecheck";
|
|
18
|
-
type GitState = {
|
|
19
|
-
branch: string | undefined;
|
|
20
|
-
commonDir: string;
|
|
21
|
-
gitDir: string;
|
|
22
|
-
head: string;
|
|
23
|
-
main: string;
|
|
24
|
-
primary: boolean;
|
|
25
|
-
};
|
|
26
|
-
type ManagedDevSession = {
|
|
27
|
-
action(action: ManagedDevAction, options?: {
|
|
28
|
-
onCodexEvent?(event: ManagedDevCodexEvent): void;
|
|
29
|
-
}): Promise<ManagedDevActionResult>;
|
|
30
|
-
activate(): Promise<void>;
|
|
31
|
-
getStatus(): ManagedDevStatus;
|
|
32
|
-
close(): Promise<void>;
|
|
33
|
-
};
|
|
34
|
-
declare function isManagedDevCheckout(cwd?: string): Promise<boolean>;
|
|
35
|
-
declare function isPrimaryCheckout(cwd?: string): Promise<boolean>;
|
|
36
|
-
declare function startManagedDevSession({
|
|
37
|
-
config,
|
|
38
|
-
cwd,
|
|
39
|
-
env,
|
|
40
|
-
localCheckInterval,
|
|
41
|
-
onRestart,
|
|
42
|
-
onStatusChange,
|
|
43
|
-
remoteCheckInterval,
|
|
44
|
-
runCheck,
|
|
45
|
-
watchState
|
|
46
|
-
}: ManagedDevSessionOptions): Promise<ManagedDevSession>;
|
|
47
|
-
//#endregion
|
|
48
|
-
export { ManagedDevSession, isManagedDevCheckout, isPrimaryCheckout, startManagedDevSession };
|
package/dist/managed-dev.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{createHash as e,randomBytes as t}from"node:crypto";import{access as n,copyFile as r,mkdir as i,mkdtemp as a,open as o,readFile as s,realpath as c,rm as l,unlink as u,writeFile as d}from"node:fs/promises";import f from"node:path";import p,{SubprocessError as m}from"nano-spawn";import{pathToFileURL as h}from"node:url";import{constants as g,watch as _}from"node:fs";import v from"node:process";import{resolve as y}from"import-meta-resolve";const b=`refs/heads/main`,x=`refs/heads/dev`,ee=`refs/remotes/origin/main`,te=/^[a-z][a-z0-9-]*(?:\([^)]+\))?!?:\s+\S/i,S=`coreframe-managed-dev-codex-completion.json`,ne=`coreframe-managed-dev-setup-failure.json`;async function C(e=v.cwd()){let t=await oe(e);return t.primary&&t.branch===`main`&&t.head===t.main}async function w(e=v.cwd()){try{let{commonDir:t,gitDir:n}=await T(e);return n===t}catch{return!1}}async function T(e){let t=await c(await q(e,[`rev-parse`,`--show-toplevel`])),n=await c(e),r=f.resolve(n,await q(e,[`rev-parse`,`--git-dir`])),i=f.resolve(n,await q(e,[`rev-parse`,`--git-common-dir`]));return{commonDir:i,gitDir:r,primary:t===n&&r===i}}async function E({config:e,cwd:n=v.cwd(),env:r=v.env,localCheckInterval:i=1e3,onRestart:a=()=>void 0,onStatusChange:o=()=>void 0,remoteCheckInterval:s=6e4,runCheck:c=e=>fe(n,r,e),watchState:l=se}){let m=r,h={mode:`waiting`,warnings:[]},g=!1,_=!1,y=!1,C=!1,w,T,E,D,O,k,A=[],j,P,F=Promise.resolve(),I=()=>{g||o(h)},L=async({fetch:e=!1}={})=>{if(!(!_||g||!T)){if(y){C=!0;return}try{let[t,r,i]=await Promise.all([q(n,[`rev-parse`,`--abbrev-ref`,`HEAD`]),q(n,[`rev-parse`,`HEAD`]),q(n,[`rev-parse`,b])]);if(t!==`main`||r!==i){h={message:`Managed synchronization is paused until the primary checkout is back on local main.`,mode:`waiting`,warnings:[]};return}r!==w&&(w=r,j=void 0);let a=await M(n);if(a.tracked||a.untracked.length>0){h={...h,currentCommit:w,draft:a,message:void 0,mode:`managed`,proposal:V(a.fingerprint),target:void 0};return}e&&await J(n,[`remote`,`get-url`,`origin`])&&await K(n,[`fetch`,`origin`,`+refs/heads/main:${ee}`]);let o=await J(n,[`rev-parse`,x]),s=await J(n,[`rev-parse`,ee]),c=[...o?[{commit:o,source:`dev`}]:[],...s?[{commit:s,source:`upstream`}]:[]],l;for(let e of c)if(!await we(n,e.commit,w)){l=e;break}h={...h,currentCommit:w,draft:void 0,message:void 0,mode:`managed`,proposal:void 0,target:l===void 0?void 0:await be(n,l.commit,l.source)}}catch(e){h={...h,message:Z(e),warnings:[Z(e)]}}finally{I()}}},R=()=>{clearTimeout(k),k=setTimeout(()=>void L(),50),k.unref()},z=(e,n)=>{let r=async()=>{let r=[{command:`pnpm typecheck`,status:`running`},{command:`pnpm test`,status:`pending`}],i=()=>{h={...h,checks:{commit:e,commands:structuredClone(r),trigger:n}},I()};i();for(let[e,n]of[`typecheck`,`test`].entries()){e>0&&(r[e].status=`running`,i());try{await c(n),r[e].status=`passed`}catch(n){r[e].status=`failed`,r[e].failureId=t(12).toString(`hex`),r[e].output=pe(n)}i()}};F=F.then(r,r)},he=async()=>{if(_||g)return;let e=await oe(n);if(!e.primary){h={message:`Managed development only runs from the primary checkout.`,mode:`unmanaged`,warnings:[]},I();return}if(e.branch!==`main`||e.head!==e.main){let t=`Managed development requires the primary checkout on local main; current branch is ${e.branch??`detached HEAD`}.`;console.warn(`Coreframe managed development disabled: ${t}`),h={message:t,mode:`unmanaged`,warnings:[]},I();return}E=f.join(e.commonDir,`coreframe-managed-dev.lock`),await xe(E),await J(n,[`rev-parse`,`--verify`,x])||await K(n,[`branch`,`dev`,e.head]),T=e,w=e.head,_=!0,h={codexCompletion:await re(e.commonDir),currentCommit:e.head,mode:`managed`,setupFailure:await ae(e.commonDir,e.head),warnings:[]},I(),A=await l(e,R),D=setInterval(()=>{h.draft&&L()},i),D.unref(),O=setInterval(()=>void L({fetch:!0}),s),O.unref(),await L(),L({fetch:!0})},ge=async(e,{onCodexEvent:t=()=>void 0}={})=>{if(!_||h.mode!==`managed`)throw Error(`Managed development is not active.`);if(y)throw Error(`Another managed development action is already running.`);let r=[],i=[],a,o=e=>{e.phase===`start`?(i=e.commits,r.splice(0,r.length,e.message)):e.phase===`message`?r.push(e.message):e.phase===`complete`?a=e.finalMessage:e.phase===`progress`&&(i=e.commits),t(e)};y=!0,h={...h,busy:De(e),message:void 0},I();try{if(e.type===`acknowledge-codex`)h.codexCompletion?.id===e.id&&await Me();else if(e.type===`dismiss-check`)h.checks&&(h={...h,checks:{...h.checks,commands:h.checks.commands.map(t=>t.failureId===e.failureId?{...t,dismissed:!0}:t)}});else if(e.type===`reject`)h={...h,draft:void 0,proposal:void 0};else if(e.type===`prepare`){let t=B(e.target),r=await M(n);r.tracked||r.untracked.length>0?h={...h,draft:r,proposal:V(r.fingerprint)}:await W({onCodexEvent:o,source:t.source,target:e.target})}else if(e.type===`message`){let t=await H(e.fingerprint,e.untracked),r=V(t.fingerprint);if(r===void 0){try{if(P??=le(`codex`,m),!await P)throw Error("Codex CLI is not installed or is unavailable on PATH. Install it with `npm install -g @openai/codex`, then restart the dev server.");r=await ce(n,m,t.untracked)}catch(e){r=``,h={...h,warnings:[...h.warnings,`Codex could not generate a commit message: ${Z(e)}`]}}j={fingerprint:t.fingerprint,message:r}}h={...h,draft:t,proposal:r}}else if(e.type===`commit`){let t=await U(e);h={...h,currentCommit:t,draft:void 0,message:void 0,proposal:void 0,target:void 0},R()}else if(e.type===`retry-install`)await _e();else if(e.type===`reset-database`)await Se();else{let t=B(e.target),r=await M(n);if(r.tracked||r.untracked.length>0){if(!e.fingerprint||!e.untracked)throw Error(`Refresh requires the current working-tree confirmation.`);if(await H(e.fingerprint,e.untracked),!e.message||!te.test(Ee(e.message)))throw Error(`Enter a commit message with a valid Conventional Commits header.`)}await W({fingerprint:e.fingerprint,message:e.message,onCodexEvent:o,source:t.source,target:e.target,untracked:e.untracked})}}finally{y=!1,h={...h,busy:void 0},I(),C&&(C=!1,R())}return a&&await je(a,r,i),{status:h}},B=e=>{if(!h.target||h.target.commit!==e)throw Error(`The offered update changed. Review the latest target before refreshing.`);return h.target},V=e=>j?.fingerprint===e?j.message:void 0,H=async(e,t)=>{let r=await M(n);if(r.fingerprint!==e)throw j=void 0,Error(`Working-tree changes changed; generate a new commit message.`);if(!Te(r.untracked,t))throw Error(`Include every untracked file or remove it before refreshing.`);return r},U=async({fingerprint:e,message:t,untracked:r})=>{let i=await H(e,r);if(!t||!te.test(Ee(t)))throw Error(`Enter a commit message with a valid Conventional Commits header.`);await K(n,[`add`,`--update`]),i.untracked.length>0&&await K(n,[`add`,`--`,...r]),await K(n,[`commit`,`--message`,t],{env:{GIT_EDITOR:`true`}});let a=await q(n,[`rev-parse`,`HEAD`]);return w=a,j=void 0,a},W=async({fingerprint:e,message:t,onCodexEvent:r=()=>void 0,source:i,target:a,untracked:o=[]})=>{B(a);let s=await q(n,[`rev-parse`,`HEAD`]),c,l,u=await M(n);if(u.tracked||u.untracked.length>0){if(!e||u.fingerprint!==e||!Te(u.untracked,o))throw Error(`Working-tree changes changed; review them before refreshing.`);await K(n,[`add`,`--update`]),o.length>0&&await K(n,[`add`,`--`,...o]),await K(n,[`commit`,`--message`,t],{env:{GIT_EDITOR:`true`}}),c=await q(n,[`rev-parse`,`HEAD`]),w=c,l=`refs/coreframe/recovery/${Date.now()}-${c.slice(0,12)}`,await K(n,[`update-ref`,l,c])}let d=c??s,f;try{if(f=await ue({cwd:n,env:m,localMain:d,onCodexEvent:r,source:i,target:a}),await q(n,[`rev-parse`,`HEAD`])!==d)throw Error(`HEAD changed while the accepted update was being prepared.`);if(await q(n,[`rev-parse`,b])!==d)throw Error(`Local main changed while the accepted update was being prepared.`);await de(n,f,d),w=f.commit,await K(n,[`reset`,`--hard`,f.commit]);let e=Y(await q(n,[`diff`,`--name-only`,`-z`,s,f.commit]));j=void 0,l&&await K(n,[`update-ref`,`-d`,l]),h={...h,currentCommit:f.commit,draft:void 0,proposal:void 0,setupFailure:void 0,target:void 0},await G({installDependencies:ve(e),restartRequired:ye(e),trigger:`synchronization`})}catch(e){e instanceof N&&(C=!0);let t=l?` Recovery commit: ${l}.`:``;throw h={...h,currentCommit:w,message:`${Z(e)}${t}`},e}},G=async({installDependencies:t,restartRequired:r,trigger:i})=>{let o=w;if(t)try{await ke([`install`,`--frozen-lockfile`])}catch(e){await Q({command:`pnpm install --frozen-lockfile`,commit:o,error:e,message:`The project was synchronized, but dependency installation failed. Fix the package or lockfile issue, then retry the install.`,restartRequired:r,stage:`dependencies`});return}try{await me({config:e,cwd:n,env:m})}catch(e){await Q({command:`pnpm db migrate`,commit:o,error:e,message:`The project was synchronized, but its database migration failed. The previous database was restored. Reset the database to recreate it, apply migrations, and rerun seed scripts.`,restartRequired:r,stage:`migration`});return}await $(),z(o,i),r&&a()},_e=async()=>{let e=Oe(`dependencies`);await $(),await G({installDependencies:!0,restartRequired:e.restartRequired,trigger:`dependency-recovery`})},Se=async()=>{let e=Oe(`migration`);try{await ke([`db`,`setup`])}catch(t){await Q({command:`pnpm db setup`,commit:e.commit,error:t,message:`The project remains synchronized, but the database reset failed. Review the diagnostics, fix the reported problem, and try the reset again.`,restartRequired:e.restartRequired,stage:`migration`});return}await $(),z(e.commit,`database-recovery`),e.restartRequired&&a()},Oe=e=>{if(!h.setupFailure||h.setupFailure.stage!==e)throw Error(`There is no failed ${e} setup step to recover.`);return h.setupFailure},ke=async e=>{await p(X(),e,{cwd:n,env:m})},Q=async({command:e,commit:t,error:n,message:r,restartRequired:i,stage:a})=>{let o=pe(n).slice(-1e5),s={command:e,commit:t,message:r,output:o,restartRequired:i,stage:a};h={...h,setupFailure:s,target:void 0},console.error(`Coreframe managed development setup failed (${e}): ${r}\n${o}`);let c=Ae();c&&await d(c,`${JSON.stringify(s)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development setup failure: ${Z(e)}`)})},$=async()=>{h={...h,setupFailure:void 0};let e=Ae();e&&await u(e).catch(e=>{e instanceof Error&&`code`in e&&e.code===`ENOENT`||console.warn(`Could not clear the managed-development setup failure: ${Z(e)}`)})},Ae=()=>T?f.join(T.commonDir,ne):void 0,je=async(e,n,r)=>{let i={commits:r,finalMessage:e,id:t(16).toString(`hex`),messages:ie(n)};h={...h,codexCompletion:i},T&&await d(f.join(T.commonDir,S),`${JSON.stringify(i)}\n`,{mode:384}).catch(e=>{console.warn(`Could not persist the managed-development Codex result: ${Z(e)}`)}),I()},Me=async()=>{h={...h,codexCompletion:void 0},T&&await u(f.join(T.commonDir,S)).catch(e=>{if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e})};return{action:ge,activate:he,getStatus:()=>h,async close(){if(!g){g=!0,clearInterval(D),clearInterval(O),clearTimeout(k);for(let e of A)e.close();await Ce(E)}}}}async function re(e){let t=f.join(e,S);try{let e=JSON.parse(await s(t,`utf8`));if(D(e))return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development Codex result: ${Z(e)}`)}await u(t).catch(()=>void 0)}function D(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.finalMessage==`string`&&typeof t.id==`string`&&Array.isArray(t.messages)&&t.messages.every(k)&&(t.commits===void 0||Array.isArray(t.commits)&&t.commits.every(O))}function O(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.commit==`string`&&typeof t.shortCommit==`string`&&typeof t.subject==`string`}function k(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.kind===`agent`||t.kind===`thought`||t.kind===`user`)&&typeof t.text==`string`}function ie(e){let t=new Set(e.filter(e=>e.kind===`user`)),n=[...t].reduce((e,t)=>e+t.text.length,0),r=!1;for(let i of[...e].reverse())if(i.kind!==`user`){if(n+i.text.length>1e5&&r)break;t.add(i),r=!0,n+=i.text.length}return e.filter(e=>t.has(e))}async function ae(e,t){let n=f.join(e,ne);try{let e=JSON.parse(await s(n,`utf8`));if(A(e)&&e.commit===t)return e}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;console.warn(`Could not read the managed-development setup failure: ${Z(e)}`)}await u(n).catch(()=>void 0)}function A(e){if(!e||typeof e!=`object`)return!1;let t=e;return(t.command===`pnpm db migrate`||t.command===`pnpm db setup`||t.command===`pnpm install --frozen-lockfile`)&&typeof t.commit==`string`&&typeof t.message==`string`&&typeof t.output==`string`&&typeof t.restartRequired==`boolean`&&(t.stage===`dependencies`||t.stage===`migration`)}async function oe(e){let t=await T(e);return{branch:j(await q(e,[`rev-parse`,`--abbrev-ref`,`HEAD`])),commonDir:t.commonDir,gitDir:t.gitDir,head:await q(e,[`rev-parse`,`HEAD`]),main:await q(e,[`rev-parse`,b]),primary:t.primary}}function j(e){return e===`HEAD`?void 0:e}async function se(e,t){let n=[e.gitDir,f.join(e.commonDir,`refs`,`heads`)],r=[];for(let e of n)try{r.push(_(e,{persistent:!1},t))}catch{}return r}async function M(t){let[n,r,i]=await Promise.all([q(t,[`status`,`--porcelain`,`--untracked-files=no`]),q(t,[`diff`,`HEAD`,`--binary`]),q(t,[`ls-files`,`--others`,`--exclude-standard`,`-z`])]),a=Y(i).sort(),o=e(`sha256`).update(r);for(let e of a)o.update(`\0`).update(e);return{fingerprint:o.digest(`hex`),tracked:n.length>0,untracked:a}}async function ce(e,t,n){let r=[`Tracked changes:`,await q(e,[`diff`,`HEAD`,`--binary`])];for(let t of n){let n=await s(f.join(e,t));r.push(`\nUntracked file: ${t}\n`,n.toString(`utf8`))}let{stdout:i}=await p(`codex`,[`exec`,`--ephemeral`,`--ignore-user-config`,`--sandbox`,`read-only`,`--cd`,e,`Return only a concise Conventional Commits message for the supplied working-tree changes. Use a body only when it adds material context.`],{cwd:e,env:t,stderr:`ignore`,stdin:{string:r.join(`
|
|
2
|
-
`)}});return i.trim().replace(/^```(?:text)?\s*|\s*```$/g,``)}async function le(e,t){let r=t.PATH??t.Path??t.path??``,i=v.platform===`win32`?(t.PATHEXT??`.COM;.EXE;.BAT;.CMD`).split(`;`):[``];for(let t of r.split(f.delimiter))for(let r of i)try{return await n(f.join(t||`.`,`${e}${r}`),g.X_OK),!0}catch{}return!1}var N=class extends Error{constructor(){super(`Local dev advanced while this update was being prepared. Nothing was changed. Review the latest update and try again.`)}};async function ue({cwd:e,env:n,localMain:r,onCodexEvent:a,source:o,target:s}){if(o===`dev`&&await we(e,r,s))return{commit:s,devTarget:s};let c=f.resolve(e,await q(e,[`rev-parse`,`--git-common-dir`])),u=f.join(c,`coreframe-managed-dev`);await i(u,{recursive:!0});let d=t(8).toString(`hex`),p=f.join(u,`integration-${d}`);try{if(await K(e,[`worktree`,`add`,`--detach`,p,r]),r!==s)if(o===`dev`)await P(p,n,[`merge`,`--no-edit`,`--no-ff`,`--allow-unrelated-histories`,`--message`,`Merge dev into main`,s],`merge`,a);else{let e=await J(p,[`merge-base`,r,s]);await P(p,n,e?[`rebase`,`--onto`,s,e]:[`rebase`,`--root`,`--onto`,s],`rebase`,a,s)}return{commit:await q(p,[`rev-parse`,`HEAD`]),devTarget:o===`dev`?s:void 0}}finally{await K(e,[`worktree`,`remove`,`--force`,p]).catch(()=>void 0),await l(p,{force:!0,recursive:!0})}}async function de(e,t,n){let r=[`start`,`update ${b} ${t.commit} ${n}`];t.devTarget&&r.push(t.devTarget===t.commit?`verify ${x} ${t.devTarget}`:`update ${x} ${t.commit} ${t.devTarget}`),r.push(`prepare`,`commit`);try{await p(`git`,[`update-ref`,`--stdin`],{cwd:e,stdin:{string:`${r.join(`
|
|
3
|
-
`)}\n`}})}catch(r){if(t.devTarget)try{let[r,i]=await Promise.all([q(e,[`rev-parse`,b]),J(e,[`rev-parse`,x])]);if(r===n&&i!==t.devTarget)throw new N}catch(e){if(e instanceof N)throw e}throw r}}async function P(e,t,n,r,i,a){try{await K(e,n,{env:{GIT_EDITOR:`true`}});return}catch(n){let o=await z(e);if(o.length===0)throw n;try{for(;o.length>0;){await F(e,t,r,o,a?await I(e,a):[],i),await K(e,[`diff`,`--check`]),await K(e,[`add`,`--all`]);let n=await z(e);if(n.length>0)throw Error(`Codex left unresolved paths: ${n.join(`, `)}`);try{await K(e,[r,`--continue`],{env:{GIT_EDITOR:`true`}})}catch(t){if(o=await z(e),o.length===0)throw t;i({commits:a?await I(e,a):[],phase:`progress`});continue}i({commits:a?await I(e,a):[],phase:`progress`}),o=await z(e)}return}catch(t){throw await K(e,[r,`--abort`]).catch(()=>void 0),Error(`Codex could not resolve ${r} conflicts: ${Z(t)}`)}}}async function F(e,t,n,r,i,a){let o=`Resolve the current Git ${n} conflicts cleanly. Edit only files needed for the resolution, preserve intended behavior from both sides, remove all conflict markers, and do not stage files or run Git continuation commands. Conflicted paths: ${r.join(`, `)}`;a({commits:i,message:{kind:`user`,text:o},phase:`start`});let s=p(`codex`,[`exec`,`--ephemeral`,`--ignore-user-config`,`--json`,`--config`,`model_reasoning_effort="low"`,`--sandbox`,`workspace-write`,`--cd`,e,o],{cwd:e,env:t,stdin:`ignore`}),c=``,l=[];try{await Promise.all([R(s.stdout,e=>{let t=L(e);t&&(t.kind===`agent`&&(c=t.text),a({message:t,phase:`message`}))}),R(s.stderr,e=>l.push(e))])}catch(e){a({phase:`error`});let t=l.join(`
|
|
4
|
-
`).trim();throw t?Error(`${Z(e)}\n${t}`):e}a({finalMessage:c||`Codex resolved the conflicts.`,phase:`complete`})}async function I(e,t){let n=await q(e,[`log`,`--reverse`,`--format=%H%x00%s`,`${t}..HEAD`]);return n?n.split(`
|
|
5
|
-
`).map(e=>{let[t,n=``]=e.split(`\0`,2);return{commit:t,shortCommit:t.slice(0,12),subject:n}}):[]}function L(e){let t;try{t=JSON.parse(e)}catch{throw Error(`Codex emitted invalid JSONL output.`)}if(!t||typeof t!=`object`)return;let n=t.item;if(t.type!==`item.completed`||!n||typeof n!=`object`)return;let{text:r,type:i}=n;if(!(typeof r!=`string`||!r.trim())){if(i===`reasoning`)return{kind:`thought`,text:r};if(i===`agent_message`)return{kind:`agent`,text:r}}}async function R(e,t){for await(let n of e)t(n)}async function z(e){return Y(await q(e,[`diff`,`--name-only`,`--diff-filter=U`,`-z`]))}async function fe(e,t,n){await p(X(),[n],{cwd:e,env:t})}function pe(e){if(e instanceof m){let t=e.output.trim();if(t)return t}return Z(e)}async function me({config:e,cwd:t,env:n}){if(!e.database)return;let r=await he({config:e,cwd:t,env:n});try{await p(X(),[`db`,`migrate`],{cwd:t,env:n})}catch(e){throw await r.restore(),e}await r.discard().catch(e=>{console.warn(`Could not remove the managed-development database snapshot: ${Z(e)}`)}),await l(r.directory,{force:!0,recursive:!0})}async function he({config:e,cwd:t,env:n}){let o=f.join(t,`.coreframe`,`managed-dev-backups`);await i(o,{recursive:!0});let s=await a(f.join(o,`refresh-`));if(e.database?.dialect===`sqlite`){let e=[`turso.db`,`turso.db-wal`,`turso.db-shm`],n=new Set;for(let r of e)await ge(f.join(t,`.coreframe`,r),f.join(s,r))&&n.add(r);return{directory:s,async discard(){},async restore(){for(let i of e){let e=f.join(t,`.coreframe`,i);n.has(i)?await r(f.join(s,i),e):await l(e,{force:!0})}}}}if(!n.DATABASE_URL)throw Error(`DATABASE_URL is required to snapshot local PostgreSQL.`);let c=await B(t);if(c)return V({directory:s,connectionString:n.DATABASE_URL,postgres:c});let u=f.join(s,`database.dump`),d=_e(n,n.DATABASE_URL);return await p(`pg_dump`,[`--format=custom`,`--file`,u],{cwd:t,env:d,stdin:`ignore`}),{directory:s,async discard(){},async restore(){await p(`pg_restore`,[`--clean`,`--if-exists`,`--no-owner`,`--dbname`,d.PGDATABASE,u],{cwd:t,env:d,stdin:`ignore`})}}}async function ge(e,t){try{return await r(e,t),!0}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e;return!1}}async function B(e){let t=JSON.parse(await s(f.join(e,`package.json`),`utf8`));if(!(!t.dependencies?.pg&&!t.devDependencies?.pg&&!t.optionalDependencies?.pg))try{return await import(y(`pg`,h(f.join(e,`package.json`)).href))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ERR_MODULE_NOT_FOUND`)return;throw e}}async function V({directory:e,connectionString:n,postgres:r}){let i=new URL(n),a=decodeURIComponent(i.pathname.slice(1));if(!a)throw Error(`DATABASE_URL must name a PostgreSQL database to snapshot.`);let o=`coreframe_backup_${t(6).toString(`hex`)}`,s=`${o}_failed`,c=new URL(i);c.pathname=a===`postgres`?`/template1`:`/postgres`;let l=new r.Client({connectionString:c.href});await l.connect();try{await U(l,a,!1),await W(l,a),await l.query(`CREATE DATABASE ${G(o)} WITH TEMPLATE ${G(a)}`),await U(l,o,!0)}finally{await U(l,a,!0).catch(()=>void 0),await l.end()}return{directory:e,async discard(){await H(r,c.href,async e=>{await W(e,o),await e.query(`DROP DATABASE ${G(o)}`)})},async restore(){await H(r,c.href,async e=>{await U(e,a,!1),await W(e,a),await e.query(`ALTER DATABASE ${G(a)} RENAME TO ${G(s)}`);try{await e.query(`ALTER DATABASE ${G(o)} RENAME TO ${G(a)}`)}catch(t){throw await e.query(`ALTER DATABASE ${G(s)} RENAME TO ${G(a)}`).catch(()=>void 0),await U(e,a,!0).catch(()=>void 0),t}await W(e,s),await e.query(`DROP DATABASE ${G(s)}`)})}}}async function H(e,t,n){let r=new e.Client({connectionString:t});await r.connect();try{return await n(r)}finally{await r.end()}}async function U(e,t,n){await e.query(`ALTER DATABASE ${G(t)} ALLOW_CONNECTIONS ${n?`true`:`false`}`)}async function W(e,t){await e.query(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()`,[t])}function G(e){return`"${e.replaceAll(`"`,`""`)}"`}function _e(e,t){let n=new URL(t);return{...e,PGDATABASE:decodeURIComponent(n.pathname.slice(1)),PGHOST:n.hostname,PGPASSWORD:decodeURIComponent(n.password),PGPORT:n.port||`5432`,PGUSER:decodeURIComponent(n.username)}}function ve(e){return e.some(e=>f.basename(e)===`package.json`||f.basename(e).endsWith(`lock.yaml`)||f.basename(e)===`pnpm-workspace.yaml`)}function ye(e){return e.some(e=>ve([e])||/(^|\/)(vite|coreframe|tsconfig|drizzle)\.[^/]+$/.test(e)||/(^|\/)(drizzle|scripts|src\/api|tauri)(\/|$)/.test(e))}async function be(e,t,n){return{commit:t,shortCommit:t.slice(0,12),source:n,subject:await q(e,[`show`,`-s`,`--format=%s`,t])}}async function xe(e){try{let t=await o(e,`wx`);await t.writeFile(`${v.pid}\n`),await t.close()}catch(t){if(!(t instanceof Error&&`code`in t&&t.code===`EEXIST`))throw t;let n=(await s(e,`utf8`).catch(()=>`unknown`)).trim(),r=Number(n);if(Number.isInteger(r)&&!Se(r)){await u(e).catch(()=>void 0),await xe(e);return}throw Error(`Managed development is already owned by PID ${n}.`)}}function Se(e){try{return v.kill(e,0),!0}catch(e){return!(e instanceof Error&&`code`in e&&e.code===`ESRCH`)}}async function Ce(e){e&&(await s(e,`utf8`).catch(()=>void 0))?.trim()===String(v.pid)&&await u(e).catch(()=>void 0)}async function K(e,t,{env:n}={}){return p(`git`,t,{cwd:e,env:n,stdin:`ignore`})}async function q(e,t){return(await K(e,t)).stdout.trim()}async function J(e,t){try{return await q(e,t)||void 0}catch(e){if(e instanceof m&&e.exitCode&&e.exitCode>0)return;throw e}}async function we(e,t,n){try{return await K(e,[`merge-base`,`--is-ancestor`,t,n]),!0}catch(e){if(e instanceof m&&e.exitCode===1)return!1;throw e}}function Te(e,t){return e.length===t.length&&[...e].sort().every((e,n)=>e===[...t].sort()[n])}function Y(e){return e.split(`\0`).filter(Boolean)}function Ee(e){return e.split(/\r?\n/,1)[0]??``}function De(e){return e.type===`acknowledge-codex`?`Acknowledging Codex result`:e.type===`dismiss-check`?`Dismissing managed development check`:e.type===`message`?`Generating commit message`:e.type===`commit`?`Committing local changes`:e.type===`apply`?`Integrating accepted update`:e.type===`prepare`?`Reviewing working tree`:e.type===`retry-install`?`Retrying dependency installation`:e.type===`reset-database`?`Resetting local database`:`Aborting refresh`}function X(){return v.platform===`win32`?`pnpm.cmd`:`pnpm`}function Z(e){return e instanceof Error?e.message:String(e)}export{C as isManagedDevCheckout,w as isPrimaryCheckout,E as startManagedDevSession};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { AssetCredentialStore } from "./assets/credentials.js";
|
|
2
|
-
|
|
3
|
-
//#region private-object-store.d.ts
|
|
4
|
-
type PrivateObjectStore = {
|
|
5
|
-
has(bucket: string, key: string): Promise<boolean>;
|
|
6
|
-
download(bucket: string, key: string, target: string): Promise<void>;
|
|
7
|
-
upload(bucket: string, key: string, source: string, contentType: string): Promise<void>;
|
|
8
|
-
};
|
|
9
|
-
type PrivateObjectStoreConfig = {
|
|
10
|
-
credentialProfile: string;
|
|
11
|
-
endpoint: string;
|
|
12
|
-
region: string;
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Creates the shared private S3-compatible store used by managed-asset sources and build-only state
|
|
16
|
-
* such as i18n snapshots. The credential names remain compatible with existing Coreframe projects.
|
|
17
|
-
*/
|
|
18
|
-
declare function createB2PrivateObjectStore({
|
|
19
|
-
config,
|
|
20
|
-
credentialStore,
|
|
21
|
-
env
|
|
22
|
-
}: {
|
|
23
|
-
config: PrivateObjectStoreConfig;
|
|
24
|
-
credentialStore?: AssetCredentialStore;
|
|
25
|
-
env?: NodeJS.ProcessEnv;
|
|
26
|
-
}): PrivateObjectStore;
|
|
27
|
-
//#endregion
|
|
28
|
-
export { PrivateObjectStore, PrivateObjectStoreConfig, createB2PrivateObjectStore };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{resolveAssetCredentials as e}from"./assets/credentials.js";import{stat as t}from"node:fs/promises";import{createReadStream as n,createWriteStream as r}from"node:fs";import{pipeline as i}from"node:stream/promises";import{GetObjectCommand as a,HeadObjectCommand as o,PutObjectCommand as s,S3Client as c}from"@aws-sdk/client-s3";function l({config:l,credentialStore:u,env:d=process.env}){let f;async function p(){if(f)return f;let t=await e({env:d,profile:l.credentialProfile,store:u});return f=new c({endpoint:l.endpoint,forcePathStyle:!0,region:l.region,credentials:{accessKeyId:t.applicationKeyId,secretAccessKey:t.applicationKey}}),f}return{async has(e,t){try{return await(await p()).send(new o({Bucket:e,Key:t})),!0}catch(e){if(e.$metadata?.httpStatusCode===404)return!1;throw e}},async download(e,t,n){let o=await(await p()).send(new a({Bucket:e,Key:t}));if(!o.Body)throw Error(`Backblaze B2 returned an empty body for ${e}/${t}.`);await i(o.Body,r(n,{flags:`wx`}))},async upload(e,r,i,a){let{size:o}=await t(i);await(await p()).send(new s({Bucket:e,Key:r,Body:n(i),ContentLength:o,ContentType:a}))}}}export{l as createB2PrivateObjectStore};
|
package/dist/project.d.ts
DELETED
package/dist/project.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{resolve as e}from"node:path";import{pathToFileURL as t}from"node:url";import{resolve as n}from"import-meta-resolve";async function r(n){return await import(t(e(process.cwd(),n)).href)}async function i(r,i=process.cwd()){return await import(n(r,t(e(i,`package.json`)).href))}export{i as importProjectDependency,r as importProjectModule};
|
package/dist/recipes/apply.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
//#region recipes/apply.d.ts
|
|
2
|
-
type ApplyRecipeOptions = {
|
|
3
|
-
cwd?: string;
|
|
4
|
-
fetch?: boolean;
|
|
5
|
-
name: string;
|
|
6
|
-
remote?: string;
|
|
7
|
-
target?: string;
|
|
8
|
-
};
|
|
9
|
-
type AppliedRecipe = {
|
|
10
|
-
created: string[];
|
|
11
|
-
instructions: string;
|
|
12
|
-
name: string;
|
|
13
|
-
ref: string;
|
|
14
|
-
unchanged: string[];
|
|
15
|
-
updated: string[];
|
|
16
|
-
};
|
|
17
|
-
declare function applyRecipe({
|
|
18
|
-
cwd,
|
|
19
|
-
fetch,
|
|
20
|
-
name,
|
|
21
|
-
remote,
|
|
22
|
-
target
|
|
23
|
-
}: ApplyRecipeOptions): AppliedRecipe;
|
|
24
|
-
declare function printAppliedRecipe(result: AppliedRecipe): void;
|
|
25
|
-
//#endregion
|
|
26
|
-
export { AppliedRecipe, ApplyRecipeOptions, applyRecipe, printAppliedRecipe };
|
package/dist/recipes/apply.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{parseRecipeManifest as e,validateRecipeName as t}from"./manifest.js";import{listGitFiles as n,readGitBuffer as r,readGitText as i,resolveRecipeSource as a}from"./source.js";import{dirname as o,isAbsolute as s,join as c,posix as l}from"node:path";import{existsSync as u,lstatSync as d,mkdirSync as f,readFileSync as p,writeFileSync as m}from"node:fs";import{parse as h,stringify as g}from"yaml";function _({cwd:s=process.cwd(),fetch:c=!0,name:l,remote:d=`template`,target:p}){t(l);let{projectRoot:h,ref:_,repositoryRoot:v}=a({cwd:s,fetch:c,remote:d,target:p}),b=`recipes/${l}`,C=`${b}/recipe.yaml`,E=e(i(v,_,C),C),D=i(v,_,`${b}/RECIPE.md`),O=n(v,_,`${b}/.agents`),k=new Map,A=[],j=[],M=[];for(let e of O){let t=e.slice(`${b}/`.length);x(t,`Recipe asset ${e}`),k.set(t,r(v,_,e))}let N=new Map;for(let[e,t]of k){let n=w(S(h,e));if(n===void 0)N.set(e,t),A.push(e);else if(n.equals(t))j.push(e);else throw Error(`Recipe ${l} cannot replace modified ${e}. Reconcile that agent asset manually.`)}let P=new Map;for(let e of E.routes){if(x(e.router,`Recipe route router`),x(e.path,`Recipe route path`),k.has(e.router))throw Error(`Recipe cannot replace its destination router ${e.router}.`);if(!k.has(e.path)&&!u(S(h,e.path)))throw Error(`Recipe route target ${e.path} does not exist.`);let t=P.get(e.router)??y(T(S(h,e.router),e.router),e.router);P.set(e.router,t);let n=t.routes.find(t=>t.path===e.path);if(n){if(n.when!==e.when)throw Error(`Recipe ${l} route ${e.path} conflicts with the existing trigger in ${e.router}.`);continue}t.routes.push({path:e.path,when:e.when})}for(let[e,t]of P){t.routes.sort((e,t)=>e.path<t.path?-1:+(e.path>t.path));let n=T(S(h,e),e),r=g(t,{lineWidth:0});r===n?j.push(e):(N.set(e,r),M.push(e))}for(let[e,t]of N){let n=S(h,e);f(o(n),{recursive:!0}),m(n,t)}return{created:A.sort(),instructions:D,name:l,ref:_,unchanged:[...new Set(j)].sort(),updated:M.sort()}}function v(e){console.log(`Prepared Coreframe recipe ${e.name} from ${e.ref}.`);for(let t of e.created)console.log(`created: ${t}`);for(let t of e.updated)console.log(`updated: ${t}`);for(let t of e.unchanged)console.log(`unchanged: ${t}`);console.log(`\nContinue by following ${e.ref}:recipes/${e.name}/RECIPE.md:\n`),console.log(e.instructions.trimEnd())}function y(e,t){let n=b(e,t);if(!E(n)||!D(n,[`routes`,`rules`])||!Array.isArray(n.rules)||!n.rules.every(O)||!Array.isArray(n.routes))throw Error(`${t} must contain only string rules and a routes array.`);let r=n.routes.map((e,n)=>{if(!E(e)||!D(e,[`path`,`when`])||!O(e.path)||!O(e.when))throw Error(`${t} route ${n+1} must contain path and when strings.`);return{path:e.path,when:e.when}}),i=r.map(e=>e.path);if(new Set(i).size!==i.length)throw Error(`${t} contains duplicate route paths.`);return{rules:n.rules,routes:r}}function b(e,t){try{return h(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function x(e,t){if(!e.startsWith(`.agents/`)||s(e)||e.includes(`\\`)||l.normalize(e)!==e)throw Error(`${t} must be a normalized project-relative path beneath .agents/.`)}function S(e,t){x(t,`Recipe destination`);let n=c(e,t),r=e;for(let e of t.split(`/`))if(r=c(r,e),u(r)&&d(r).isSymbolicLink())throw Error(`Recipe destination ${t} crosses symbolic link ${r}.`);return n}function C(e){return w(e)?.toString(`utf8`)}function w(e){try{return p(e)}catch(e){if(k(e)&&e.code===`ENOENT`)return;throw e}}function T(e,t){let n=C(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function E(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function D(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function O(e){return typeof e==`string`&&e.length>0}function k(e){return e instanceof Error&&`code`in e}export{_ as applyRecipe,v as printAppliedRecipe};
|
package/dist/recipes/list.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { RecipeSourceOptions } from "./source.js";
|
|
2
|
-
|
|
3
|
-
//#region recipes/list.d.ts
|
|
4
|
-
type RecipeCatalog = {
|
|
5
|
-
recipes: Array<{
|
|
6
|
-
description: string;
|
|
7
|
-
name: string;
|
|
8
|
-
}>;
|
|
9
|
-
ref: string;
|
|
10
|
-
};
|
|
11
|
-
declare function listRecipes(options?: RecipeSourceOptions): RecipeCatalog;
|
|
12
|
-
declare function printRecipeCatalog(catalog: RecipeCatalog): void;
|
|
13
|
-
//#endregion
|
|
14
|
-
export { RecipeCatalog, listRecipes, printRecipeCatalog };
|
package/dist/recipes/list.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{parseRecipeManifest as e,validateRecipeName as t}from"./manifest.js";import{listGitFiles as n,readGitText as r,resolveRecipeSource as i}from"./source.js";function a(a={}){let{ref:o,repositoryRoot:s}=i(a),c=n(s,o,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(n=>{let i=n.split(`/`)[1];return t(i),{description:e(r(s,o,n),n).description,name:i}});return c.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:c,ref:o}}function o(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}export{a as listRecipes,o as printRecipeCatalog};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
//#region recipes/manifest.d.ts
|
|
2
|
-
type RecipeRoute = {
|
|
3
|
-
path: string;
|
|
4
|
-
router: string;
|
|
5
|
-
when: string;
|
|
6
|
-
};
|
|
7
|
-
type RecipeManifest = {
|
|
8
|
-
description: string;
|
|
9
|
-
routes: RecipeRoute[];
|
|
10
|
-
};
|
|
11
|
-
declare function parseRecipeManifest(contents: string, path: string): RecipeManifest;
|
|
12
|
-
declare function validateRecipeName(name: string): string;
|
|
13
|
-
//#endregion
|
|
14
|
-
export { RecipeManifest, RecipeRoute, parseRecipeManifest, validateRecipeName };
|
package/dist/recipes/manifest.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{parse as e}from"yaml";const t=/^[a-z0-9]+(?:-[a-z0-9]+)*$/u;function n(e,t){let n=i(e,t);if(!a(n)||!o(n,[`description`,`routes`])||!s(n.description)||!Array.isArray(n.routes))throw Error(`${t} must contain only a description string and routes array.`);let r=n.routes.map((e,n)=>{if(!a(e)||!o(e,[`path`,`router`,`when`])||!s(e.path)||!s(e.router)||!s(e.when))throw Error(`${t} route ${n+1} must contain router, path, and when strings.`);return{path:e.path,router:e.router,when:e.when}}),c=r.map(e=>`${e.router}\0${e.path}`);if(new Set(c).size!==c.length)throw Error(`${t} contains a duplicate router and path pair.`);return{description:n.description,routes:r}}function r(e){if(!t.test(e))throw Error(`Recipe names use lowercase letters, numbers, and single hyphens.`);return e}function i(t,n){try{return e(t)}catch(e){throw Error(`Could not parse ${n}.`,{cause:e})}}function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function s(e){return typeof e==`string`&&e.length>0}export{n as parseRecipeManifest,r as validateRecipeName};
|
package/dist/recipes/source.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
//#region recipes/source.d.ts
|
|
2
|
-
type RecipeSourceOptions = {
|
|
3
|
-
cwd?: string;
|
|
4
|
-
fetch?: boolean;
|
|
5
|
-
remote?: string;
|
|
6
|
-
target?: string;
|
|
7
|
-
};
|
|
8
|
-
declare function resolveRecipeSource({
|
|
9
|
-
cwd,
|
|
10
|
-
fetch,
|
|
11
|
-
remote,
|
|
12
|
-
target
|
|
13
|
-
}?: RecipeSourceOptions): {
|
|
14
|
-
projectRoot: string;
|
|
15
|
-
ref: string;
|
|
16
|
-
repositoryRoot: string;
|
|
17
|
-
};
|
|
18
|
-
declare function readGitText(repositoryRoot: string, ref: string, path: string): string;
|
|
19
|
-
declare function readGitBuffer(repositoryRoot: string, ref: string, path: string): NonSharedBuffer;
|
|
20
|
-
declare function listGitFiles(repositoryRoot: string, ref: string, path: string): string[];
|
|
21
|
-
//#endregion
|
|
22
|
-
export { RecipeSourceOptions, listGitFiles, readGitBuffer, readGitText, resolveRecipeSource };
|
package/dist/recipes/source.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ensureTemplateRemote as e}from"../upgrade/ensure-template-remote.js";import{coreframeGitRef as t}from"../upgrade/template-ref.js";import{dirname as n,join as r,resolve as i}from"node:path";import{readFileSync as a}from"node:fs";import{spawnSync as o}from"node:child_process";function s({cwd:n=process.cwd(),fetch:r=!0,remote:i=`template`,target:a}={}){let o=d(n),s=h(o,[`rev-parse`,`--show-toplevel`]),c=t(a??f(o));return e({cwd:s,fetch:r,remote:i}),{projectRoot:o,ref:c,repositoryRoot:s}}function c(e,t,n){return l(e,t,n).toString(`utf8`)}function l(e,t,n){let r=`${t}:${n}`,i=o(`git`,[`show`,r],{cwd:e,encoding:`buffer`});if(i.status!==0)throw Error(`Could not read ${r}. ${g([`show`,r],i)}`);return i.stdout}function u(e,t,n){let r=o(`git`,[`ls-tree`,`-r`,`--name-only`,`-z`,t,`--`,n],{cwd:e,encoding:`buffer`});if(r.status!==0)throw Error(g([`ls-tree`,t,n],r));return r.stdout.toString(`utf8`).split(`\0`).filter(Boolean)}function d(e){let t=i(e);for(;;){let e=r(t,`package.json`),i=m(e);if(i!==void 0&&p(i,e).engines?.coreframe)return t;let a=n(t);if(a===t)throw Error(`Could not find a package.json with engines.coreframe.`);t=a}}function f(e){let t=r(e,`package.json`),n=m(t);if(n===void 0)throw Error(`Required file package.json does not exist.`);let i=p(n,t).engines?.coreframe;if(!i)throw Error(`package.json must declare an exact engines.coreframe recipe baseline.`);return i}function p(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}}function m(e){try{return a(e,`utf8`)}catch(e){if(_(e)&&e.code===`ENOENT`)return;throw e}}function h(e,t){let n=o(`git`,t,{cwd:e,encoding:`utf8`});if(n.status!==0)throw Error(g(t,n));return n.stdout.trim()}function g(e,t){let n=t.stderr.toString(`utf8`).trim()||t.stdout.toString(`utf8`).trim();return`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`}function _(e){return e instanceof Error&&`code`in e}export{u as listGitFiles,l as readGitBuffer,c as readGitText,s as resolveRecipeSource};
|
package/dist/runner.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import * as cmdts from "@alloc/cmd-ts";
|
|
2
|
-
|
|
3
|
-
//#region runner.d.ts
|
|
4
|
-
type CliErrorReporterOptions = {
|
|
5
|
-
formatMessage?: (error: unknown) => string | undefined;
|
|
6
|
-
temporaryDirectory?: string;
|
|
7
|
-
write?: (message: string) => void;
|
|
8
|
-
};
|
|
9
|
-
type Command = Parameters<typeof cmdts.binary>[0];
|
|
10
|
-
type RunFunction = () => unknown | PromiseLike<unknown>;
|
|
11
|
-
type RunOptions = Pick<CliErrorReporterOptions, "formatMessage">;
|
|
12
|
-
declare function reportCliError(error: unknown, {
|
|
13
|
-
formatMessage,
|
|
14
|
-
temporaryDirectory,
|
|
15
|
-
write
|
|
16
|
-
}?: CliErrorReporterOptions): string | undefined;
|
|
17
|
-
declare function run(command: Command, options?: RunOptions): void;
|
|
18
|
-
declare function run(fn: RunFunction, options?: RunOptions): void;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { reportCliError, run };
|
package/dist/runner.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{join as e}from"node:path";import{mkdtempSync as t,writeFileSync as n}from"node:fs";import{tmpdir as r}from"node:os";import*as i from"@alloc/cmd-ts";import{inspect as a}from"node:util";function o(i,{formatMessage:a,temporaryDirectory:o=r(),write:s=e=>console.error(e)}={}){let u=f(i),d=m(c(i,a),u);try{let r=e(t(e(o,`coreframe-error-`)),`error.log`);return n(r,`${m(l(i),u)}\n`,{mode:384}),s(`Error: ${d}\nFull diagnostic: ${r}`),r}catch{s(`Error: ${d}\nThe full diagnostic could not be written to the temporary directory.`);return}}function s(e,t={}){let n=typeof e==`function`?e:()=>i.run(i.binary(e),process.argv),r=!1,a=e=>{r||(r=!0,o(e,t),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(n).catch(a)}function c(e,t){try{return t?.(e)||(e instanceof Error?e.message:String(e)).split(/\r?\n/,1)[0]||`Unknown error`}catch{return`Unknown error`}}function l(e){try{let t=u(e);if(!(e instanceof Error)||!d(t))return a(t,{customInspect:!1,depth:10});let n=typeof t.stack==`string`?t.stack:`${e.name}: ${e.message}`;return delete t.name,delete t.message,delete t.stack,`${n}${Reflect.ownKeys(t).length?`\n${a(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function u(e,t=new WeakMap){if((typeof e!=`object`||!e)&&typeof e!=`function`)return e;let n=e,r=t.get(n);if(r)return r;if(typeof e==`function`)return`[Function${e.name?`: ${e.name}`:``}]`;let i=Array.isArray(e)?[]:{};t.set(n,i),e instanceof Error&&(i.name=e.name,i.message=e.message,i.stack=e.stack??`${e.name}: ${e.message}`);for(let r of Reflect.ownKeys(n)){if(typeof r!=`string`||r.toLowerCase()===`env`||Array.isArray(e)&&r===`length`||e instanceof Error&&(r===`name`||r===`message`||r===`stack`))continue;let a=Object.getOwnPropertyDescriptor(n,r);!a||!(`value`in a)||Object.defineProperty(i,r,{configurable:!0,enumerable:!0,value:u(a.value,t),writable:!0})}return i}function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t=new WeakSet){let n=new Set;function r(e){if((typeof e!=`object`||!e)&&typeof e!=`function`)return;let i=e;if(!t.has(i)){t.add(i);for(let e of Reflect.ownKeys(i)){if(typeof e!=`string`)continue;let t=Object.getOwnPropertyDescriptor(i,e);!t||!(`value`in t)||(e.toLowerCase()===`env`?p(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function p(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function m(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}export{o as reportCliError,s as run};
|
package/dist/staging.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { StagingHostnameConfig } from "./deploy/config.js";
|
|
2
|
-
|
|
3
|
-
//#region staging.d.ts
|
|
4
|
-
declare const stagingHostnameWords: readonly ["amber", "cedar", "cobalt", "coral", "ember", "fern", "indigo", "juniper", "lilac", "maple", "marble", "meadow", "moss", "pebble", "pine", "plum", "quartz", "river", "sable", "sage", "silver", "spruce", "willow"];
|
|
5
|
-
type CloudflareDomain = {
|
|
6
|
-
id: string;
|
|
7
|
-
hostname: string;
|
|
8
|
-
service: string;
|
|
9
|
-
zone_id: string;
|
|
10
|
-
zone_name: string;
|
|
11
|
-
};
|
|
12
|
-
type StagingEnvironment = NodeJS.ProcessEnv & {
|
|
13
|
-
CLOUDFLARE_ACCOUNT_ID?: string;
|
|
14
|
-
CLOUDFLARE_API_TOKEN?: string;
|
|
15
|
-
CLOUDFLARE_ZONE_ID?: string;
|
|
16
|
-
};
|
|
17
|
-
type StagingDependencies = {
|
|
18
|
-
env?: StagingEnvironment;
|
|
19
|
-
fetch?: typeof fetch;
|
|
20
|
-
randomBytes?: (size: number) => Uint8Array;
|
|
21
|
-
sleep?: (milliseconds: number) => Promise<void>;
|
|
22
|
-
};
|
|
23
|
-
type StagingAssignment = {
|
|
24
|
-
previousUrl?: string;
|
|
25
|
-
url: string;
|
|
26
|
-
};
|
|
27
|
-
declare function discoverStagingUrl(dependencies?: StagingDependencies): Promise<string>;
|
|
28
|
-
declare function reassignStagingHostname(dependencies?: StagingDependencies): Promise<StagingAssignment>;
|
|
29
|
-
declare function generateStagingHostname(config: StagingHostnameConfig, random?: (size: number) => Uint8Array): string;
|
|
30
|
-
declare function generateAvailableHostname(config: StagingHostnameConfig, occupied: ReadonlySet<string>, random?: (size: number) => Uint8Array): string;
|
|
31
|
-
declare function discoverManagedDomain(domains: readonly CloudflareDomain[], config: StagingHostnameConfig): CloudflareDomain;
|
|
32
|
-
//#endregion
|
|
33
|
-
export { StagingAssignment, discoverManagedDomain, discoverStagingUrl, generateAvailableHostname, generateStagingHostname, reassignStagingHostname, stagingHostnameWords };
|
package/dist/staging.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{readProjectConfig as e}from"./config.js";import{runDeploySmokeChecks as t}from"./deploy/checks.js";import{resolveDeployConfig as n}from"./deploy/config.js";import{randomBytes as r}from"node:crypto";const i=`APP_ORIGIN`,a=[`amber`,`cedar`,`cobalt`,`coral`,`ember`,`fern`,`indigo`,`juniper`,`lilac`,`maple`,`marble`,`meadow`,`moss`,`pebble`,`pine`,`plum`,`quartz`,`river`,`sable`,`sage`,`silver`,`spruce`,`willow`];async function o(e={}){let t=await d(e),n=u(await f(t),t.config);if(!n)throw Error("No pinned staging hostname exists. Run `coreframe staging reassign` to assign one.");return T(n)}async function s(r={}){let i=await d(r),a=await f(i),o=u(a,i.config),s=o?new URL(T(o)).origin:await g(i),c=l(i.config,new Set(a.map(e=>e.hostname)),i.random),y=`https://${c}/`,b,x=!1,S=!1;try{x=!0,b=await p(i,c),await v(i,y),await h(i,new URL(y).origin),S=!0,await t(n((await e()).deploy??{},`staging`,{}),{environment:`staging`,releaseName:`staging-hostname-reassignment`,url:y,version:`staging`},i.request,()=>void 0)}catch(e){let t=[];if(S)try{s?await h(i,s):await _(i)}catch(e){t.push(M(e))}let n=b;if(!n&&x)try{n=(await f(i)).find(e=>e.hostname===c&&e.service===i.config.workerService&&e.zone_id===i.zoneId)}catch(e){t.push(M(e))}if(n)try{await m(i,n)}catch(e){t.push(M(e))}throw C(e,t,!!o)}if(o)try{await m(i,o)}catch(e){throw Error(`The new staging URL ${y} is ready, but the old hostname ${o.hostname} could not be detached: ${M(e).message}\nRotation is incomplete and discovery is now ambiguous. In the Cloudflare dashboard, verify ${y} and detach only domain ID ${o.id} (${o.hostname}); do not detach unrelated domains.`)}return{previousUrl:o?T(o):void 0,url:y}}function c(e,t=r){x(e);let n=t(5);if(n.length<5)throw Error(`The secure random source returned too few bytes.`);let i=a[n[0]%a.length],o=Array.from(n.slice(1,5),e=>String.fromCharCode(97+e%26)).join(``);return`${e.managedLabelPrefix}${i}-${o}.${e.parentHostname}`}function l(e,t,n=r){for(let r=0;r<24;r+=1){let r=c(e,n);if(!t.has(r))return r}throw Error(`Could not find an unused staging hostname after 24 attempts.`)}function u(e,t){x(t);let n=S(t),r=e.filter(e=>e.service===t.workerService&&e.hostname.endsWith(`.${t.parentHostname}`)&&n.test(e.hostname));if(r.length>1)throw Error(`Found multiple CLI-managed staging domains for ${t.workerService}: ${r.map(e=>`${e.hostname} (${e.id})`).join(`, `)}. Refusing to guess. In Cloudflare, retain the intended domain and detach only obsolete domains after verifying their IDs, then rerun the command.`);return r[0]}async function d(t){let n=t.env??process.env,i=(await e()).deploy?.stagingHostname;if(!i)throw Error(`Missing deploy.stagingHostname in coreframe.config.ts. Configure workerService, parentHostname, and managedLabelPrefix.`);return x(i),{accountId:w(n,`CLOUDFLARE_ACCOUNT_ID`),apiToken:w(n,`CLOUDFLARE_API_TOKEN`),config:i,env:n,random:t.randomBytes??r,request:t.fetch??fetch,sleep:t.sleep??(e=>new Promise(t=>setTimeout(t,e))),zoneId:w(n,`CLOUDFLARE_ZONE_ID`)}}async function f(e){let t=[],n=1,r=1;do{let i=new URLSearchParams({page:String(n),per_page:`50`,zone_id:e.zoneId}),a=await y(e,`/accounts/${encodeURIComponent(e.accountId)}/workers/domains?${i}`),o=D(a.result,`domain list`).map(b);if(o.some(t=>t.zone_id!==e.zoneId))throw Error(`Cloudflare returned a Custom Domain outside the configured zone.`);t.push(...o),r=E(a.result_info?.total_pages),n+=1}while(n<=r);return t}async function p(e,t){let n=b((await y(e,`/accounts/${encodeURIComponent(e.accountId)}/workers/domains`,{body:JSON.stringify({hostname:t,service:e.config.workerService,zone_id:e.zoneId}),method:`PUT`})).result);if(n.hostname!==t||n.service!==e.config.workerService||n.zone_id!==e.zoneId)throw Error(`Cloudflare returned a Custom Domain that did not match the attach request.`);return n}async function m(e,t){if(t.service!==e.config.workerService||t.zone_id!==e.zoneId||!S(e.config).test(t.hostname))throw Error(`Refusing to detach unmanaged hostname ${t.hostname}.`);await y(e,`/accounts/${encodeURIComponent(e.accountId)}/workers/domains/${encodeURIComponent(t.id)}`,{method:`DELETE`})}async function h(e,t){await y(e,`/accounts/${encodeURIComponent(e.accountId)}/workers/scripts/${encodeURIComponent(e.config.workerService)}/secrets`,{body:JSON.stringify({name:i,text:t,type:`secret_text`}),method:`PUT`})}async function g(e){if(!D((await y(e,`/accounts/${encodeURIComponent(e.accountId)}/workers/scripts/${encodeURIComponent(e.config.workerService)}/secrets`)).result,`secret list`).some(e=>{if(!O(e)||!k(e.name)||!k(e.type))throw Error(`Cloudflare returned an invalid Worker secret response.`);return e.name===i}))return;let t=e.env.DEPLOY_URL;if(!t)throw Error(`The staging Worker already has APP_ORIGIN but no managed hostname identifies its prior value. Refusing to mutate it without rollback information. Rerun with DEPLOY_URL set to the exact current staging origin.`);return N(t,`DEPLOY_URL`)}async function _(e){await y(e,`/accounts/${encodeURIComponent(e.accountId)}/workers/scripts/${encodeURIComponent(e.config.workerService)}/secrets/${i}`,{method:`DELETE`})}async function v(e,t){let n;for(let r=1;r<=24;r+=1)try{await e.request(t,{redirect:`manual`});return}catch(t){n=M(t),r<24&&await e.sleep(5e3)}throw Error(`Staging hostname did not become DNS/TLS/HTTP ready: ${n?.message}`)}async function y(e,t,n={}){let r=await e.request(`https://api.cloudflare.com/client/v4${t}`,{...n,headers:{Authorization:`Bearer ${e.apiToken}`,...n.body?{"Content-Type":`application/json`}:{}}}),i=await r.json().catch(()=>void 0);if(!O(i))throw Error(`Cloudflare returned an invalid response (${r.status}).`);let a=i;if(!r.ok||a.success!==!0){let e=a.errors?.map(e=>e.message).filter(Boolean).join(`; `);throw Error(`Cloudflare API request failed (${r.status})${e?`: ${e}`:`.`}`)}return a}function b(e){if(!O(e)||!k(e.id)||!k(e.hostname)||!k(e.service)||!k(e.zone_id)||!k(e.zone_name))throw Error(`Cloudflare returned an invalid Custom Domain response.`);return{hostname:e.hostname.toLowerCase(),id:e.id,service:e.service,zone_id:e.zone_id,zone_name:e.zone_name}}function x(e){let t=e.parentHostname.toLowerCase();if(e.parentHostname!==t||!A(t)||t.includes(`*`))throw Error(`deploy.stagingHostname.parentHostname must be a lowercase DNS hostname.`);if(!/^[a-z0-9-]*$/.test(e.managedLabelPrefix))throw Error(`deploy.stagingHostname.managedLabelPrefix must contain only lowercase letters, digits, or hyphens.`);let n=Math.max(...a.map(e=>e.length));if(e.managedLabelPrefix.length+n+5>63)throw Error(`deploy.stagingHostname.managedLabelPrefix is too long for a DNS label.`);if(!/^[a-z0-9][a-z0-9-]*$/.test(e.workerService))throw Error(`deploy.stagingHostname.workerService is invalid.`)}function S(e){let t=a.join(`|`);return RegExp(`^${j(e.managedLabelPrefix)}(?:${t})-[a-z]{4}\\.${j(e.parentHostname)}$`)}function C(e,t,n){let r=t.length?`\nRollback also failed: ${t.map(e=>e.message).join(`; `)}`:n?`
|
|
2
|
-
The old staging hostname was retained and the new hostname was rolled back.`:`
|
|
3
|
-
The new hostname was rolled back and APP_ORIGIN was restored to its prior state.`;return Error(`Staging hostname reassignment failed: ${M(e).message}${r}`)}function w(e,t){let n=e[t];if(!n)throw Error(`Missing required environment variable ${t}.`);return n}function T(e){return`https://${e.hostname}/`}function E(e){if(e===void 0)return 1;if(!Number.isInteger(e)||e<1||e>1e4)throw Error(`Cloudflare returned invalid domain-list pagination.`);return e}function D(e,t){if(!Array.isArray(e))throw Error(`Cloudflare returned an invalid ${t} response.`);return e}function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function k(e){return typeof e==`string`&&e.length>0}function A(e){return e.length<=253&&e.split(`.`).every(e=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(e))}function j(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function M(e){return e instanceof Error?e:Error(String(e))}function N(e,t){let n;try{n=new URL(e)}catch{throw Error(`${t} must be an exact HTTPS origin.`)}if(n.protocol!==`https:`||n.username||n.password||n.pathname!==`/`||n.search||n.hash)throw Error(`${t} must be an exact HTTPS origin.`);return n.origin}export{u as discoverManagedDomain,o as discoverStagingUrl,l as generateAvailableHostname,c as generateStagingHostname,s as reassignStagingHostname,a as stagingHostnameWords};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Writable } from "node:stream";
|
|
2
|
-
|
|
3
|
-
//#region tauri-dev-output.d.ts
|
|
4
|
-
type TauriDevOutput = {
|
|
5
|
-
close(): Promise<void>;
|
|
6
|
-
consume(lines: AsyncIterable<string>): Promise<void>;
|
|
7
|
-
failureReason(): TauriDevFailureReason | undefined;
|
|
8
|
-
logFile: string;
|
|
9
|
-
reportFailure(): Promise<void>;
|
|
10
|
-
};
|
|
11
|
-
type TauriDevFailureReason = "locked-device";
|
|
12
|
-
type CreateTauriDevOutputOptions = {
|
|
13
|
-
output: Writable;
|
|
14
|
-
temporaryDirectory?: string;
|
|
15
|
-
};
|
|
16
|
-
declare function createTauriDevOutput({
|
|
17
|
-
output,
|
|
18
|
-
temporaryDirectory
|
|
19
|
-
}: CreateTauriDevOutputOptions): Promise<TauriDevOutput>;
|
|
20
|
-
//#endregion
|
|
21
|
-
export { TauriDevFailureReason, TauriDevOutput, createTauriDevOutput };
|
package/dist/tauri-dev-output.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{mkdtemp as e}from"node:fs/promises";import t from"node:path";import{createWriteStream as n}from"node:fs";import{tmpdir as r}from"node:os";import{finished as i}from"node:stream/promises";import{stripVTControlCharacters as a}from"node:util";import{once as o}from"node:events";async function s({output:i,temporaryDirectory:a=r()}){let s=await e(t.join(a,`coreframe-ios-dev-`)),l=t.join(s,`tauri.log`),u=n(l,{flags:`wx`,mode:384});return await o(u,`open`),new c(l,u,i)}var c=class{logFile;closed=!1;failureLines=[];lockedDeviceFailure=!1;log;output;runtime=!1;showInstalledBundleId=!1;constructor(e,t,n){this.logFile=e,this.log=t,this.output=n}async consume(e){try{for await(let t of e)await f(this.log,`${t}\n`),this.rememberFailureLine(t),this.shouldShow(t)&&await f(this.output,`${t}\n`)}catch{}}async reportFailure(){await f(this.output,`iOS development failed. Recent diagnostic output:
|
|
2
|
-
`);for(let e of this.failureLines)await f(this.output,`${e}\n`);await f(this.output,`Full iOS log: ${this.logFile}\n`)}failureReason(){return this.lockedDeviceFailure?`locked-device`:void 0}async close(){this.closed||(this.closed=!0,this.log.end(),await i(this.log))}shouldShow(e){let t=a(e).trim();if(t===`Building app...`)return this.runtime=!1,!0;if(u(t))return!1;if(t.startsWith(`Launched application with `))return this.runtime=!0,!0;if(this.runtime)return!0;if(t===`App installed:`)return this.showInstalledBundleId=!0,!0;if(this.showInstalledBundleId){if(t.length===0)return!1;if(this.showInstalledBundleId=!1,t.startsWith(`• bundleID:`))return!0}return/^(Archiving app|Exporting app|Extracting IPA|Deploying app to device|Pairing with device)\.\.\.$/u.test(t)||/^\*\* BUILD (?:SUCCEEDED|FAILED) \*\*$/u.test(t)||/^(?:Compiling|Checking|Finished)\b/u.test(t)||/^(?:Warn|Error)\b/u.test(t)||/(?:^|:\d+:\d+: )(?:warning|error)(?:\[[^\]]+\])?:/iu.test(t)||/^(?:fatal:|thread .+ panicked|Failed to |No device found\.|The following build commands failed:|command \[.+\] exited)/iu.test(t)||/^Info Watching\b/u.test(t)||/^note: run with RUST_BACKTRACE=/u.test(t)}rememberFailureLine(e){let t=a(e).trim();l(t)&&(this.lockedDeviceFailure=!0),!d(t)&&(this.failureLines.push(e),this.failureLines.length>40&&this.failureLines.shift())}};function l(e){return/\bBSErrorCodeDescription\s*=\s*Locked\b/iu.test(e)||/\bNSLocalizedFailureReason\s*=.*\breason:\s*Locked\b/iu.test(e)||/Unable to launch (?:the )?(?:iOS )?app(?:lication)? because the device (?:was not|could not be), or could not be, unlocked/iu.test(e)}function u(e){return e.startsWith(`--- xcodebuild: WARNING: Using the first of multiple matching destinations:`)||/^Failed to load provisioning param(?:e)?ter list due to error:/u.test(e)||e==="`devicectl manage create` may support a reduced set of arguments."||/(?:^|\/)idevicesyslog$/u.test(e)}function d(e){return e.length===0||e.startsWith(`export `)||e.startsWith(`inflating:`)||e.startsWith(`Archive:`)||e.startsWith(`cd `)||e.startsWith(`/bin/sh -c `)||e.startsWith(`Command line invocation:`)||e.startsWith(`Build settings from command line:`)}async function f(e,t){e.write(t)||await o(e,`drain`)}export{s as createTauriDevOutput};
|
package/dist/typecheck.d.ts
DELETED
package/dist/typecheck.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{access as e}from"node:fs/promises";import t from"node:path";import n from"node:process";import{supervise as r}from"procband";const i=t.resolve(`node_modules`,`.bin`);n.env.PATH=i+t.delimiter+n.env.PATH;const a=n.platform===`win32`?`tsc.cmd`:`tsc`,o=[{name:`scripts`,path:`scripts/tsconfig.json`},{name:`shared`,path:`src/shared/tsconfig.json`},{name:`api`,path:`src/api/tsconfig.json`},{name:`worker`,path:`src/api/worker/tsconfig.json`},{name:`web`,path:`src/web/tsconfig.json`}];async function s(){let t=[];for(let n of o)try{await e(n.path),t.push(n)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let i=t.map(e=>r({name:e.name,command:a,args:[`-p`,e.path]})),s=(await Promise.all(i.map(e=>e.wait()))).filter(e=>e.exitCode!==0);s.length>0&&(n.exitCode=s[0].exitCode)}export{s as typecheckProject};
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
//#region upgrade/check-skill-current.d.ts
|
|
2
|
-
type CheckUpgradeSkillOptions = {
|
|
3
|
-
apply: boolean;
|
|
4
|
-
target: string;
|
|
5
|
-
};
|
|
6
|
-
declare function checkUpgradeSkillCurrent({
|
|
7
|
-
apply,
|
|
8
|
-
target
|
|
9
|
-
}: CheckUpgradeSkillOptions): 0 | 20;
|
|
10
|
-
//#endregion
|
|
11
|
-
export { CheckUpgradeSkillOptions, checkUpgradeSkillCurrent };
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{coreframeGitRef as e,coreframeTemplateFile as t}from"./template-ref.js";import{join as n}from"node:path";import{existsSync as r,mkdtempSync as i,readFileSync as a,rmSync as o,writeFileSync as s}from"node:fs";import{tmpdir as c}from"node:os";import{spawnSync as l}from"node:child_process";const u=`.agents/skills/coreframe-upgrade/SKILL.md`;function d(e,t={}){return l(`git`,e,t)}function f(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function p(e,n){let r=t(e,n),i=d([`show`,r],{encoding:`utf8`});if(i.status!==0){let e=f(i);throw Error(`Could not read ${r}.${e?` ${e}`:``}`)}return i.stdout.toString()}function m(){let e=d([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=f(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function h(e,t){let r=i(n(c(),`coreframe-upgrade-skill-`)),a=n(r,`SKILL.md`);try{s(a,t);let n=f(d([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,a]));n&&console.log(n)}finally{o(r,{force:!0,recursive:!0})}}function g({apply:t,target:i}){let o=n(m(),u),c=e(i);if(!r(o))throw Error(`Local ${u} does not exist.`);let l=a(o,`utf8`),d=p(i,u);return l===d?(console.log(`Coreframe upgrade skill matches ${c}:template/${u}.`),0):t?(s(o,d),console.error(`Updated ${u} from ${c}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${c}:template/${u}.`),console.error(`Run again with --apply to update it, then reread ${u} before continuing.`),h(o,d),20)}export{g as checkUpgradeSkillCurrent};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region upgrade/ensure-template-remote.d.ts
|
|
2
|
-
type EnsureTemplateRemoteOptions = {
|
|
3
|
-
cwd: string;
|
|
4
|
-
fetch: boolean;
|
|
5
|
-
remote: string;
|
|
6
|
-
};
|
|
7
|
-
declare function ensureTemplateRemote({
|
|
8
|
-
cwd,
|
|
9
|
-
fetch,
|
|
10
|
-
remote
|
|
11
|
-
}?: Partial<EnsureTemplateRemoteOptions>): void;
|
|
12
|
-
//#endregion
|
|
13
|
-
export { EnsureTemplateRemoteOptions, ensureTemplateRemote };
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{spawnSync as e}from"node:child_process";const t=`https://github.com/airlock-labs/coreframe.git`;function n(t,n){return e(`git`,t,{cwd:n,encoding:`utf8`})}function r(e,t){let r=n(e,t);if(r.status!==0){let t=r.stderr.trim()||r.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${t?`\n${t}`:``}`)}return r.stdout}function i(e,t){let r=n([`remote`,`get-url`,e],t);if(r.status===2)return null;if(r.status!==0){let t=r.stderr.trim()||r.stdout.trim();throw Error(`Could not inspect remote ${e}.${t?`\n${t}`:``}`)}return r.stdout.trim()}function a({cwd:e=process.cwd(),fetch:n=!0,remote:a=`template`}={}){if(a.length===0)throw Error(`Remote name must not be empty.`);r([`rev-parse`,`--show-toplevel`],e);let o=i(a,e);if(o===null)r([`remote`,`add`,a,t],e),console.log(`Added ${a} remote: ${t}`);else if(o===t)console.log(`${a} remote already points at ${t}`);else throw Error(`${a} remote points at ${o}, not ${t}.\nChoose the intended template source before continuing, then update or rename the remote manually.`);n&&(r([`fetch`,a,`--tags`,`--prune`],e),console.log(`Fetched ${a}.`))}export{a as ensureTemplateRemote};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
//#region upgrade/fast-forward-template-files.d.ts
|
|
2
|
-
type FastForwardTemplateFilesOptions = {
|
|
3
|
-
apply: boolean;
|
|
4
|
-
base?: string;
|
|
5
|
-
target: string;
|
|
6
|
-
};
|
|
7
|
-
declare function fastForwardTemplateFiles(args: FastForwardTemplateFilesOptions): void;
|
|
8
|
-
//#endregion
|
|
9
|
-
export { FastForwardTemplateFilesOptions, fastForwardTemplateFiles };
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{coreframeGitRef as e,coreframeTemplateTree as t}from"./template-ref.js";import{dirname as n,join as r,resolve as i,sep as a}from"node:path";import{chmodSync as o,existsSync as s,lstatSync as c,mkdirSync as l,readFileSync as u,readlinkSync as d,rmSync as f,symlinkSync as p,writeFileSync as m}from"node:fs";import{spawnSync as h}from"node:child_process";const g=[{matches:e=>e===`drizzle`||e.startsWith(`drizzle/`),reason:`project-owned migration history`},{matches:e=>e===`drizzle-hold`||e.startsWith(`drizzle-hold/`),reason:`project-owned migration history`},{matches:e=>e===`src/web/routes.ts`||e.startsWith(`src/web/app/routes/`),reason:`downstream-owned demonstration routes`},{matches:e=>e===`pnpm-lock.yaml`||e===`src-tauri/Cargo.lock`,reason:`downstream-owned dependency lockfile`}],_=new Set([`100644`,`100755`,`120000`]);function v(e,t={}){return h(`git`,e,t)}function y(e){let t=v(e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.toString().trim()||t.stdout.toString().trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout.toString()}function b(e){let t=v(e);if(t.status!==0){let n=t.stderr.toString(`utf8`).trim()||t.stdout.toString(`utf8`).trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function x(){return y([`rev-parse`,`--show-toplevel`]).trim()}function S(e){let t=r(e,`package.json`);if(!s(t))throw Error(`Missing --base <git-ref>, and package.json does not exist.`);let n=JSON.parse(u(t,`utf8`)).engines?.coreframe;if(typeof n!=`string`||n.length===0)throw Error(`Missing --base <git-ref>, and package.json engines.coreframe is not set.`);return n}function C(e){let t=[],n=0;for(let r=0;r<e.length;r+=1)e[r]===0&&(t.push(e.subarray(n,r).toString(`utf8`)),n=r+1);return t.filter(e=>e.length>0)}function w(e,n){let r=C(b([`diff`,`--name-status`,`-z`,`--no-renames`,t(e),t(n),`--`])),i=[];for(let e=0;e<r.length;e+=2){let t=r[e],n=r[e+1];if(!t||!n)throw Error(`Could not parse git diff --name-status output.`);i.push({path:n,status:t})}return i}function T(e,n){let r=b([`ls-tree`,`-z`,t(e),`--`,n]);if(r.length===0)return null;let i=C(r)[0],a=i.indexOf(` `);if(a===-1)throw Error(`Could not parse git ls-tree output for ${e}:${n}.`);let[o,s,c]=i.slice(0,a).split(` `);if(!o||!s||!c)throw Error(`Could not parse git ls-tree metadata for ${e}:${n}.`);return{mode:o,object:c,path:n,type:s}}function E(e){return b([`cat-file`,`blob`,e.object])}function D(e,t){let n=i(e,t),r=e.endsWith(a)?e:`${e}${a}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function O(e){try{return c(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function k(e){return(e.mode&73)!=0}function A(e){return e===null||e.type===`blob`&&_.has(e.mode)}function j(e){return g.find(t=>t.matches(e))?.reason}function M(e,t,n){let r=D(e,t);if(n===null)return{matches:!O(r)};if(!A(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=c(r)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return{matches:!1,reason:`path is missing from worktree`};throw e}let a=E(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(d(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?k(i):!k(i))?{matches:u(r).equals(a)}:{matches:!1,reason:`worktree executable bit differs from template`}:{matches:!1,reason:`worktree path is not a regular file`}}function N(e){O(e)&&f(e,{force:!0,recursive:!1})}function P(e,t,r){let i=D(e,t);if(r===null){N(i);return}if(l(n(i),{recursive:!0}),r.mode===`120000`){N(i),p(E(r).toString(`utf8`),i);return}let a=O(i)?c(i):null;a&&!a.isFile()&&N(i),m(i,E(r)),o(i,r.mode===`100755`?493:420)}function F(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function I(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t){let t=e.reason?` (${e.reason})`:``;console.log(` ${e.action}: ${e.path}${t}`)}console.log(``)}}function L(t){let n=x(),r=e(t.base??S(n)),i=e(t.target),a=w(r,i),o=[],s=[],c=[],l=[];for(let e of a){let t=j(e.path);if(t){s.push({action:`ignored`,path:e.path,reason:t});continue}let a=T(r,e.path),u=T(i,e.path),d=F(a,u);if(!A(a)||!A(u)){c.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(M(n,e.path,u).matches){l.push({action:`unchanged`,path:e.path});continue}let f=M(n,e.path,a);if(!f.matches){c.push({action:d,path:e.path,reason:f.reason??`downstream differs from base template`});continue}o.push({action:d,path:e.path,targetEntry:u})}if(t.apply)for(let e of o)P(n,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${r} -> ${i}`),console.log(``),I(t.apply?`Applied clean template updates`:`Would apply clean template updates`,o),I(`Ignored downstream-owned paths`,s),I(`Skipped for agent review`,c),l.length>0&&console.log(`${l.length} changed template path(s) already matched the target state.`),a.length===0&&console.log(`No template file changes found in the requested range.`),!t.apply&&o.length>0&&(console.log(``),console.log(`Run with --apply to write the ${o.length} clean update(s).`))}export{L as fastForwardTemplateFiles};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
//#region upgrade/sync-coreframe-packages.d.ts
|
|
2
|
-
type SyncCoreframePackagesOptions = {
|
|
3
|
-
apply: boolean;
|
|
4
|
-
target: string;
|
|
5
|
-
};
|
|
6
|
-
declare function syncCoreframePackages(args: SyncCoreframePackagesOptions): void;
|
|
7
|
-
//#endregion
|
|
8
|
-
export { SyncCoreframePackagesOptions, syncCoreframePackages };
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{coreframeGitRef as e}from"./template-ref.js";import{posix as t,resolve as n}from"node:path";import{readFileSync as r,writeFileSync as i}from"node:fs";import{spawnSync as a}from"node:child_process";const o=[`dependencies`,`devDependencies`];function s(e){let t=a(`git`,e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.trim()||t.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function c(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function l(t,n){let r=`${e(t)}:${n}`;return c(s([`show`,r]),r)}function u(e){return e.startsWith(`@coreframe/`)}function d(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function f(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function p(e,n){let r=e.indexOf(`:`),i=e.slice(r+1),a=t.normalize(t.join(`template`,i,`package.json`));if(i.length===0||t.isAbsolute(i)||a===`..`||a.startsWith(`../`))throw Error(`Invalid local template dependency for ${n}: ${e}`);return a}function m(t){let n=l(t,`template/package.json`),r=[],i=new Set;for(let a of o)for(let[o,s]of Object.entries(n[a]??{})){if(!u(o)||!f(s))continue;if(i.has(o))throw Error(`Target template declares ${o} more than once.`);let n=p(s,o),c=l(t,n);if(c.name!==o||typeof c.version!=`string`)throw Error(`${e(t)}:${n} must declare ${o} with a version.`);r.push({group:a,name:o,spec:`^${c.version}`}),i.add(o)}return r}function h(e,t){for(let n of o){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function g(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,a=t.endsWith(`
|
|
3
|
-
`)?`
|
|
4
|
-
`:``;i(e,`${JSON.stringify(n,null,r)}${a}`)}function _(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function v(t){let i=n(s([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),a=r(i,`utf8`),l=c(a,i),f=e(t.target),p=m(f),v=new Set(p.map(({name:e})=>e)),y=[],b=[],x=[],S=0;for(let e of p){let t=h(l,e.name);if(!t){b.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(d(t.spec)){x.push(`linked: ${e.name} ${t.spec}`);continue}if(t.spec===e.spec){S+=1;continue}y.push({...e,currentGroup:t.group,currentSpec:t.spec})}let C=o.flatMap(e=>Object.entries(l[e]??{}).filter(([e])=>u(e)&&!v.has(e)).map(([t,n])=>`review: ${t} ${n} (${e})`));if(t.apply&&y.length>0){for(let e of y)l[e.currentGroup][e.name]=e.spec;g(i,a,l)}console.log(`Coreframe package sync: ${f}`),console.log(``),_(t.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,y.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),_(`Missing target Coreframe packages`,b),_(`Locally linked Coreframe packages`,x),_(`Downstream-only Coreframe packages`,C),S>0&&console.log(`${S} Coreframe package(s) already match the target versions.`),y.length===0?console.log(`No Coreframe package version updates found.`):t.apply||(console.log(``),console.log(`Run with --apply to write the ${y.length} package update(s).`))}export{v as syncCoreframePackages};
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
//#region upgrade/template-ref.d.ts
|
|
2
|
-
declare function coreframeGitRef(ref: string): string;
|
|
3
|
-
declare function coreframeTemplateTree(ref: string): string;
|
|
4
|
-
declare function coreframeTemplateFile(ref: string, path: string): string;
|
|
5
|
-
//#endregion
|
|
6
|
-
export { coreframeGitRef, coreframeTemplateFile, coreframeTemplateTree };
|