@stacksjs/buddy 0.70.163 → 0.70.164

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 (78) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +1 -0
  3. package/dist/commands/ai-context.js +1 -1
  4. package/dist/commands/create.js +1 -1
  5. package/dist/commands/deploy.d.ts +11 -1
  6. package/dist/commands/deploy.js +22 -4
  7. package/dist/commands/dev.js +44 -14
  8. package/dist/commands/docs/buddy-commands.d.ts +8 -0
  9. package/dist/commands/docs/buddy-commands.js +116 -0
  10. package/dist/commands/docs/buddy-commands.test.d.ts +1 -0
  11. package/dist/commands/docs/buddy-commands.test.js +38 -0
  12. package/dist/commands/docs/generated-artifacts.d.ts +3 -0
  13. package/dist/commands/docs/generated-artifacts.js +69 -0
  14. package/dist/commands/docs/generated-artifacts.test.d.ts +1 -0
  15. package/dist/commands/docs/generated-artifacts.test.js +19 -0
  16. package/dist/commands/docs/links.d.ts +18 -0
  17. package/dist/commands/docs/links.js +83 -0
  18. package/dist/commands/docs/links.test.d.ts +1 -0
  19. package/dist/commands/docs/links.test.js +73 -0
  20. package/dist/commands/docs.d.ts +7 -0
  21. package/dist/commands/docs.js +24 -0
  22. package/dist/commands/doctor.js +8 -0
  23. package/dist/commands/env.d.ts +14 -0
  24. package/dist/commands/env.js +73 -7
  25. package/dist/commands/generate.js +1 -1
  26. package/dist/commands/index.d.ts +2 -0
  27. package/dist/commands/index.js +2 -0
  28. package/dist/commands/mail.js +1 -1
  29. package/dist/commands/migrate.js +4 -4
  30. package/dist/commands/protocol/craft-evidence.d.ts +76 -0
  31. package/dist/commands/protocol/craft-evidence.js +98 -0
  32. package/dist/commands/protocol/craft-evidence.test.d.ts +1 -0
  33. package/dist/commands/protocol/craft-evidence.test.js +20 -0
  34. package/dist/commands/protocol/desktop-lifecycle-report.d.ts +16 -0
  35. package/dist/commands/protocol/desktop-lifecycle-report.js +57 -0
  36. package/dist/commands/protocol/desktop-lifecycle-report.test.d.ts +1 -0
  37. package/dist/commands/protocol/desktop-lifecycle-report.test.js +32 -0
  38. package/dist/commands/protocol/desktop-support.d.ts +1 -0
  39. package/dist/commands/protocol/desktop-support.js +32 -0
  40. package/dist/commands/protocol/desktop-workflow.test.d.ts +1 -0
  41. package/dist/commands/protocol/desktop-workflow.test.js +33 -0
  42. package/dist/commands/protocol/driver-registry.d.ts +1 -0
  43. package/dist/commands/protocol/driver-registry.js +71 -0
  44. package/dist/commands/protocol/pantry-evidence.d.ts +67 -0
  45. package/dist/commands/protocol/pantry-evidence.js +144 -0
  46. package/dist/commands/protocol/pantry-evidence.test.d.ts +1 -0
  47. package/dist/commands/protocol/pantry-evidence.test.js +29 -0
  48. package/dist/commands/protocol/release-manifest.d.ts +30 -0
  49. package/dist/commands/protocol/release-manifest.js +102 -0
  50. package/dist/commands/protocol/release-manifest.test.d.ts +1 -0
  51. package/dist/commands/protocol/release-manifest.test.js +34 -0
  52. package/dist/commands/protocol/run-conformance.d.ts +21 -0
  53. package/dist/commands/protocol/run-conformance.js +358 -0
  54. package/dist/commands/protocol/run-conformance.test.d.ts +1 -0
  55. package/dist/commands/protocol/run-conformance.test.js +52 -0
  56. package/dist/commands/protocol/run-driver-contracts.d.ts +7 -0
  57. package/dist/commands/protocol/run-driver-contracts.js +94 -0
  58. package/dist/commands/protocol/run-driver-contracts.test.d.ts +1 -0
  59. package/dist/commands/protocol/run-driver-contracts.test.js +18 -0
  60. package/dist/commands/protocol/source-manifest.d.ts +25 -0
  61. package/dist/commands/protocol/source-manifest.js +113 -0
  62. package/dist/commands/protocol/sync-suite.d.ts +8 -0
  63. package/dist/commands/protocol/sync-suite.js +137 -0
  64. package/dist/commands/protocol/sync-suite.test.d.ts +1 -0
  65. package/dist/commands/protocol/sync-suite.test.js +44 -0
  66. package/dist/commands/protocol.d.ts +8 -0
  67. package/dist/commands/protocol.js +60 -0
  68. package/dist/commands/publish.js +149 -0
  69. package/dist/commands/run-tool.d.ts +7 -0
  70. package/dist/commands/run-tool.js +9 -0
  71. package/dist/commands/seed.js +15 -40
  72. package/dist/commands/serve.d.ts +18 -5
  73. package/dist/commands/serve.js +21 -2
  74. package/dist/commands/setup-ai.d.ts +39 -0
  75. package/dist/commands/setup-ai.js +121 -0
  76. package/dist/commands/setup.js +22 -0
  77. package/dist/lazy-commands.js +27 -1
  78. package/package.json +43 -42
@@ -1,11 +1,24 @@
1
1
  import type { CLI } from '@stacksjs/types';
2
2
  /**
3
- * Resolve the project's includes directory using Stacks conventions. Modern
4
- * Stacks apps keep reusable `.stx` fragments in `resources/components` and
5
- * commonly point `config/stx.ts#partialsDir` there; older apps may still use
6
- * one of the dedicated partials directories below.
3
+ * Resolve the project's includes directory.
4
+ *
5
+ * A configured `config/stx.ts#partialsDir` wins outright. The convention list
6
+ * below is only a fallback for apps that never set one, and it cannot stand in
7
+ * for the config: the candidates are probed for existence in order, so an app
8
+ * that keeps its includes in `resources/components` but also has an unrelated
9
+ * `resources/partials` directory silently resolved to the wrong one and every
10
+ * `@include` failed with ENOENT at runtime.
11
+ *
12
+ * The configured value is relative to the stx root (`resources`), matching how
13
+ * stx itself reads it, but an app-root-relative path is accepted too so either
14
+ * spelling resolves.
15
+ */
16
+ export declare function resolveUserPartialsPath(cwd?: unknown, configuredDir?: string): string | undefined;
17
+ /**
18
+ * Read `partialsDir` off the app's stx config. Failure is non-fatal: without
19
+ * it {@link resolveUserPartialsPath} falls back to the conventions.
7
20
  */
8
- export declare function resolveUserPartialsPath(cwd?: unknown): string | undefined;
21
+ export declare function loadStxPartialsDir(cwd?: unknown): Promise<string | undefined>;
9
22
  /**` requests (and any non-GET/HEAD verb) are
10
23
  * reverse-proxied to the API process — mirroring the dev views server — so
11
24
  * scaffolded `fetch('/api/...')` calls behave identically in production
@@ -30,7 +30,15 @@ function parseCookies(req) {
30
30
  }
31
31
  return out;
32
32
  }
33
- export function resolveUserPartialsPath(cwd = process.cwd()) {
33
+ export function resolveUserPartialsPath(cwd = process.cwd(), configuredDir) {
34
+ if (configuredDir) {
35
+ const configured = [
36
+ join(cwd, "resources", configuredDir),
37
+ join(cwd, configuredDir)
38
+ ].find((candidate) => existsSync(candidate));
39
+ if (configured)
40
+ return configured;
41
+ }
34
42
  const relative = [
35
43
  "resources/partials",
36
44
  "resources/views/partials",
@@ -39,6 +47,17 @@ export function resolveUserPartialsPath(cwd = process.cwd()) {
39
47
  ].find((candidate) => existsSync(join(cwd, candidate)));
40
48
  return relative ? join(cwd, relative) : void 0;
41
49
  }
50
+ export async function loadStxPartialsDir(cwd = process.cwd()) {
51
+ const configPath = join(cwd, "config/stx.ts");
52
+ if (!existsSync(configPath))
53
+ return;
54
+ try {
55
+ const dir = (await import(configPath)).default?.partialsDir;
56
+ return typeof dir === "string" && dir.length > 0 ? dir : void 0;
57
+ } catch {
58
+ return;
59
+ }
60
+ }
42
61
  export function serve(buddy) {
43
62
  buddy.command("serve", "Start the production HTTP server (STX views + /api proxy + coming-soon/maintenance gate)").option("-p, --port <port>", "Port to listen on (defaults to PORT env or 3000)").option("--verbose", "Enable verbose output", { default: !1 }).action(async (options) => {
44
63
  if (options?.port)
@@ -62,7 +81,7 @@ export function serve(buddy) {
62
81
  } catch {}
63
82
  if (!stxServe)
64
83
  ({ serve: stxServe } = await import("bun-plugin-stx/serve"));
65
- const stxModule = await resolveVendoredStxModule(), { site: siteConfig, i18n: i18nConfig } = await loadStxSiteConfig(), userViewsPath = "resources/views", defaultsResources = resolveDefaultsResources(), defaultViewsPath = join(defaultsResources, "views"), userLayoutsPath = existsSync("resources/views/layouts") ? "resources/views/layouts" : "resources/layouts", userPartialsPath = resolveUserPartialsPath(), apiBase = process.env.API_URL || `http://127.0.0.1:${Number(process.env.PORT_API) || config.ports?.api || 3008}`;
84
+ const stxModule = await resolveVendoredStxModule(), { site: siteConfig, i18n: i18nConfig } = await loadStxSiteConfig(), userViewsPath = "resources/views", defaultsResources = resolveDefaultsResources(), defaultViewsPath = join(defaultsResources, "views"), userLayoutsPath = existsSync("resources/views/layouts") ? "resources/views/layouts" : "resources/layouts", userPartialsPath = resolveUserPartialsPath(process.cwd(), await loadStxPartialsDir()), apiBase = process.env.API_URL || `http://127.0.0.1:${Number(process.env.PORT_API) || config.ports?.api || 3008}`;
66
85
  log.info(`Starting production server on port ${port}...`);
67
86
  await stxServe({
68
87
  patterns: [userViewsPath, defaultViewsPath],
@@ -0,0 +1,39 @@
1
+ export declare function isAiProvider(value: string): value is AiProvider;
2
+ /**
3
+ * Sets a project up for one AI coding agent. Idempotent: re-running it after a
4
+ * framework upgrade refreshes what it owns and leaves everything else alone.
5
+ */
6
+ export declare function setupAiProvider(provider: AiProvider, options?: SetupAiOptions): SetupAiResult;
7
+ /**
8
+ * Renders the result of a setup run.
9
+ */
10
+ export declare function reportAiSetup(provider: AiProviderDefinition, result: SetupAiResult): void;
11
+ /*.mdc`, Copilot reads `.github/copilot-instructions.md`,
12
+ * and Gemini CLI reads `GEMINI.md`.
13
+ */
14
+ export declare const AI_PROVIDERS: readonly AiProviderDefinition[];
15
+ export declare interface AiProviderDefinition {
16
+ id: AiProvider
17
+ label: string
18
+ reads: string[]
19
+ }
20
+ export declare interface SetupAiOptions {
21
+ copy?: boolean
22
+ force?: boolean
23
+ }
24
+ export declare interface SetupAiResult {
25
+ created: string[]
26
+ skipped: string[]
27
+ }
28
+ /**
29
+ * `buddy setup:ai` - wires a project up for an AI coding agent.
30
+ *
31
+ * The framework keeps its agent material in `storage/framework/defaults/ai`.
32
+ * Nothing there is read at runtime; this command materializes it into whatever
33
+ * files and directories the chosen agent actually looks for.
34
+ *
35
+ * Only `AGENTS.md` is committed - it is shared guidance every agent reads, and
36
+ * it belongs in review. The generated per-agent directories are gitignored,
37
+ * because which agent a developer uses is a personal choice.
38
+ */
39
+ export type AiProvider = 'claude' | 'codex' | 'cursor' | 'copilot' | 'gemini';
@@ -0,0 +1,121 @@
1
+ import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
2
+ import process from "node:process";
3
+ import { dim, green, log, yellow } from "@stacksjs/cli";
4
+ import { frameworkPath, join, projectPath, relative } from "@stacksjs/path";
5
+ import { listSkills, resolveSkillPath } from "@stacksjs/skills";
6
+ export const AI_PROVIDERS = [
7
+ { id: "claude", label: "Claude Code", reads: ["AGENTS.md", "CLAUDE.md", ".claude/skills", ".claude/launch.json"] },
8
+ { id: "codex", label: "OpenAI Codex CLI", reads: ["AGENTS.md"] },
9
+ { id: "cursor", label: "Cursor", reads: ["AGENTS.md", ".cursor/rules"] },
10
+ { id: "copilot", label: "GitHub Copilot", reads: ["AGENTS.md", ".github/copilot-instructions.md"] },
11
+ { id: "gemini", label: "Gemini CLI", reads: ["AGENTS.md", "GEMINI.md"] }
12
+ ];
13
+ export function isAiProvider(value) {
14
+ return AI_PROVIDERS.some((provider) => provider.id === value);
15
+ }
16
+ function materialize(target, path, options) {
17
+ const existing = lstatSync(path, { throwIfNoEntry: !1 });
18
+ if (existing) {
19
+ if (!existing.isSymbolicLink() && !options.force)
20
+ return !1;
21
+ rmSync(path, { recursive: !0, force: !0 });
22
+ }
23
+ mkdirSync(join(path, ".."), { recursive: !0 });
24
+ if (options.copy)
25
+ cpSync(target, path, { recursive: !0 });
26
+ else
27
+ symlinkSync(relative(join(path, ".."), target), path, process.platform === "win32" ? "junction" : "dir");
28
+ return !0;
29
+ }
30
+ function materializeFile(source, path, options) {
31
+ if (existsSync(path) && !options.force)
32
+ return !1;
33
+ mkdirSync(join(path, ".."), { recursive: !0 });
34
+ cpSync(source, path, { recursive: !0, force: !0 });
35
+ return !0;
36
+ }
37
+ function installSkills(destination, options) {
38
+ const names = listSkills();
39
+ let installed = 0, skipped = 0;
40
+ mkdirSync(destination, { recursive: !0 });
41
+ for (const entry of readdirSync(destination)) {
42
+ const path = join(destination, entry);
43
+ if (lstatSync(path, { throwIfNoEntry: !1 })?.isSymbolicLink() && !existsSync(path))
44
+ rmSync(path, { force: !0 });
45
+ }
46
+ for (const name of names) {
47
+ const source = resolveSkillPath(name);
48
+ if (!source)
49
+ continue;
50
+ if (materialize(source, join(destination, name), options))
51
+ installed++;
52
+ else
53
+ skipped++;
54
+ }
55
+ return { installed, skipped };
56
+ }
57
+ export function setupAiProvider(provider, options = {}) {
58
+ const created = [], skipped = [], defaults = frameworkPath("defaults/ai"), rel = (path) => relative(projectPath(), path), record = (path, didCreate) => {
59
+ (didCreate ? created : skipped).push(rel(path));
60
+ }, agents = projectPath("AGENTS.md");
61
+ record(agents, materializeFile(join(defaults, "AGENTS.md"), agents, { ...options, force: !1 }));
62
+ switch (provider) {
63
+ case "claude": {
64
+ const claudeMd = projectPath("CLAUDE.md");
65
+ record(claudeMd, materialize(agents, claudeMd, { ...options, copy: !1 }));
66
+ const launch = projectPath(".claude/launch.json");
67
+ record(launch, materializeFile(join(defaults, "claude/launch.json"), launch, options));
68
+ const skillsDir = projectPath(".claude/skills"), { installed, skipped: untouched } = installSkills(skillsDir, options);
69
+ if (installed > 0)
70
+ created.push(`${rel(skillsDir)} (${installed} skills)`);
71
+ if (untouched > 0)
72
+ skipped.push(`${rel(skillsDir)} (${untouched} skills)`);
73
+ break;
74
+ }
75
+ case "codex":
76
+ break;
77
+ case "cursor": {
78
+ const rules = projectPath(".cursor/rules");
79
+ record(rules, materialize(frameworkPath("defaults/ide/cursor/rules"), rules, options));
80
+ break;
81
+ }
82
+ case "copilot": {
83
+ const instructions = projectPath(".github/copilot-instructions.md");
84
+ if (existsSync(instructions) && !options.force)
85
+ skipped.push(rel(instructions));
86
+ else {
87
+ mkdirSync(projectPath(".github"), { recursive: !0 });
88
+ writeFileSync(instructions, pointerFile("AGENTS.md"), "utf8");
89
+ created.push(rel(instructions));
90
+ }
91
+ break;
92
+ }
93
+ case "gemini": {
94
+ const geminiMd = projectPath("GEMINI.md");
95
+ record(geminiMd, materialize(agents, geminiMd, { ...options, copy: !1 }));
96
+ break;
97
+ }
98
+ }
99
+ return { created, skipped };
100
+ }
101
+ function pointerFile(target) {
102
+ return [
103
+ "# Project instructions",
104
+ "",
105
+ `This project keeps its agent guidance in [\`${target}\`](../${target}), so every`,
106
+ "agent works from the same rules. Read that file.",
107
+ "",
108
+ "Regenerate this pointer with `buddy setup:ai copilot --force`.",
109
+ ""
110
+ ].join(`
111
+ `);
112
+ }
113
+ export function reportAiSetup(provider, result) {
114
+ for (const path of result.created)
115
+ log.info(` ${green("+")} ${path}`);
116
+ for (const path of result.skipped)
117
+ log.info(` ${yellow("\xB7")} ${path} ${dim("(already present, left alone)")}`);
118
+ if (result.created.length === 0)
119
+ log.info(dim(" Nothing to do - re-run with --force to overwrite."));
120
+ log.success(`${provider.label} is set up. It reads: ${provider.reads.join(", ")}`);
121
+ }
@@ -21,6 +21,9 @@ export function setup(buddy) {
21
21
  const descriptions = {
22
22
  setup: "This command ensures your project is setup correctly",
23
23
  ssl: "Setup SSL certificates and hosts file for HTTPS development",
24
+ ai: "Set the project up for an AI coding agent (Claude Code, Codex, Cursor, Copilot, Gemini)",
25
+ copy: "Copy the agent files instead of symlinking them, so they can be edited per project",
26
+ force: "Overwrite files that already exist",
24
27
  ohMyZsh: "Enable Oh My Zsh",
25
28
  aws: "Ensures AWS is connected to the project",
26
29
  project: "Target a specific project",
@@ -49,6 +52,25 @@ export function setup(buddy) {
49
52
  log.info("You may need to manually trust certificates or update hosts file");
50
53
  }
51
54
  });
55
+ buddy.command("setup:ai [provider]", descriptions.ai).alias("ai:setup").option("--copy", descriptions.copy, { default: !1 }).option("--force", descriptions.force, { default: !1 }).option("--verbose", descriptions.verbose, { default: !1 }).action(async (provider, options) => {
56
+ log.debug("Running `buddy setup:ai` ...", options);
57
+ const { AI_PROVIDERS, isAiProvider, reportAiSetup, setupAiProvider } = await import("./setup-ai");
58
+ let id = provider;
59
+ if (!id) {
60
+ const { select } = await import("@stacksjs/cli");
61
+ id = await select({
62
+ message: "Which AI coding agent do you use?",
63
+ choices: AI_PROVIDERS.map((entry) => ({ value: entry.id, label: entry.label })),
64
+ initial: 0
65
+ });
66
+ }
67
+ if (!id || !isAiProvider(id)) {
68
+ log.error(`Unknown AI provider: ${id}. Expected one of: ${AI_PROVIDERS.map((entry) => entry.id).join(", ")}`);
69
+ process.exit(ExitCode.InvalidArgument);
70
+ }
71
+ const definition = AI_PROVIDERS.find((entry) => entry.id === id);
72
+ reportAiSetup(definition, setupAiProvider(id, { copy: options.copy, force: options.force }));
73
+ });
52
74
  buddy.command("setup:oh-my-zsh", descriptions.ohMyZsh).alias("upgrade:oh-my-zsh").option("--verbose", descriptions.verbose, { default: !1 }).action(async (_options) => {
53
75
  log.debug("Running `buddy setup:oh-my-zsh` ...", _options);
54
76
  const result = await runAction(Action.UpgradeShell);
@@ -100,6 +100,10 @@ const commandRegistry = {
100
100
  serve: { path: "./commands/serve.js", exportName: "serve" },
101
101
  "serve:api": { path: "./commands/serve.js", exportName: "serveApi" },
102
102
  setup: { path: "./commands/setup.js", exportName: "setup" },
103
+ "setup:ai": { path: "./commands/setup.js", exportName: "setup" },
104
+ "setup:ssl": { path: "./commands/setup.js", exportName: "setup" },
105
+ "setup:oh-my-zsh": { path: "./commands/setup.js", exportName: "setup" },
106
+ "ai:setup": { path: "./commands/setup.js", exportName: "setup" },
103
107
  share: { path: "./commands/share.js", exportName: "share" },
104
108
  stack: { path: "./commands/stacks.js", exportName: "stacks" },
105
109
  sms: { path: "./commands/sms.js", exportName: "sms" },
@@ -109,7 +113,29 @@ const commandRegistry = {
109
113
  types: { path: "./commands/types.js", exportName: "types" },
110
114
  undeploy: { path: "./commands/cloud.js", exportName: "cloud" },
111
115
  upgrade: { path: "./commands/upgrade.js", exportName: "upgrade" },
112
- version: { path: "./commands/version.js", exportName: "version" }
116
+ version: { path: "./commands/version.js", exportName: "version" },
117
+ "protocol:conformance": { path: "./commands/protocol.js", exportName: "protocol" },
118
+ "protocol:sync": { path: "./commands/protocol.js", exportName: "protocol" },
119
+ "protocol:check": { path: "./commands/protocol.js", exportName: "protocol" },
120
+ "protocol:manifest": { path: "./commands/protocol.js", exportName: "protocol" },
121
+ "protocol:manifest:check": { path: "./commands/protocol.js", exportName: "protocol" },
122
+ "protocol:release": { path: "./commands/protocol.js", exportName: "protocol" },
123
+ "protocol:release:check": { path: "./commands/protocol.js", exportName: "protocol" },
124
+ "protocol:drivers": { path: "./commands/protocol.js", exportName: "protocol" },
125
+ "protocol:drivers:check": { path: "./commands/protocol.js", exportName: "protocol" },
126
+ "protocol:drivers:test": { path: "./commands/protocol.js", exportName: "protocol" },
127
+ "protocol:desktop": { path: "./commands/protocol.js", exportName: "protocol" },
128
+ "protocol:desktop:check": { path: "./commands/protocol.js", exportName: "protocol" },
129
+ "protocol:pantry": { path: "./commands/protocol.js", exportName: "protocol" },
130
+ "protocol:pantry:check": { path: "./commands/protocol.js", exportName: "protocol" },
131
+ "protocol:craft": { path: "./commands/protocol.js", exportName: "protocol" },
132
+ "protocol:craft:check": { path: "./commands/protocol.js", exportName: "protocol" },
133
+ "docs:buddy": { path: "./commands/docs.js", exportName: "docs" },
134
+ "docs:buddy:check": { path: "./commands/docs.js", exportName: "docs" },
135
+ "docs:artifacts": { path: "./commands/docs.js", exportName: "docs" },
136
+ "docs:artifacts:check": { path: "./commands/docs.js", exportName: "docs" },
137
+ "docs:links": { path: "./commands/docs.js", exportName: "docs" },
138
+ "docs:links:check": { path: "./commands/docs.js", exportName: "docs" }
113
139
  }, commandGroups = {
114
140
  minimal: ["version", "help"],
115
141
  development: ["dev", "build", "test", "lint"],
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/buddy",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.70.163",
5
+ "version": "0.70.164",
6
6
  "description": "Meet Buddy. The Stacks runtime.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -91,52 +91,53 @@
91
91
  "prepublishOnly": "bun run build"
92
92
  },
93
93
  "dependencies": {
94
- "@stacksjs/actions": "^0.70.163",
95
- "@stacksjs/ai": "^0.70.163",
96
- "@stacksjs/alias": "^0.70.163",
97
- "@stacksjs/arrays": "^0.70.163",
98
- "@stacksjs/auth": "^0.70.163",
99
- "@stacksjs/build": "^0.70.163",
100
- "@stacksjs/cache": "^0.70.163",
101
- "@stacksjs/cli": "^0.70.163",
94
+ "@stacksjs/actions": "^0.70.164",
95
+ "@stacksjs/ai": "^0.70.164",
96
+ "@stacksjs/alias": "^0.70.164",
97
+ "@stacksjs/arrays": "^0.70.164",
98
+ "@stacksjs/auth": "^0.70.164",
99
+ "@stacksjs/build": "^0.70.164",
100
+ "@stacksjs/cache": "^0.70.164",
101
+ "@stacksjs/cli": "^0.70.164",
102
102
  "@stacksjs/clapp": "^0.2.12",
103
- "@stacksjs/cloud": "^0.70.163",
104
- "@stacksjs/collections": "^0.70.163",
105
- "@stacksjs/config": "^0.70.163",
106
- "@stacksjs/database": "^0.70.163",
107
- "@stacksjs/desktop": "^0.70.163",
108
- "@stacksjs/dns": "^0.70.163",
109
- "@stacksjs/email": "^0.70.163",
110
- "@stacksjs/enums": "^0.70.163",
111
- "@stacksjs/error-handling": "^0.70.163",
112
- "@stacksjs/events": "^0.70.163",
113
- "@stacksjs/git": "^0.70.163",
103
+ "@stacksjs/cloud": "^0.70.164",
104
+ "@stacksjs/collections": "^0.70.164",
105
+ "@stacksjs/config": "^0.70.164",
106
+ "@stacksjs/database": "^0.70.164",
107
+ "@stacksjs/desktop": "^0.70.164",
108
+ "@stacksjs/dns": "^0.70.164",
109
+ "@stacksjs/email": "^0.70.164",
110
+ "@stacksjs/enums": "^0.70.164",
111
+ "@stacksjs/error-handling": "^0.70.164",
112
+ "@stacksjs/events": "^0.70.164",
113
+ "@stacksjs/git": "^0.70.164",
114
114
  "@stacksjs/gitit": "^0.2.5",
115
- "@stacksjs/health": "^0.70.163",
115
+ "@stacksjs/health": "^0.70.164",
116
116
  "@stacksjs/dnsx": "^0.2.3",
117
117
  "@stacksjs/httx": "^0.1.10",
118
- "@stacksjs/lint": "^0.70.163",
119
- "@stacksjs/logging": "^0.70.163",
120
- "@stacksjs/notifications": "^0.70.163",
121
- "@stacksjs/objects": "^0.70.163",
122
- "@stacksjs/orm": "^0.70.163",
123
- "@stacksjs/path": "^0.70.163",
124
- "@stacksjs/payments": "^0.70.163",
125
- "@stacksjs/realtime": "^0.70.163",
126
- "@stacksjs/router": "^0.70.163",
118
+ "@stacksjs/lint": "^0.70.164",
119
+ "@stacksjs/logging": "^0.70.164",
120
+ "@stacksjs/notifications": "^0.70.164",
121
+ "@stacksjs/objects": "^0.70.164",
122
+ "@stacksjs/orm": "^0.70.164",
123
+ "@stacksjs/path": "^0.70.164",
124
+ "@stacksjs/skills": "^0.70.164",
125
+ "@stacksjs/payments": "^0.70.164",
126
+ "@stacksjs/realtime": "^0.70.164",
127
+ "@stacksjs/router": "^0.70.164",
127
128
  "@stacksjs/rpx": "^0.11.31",
128
- "@stacksjs/search-engine": "^0.70.163",
129
- "@stacksjs/security": "^0.70.163",
130
- "@stacksjs/server": "^0.70.163",
131
- "@stacksjs/storage": "^0.70.163",
132
- "@stacksjs/strings": "^0.70.163",
133
- "@stacksjs/testing": "^0.70.163",
134
- "@stacksjs/tunnel": "^0.70.163",
135
- "@stacksjs/types": "^0.70.163",
136
- "@stacksjs/ui": "^0.70.163",
137
- "@stacksjs/utils": "^0.70.163",
138
- "@stacksjs/validation": "^0.70.163",
139
- "@stacksjs/ts-cloud": "^0.7.56"
129
+ "@stacksjs/search-engine": "^0.70.164",
130
+ "@stacksjs/security": "^0.70.164",
131
+ "@stacksjs/server": "^0.70.164",
132
+ "@stacksjs/storage": "^0.70.164",
133
+ "@stacksjs/strings": "^0.70.164",
134
+ "@stacksjs/testing": "^0.70.164",
135
+ "@stacksjs/tunnel": "^0.70.164",
136
+ "@stacksjs/types": "^0.70.164",
137
+ "@stacksjs/ui": "^0.70.164",
138
+ "@stacksjs/utils": "^0.70.164",
139
+ "@stacksjs/validation": "^0.70.164",
140
+ "@stacksjs/ts-cloud": "^0.7.60"
140
141
  },
141
142
  "devDependencies": {
142
143
  "better-dx": "^0.2.17"