create-astrale-domain 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +95 -27
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -780,7 +780,7 @@ import { existsSync as existsSync2 } from "node:fs";
780
780
  import { delimiter, join as join2, relative as relative2, resolve as resolve2 } from "node:path";
781
781
 
782
782
  // src/scaffold.ts
783
- import { existsSync } from "node:fs";
783
+ import { existsSync, readFileSync } from "node:fs";
784
784
  import { cp, readFile, rm, writeFile } from "node:fs/promises";
785
785
  import { createRequire } from "node:module";
786
786
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
@@ -804,7 +804,43 @@ var ADAPTER_PACKAGES = {
804
804
  astrale: "@astrale-os/adapter-astrale",
805
805
  cloudflare: "@astrale-os/adapter-cloudflare"
806
806
  };
807
- var ADAPTER_DEP_RANGE = ">=0.1.0 <1.0.0";
807
+ function packageJson(pkgName) {
808
+ const rel = LINK_TARGETS[pkgName];
809
+ if (rel) {
810
+ const local = join(WORKSPACE_ROOT, rel, "package.json");
811
+ if (existsSync(local)) return JSON.parse(readFileSync(local, "utf-8"));
812
+ }
813
+ const direct = tryPackageJson(require2, pkgName);
814
+ if (direct) return direct;
815
+ for (const owner of /* @__PURE__ */ new Set([BODY_PACKAGE, ...Object.values(ADAPTER_PACKAGES)])) {
816
+ const ownerPkgPath = tryResolve(`${owner}/package.json`);
817
+ if (!ownerPkgPath) continue;
818
+ const ownerRequire = createRequire(ownerPkgPath);
819
+ const nested = tryPackageJson(ownerRequire, pkgName);
820
+ if (nested) return nested;
821
+ }
822
+ throw new Error(`Could not read ${pkgName} package.json.`);
823
+ }
824
+ function tryResolve(id) {
825
+ try {
826
+ return require2.resolve(id);
827
+ } catch {
828
+ return void 0;
829
+ }
830
+ }
831
+ function tryPackageJson(req, pkgName) {
832
+ try {
833
+ return req(`${pkgName}/package.json`);
834
+ } catch {
835
+ return void 0;
836
+ }
837
+ }
838
+ function publishedDepVersion(pkgName) {
839
+ const pkg = packageJson(pkgName);
840
+ const version = pkg.version;
841
+ if (!version) throw new Error(`Could not read ${pkgName} package version.`);
842
+ return version;
843
+ }
808
844
  function templateDir(pkg) {
809
845
  return join(dirname(require2.resolve(`${pkg}/package.json`)), "template");
810
846
  }
@@ -819,12 +855,15 @@ async function scaffold(opts) {
819
855
  }
820
856
  await cp(src, opts.dir, {
821
857
  recursive: true,
822
- filter: (s) => !/\/(node_modules|\.astrale|dist-client|\.wrangler)(\/|$)/.test(`/${relative(src, s)}`)
858
+ filter: (s) => !/\/(node_modules|\.astrale|dist-client|\.wrangler|pnpm-lock\.yaml|\.DS_Store)(\/|$)/.test(
859
+ `/${relative(src, s)}`
860
+ )
823
861
  });
824
862
  await materializeAdapter(opts);
825
863
  await stampOrigin(opts.dir, opts.origin);
826
864
  await rewritePackageJson(opts.dir, opts.name, opts.link);
827
- if (opts.link) await linkWorkspaceMember(join(opts.dir, "client", "package.json"));
865
+ await rewriteWorkspaceMember(join(opts.dir, "client", "package.json"), opts.link);
866
+ if (!opts.link) await writeReleaseAgePolicy(opts.dir);
828
867
  await writeFile(
829
868
  join(opts.dir, ".env.dev"),
830
869
  "# Dev secrets \u2014 the ENTIRE file is injected into the local runtime by `pnpm dev`.\n# Gitignored. See .env.example.\n"
@@ -858,37 +897,24 @@ async function setAdapterDep(dir, from, to) {
858
897
  const pkg = JSON.parse(await readFile(path, "utf-8"));
859
898
  if (!pkg.dependencies || !(from in pkg.dependencies)) return;
860
899
  delete pkg.dependencies[from];
861
- pkg.dependencies[to] = ADAPTER_DEP_RANGE;
900
+ pkg.dependencies[to] = publishedDepVersion(to);
862
901
  pkg.dependencies = Object.fromEntries(
863
902
  Object.entries(pkg.dependencies).sort(([a], [b3]) => a.localeCompare(b3))
864
903
  );
865
904
  await writeFile(path, JSON.stringify(pkg, null, 2) + "\n");
866
905
  }
867
- async function linkWorkspaceMember(pkgPath) {
906
+ async function rewriteWorkspaceMember(pkgPath, link) {
868
907
  if (!existsSync(pkgPath)) return;
869
908
  const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
870
- let changed = false;
871
- for (const group of [pkg.dependencies, pkg.devDependencies]) {
872
- if (!group) continue;
873
- for (const [dep, rel] of Object.entries(LINK_TARGETS)) {
874
- if (dep in group) {
875
- group[dep] = `link:${join(WORKSPACE_ROOT, rel)}`;
876
- changed = true;
877
- }
878
- }
879
- }
909
+ const changed = rewriteAstraleDeps(pkg, link);
880
910
  if (changed) await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
881
911
  }
882
912
  async function rewritePackageJson(dir, name, link) {
883
913
  const path = join(dir, "package.json");
884
914
  const pkg = JSON.parse(await readFile(path, "utf-8"));
885
915
  pkg.name = name;
886
- if (link && pkg.dependencies) {
887
- for (const [dep, rel] of Object.entries(LINK_TARGETS)) {
888
- if (dep in pkg.dependencies) {
889
- pkg.dependencies[dep] = `link:${join(WORKSPACE_ROOT, rel)}`;
890
- }
891
- }
916
+ rewriteAstraleDeps(pkg, link);
917
+ if (link) {
892
918
  pkg.pnpm = {
893
919
  ...pkg.pnpm,
894
920
  overrides: {
@@ -899,6 +925,50 @@ async function rewritePackageJson(dir, name, link) {
899
925
  }
900
926
  await writeFile(path, JSON.stringify(pkg, null, 2) + "\n");
901
927
  }
928
+ function rewriteAstraleDeps(pkg, link) {
929
+ let changed = false;
930
+ for (const group of [pkg.dependencies, pkg.devDependencies]) {
931
+ if (!group) continue;
932
+ for (const dep of Object.keys(group)) {
933
+ if (!dep.startsWith("@astrale-os/")) continue;
934
+ const next = link && LINK_TARGETS[dep] ? `link:${join(WORKSPACE_ROOT, LINK_TARGETS[dep])}` : publishedDepVersion(dep);
935
+ if (group[dep] !== next) {
936
+ group[dep] = next;
937
+ changed = true;
938
+ }
939
+ }
940
+ }
941
+ return changed;
942
+ }
943
+ async function writeReleaseAgePolicy(dir) {
944
+ const workspace = join(dir, "pnpm-workspace.yaml");
945
+ if (!existsSync(workspace)) return;
946
+ const names = /* @__PURE__ */ new Set();
947
+ for (const pkgPath of [join(dir, "package.json"), join(dir, "client", "package.json")]) {
948
+ if (!existsSync(pkgPath)) continue;
949
+ const pkg = JSON.parse(await readFile(pkgPath, "utf-8"));
950
+ for (const group of [pkg.dependencies, pkg.devDependencies]) {
951
+ for (const [name, spec] of Object.entries(group ?? {})) {
952
+ if (name.startsWith("@astrale-os/") && !spec.startsWith("link:")) names.add(name);
953
+ }
954
+ }
955
+ }
956
+ if (names.size === 0) return;
957
+ const start = "# create-astrale-domain: exact first-party deps";
958
+ const end = "# /create-astrale-domain";
959
+ const block = `
960
+ ${start}
961
+ minimumReleaseAgeExclude:
962
+ ` + [...names].sort().map((name) => ` - '${name}'`).join("\n") + `
963
+ ${end}
964
+ `;
965
+ const text = await readFile(workspace, "utf-8");
966
+ const pattern = new RegExp(`\\n?${escapeRegExp(start)}[\\s\\S]*?${escapeRegExp(end)}\\n?`);
967
+ await writeFile(workspace, text.replace(pattern, "\n").trimEnd() + block);
968
+ }
969
+ function escapeRegExp(value) {
970
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
971
+ }
902
972
  function sdkZodVersion() {
903
973
  const sdkRequire = createRequire(join(WORKSPACE_ROOT, "sdk", "package.json"));
904
974
  const pkg = sdkRequire("zod/package.json");
@@ -973,12 +1043,11 @@ export const methods: SchemaMethodsImpl<typeof schema, Deps> = { class: {} }
973
1043
  await rm(join(dir, "integrations"), { recursive: true, force: true });
974
1044
  await rm(join(dir, "views", "welcome.ts"), { force: true });
975
1045
  await rm(join(dir, "views", "status-page.ts"), { force: true });
976
- await rm(join(dir, "runtime", "monitor"), { recursive: true, force: true });
977
- await rm(join(dir, "runtime", "status-page"), { recursive: true, force: true });
1046
+ await rm(join(dir, "runtime", "monitoring"), { recursive: true, force: true });
978
1047
  await rm(join(dir, "runtime", "shared.ts"), { force: true });
979
1048
  await replaceInFile(
980
1049
  join(dir, "domain.ts"),
981
- /\n\s*postInstall: `\/:\$\{schema\.domain\}:class\.Monitor:seed`,/,
1050
+ /\n(?:[^\S\n]*\/\/[^\n]*\n)*[^\S\n]*postInstall: functions\.seed,/,
982
1051
  ""
983
1052
  );
984
1053
  }
@@ -1165,8 +1234,7 @@ async function main() {
1165
1234
  );
1166
1235
  }
1167
1236
  M2.info(
1168
- `AI agent on this project? The full authoring guide ships at .agents/skills/astrale-domain/SKILL.md
1169
- Agent rooted at a parent workspace? Register the skills there: npx skills add ${cdTarget === dir ? dir : `./${cdTarget}`}/.agents/skills -y`
1237
+ "AI agent on this project? Install the authoring + ops skills once (user-level):\n npx skills add astrale-os/cli -g # or run `astrale setup`"
1170
1238
  );
1171
1239
  Se(`\u2713 ${slug} ready`);
1172
1240
  return 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-astrale-domain",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Scaffold a standalone Astrale domain — npm create astrale-domain",
5
5
  "keywords": [
6
6
  "astrale",
@@ -19,8 +19,8 @@
19
19
  "type": "module",
20
20
  "dependencies": {
21
21
  "@clack/prompts": "^0.11.0",
22
- "@astrale-os/adapter-cloudflare": "^0.2.0",
23
- "@astrale-os/adapter-astrale": "^0.2.0"
22
+ "@astrale-os/adapter-astrale": "^0.3.0",
23
+ "@astrale-os/adapter-cloudflare": "^0.3.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@astrale-os/ox": ">=0.1.0 <1.0.0",