@lark-apaas/miaoda-cli 0.1.24-alpha.77f133a → 0.1.24-alpha.bc2625d
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/api/db/sql-keywords.js +1 -0
- package/dist/cli/handlers/app/init.js +29 -17
- package/dist/cli/handlers/db/sql.js +15 -0
- package/dist/services/app/init/index.js +2 -1
- package/dist/services/app/init/template.js +8 -1
- package/dist/services/deploy/modern/patch/source-scan.js +18 -0
- package/package.json +1 -1
|
@@ -60,11 +60,16 @@ async function handleAppInit(opts) {
|
|
|
60
60
|
const tplResult = (0, index_1.renderTemplate)({ stack, version, targetDir, projectName });
|
|
61
61
|
// source_path 导入:当前仅 app_type=modern_html 生效。渲染完模板后、装依赖前叠加进 src/。
|
|
62
62
|
const sourceImport = applySourcePathImport(opts, targetDir);
|
|
63
|
+
// 本地脚手架门禁:沙箱内所有栈照旧同步(nested,产出 .agent/);本地只有 LOCAL_STEERING_STACKS
|
|
64
|
+
// 白名单栈(nestjs-react-fullstack / vite-react)才落地 steering(.claude/.agents)与 logs/。
|
|
65
|
+
// html / design-html 是纯静态 / 设计产物,本地不需要这套 agent skills 脚手架,整段跳过。
|
|
66
|
+
const sandbox = (0, env_1.isSandboxEnv)();
|
|
67
|
+
const scaffoldSteering = sandbox || index_1.LOCAL_STEERING_STACKS.has(stack);
|
|
63
68
|
// 先建 logs/,防止 user 跑 dev 之前 AI/工具 redirect 到 logs/*.log 因为父目录不存在直接挂
|
|
64
69
|
// (dev.js / dev-local.js 自己也建 logs/,但只在它启动后;启动前的 shell redirect 会先于此)。
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
if (!
|
|
70
|
+
// 仅本地白名单栈需要:沙箱环境由平台 supervisor 拉起 dev,无 init 前的 shell redirect 场景;
|
|
71
|
+
// 非白名单栈本地不落 steering 脚手架,也无需预建 logs/。
|
|
72
|
+
if (!sandbox && scaffoldSteering) {
|
|
68
73
|
(0, logs_dir_1.ensureLogsDir)(targetDir);
|
|
69
74
|
}
|
|
70
75
|
// skills 同步软失败:拉不到 coding-steering 包不该阻断 writeSparkMeta /
|
|
@@ -74,21 +79,28 @@ async function handleAppInit(opts) {
|
|
|
74
79
|
// 跟沙箱端 update-skills.sh 链路对齐
|
|
75
80
|
// - 本地 → flat (.agents/skills + .claude/skills 软链),
|
|
76
81
|
// Agent / Claude Code 用同一份;nrf 在本地是主战场,vite-react 等也一样适用
|
|
77
|
-
const outputLayout =
|
|
78
|
-
|
|
82
|
+
const outputLayout = sandbox ? 'nested' : 'flat';
|
|
83
|
+
// 默认空结果:非白名单栈跳过 steering 同步时(scaffoldSteering=false)直接沿用,
|
|
84
|
+
// 与"拉不到 coding-steering 包"软失败路径共用同一份占位,emit / meta 落盘不受影响。
|
|
85
|
+
let steeringResult = {
|
|
86
|
+
version: 'unknown',
|
|
87
|
+
syncedSkills: [],
|
|
88
|
+
techSynced: false,
|
|
89
|
+
};
|
|
79
90
|
let steeringError;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
if (scaffoldSteering) {
|
|
92
|
+
try {
|
|
93
|
+
steeringResult = (0, coding_steering_1.syncCodingSteering)({
|
|
94
|
+
stack,
|
|
95
|
+
targetDir,
|
|
96
|
+
logPrefix: 'init',
|
|
97
|
+
outputLayout,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
steeringError = err instanceof Error ? err.message : String(err);
|
|
102
|
+
(0, logger_1.log)('init', `⚠ skills sync failed (continuing init): ${steeringError}`);
|
|
103
|
+
}
|
|
92
104
|
}
|
|
93
105
|
// 依赖安装:async 模式留到 meta 落盘后派发后台进程(不等装完),同步模式当场装。
|
|
94
106
|
// 同步:装模板钉死的依赖。不带 <pkg>@latest 位置参数,因此 npm 不会改写 package.json/lockfile
|
|
@@ -411,6 +411,19 @@ const ISO_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?
|
|
|
411
411
|
const SYNTAX_RE = /syntax error at or near "([^"]+)"/i;
|
|
412
412
|
const RELATION_RE = /relation "([^"]+)" does not exist/i;
|
|
413
413
|
const COLUMN_RE = /column "([^"]+)"(?: of relation "([^"]+)")? does not exist/i;
|
|
414
|
+
const KEYWORD_TYPO_IGNORE_WORDS = new Set([
|
|
415
|
+
// Legal PostgreSQL terms that are not useful keyword typo candidates.
|
|
416
|
+
'ROW',
|
|
417
|
+
'LEVEL',
|
|
418
|
+
'SECURITY',
|
|
419
|
+
// Common index access methods used after `USING`.
|
|
420
|
+
'BTREE',
|
|
421
|
+
'HASH',
|
|
422
|
+
'GIST',
|
|
423
|
+
'SPGIST',
|
|
424
|
+
'GIN',
|
|
425
|
+
'BRIN',
|
|
426
|
+
]);
|
|
414
427
|
/**
|
|
415
428
|
* 在错误抛出前富化 next_actions(最多 1 条 hint),按 PG 报错形态分发:
|
|
416
429
|
*
|
|
@@ -540,6 +553,8 @@ function findKeywordTypo(sql) {
|
|
|
540
553
|
const upper = tok.toUpperCase();
|
|
541
554
|
if (sql_keywords_1.SQL_KEYWORDS.includes(upper))
|
|
542
555
|
continue; // 写对的关键字
|
|
556
|
+
if (KEYWORD_TYPO_IGNORE_WORDS.has(upper))
|
|
557
|
+
continue;
|
|
543
558
|
const guess = (0, fuzzy_match_1.suggest)(upper, sql_keywords_1.SQL_KEYWORDS);
|
|
544
559
|
if (guess && guess !== upper) {
|
|
545
560
|
return { input: tok, suggest: guess };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ASYNC_INSTALL_LOG = exports.runAsyncInstallWorker = exports.dispatchAsyncInstall = exports.resolveNpmInstallRegistry = exports.installDependencies = exports.writeSparkMeta = exports.readSparkMeta = exports.IMPORT_SKIP_FILES = exports.IMPORT_SKIP_DIRS = exports.importSourceSrc = exports.TEMPLATE_PACKAGE_BY_STACK = exports.STACK_BY_APP_TYPE = exports.APP_TYPES = exports.SUPPORTED_STACKS = exports.resolveStack = exports.renderTemplate = void 0;
|
|
3
|
+
exports.ASYNC_INSTALL_LOG = exports.runAsyncInstallWorker = exports.dispatchAsyncInstall = exports.resolveNpmInstallRegistry = exports.installDependencies = exports.writeSparkMeta = exports.readSparkMeta = exports.IMPORT_SKIP_FILES = exports.IMPORT_SKIP_DIRS = exports.importSourceSrc = exports.TEMPLATE_PACKAGE_BY_STACK = exports.STACK_BY_APP_TYPE = exports.APP_TYPES = exports.LOCAL_STEERING_STACKS = exports.SUPPORTED_STACKS = exports.resolveStack = exports.renderTemplate = void 0;
|
|
4
4
|
var template_1 = require("./template");
|
|
5
5
|
Object.defineProperty(exports, "renderTemplate", { enumerable: true, get: function () { return template_1.renderTemplate; } });
|
|
6
6
|
Object.defineProperty(exports, "resolveStack", { enumerable: true, get: function () { return template_1.resolveStack; } });
|
|
7
7
|
Object.defineProperty(exports, "SUPPORTED_STACKS", { enumerable: true, get: function () { return template_1.SUPPORTED_STACKS; } });
|
|
8
|
+
Object.defineProperty(exports, "LOCAL_STEERING_STACKS", { enumerable: true, get: function () { return template_1.LOCAL_STEERING_STACKS; } });
|
|
8
9
|
Object.defineProperty(exports, "APP_TYPES", { enumerable: true, get: function () { return template_1.APP_TYPES; } });
|
|
9
10
|
Object.defineProperty(exports, "STACK_BY_APP_TYPE", { enumerable: true, get: function () { return template_1.STACK_BY_APP_TYPE; } });
|
|
10
11
|
Object.defineProperty(exports, "TEMPLATE_PACKAGE_BY_STACK", { enumerable: true, get: function () { return template_1.TEMPLATE_PACKAGE_BY_STACK; } });
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.APP_TYPES = exports.STACK_BY_APP_TYPE = exports.SUPPORTED_STACKS = exports.TEMPLATE_PINNED_VERSION_BY_STACK = exports.TEMPLATE_PACKAGE_BY_STACK = void 0;
|
|
6
|
+
exports.APP_TYPES = exports.STACK_BY_APP_TYPE = exports.LOCAL_STEERING_STACKS = exports.SUPPORTED_STACKS = exports.TEMPLATE_PINNED_VERSION_BY_STACK = exports.TEMPLATE_PACKAGE_BY_STACK = void 0;
|
|
7
7
|
exports.resolveStack = resolveStack;
|
|
8
8
|
exports.renderTemplate = renderTemplate;
|
|
9
9
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
@@ -27,6 +27,13 @@ exports.TEMPLATE_PACKAGE_BY_STACK = {
|
|
|
27
27
|
*/
|
|
28
28
|
exports.TEMPLATE_PINNED_VERSION_BY_STACK = {};
|
|
29
29
|
exports.SUPPORTED_STACKS = Object.keys(exports.TEMPLATE_PACKAGE_BY_STACK);
|
|
30
|
+
/**
|
|
31
|
+
* 本地开发(非沙箱)需要落地 agent skills 脚手架(.claude/.agents)与 logs/ 的 stack 白名单。
|
|
32
|
+
* 只有这些全栈 / 前端框架栈在本地才需要 coding-steering 的 skills;html / design-html 是纯
|
|
33
|
+
* 静态 / 设计产物,本地无需这套脚手架,init 直接跳过 syncCodingSteering 与 logs 创建。
|
|
34
|
+
* 沙箱环境不受此白名单约束(所有栈照旧走 nested 同步,产出 .agent/)。
|
|
35
|
+
*/
|
|
36
|
+
exports.LOCAL_STEERING_STACKS = new Set(['nestjs-react-fullstack', 'vite-react']);
|
|
30
37
|
/**
|
|
31
38
|
* app_type(业务类型)→ stack 短名映射。仅在调用方未显式传 --template 时用于解析 stack。
|
|
32
39
|
* 与 src/api/app/types.ts 的 AppType 枚举无关,是独立的业务类型概念。
|
|
@@ -19,14 +19,32 @@ exports.EXCLUDES = new Set([
|
|
|
19
19
|
'yarn.lock',
|
|
20
20
|
'.gitignore',
|
|
21
21
|
'.npmrc',
|
|
22
|
+
// agent / 编辑器配置目录与指令文件:只服务本地开发,不属于应用资产。
|
|
23
|
+
// 注意 .claude/skills 在 flat layout 下是指向 ../.agents/skills 的软链,而 listSourceFiles
|
|
24
|
+
// 会 follow 软链,所以必须按 basename 把 .claude 整个排掉,否则 skills 会从软链侧被带进产物。
|
|
22
25
|
'.agent',
|
|
23
26
|
'.agents',
|
|
27
|
+
'.claude',
|
|
28
|
+
'.codex',
|
|
29
|
+
'.cursor',
|
|
30
|
+
'.gemini',
|
|
31
|
+
'.trae',
|
|
32
|
+
'.windsurf',
|
|
33
|
+
'.vscode',
|
|
34
|
+
'.idea',
|
|
35
|
+
'AGENTS.md',
|
|
36
|
+
'CLAUDE.md',
|
|
37
|
+
'GEMINI.md',
|
|
24
38
|
'skills',
|
|
25
39
|
'.env',
|
|
26
40
|
'.env.local',
|
|
27
41
|
'README.md',
|
|
28
42
|
'.DS_Store',
|
|
29
43
|
'.spark',
|
|
44
|
+
// 本地开发的临时/运行时目录:tmp 里的 .html 是草稿或中间产物,logs 是本地日志,
|
|
45
|
+
// 两者既不进产物也不该出现在 routes.json。
|
|
46
|
+
'tmp',
|
|
47
|
+
'logs',
|
|
30
48
|
]);
|
|
31
49
|
/**
|
|
32
50
|
* 递归列出 root 下所有文件的相对 posix 路径,跳过 EXCLUDES(任意层级 basename),
|