@alphafox/cli 0.3.10 → 0.3.12

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 (41) hide show
  1. package/README.md +5 -4
  2. package/dist/engine-backtest/coverage-notice.d.ts +5 -0
  3. package/dist/engine-backtest/coverage-notice.js +115 -0
  4. package/dist/engine-backtest/parse-args.d.ts +1 -1
  5. package/dist/engine-backtest/parse-args.js +3 -2
  6. package/dist/engine-backtest/persist.d.ts +3 -1
  7. package/dist/engine-backtest/persist.js +5 -0
  8. package/dist/engine-backtest/run-command.js +10 -1
  9. package/dist/engine-backtest/sweep-command.js +10 -1
  10. package/dist/engine-backtest/types.d.ts +24 -0
  11. package/dist/engine-backtest/types.js +3 -0
  12. package/dist/index.d.ts +1 -0
  13. package/dist/install/types.d.ts +2 -0
  14. package/dist/install/wizard.js +3 -26
  15. package/dist/skills/agent-links.d.ts +29 -0
  16. package/dist/skills/agent-links.js +217 -0
  17. package/dist/skills/manager.d.ts +8 -0
  18. package/dist/skills/manager.js +1 -0
  19. package/dist/skills/run-command.js +23 -6
  20. package/dist/skills-manifest.json +42 -42
  21. package/dist/version.d.ts +1 -1
  22. package/dist/version.js +1 -1
  23. package/docs/alphafox-cli-installation-guide.md +13 -2
  24. package/package.json +1 -1
  25. package/skills/account/SKILL.md +1 -1
  26. package/skills/admin/SKILL.md +1 -1
  27. package/skills/alphafox/SKILL.md +58 -4
  28. package/skills/alphafox-shared/SKILL.md +4 -2
  29. package/skills/auth/SKILL.md +1 -1
  30. package/skills/cache/SKILL.md +1 -1
  31. package/skills/engine-backtest/SKILL.md +4 -3
  32. package/skills/exchange/SKILL.md +1 -1
  33. package/skills/market/SKILL.md +1 -1
  34. package/skills/notification/SKILL.md +1 -1
  35. package/skills/strategy/SKILL.md +46 -9
  36. package/skills/trading/SKILL.md +1 -1
  37. package/vendor/backtest-runner/README.md +4 -4
  38. package/vendor/backtest-runner/index.d.ts +13 -0
  39. package/vendor/backtest-runner/index.mjs +3 -0
  40. package/vendor/backtest-runner/lib/coverage.mjs +37 -2
  41. package/vendor/backtest-runner/lib/tape-loader.mjs +6 -1
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.agentHomeDir = agentHomeDir;
4
+ exports.resolveAgentSkillTargets = resolveAgentSkillTargets;
5
+ exports.inspectAgentLinks = inspectAgentLinks;
6
+ exports.ensureAgentLinks = ensureAgentLinks;
7
+ exports.removeAgentLinks = removeAgentLinks;
8
+ exports.attachAgentLinks = attachAgentLinks;
9
+ exports.applyAgentLinkPass = applyAgentLinkPass;
10
+ exports.agentLinksNeedWork = agentLinksNeedWork;
11
+ const node_fs_1 = require("node:fs");
12
+ const node_os_1 = require("node:os");
13
+ const node_path_1 = require("node:path");
14
+ const manager_1 = require("./manager");
15
+ function agentHomeDir(env = process.env) {
16
+ return env.ALPHAFOX_AGENT_HOME?.trim() || (0, node_os_1.homedir)();
17
+ }
18
+ function resolveAgentSkillTargets(homeDir, env = process.env) {
19
+ const claudeHome = env.CLAUDE_CONFIG_DIR?.trim() || (0, node_path_1.join)(homeDir, ".claude");
20
+ const cursorHome = (0, node_path_1.join)(homeDir, ".cursor");
21
+ const codexHome = env.CODEX_HOME?.trim() || (0, node_path_1.join)(homeDir, ".codex");
22
+ return [
23
+ {
24
+ id: "claude-code",
25
+ required: true,
26
+ home: claudeHome,
27
+ skillsDir: (0, node_path_1.join)(claudeHome, "skills"),
28
+ },
29
+ {
30
+ id: "cursor",
31
+ required: false,
32
+ home: cursorHome,
33
+ skillsDir: (0, node_path_1.join)(cursorHome, "skills"),
34
+ },
35
+ {
36
+ id: "codex",
37
+ required: false,
38
+ home: codexHome,
39
+ skillsDir: (0, node_path_1.join)(codexHome, "skills"),
40
+ },
41
+ ];
42
+ }
43
+ function inspectAgentLinks(input) {
44
+ return activeTargets(input).map((target) => classifyTarget(target, input));
45
+ }
46
+ function ensureAgentLinks(input) {
47
+ const created = [];
48
+ for (const status of inspectAgentLinks(input)) {
49
+ if (status.missing.length === 0)
50
+ continue;
51
+ (0, node_fs_1.mkdirSync)(status.skillsDir, { recursive: true });
52
+ for (const name of status.missing) {
53
+ linkSkillDir((0, node_path_1.join)(input.canonicalRoot, name), (0, node_path_1.join)(status.skillsDir, name));
54
+ created.push({ agent: status.id, name });
55
+ }
56
+ }
57
+ return created;
58
+ }
59
+ function removeAgentLinks(input) {
60
+ for (const target of activeTargets(input)) {
61
+ for (const name of input.skillNames) {
62
+ const dest = (0, node_path_1.join)(target.skillsDir, name);
63
+ if (!lexists(dest))
64
+ continue;
65
+ if (!isOurAgentLink(dest, (0, node_path_1.join)(input.canonicalRoot, name)))
66
+ continue;
67
+ (0, node_fs_1.unlinkSync)(dest);
68
+ }
69
+ }
70
+ }
71
+ function attachAgentLinks(status, env = process.env) {
72
+ const skillNames = status.skills
73
+ .filter((skill) => skill.status !== "missing")
74
+ .map((skill) => skill.name);
75
+ const agentLinks = inspectAgentLinks({
76
+ canonicalRoot: status.installedRoot,
77
+ skillNames,
78
+ homeDir: agentHomeDir(env),
79
+ env,
80
+ });
81
+ return {
82
+ ...status,
83
+ agentLinks,
84
+ restartRequired: status.restartRequired || agentLinksNeedWork(agentLinks),
85
+ };
86
+ }
87
+ function applyAgentLinkPass(result, input) {
88
+ const skillNames = result.status.skills
89
+ .filter((skill) => skill.status !== "missing")
90
+ .map((skill) => skill.name);
91
+ const linkInput = {
92
+ canonicalRoot: input.canonicalRoot,
93
+ skillNames,
94
+ homeDir: agentHomeDir(input.env),
95
+ env: input.env,
96
+ };
97
+ const created = input.dryRun ? [] : ensureAgentLinks(linkInput);
98
+ const status = attachAgentLinks(result.status, input.env);
99
+ if (!input.dryRun && agentLinksNeedWork(status.agentLinks)) {
100
+ throw Object.assign(new Error(`Failed to link Skills into Agent directories: ${missingAgentSummary(status.agentLinks)}`), {
101
+ type: "install",
102
+ subtype: "skills_agent_link_failed",
103
+ details: status.agentLinks.filter((item) => item.missing.length > 0),
104
+ });
105
+ }
106
+ const linked = created.length > 0 || agentLinksNeedWork(status.agentLinks);
107
+ return {
108
+ ...result,
109
+ status,
110
+ action: nextSyncAction(result.action, linked, input.dryRun),
111
+ restartRequired: result.restartRequired || linked,
112
+ };
113
+ }
114
+ function agentLinksNeedWork(agentLinks) {
115
+ return agentLinks.some((item) => item.missing.length > 0);
116
+ }
117
+ function activeTargets(input) {
118
+ return resolveAgentSkillTargets(input.homeDir, input.env ?? {}).filter((target) => target.required || (0, node_fs_1.existsSync)(target.home));
119
+ }
120
+ function classifyTarget(target, input) {
121
+ const linked = [];
122
+ const missing = [];
123
+ const blocked = [];
124
+ for (const name of input.skillNames) {
125
+ const state = classifyLink((0, node_path_1.join)(input.canonicalRoot, name), (0, node_path_1.join)(target.skillsDir, name));
126
+ if (state === "linked")
127
+ linked.push(name);
128
+ else if (state === "blocked")
129
+ blocked.push(name);
130
+ else
131
+ missing.push(name);
132
+ }
133
+ return {
134
+ id: target.id,
135
+ skillsDir: target.skillsDir,
136
+ linked,
137
+ missing,
138
+ blocked,
139
+ };
140
+ }
141
+ function classifyLink(canonical, dest) {
142
+ if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(canonical, "SKILL.md")))
143
+ return "missing";
144
+ if ((0, node_path_1.resolve)(canonical) === (0, node_path_1.resolve)(dest))
145
+ return "linked";
146
+ if (!lexists(dest) || isBrokenSymlink(dest))
147
+ return "missing";
148
+ if (isOurAgentLink(dest, canonical))
149
+ return "linked";
150
+ return "blocked";
151
+ }
152
+ function isOurAgentLink(dest, canonical) {
153
+ if (pointsAtCanonical(dest, canonical))
154
+ return true;
155
+ try {
156
+ const stat = (0, node_fs_1.lstatSync)(dest);
157
+ if (stat.isSymbolicLink() || !stat.isDirectory())
158
+ return false;
159
+ if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(dest, "SKILL.md")))
160
+ return false;
161
+ return (0, manager_1.hashSkillDirectory)(dest) === (0, manager_1.hashSkillDirectory)(canonical);
162
+ }
163
+ catch {
164
+ return false;
165
+ }
166
+ }
167
+ function pointsAtCanonical(dest, canonical) {
168
+ try {
169
+ if ((0, node_fs_1.lstatSync)(dest).isSymbolicLink()) {
170
+ const resolved = (0, node_path_1.resolve)((0, node_path_1.dirname)(dest), (0, node_fs_1.readlinkSync)(dest));
171
+ if ((0, node_path_1.resolve)(resolved) === (0, node_path_1.resolve)(canonical))
172
+ return true;
173
+ }
174
+ }
175
+ catch {
176
+ // Compare real paths below when the symlink metadata is unreadable.
177
+ }
178
+ try {
179
+ return (0, node_fs_1.realpathSync)(dest) === (0, node_fs_1.realpathSync)(canonical);
180
+ }
181
+ catch {
182
+ return false;
183
+ }
184
+ }
185
+ function linkSkillDir(canonical, dest) {
186
+ if (isBrokenSymlink(dest))
187
+ (0, node_fs_1.unlinkSync)(dest);
188
+ (0, node_fs_1.symlinkSync)(canonical, dest, process.platform === "win32" ? "junction" : undefined);
189
+ }
190
+ function lexists(path) {
191
+ try {
192
+ (0, node_fs_1.lstatSync)(path);
193
+ return true;
194
+ }
195
+ catch {
196
+ return false;
197
+ }
198
+ }
199
+ function isBrokenSymlink(path) {
200
+ try {
201
+ return (0, node_fs_1.lstatSync)(path).isSymbolicLink() && !(0, node_fs_1.existsSync)(path);
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ function nextSyncAction(action, linked, dryRun) {
208
+ if (!linked || action !== "skipped")
209
+ return action;
210
+ return dryRun ? "planned" : "synced";
211
+ }
212
+ function missingAgentSummary(agentLinks) {
213
+ return agentLinks
214
+ .filter((item) => item.missing.length > 0)
215
+ .map((item) => `${item.id} (${item.missing.join(", ")})`)
216
+ .join("; ");
217
+ }
@@ -39,6 +39,13 @@ export interface InspectedSkill {
39
39
  readonly status: SkillStatus;
40
40
  readonly managed: boolean;
41
41
  }
42
+ export interface AgentSkillLinkStatus {
43
+ readonly id: "claude-code" | "cursor" | "codex";
44
+ readonly skillsDir: string;
45
+ readonly linked: readonly string[];
46
+ readonly missing: readonly string[];
47
+ readonly blocked: readonly string[];
48
+ }
42
49
  export interface SkillsStatus {
43
50
  readonly bundleVersion: string;
44
51
  readonly contractVersion: string;
@@ -52,6 +59,7 @@ export interface SkillsStatus {
52
59
  readonly modified: boolean;
53
60
  }[];
54
61
  readonly summary: Readonly<Record<SkillStatus, number>>;
62
+ readonly agentLinks: readonly AgentSkillLinkStatus[];
55
63
  readonly restartRequired: boolean;
56
64
  }
57
65
  export interface SkillsSyncResult {
@@ -183,6 +183,7 @@ function inspectSkills(input) {
183
183
  skills,
184
184
  orphans,
185
185
  summary,
186
+ agentLinks: [],
186
187
  restartRequired: summary.missing + summary.stale + summary.modified + orphans.length > 0,
187
188
  };
188
189
  }
@@ -12,6 +12,7 @@ const profiles_1 = require("../config/profiles");
12
12
  const envelope_1 = require("../envelope");
13
13
  const exec_1 = require("../install/exec");
14
14
  const package_root_1 = require("../install/package-root");
15
+ const agent_links_1 = require("./agent-links");
15
16
  const manager_1 = require("./manager");
16
17
  const SKILLS_TIMEOUT_MS = 120_000;
17
18
  function installedSkillsRoot(env = process.env) {
@@ -33,25 +34,34 @@ function resolveCurrentSkillsPackageRoot(searchDirs = [__dirname, process.cwd()]
33
34
  }
34
35
  function inspectCurrentSkills(env = process.env, packageRoot = resolveCurrentSkillsPackageRoot()) {
35
36
  const manifest = (0, manager_1.loadAndVerifySkillsManifest)(packageRoot);
36
- return (0, manager_1.inspectSkills)({
37
+ return (0, agent_links_1.attachAgentLinks)((0, manager_1.inspectSkills)({
37
38
  manifest,
38
39
  installedRoot: installedSkillsRoot(env),
39
40
  state: (0, manager_1.loadSkillsState)(skillsStatePath(env)),
40
- });
41
+ }), env);
41
42
  }
42
43
  async function syncCurrentSkills(input, env = process.env, deps = {}) {
43
44
  const packageRoot = deps.packageRoot ?? resolveCurrentSkillsPackageRoot();
44
45
  const runner = deps.runner ??
45
46
  (0, exec_1.createDefaultInstallRunner)(env, [__dirname, process.cwd()]);
47
+ const canonicalRoot = installedSkillsRoot(env);
46
48
  const manifest = (0, manager_1.loadAndVerifySkillsManifest)(packageRoot);
47
- return await (0, manager_1.syncSkills)({
49
+ const result = await (0, manager_1.syncSkills)({
48
50
  manifest,
49
51
  packageRoot,
50
- installedRoot: installedSkillsRoot(env),
52
+ installedRoot: canonicalRoot,
51
53
  statePath: skillsStatePath(env),
52
54
  dryRun: input.dryRun,
53
55
  force: input.force,
54
- }, {
56
+ }, skillsBundleDeps(runner, packageRoot, canonicalRoot, env));
57
+ return (0, agent_links_1.applyAgentLinkPass)(result, {
58
+ dryRun: input.dryRun,
59
+ env,
60
+ canonicalRoot,
61
+ });
62
+ }
63
+ function skillsBundleDeps(runner, packageRoot, canonicalRoot, env) {
64
+ return {
55
65
  install: async (names) => {
56
66
  await runner.exec("npx", [
57
67
  "-y",
@@ -66,8 +76,14 @@ async function syncCurrentSkills(input, env = process.env, deps = {}) {
66
76
  },
67
77
  remove: async (names) => {
68
78
  await runner.exec("npx", ["-y", "skills", "remove", ...names, "-y", "-g"], { timeoutMs: SKILLS_TIMEOUT_MS });
79
+ (0, agent_links_1.removeAgentLinks)({
80
+ canonicalRoot,
81
+ skillNames: names,
82
+ homeDir: (0, agent_links_1.agentHomeDir)(env),
83
+ env,
84
+ });
69
85
  },
70
- });
86
+ };
71
87
  }
72
88
  async function cmdSkills(args, flags, env = process.env, deps = {}) {
73
89
  const parsed = parseSkillsArgs(args);
@@ -81,6 +97,7 @@ async function cmdSkills(args, flags, env = process.env, deps = {}) {
81
97
  ],
82
98
  notes: [
83
99
  "Skills are synced only from the verified bundle inside the installed @alphafox/cli package",
100
+ "Sync also links Skills into ~/.claude/skills (and ~/.cursor/skills, ~/.codex/skills when those agents are present)",
84
101
  "Modified Skills are preserved unless --force --yes is explicit",
85
102
  "Restart the AI tool after a successful sync",
86
103
  ],
@@ -1,153 +1,153 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "@alphafox/cli",
4
- "packageVersion": "0.3.10",
4
+ "packageVersion": "0.3.12",
5
5
  "contractVersion": "2026-08-13",
6
- "bundleHash": "e03966174d892d1205e0f4a5ec69c11d7cd78e9f5bd2f95fc3e145b7dfea14cd",
6
+ "bundleHash": "5129a939b6c209ec5e5d1a08ee94fe3c4999c53bd251731314c27de29f8ff5f0",
7
7
  "skills": [
8
8
  {
9
9
  "name": "alphafox",
10
- "version": "0.3.10",
10
+ "version": "0.3.12",
11
11
  "files": [
12
12
  {
13
13
  "path": "SKILL.md",
14
- "sha256": "58466ff1f9d42d6c64b1a4b2d52bafd40857dd7e0ca928f987fc926c358bd850",
15
- "size": 4407
14
+ "sha256": "37dc3b595471e1130662a54d8aed35e12a32222d2f95d3fadf3c9f5636a52ac9",
15
+ "size": 7415
16
16
  }
17
17
  ],
18
- "hash": "363bf0b3746b8cd8b291956b58dd9ac3e001bc1bfb80f0fa9c471aec4bf0021d"
18
+ "hash": "87347f1a8364fa982399b5641d6ff347c85376425e589ad6581001b1d1fefaac"
19
19
  },
20
20
  {
21
21
  "name": "alphafox-account",
22
- "version": "0.3.10",
22
+ "version": "0.3.12",
23
23
  "files": [
24
24
  {
25
25
  "path": "SKILL.md",
26
- "sha256": "4fcc7608817c900055dd605e0e71cd5b05e0945516701d0a281ebefb0407fb7b",
26
+ "sha256": "c4cdac0a980106ad110c306b5248b9b8f325d9de60e50f39d412b40854238a36",
27
27
  "size": 784
28
28
  }
29
29
  ],
30
- "hash": "273fdb4dd81103fc214b85ab7d59fb9dd65ebf2ec6d5d0d889837573bd8e3dae"
30
+ "hash": "743b0f52a8f707f568c8ba9fba28d648d67d7ed524c6b41b550b9dd8d56434a0"
31
31
  },
32
32
  {
33
33
  "name": "alphafox-admin",
34
- "version": "0.3.10",
34
+ "version": "0.3.12",
35
35
  "files": [
36
36
  {
37
37
  "path": "SKILL.md",
38
- "sha256": "0639573e3d59f42d3d718bdf07d719b01d802cbbdc04806c14882ebf8cd7c081",
38
+ "sha256": "6f06d16bd52b3d8651b91b0b6e4dc606d1d98de5827fc5c164f6d23705de3910",
39
39
  "size": 788
40
40
  }
41
41
  ],
42
- "hash": "bcd9d41096e65472eebc0981cc9f614c755f28ae307dffdb15117ad8e22c954c"
42
+ "hash": "ccbca03ae872a794eb950897b8cac4f398014a9c014ac956245c89ffb08bf4f0"
43
43
  },
44
44
  {
45
45
  "name": "alphafox-auth",
46
- "version": "0.3.10",
46
+ "version": "0.3.12",
47
47
  "files": [
48
48
  {
49
49
  "path": "SKILL.md",
50
- "sha256": "d4edec17dd89e9e2e5d1759657837456f60d0b062d0a332334d9e6df6bfe003e",
50
+ "sha256": "5985bdd0663d806e8ae8ab08d2ef2e1c1aa99b541ff5a5e72b14337eff3f22e6",
51
51
  "size": 2371
52
52
  }
53
53
  ],
54
- "hash": "01c80f4fa33736e85b845576e5d026e7ec32869a8c0f806119625d44e43fcbaa"
54
+ "hash": "a42814a37f6cddf2e21f6badd1f66254091d734d1210c87cff6e11ea17432241"
55
55
  },
56
56
  {
57
57
  "name": "alphafox-cache",
58
- "version": "0.3.10",
58
+ "version": "0.3.12",
59
59
  "files": [
60
60
  {
61
61
  "path": "SKILL.md",
62
- "sha256": "c7f36174e5bb1ac97ca55e89b6720863d3d05a52a522ff5498a4c5ea4a31adaa",
62
+ "sha256": "9653fe4bc132b2f587a57cebf5c646527faf4f081d51f80645c3be34e952161e",
63
63
  "size": 1530
64
64
  }
65
65
  ],
66
- "hash": "a5a68c82de33aa8e09b12a65de1c45c522490d1b807c34a9616792cc71a13350"
66
+ "hash": "e3c8c25d221c5b0574f17d455b2c29d8a8c075c2a007cac4302c0fa47ea1e226"
67
67
  },
68
68
  {
69
69
  "name": "alphafox-engine-backtest",
70
- "version": "0.3.10",
70
+ "version": "0.3.12",
71
71
  "files": [
72
72
  {
73
73
  "path": "SKILL.md",
74
- "sha256": "dbcb6dc047150bdf3988da112691868787be4a51bda95e60c63628269b06a8d7",
75
- "size": 7803
74
+ "sha256": "1bd19ba3222dd8ab90f69509c8c02db3e2b9ef460c0539816ad83fba396e8e64",
75
+ "size": 8278
76
76
  }
77
77
  ],
78
- "hash": "1e85862e3ea104968061a0d778b836a6475b1d676dfbbb80a074851cd4e386fb"
78
+ "hash": "ff899b9199e5ac28ef77f6fc8bf582d341483d0617933f669ca4f9a40e8d5bef"
79
79
  },
80
80
  {
81
81
  "name": "alphafox-exchange",
82
- "version": "0.3.10",
82
+ "version": "0.3.12",
83
83
  "files": [
84
84
  {
85
85
  "path": "SKILL.md",
86
- "sha256": "100f74f3240d86e73531a981585c9a236d3d5fd3ea31ecb54a74074d4e256403",
86
+ "sha256": "0dd186a4f7c34b01ad19028da5ecdfe2f15a15e2dc00997e048a7caa54e9d5b2",
87
87
  "size": 744
88
88
  }
89
89
  ],
90
- "hash": "9230a196316900e2cf6bd15659d2bf47f5332d855663f4dd116744139cfcf968"
90
+ "hash": "b2a0a6d2ad588da804bbadfd505b395ecace330732b3be5dcc3110f3c4d0a2eb"
91
91
  },
92
92
  {
93
93
  "name": "alphafox-market",
94
- "version": "0.3.10",
94
+ "version": "0.3.12",
95
95
  "files": [
96
96
  {
97
97
  "path": "SKILL.md",
98
- "sha256": "e750c23aaad020221a6cfdf2b273886c8367de63ca68df6a95cb31492c447f0d",
98
+ "sha256": "fba7e2e1a8a474234d984ab9bb99a91d003e8e365c10796687d6f7d8b20319ab",
99
99
  "size": 3079
100
100
  }
101
101
  ],
102
- "hash": "34283bcd2403e671ba5dcd4da7d3ad65f73a46ca3a5d29d28c3464038dfb074c"
102
+ "hash": "9e804c4418f4745b18915a4c0b8f7b7ef1a2eb4e5263d43cb5f665523b547425"
103
103
  },
104
104
  {
105
105
  "name": "alphafox-notification",
106
- "version": "0.3.10",
106
+ "version": "0.3.12",
107
107
  "files": [
108
108
  {
109
109
  "path": "SKILL.md",
110
- "sha256": "4d6e705ff6aff33af729bca184dcb716cd97d31b4fe188173b07423eba0d94d4",
110
+ "sha256": "02fc964294afa9630f220ff9bdaed283df15ddd92d52a9d9e48432072dfe87ed",
111
111
  "size": 699
112
112
  }
113
113
  ],
114
- "hash": "a36312725ffa86ed9e629b056375b68ae6955d56a304c5895e4ab24666a53763"
114
+ "hash": "acc77bfbd3f74625e80b4aeabcf2e29ff55eadb9a20a1a421f8be95ab6f2d84b"
115
115
  },
116
116
  {
117
117
  "name": "alphafox-shared",
118
- "version": "0.3.10",
118
+ "version": "0.3.12",
119
119
  "files": [
120
120
  {
121
121
  "path": "SKILL.md",
122
- "sha256": "4019aba3820aa1cf16dcb49202f251e4074829a130a7608caf6c67c3118a799c",
123
- "size": 5386
122
+ "sha256": "3d9d42c3e63c1f3c524923c9b2c544fe948464e3bf9ea1a7ec898023f68efe7c",
123
+ "size": 5643
124
124
  }
125
125
  ],
126
- "hash": "ae7dbd98f00f8f6162d5dc77bd35ca13303895f7d6c91d910af1f46f03d2869e"
126
+ "hash": "68affee820b6b6d41d01c0b83cebcd9431fa70eafe975d98736e983d47059d89"
127
127
  },
128
128
  {
129
129
  "name": "alphafox-strategy",
130
- "version": "0.3.10",
130
+ "version": "0.3.12",
131
131
  "files": [
132
132
  {
133
133
  "path": "SKILL.md",
134
- "sha256": "85c78855f0a312f5093642668606197cc68569e9203f5b85a6e9c4bd3b9c9c21",
135
- "size": 1827
134
+ "sha256": "956198df91f79ae2976d5aed8a5842a9e22c907ecafb28378e89fe5b942ee5c2",
135
+ "size": 4398
136
136
  }
137
137
  ],
138
- "hash": "cb79e63d42a2559d2ec69b684c7d13d3351b49e117ca3256f462f0f04ba7d657"
138
+ "hash": "58e72dbd185c1fa033aa52c63a79478701e3a75c14583fca13459ad55d9b3622"
139
139
  },
140
140
  {
141
141
  "name": "alphafox-trading",
142
- "version": "0.3.10",
142
+ "version": "0.3.12",
143
143
  "files": [
144
144
  {
145
145
  "path": "SKILL.md",
146
- "sha256": "b580088309ddaeb0b460b572c9861393fe8d9b1129fca2f9dd2e9caa4b568368",
146
+ "sha256": "09da55fd6ff864c6fdac0b79e106e62d7c3f083610ae71b4fad38439b529dd91",
147
147
  "size": 3123
148
148
  }
149
149
  ],
150
- "hash": "c215ba2c61b5d4487046bb7f56145eabdc942c70c6c36f2d79cc2d7da887463f"
150
+ "hash": "5ae19801df517c9c7f73c7d1b64fe0feeb0790ea660905f0971eea5ae9f209f9"
151
151
  }
152
152
  ]
153
153
  }
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export declare const CLI_NAME = "alphafox";
2
2
  export declare const CLI_PACKAGE = "@alphafox/cli";
3
- export declare const CLI_VERSION = "0.3.10";
3
+ export declare const CLI_VERSION = "0.3.12";
4
4
  export { CATALOG_VERSION as CLI_CONTRACT_VERSION } from "./catalog/operations";
package/dist/version.js CHANGED
@@ -3,6 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CLI_CONTRACT_VERSION = exports.CLI_VERSION = exports.CLI_PACKAGE = exports.CLI_NAME = void 0;
4
4
  exports.CLI_NAME = "alphafox";
5
5
  exports.CLI_PACKAGE = "@alphafox/cli";
6
- exports.CLI_VERSION = "0.3.10";
6
+ exports.CLI_VERSION = "0.3.12";
7
7
  var operations_1 = require("./catalog/operations");
8
8
  Object.defineProperty(exports, "CLI_CONTRACT_VERSION", { enumerable: true, get: function () { return operations_1.CATALOG_VERSION; } });
@@ -24,6 +24,11 @@ npm install -g @alphafox/cli
24
24
  alphafox skills sync --format json --no-input
25
25
  ```
26
26
 
27
+ `alphafox skills sync` writes the verified bundle to `~/.agents/skills` and
28
+ then links each Skill into `~/.claude/skills` so Claude Code can discover it.
29
+ Cursor (`~/.cursor/skills`) and Codex (`~/.codex/skills`) are linked when those
30
+ tools are already present. `alphafox skills status` reports `agentLinks`.
31
+
27
32
  Do not install Skills from GitHub `main` as a fallback. The CLI verifies the
28
33
  manifest and hashes inside the npm package before syncing. If sync fails, stop
29
34
  and report the error rather than downloading a different Skills version.
@@ -87,8 +92,14 @@ Parse the JSON envelope: `ok === true` means success. Errors land on
87
92
  ## Step 4: Tell the user to restart
88
93
 
89
94
  Ask the user to **restart the AI tool** so the new Skills are loaded.
90
- Then they can ask the Agent to use AlphaFox. The entry skill `alphafox` routes
91
- to auth, market, engine-backtest, strategy, trading, and the rest.
95
+
96
+ ## Step 5: New-user welcome
97
+
98
+ After restart and `alphafox auth status --verify` shows `session: active`,
99
+ follow skill `alphafox` **After install**: fetch the Lite square catalog
100
+ (`lite.catalog_config.get`, `lite.signal_sources.list`) and introduce the
101
+ classic strategy definitions from `trading.strategy_definitions.list`. Do not
102
+ invent 带单员 names. Do not create a trader until the user asks.
92
103
 
93
104
  ## Human wizard (do not run this from an Agent)
94
105
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alphafox/cli",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "description": "AlphaFox CLI — Agent/Human entry for the public Application API.",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: alphafox-account
3
3
  description: Account, wallet, and subscription read paths.
4
- version: 0.3.10
4
+ version: 0.3.12
5
5
  ---
6
6
 
7
7
  # Account / wallet
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: alphafox-admin
3
3
  description: Admin-only operations reusing Web role authorization.
4
- version: 0.3.10
4
+ version: 0.3.12
5
5
  ---
6
6
 
7
7
  # Admin