@tianacloud/agent-skills 1.0.10 → 1.0.11

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Tiana Agent Skills
2
2
 
3
- 四个基础技能覆盖 Tiana 账号与实例、SQLite、Git 和 Web 应用。应用模板由在线目录提供,用户描述需求后,Agent 根据实时目录决定使用模板还是直接开发。
3
+ 五个基础技能覆盖 Tiana 账号与实例、SQLite、Git、后端服务和 Web 应用。应用模板由在线目录提供,用户描述需求后,Agent 根据实时目录决定使用模板还是直接开发。
4
4
 
5
5
  ## 从 npm 安装
6
6
 
@@ -10,7 +10,7 @@
10
10
  npx --yes @tianacloud/agent-skills@latest install --agent codex
11
11
  ```
12
12
 
13
- 安装器调用精确依赖的 skills 工具,把 npm 包中的四个技能复制到客户端的持久目录;Codex 当前工具使用 `~/.agents/skills/`。不传目标时选择客户端:
13
+ 安装器调用精确依赖的 skills 工具,把 npm 包中的五个技能复制到客户端的持久目录;Codex 当前工具使用 `~/.agents/skills/`。不传目标时选择客户端:
14
14
 
15
15
  ```sh
16
16
  npx --yes @tianacloud/agent-skills@latest install
@@ -22,17 +22,18 @@ npx --yes @tianacloud/agent-skills@latest install
22
22
  npx --yes @tianacloud/agent-skills@latest install --dir /path/to/client/skills
23
23
  ```
24
24
 
25
- Windows PowerShell 使用 `npx.cmd`。目录可以含空格,用引号包住。重复安装会更新这四个技能目录,其他技能保留。安装完成后让客户端重载技能或开始新会话。
25
+ Windows PowerShell 使用 `npx.cmd`。目录可以含空格,用引号包住。重复安装会更新这五个技能目录,其他技能保留。安装完成后让客户端重载技能或开始新会话。
26
26
 
27
- WorkBuddy、豆包按所用版本的目录/ZIP 导入方式加载这四个目录,保留 SKILL.md 和 references。若要求 ZIP,可将每个技能目录的内容打包,SKILL.md 位于包根部。WorkBuddy 专用本地化 ZIP 由维护者构建流程提供;本仓验证 ZIP 格式和内容,不声称已验收这些客户端的运行行为。
27
+ WorkBuddy、豆包按所用版本的目录/ZIP 导入方式加载这五个目录,保留 SKILL.md 和 references。若要求 ZIP,可将每个技能目录的内容打包,SKILL.md 位于包根部。WorkBuddy 专用本地化 ZIP 由维护者构建流程提供;本仓验证 ZIP 格式和内容,不声称已验收这些客户端的运行行为。
28
28
 
29
- ## 四个入口
29
+ ## 五个入口
30
30
 
31
31
  | 技能 | 职责 |
32
32
  | --- | --- |
33
33
  | [tiana](skills/tiana/SKILL.md) | CLI 安装、登录、账号额度和通用实例管理 |
34
34
  | [tiana-sqlite](skills/tiana-sqlite/SKILL.md) | SQL、表结构、SDK 连接和数据库分支 |
35
35
  | [tiana-git](skills/tiana-git/SKILL.md) | Git 实例、原生仓库操作和源码版本同步 |
36
+ | [tiana-function](skills/tiana-function/SKILL.md) | Go 后端服务源码、构建发布、参数/CORS 与数据库后端 |
36
37
  | [tiana-web](skills/tiana-web/SKILL.md) | 实时模板选择、工程与数据初始化、通用开发、构建发布 |
37
38
 
38
39
  Web 技能每次任务都实际执行 `tiana web list-template --json`,使用当前 name/description 判断需求。模板 ZIP 原样下载解压到独立项目目录;Agent 按根部 metadata.json 替换变量、先 schema 后 seeds。模板源码和制作规范见 [template-apps](https://github.com/tianacloud/template-apps),客户安装模板由 CLI 和 MGR 目录完成。
@@ -55,7 +56,7 @@ WorkBuddy Connector 固定 online,配置和当前使用说明见 [Connector](d
55
56
 
56
57
  ## 检查与更新
57
58
 
58
- 四个技能调用 CLI 检查 npm latest,CLI 普通终端调用也使用同一本地状态。两个包各自最多每 24 小时尝试检查一次,CLI 与 Skills 共用每 24 小时一次提醒。已满足最低 CLI 版本时,断网不阻断任务;升级需要用户确认。
59
+ 五个技能调用 CLI 检查 npm latest,CLI 普通终端调用也使用同一本地状态。两个包各自最多每 24 小时尝试检查一次,CLI 与 Skills 共用每 24 小时一次提醒。已满足最低 CLI 版本时,断网不阻断任务;升级需要用户确认。
59
60
 
60
61
  确认升级后重新安装检查返回的实际版本,并核验 `tiana version`、技能 metadata.version 和宿主重载结果。已加载的会话不会因磁盘替换而自动更换指令。详情见 [开始使用](skills/tiana/references/getting-started.md)。
61
62
 
@@ -6,7 +6,7 @@ import { createRequire } from 'node:module';
6
6
  import { spawnSync } from 'node:child_process';
7
7
 
8
8
  const root = fileURLToPath(new URL('../', import.meta.url));
9
- const names = ['tiana', 'tiana-sqlite', 'tiana-git', 'tiana-web'];
9
+ const names = ['tiana', 'tiana-sqlite', 'tiana-git', 'tiana-web', 'tiana-function'];
10
10
  const usage = 'tiana-skills install [--agent NAME | --dir PATH]';
11
11
  try {
12
12
  const args = process.argv.slice(2);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tianacloud/agent-skills",
3
- "version": "1.0.10",
4
- "description": "Tiana Cloud Skills for accounts, SQLite, Git and Web applications",
3
+ "version": "1.0.11",
4
+ "description": "Tiana Cloud Skills for accounts, SQLite, Git, Functions and Web applications",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
package/plugin.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "tiana",
4
- "version": "1.0.10",
5
- "description": "Tiana Cloud account, SQLite, Git and Web application workflows",
4
+ "version": "1.0.11",
5
+ "description": "Tiana Cloud account, SQLite, Git, Functions and Web application workflows",
6
6
  "author": {
7
7
  "name": "Tiana Cloud",
8
8
  "url": "https://github.com/tianacloud"
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: tiana
3
- description: 使用 Tiana Cloud 管理实例、安装 CLI、登录和恢复账号会话。通用 Tiana 任务从此技能开始;Web 应用创建发布使用 tiana-web,数据库和分支使用 tiana-sqlite,Git 仓库和源码同步使用 tiana-git。
3
+ description: 使用 Tiana Cloud 管理实例、安装 CLI、登录和恢复账号会话。通用 Tiana 任务从此技能开始;Web 应用创建发布使用 tiana-web,数据库和分支使用 tiana-sqlite,Git 仓库和源码同步使用 tiana-git,后端服务与数据库后端使用 tiana-function。
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Tiana Cloud
7
- version: "1.0.10"
7
+ version: "1.0.11"
8
8
  source: https://github.com/tianacloud/agent-skills/tree/main/skills/tiana
9
9
  ---
10
10
 
@@ -17,10 +17,10 @@ metadata:
17
17
  **本会话首次使用任一 Tiana 技能时,先完成以下步骤,再开始登录、查询模板或操作应用:**
18
18
 
19
19
  1. 执行 `tiana version`,按[开始使用](references/getting-started.md)核验最低版本;缺少 CLI 或版本过低时,先完成安装或经用户确认的升级。
20
- 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.10 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
20
+ 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.11 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
21
21
  3. 实际发起检查命令后,才在会话中记为已尝试,并保留返回结果或执行错误。仅运行 `tiana version` 只完成第 1 步。
22
22
 
23
- 四个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
23
+ 五个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
24
24
 
25
25
  仅在 `should_notify=true` 时简短提醒并询问是否升级;用户选择稍后或检查不可用时继续原任务。CLI 仍管理检查缓存和共同的 24 小时提醒额度。升级及重载见[开始使用](references/getting-started.md#更新)。
26
26
 
@@ -29,6 +29,7 @@ metadata:
29
29
  | 任务 | 技能 |
30
30
  | --- | --- |
31
31
  | 创建、修改、预览、发布 Web 应用 | [tiana-web](../tiana-web/SKILL.md) |
32
+ | Go 后端服务、源码、参数及编译发布 | [tiana-function](../tiana-function/SKILL.md) |
32
33
  | SQLite 查询、连接、建表及数据库分支 | [tiana-sqlite](../tiana-sqlite/SKILL.md) |
33
34
  | Git 实例、仓库、源码版本同步 | [tiana-git](../tiana-git/SKILL.md) |
34
35
  | 登录、账号、额度、通用实例管理 | 本技能 |
@@ -22,7 +22,7 @@ npm install -g @tianacloud/cli@latest --registry=https://registry.npmjs.org/
22
22
  npx --yes @tianacloud/agent-skills@latest install --agent codex
23
23
  ```
24
24
 
25
- 其他客户端按自己的安装目录使用 `install --dir PATH`,或不传目标运行客户端选择流程。四个 Skills 来自 npm 包内目录,安装后是持久文件副本。导入 Skill 与安装 CLI 是两步。
25
+ 其他客户端按自己的安装目录使用 `install --dir PATH`,或不传目标运行客户端选择流程。五个 Skills 来自 npm 包内目录,安装后是持久文件副本。导入 Skill 与安装 CLI 是两步。
26
26
 
27
27
  核验安装后,先完成入口 SKILL.md 中的会话更新检查,再执行 `tiana status`,按实际结果继续任务或恢复登录。用户同时要求创建应用时,完成安装和登录后继续原始需求。当前会话可以读取新安装的 SKILL.md 及其引用文件;宿主必须重载才可使用时,明确提示重载,并保留应用需求及本次环境选择。安装失败时报告实际阶段;没有执行过的登录、资源创建或发布仍然未知。
28
28
 
@@ -34,7 +34,7 @@ npx --yes @tianacloud/agent-skills@latest install --agent codex
34
34
 
35
35
  当前 CLI 已满足最低版本时,用户选择稍后升级仍继续原任务;确认后才安装所选包的实际更新版本:CLI 使用 `npm install -g @tianacloud/cli@VERSION --registry=https://registry.npmjs.org/`;Skills 使用 `npx --yes @tianacloud/agent-skills@VERSION install --agent CLIENT`,或复用原来的 `--dir PATH`。VERSION 从检查结果取得,CLIENT/目录对应当前宿主的实际安装目标。
36
36
 
37
- CLI 升级后核验 `tiana version` 和所需帮助;Skills 安装后检查四份 SKILL.md 的 metadata.version,并让宿主重载或开始新会话。当前会话已经加载的旧指令仍按旧版本处理,不把磁盘替换当作已重载。升级失败保留实际错误,不中途改动应用资源或凭据来修复。
37
+ CLI 升级后核验 `tiana version` 和所需帮助;Skills 安装后检查五份 SKILL.md 的 metadata.version,并让宿主重载或开始新会话。当前会话已经加载的旧指令仍按旧版本处理,不把磁盘替换当作已重载。升级失败保留实际错误,不中途改动应用资源或凭据来修复。
38
38
 
39
39
  ## 环境与地址
40
40
 
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: tiana-function
3
+ description: 使用 Tiana 创建和管理 Go 后端服务,读取及保存 Git 源码、编译发布、修改参数与 CORS;为 Web 应用开发访问 SQLite 的后端服务时使用。前端页面开发配合 tiana-web。
4
+ license: Apache-2.0
5
+ metadata:
6
+ author: Tiana Cloud
7
+ version: "1.0.11"
8
+ parent: tiana
9
+ source: https://github.com/tianacloud/agent-skills/tree/main/skills/tiana-function
10
+ ---
11
+
12
+ # Tiana Function
13
+
14
+ 本 skill 负责后端服务的创建与管理、源码、运行参数、Go 接口及数据库访问、编译发布。为 Web 开发后端时,接收 [Tiana Web](../tiana-web/SKILL.md)确定的 Git ID、接口需求和数据依赖;完成后返回服务 ID、source_dir、发布回执、接口契约和参数生效结果,由 Web skill 继续前端接入、绑定、发布及分享验收。
15
+
16
+ 安装、账号与环境选择按 [Tiana](../tiana/SKILL.md)。共享各 Tiana 技能本会话的实际更新检查记录;尚未检查时先完成该入口的检查,包括实际执行 `tiana version check --skills-version 1.0.11 --json`。执行前确认 `tiana function --help` 可用;缺少命令时使用配套 CLI,不将未部署能力描述为可用。
17
+
18
+ ## 创建与修改
19
+
20
+ 按 [后端服务命令](references/commands.md)操作。先确认目标后端服务及其源码 Git,再读取源码。只编辑所需文件,保存得到 Git commit 后显式编译发布。保存源码不会自动编译;发布完成也不会中断正在处理请求的旧进程。如需立即结束当前执行,可在 Console 使用“强制休眠”,下一次请求使用新版本。
21
+
22
+ 新后端服务不自动写入示例。为 Web 开发时传入该应用已确定的 `--git-instance-id GIT_ID`,默认复用 Web 仓库;独立创建且未指定 Git 时由平台创建源码仓库。用 `--source-dir /services/orders` 指定仓库内目录,`/` 表示根目录;省略时默认 `/functions/<名称>/`,中文和大小写保留,名称中的空格替换为下划线;手动指定的目录保留空格。创建后读取 `function show` 的 source_dir,不根据名称或 ID 推导;改名不改变目录。目录是 package main 的编译入口,go.mod 可在该目录或仓库内上级目录;首次保存创建缺失目录,构建只编译指定入口。允许多个服务共享同一目录和源码,分别发布。不要把前端文件或其他后端服务的目录当作本后端服务源码覆盖。
23
+
24
+ 命令回执中的 commit 是仓库主分支提交。并发保存冲突后先保留本地编辑,重读并合并实际变化,再用新 commit 保存;不强推主分支。多文件或二进制资源也可按 [Tiana Git](../tiana-git/SKILL.md)用原生 Git 管理。
25
+
26
+ ## 参数与数据库后端
27
+
28
+ 涉及数据库 Token、第三方 API Key 等敏感配置时,必须先按[参数配置与生效](references/commands.md#参数配置与生效)配置,再按 [Go 后端服务开发](references/go-backend.md)读取与使用。参数更新无需重新编译,但要核对保存回执的应用状态和实际请求结果。
29
+
30
+ 数据库 Endpoint、Token 和第三方密钥保存在后端服务参数中,不写入 Git、前端源码、业务响应或日志。缺少实际凭据时说明待配置项,不使用占位值宣称联调成功。Web 的数据访问方式、资源绑定与模板制作由 Tiana Web 负责。
31
+
32
+ 调用方身份通过 SDK 从请求上下文读取,业务需要区分用户数据时使用该身份,不能相信请求体中自报的用户 ID。完成接口核验后,将所需调用身份与数据范围一并交给 Web skill 验证。
33
+
34
+ App 作者专属的初始化和权限管理接口,按 [App 作者与初始权限](references/go-backend.md#app-作者与初始权限)使用 `caller.IsAppOwner()` 校验;作者指本次来源 Web 的创建者,与租户角色分开。前端的 `is_app_owner` 展示由 Tiana Web 负责。
35
+
36
+ ## 结果与恢复
37
+
38
+ `accepted` 表示已受理,`publish --wait` 成功才表示发布完成。构建失败后读取 `builds` 和 `logs`,修正源码、额度或配置后重试。响应不确定时沿用原 request ID 和 commit 查询或恢复;不要把再次发起构建当作状态查询。删除后端服务会删除其制品,CLI 保留关联 Git。
@@ -0,0 +1,115 @@
1
+ # 后端服务命令
2
+
3
+ 沿用本会话已选择的 CLI 环境与登录。示例中的 `FUNCTION_ID`、`GIT_ID`、commit 和构建 ID 均替换为实际回执,名称有歧义时使用 ID。
4
+
5
+ ```sh
6
+ tiana function list --page 1 --json
7
+ tiana function show FUNCTION_ID --json
8
+ tiana function create "订单后端" -m "订单业务接口" --git-instance-id GIT_ID --source-dir /services/orders --wait --json
9
+ ```
10
+
11
+ 不传 `--git-instance-id` 则创建独立源码 Git。列表每次读取一页,按需要用 `--page` 继续,不为查找已知 ID 遍历整个租户。
12
+
13
+ ## 源码
14
+
15
+ ```sh
16
+ tiana function source list FUNCTION_ID --json
17
+ tiana function source read FUNCTION_ID main.go --commit COMMIT > main.go
18
+ tiana function source list FUNCTION_ID handlers --commit COMMIT --offset 0 --json
19
+ ```
20
+
21
+ 目录结果含 `commit`、`root`、`entries`、`next_offset`。路径相对于该后端服务的源码根,子目录翻页使用原 commit 与 next_offset。`needs_initial_source=true` 表示还需要保存初始代码。`read` 默认输出原始文件,`--json` 输出包含路径、commit 和 UTF-8 内容的结构。
22
+
23
+ 编辑本地文件后,只列出需要保存的文件:
24
+
25
+ ```sh
26
+ tiana function source save FUNCTION_ID --base-commit COMMIT --file main.go=./main.go --file go.mod=./go.mod --json
27
+ ```
28
+
29
+ 完全空的 Git 首次保存用 `--base-commit empty`。已有前端提交的共享仓库使用 `source list` 返回的 commit,不用 empty;命令会将文件写到新后端服务目录,保留其他文件。保存返回新的 commit。二进制文件、删除文件、仓库根部共享模块及跨目录整理用原生 Git。
30
+
31
+ ## 构建和发布
32
+
33
+ ```sh
34
+ tiana function publish FUNCTION_ID --commit COMMIT --wait --json
35
+ tiana function builds FUNCTION_ID --json
36
+ tiana function builds FUNCTION_ID --before SEQUENCE --json
37
+ tiana function logs FUNCTION_ID --build SUBMISSION_ID --json
38
+ ```
39
+
40
+ 省略 `--commit` 时读取 main。已是最新发布的 commit 时直接返回 `already_published`,不重新编译。构建历史每页 20 条;继续读取时以本页最后一条的 sequence 作为 before。
41
+
42
+ 提交时 stderr 显示 request ID 与 commit;JSON 回执也携带这两项。响应未知时先查询 builds;需要恢复原请求时使用相同 `--request-id REQUEST_ID --commit COMMIT`。中断等待不会取消服务端构建。
43
+
44
+ ## 参数配置与生效
45
+
46
+ 先列出代码实际需要的参数名和用途,例如 `SQLITE_ENDPOINT`(数据库连接地址)、`SQLITE_TOKEN`(该数据库实例 Token)、`PAYMENT_API_KEY`(第三方接口密钥)。使用已核实的目标资源取得实际值;缺少第三方密钥时请用户在 Console 配置,不要求在对话中粘贴。
47
+
48
+ Console 操作:打开目标后端服务 →「参数配置」→「参数列表」,分别填写参数名和值并保存。参数名须与代码 Get 的名称一致。当前只支持 `kind=plain`;敏感值也通过此入口配置,不能将它描述为已支持密钥引用管理。
49
+
50
+ CLI 操作:
51
+
52
+ ```sh
53
+ tiana function parameters get FUNCTION_ID --json
54
+ tiana function parameters set FUNCTION_ID --file parameters.json --json
55
+ ```
56
+
57
+ set 替换整个参数对象。get 的 JSON 回执从 `data.parameters` 取出已有参数,再修改目标项,保留其他值;不能把完整 get 回执直接交给 set。parameters.json 根部直接是参数名到类型和值的对象,不再包一层 parameters。下面仅展示格式,使用前替换为实际值:
58
+
59
+ ```json
60
+ {
61
+ "MESSAGE": {"kind": "plain", "value": "欢迎使用订单服务"},
62
+ "SQLITE_ENDPOINT": {"kind": "plain", "value": "<实际数据库 Endpoint>"},
63
+ "SQLITE_TOKEN": {"kind": "plain", "value": "<实际数据库实例 Token>"}
64
+ }
65
+ ```
66
+
67
+ 含凭据的文件放在 Git 和前端构建目录之外,使用仅当前用户可读写的临时文件,用完删除。get 和 set 回执都可能包含参数值,同样写入受限临时文件处理,不打印到对话或交付日志。仅报告参数名称与生效状态。
68
+
69
+ 核对 set 返回的 `data.application`:
70
+
71
+ | 结果 | 后续动作 |
72
+ | --- | --- |
73
+ | `applied` | 当前执行已接收配置,再发一个实际业务请求验证读取与使用成功。 |
74
+ | `next_start` | 配置已保存,下次启动使用;调用已发布的服务完成唤醒并验证。 |
75
+ | `pending` | 已保存但当前执行尚未确认收到。可在 Console 点击「重试下发」,再核对结果;不能报告已生效。 |
76
+
77
+ 更新参数无需重新编译。Go 读取与使用按[Go 后端服务开发](go-backend.md);验证数据库连接或上游调用是否成功,不通过回显密钥来验证。参数读取、必需值缺失和下游拒绝都要有明确业务错误。轮换凭据后再验证新请求,避免代码启动时缓存旧值造成“配置改了仍失败”。
78
+
79
+ ## CORS
80
+
81
+ ```sh
82
+ tiana function cors get FUNCTION_ID --json
83
+ tiana function cors set FUNCTION_ID --file cors.json --json
84
+ ```
85
+
86
+ CORS set 同样替换整个配置对象,先读取保留仍需使用的规则。
87
+
88
+ cors.json 示例:
89
+
90
+ ```json
91
+ {
92
+ "origins": ["https://app.example.test"],
93
+ "methods": ["GET", "POST"],
94
+ "headers": ["Authorization", "Content-Type"],
95
+ "expose_headers": ["X-Request-ID"]
96
+ }
97
+ ```
98
+
99
+ origins 决定可发起跨域浏览器调用的来源;methods 和 headers 决定预检允许的方法及请求头;expose_headers 决定浏览器脚本能读取的额外响应头。CORS 不替代调用鉴权。
100
+
101
+ ## 启停和删除
102
+
103
+ ```sh
104
+ tiana function disable FUNCTION_ID --json
105
+ tiana function enable FUNCTION_ID --json
106
+ tiana function delete FUNCTION_ID --force --wait --json
107
+ ```
108
+
109
+ 停用阻止访问;删除清理后端服务和制品,源码 Git 保留。删除必须是用户要求的操作;非交互命令用 --force 跳过已完成的人工确认。结果未知时保留回执,使用原实例 ID 和 `--request-id` 恢复。
110
+
111
+ ## 交付 Web 使用
112
+
113
+ 为 Web 开发后端时,将服务 ID、源码 Git 和 source_dir、发布回执、接口契约及参数生效结果交回 [Tiana Web 接入流程](../../tiana-web/references/backend-apps.md)。Web 绑定、前端预览与模板安装由该 skill 负责。
114
+
115
+ 源码目录支持根目录 `/`,创建后固定。服务改名不改路径,保存提交信息为 `Save source of <当前服务名称>`。多个入口目录可共用上级 go.mod;同仓同目录也可被多个服务共享。
@@ -0,0 +1,116 @@
1
+ # Go 后端服务开发
2
+
3
+ 后端服务是监听 `PORT` 环境变量指定端口的 Go HTTP 程序。平台固定 Go 1.26 工具链。source_dir 包含 package main,所属 go.mod 可在该目录或仓库内上级目录,多个入口可共享模块;依赖由构建流程下载。使用 SDK 时选择包含 function 包的已发布版本,记录在 go.mod 中,具体版本以当前配套 SDK 发布为准。
4
+
5
+ 最小程序返回 JSON:
6
+
7
+ ```go
8
+ package main
9
+
10
+ import (
11
+ "encoding/json"
12
+ "net/http"
13
+ "os"
14
+ )
15
+
16
+ func main() {
17
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
18
+ w.Header().Set("Content-Type", "application/json")
19
+ json.NewEncoder(w).Encode(map[string]string{"message": "Hello from Tiana"})
20
+ })
21
+ if err := http.ListenAndServe(":"+os.Getenv("PORT"), nil); err != nil {
22
+ panic(err)
23
+ }
24
+ }
25
+ ```
26
+
27
+ ## 读取业务参数
28
+
29
+ 例如希望返回可修改的欢迎语:在后端服务参数中新增名为 `MESSAGE` 的参数,值填写 `欢迎使用订单服务` 并保存。`MESSAGE` 只是示例业务参数名,可以换成业务自己的名称。
30
+
31
+ 在 handler 内读取配置,使之后的请求能读取更新的值:
32
+
33
+ ```go
34
+ params, err := function.ReadConfig()
35
+ if err != nil {
36
+ http.Error(w, "读取参数失败", http.StatusInternalServerError)
37
+ return
38
+ }
39
+ message, ok := params.Get("MESSAGE")
40
+ if !ok {
41
+ http.Error(w, "尚未配置欢迎语", http.StatusInternalServerError)
42
+ return
43
+ }
44
+ ```
45
+
46
+ 导入 `github.com/tianacloud/sdk-go/function`。SDK 使用平台提供的 `FUNCTION_CONFIG_FILE` 读取配置,不自行拼接宿主路径。Get 返回字符串和是否存在;已配置空字符串也会返回 true,必需且非空的业务凭据还需检查空值。不要返回整个参数对象,其中可能有数据库凭据。
47
+
48
+ ## 使用敏感配置
49
+
50
+ 先按[参数配置与生效](commands.md#参数配置与生效)保存真实值。业务参数通过 ReadConfig/Get 获取,不用 `os.Getenv("SQLITE_TOKEN")` 读取;参数不是同名环境变量。以下片段均放在 handler 内,沿用上面已成功读取的 params。
51
+
52
+ 例如 `PAYMENT_API_KEY` 是业务自定义的第三方密钥参数名,req 是业务已创建的上游 HTTP 请求:
53
+
54
+ ```go
55
+ apiKey, ok := params.Get("PAYMENT_API_KEY")
56
+ if !ok || apiKey == "" {
57
+ http.Error(w, "支付服务尚未配置", http.StatusServiceUnavailable)
58
+ return
59
+ }
60
+ req.Header.Set("Authorization", "Bearer "+apiKey)
61
+ ```
62
+
63
+ 按上游真实协议设置凭据,并检查调用结果。密钥仅用于后端向上游发请求;响应只返回业务需要的结果,不返回密钥或原始请求头。配置热更新时每次请求读取;如果复用依赖密钥的客户端,须在参数变化后更新客户端,不能一直使用启动时的旧凭据。
64
+
65
+ ## 访问 SQLite
66
+
67
+ 先用 [Tiana SQLite](../../tiana-sqlite/SKILL.md)核实数据库实例、表结构及初始化 SQL。数据库 Endpoint 和实例 Token 分别保存为后端服务参数 `SQLITE_ENDPOINT`、`SQLITE_TOKEN`,Token 在该数据库的连接管理中创建。只在后端服务内读取并传给 SDK:
68
+
69
+ ```go
70
+ endpoint, endpointOK := params.Get("SQLITE_ENDPOINT")
71
+ secret, tokenOK := params.Get("SQLITE_TOKEN")
72
+ if !endpointOK || !tokenOK || endpoint == "" || secret == "" {
73
+ http.Error(w, "数据库参数未配置", http.StatusInternalServerError)
74
+ return
75
+ }
76
+ token, err := tiana.NewToken(secret)
77
+ if err != nil {
78
+ http.Error(w, "数据库凭据无效", http.StatusInternalServerError)
79
+ return
80
+ }
81
+ connector, err := tianasqlite.NewConnector(tianasqlite.Config{
82
+ Gateway: tiana.Config{Endpoint: endpoint, Token: token},
83
+ RequestTimeout: 30 * time.Second,
84
+ })
85
+ if err != nil {
86
+ http.Error(w, "数据库连接失败", http.StatusInternalServerError)
87
+ return
88
+ }
89
+ db := sql.OpenDB(connector)
90
+ defer db.Close()
91
+ ```
92
+
93
+ 对应导入为 `database/sql`、`time`、`tiana "github.com/tianacloud/sdk-go"`、`tianasqlite "github.com/tianacloud/sdk-go-sqlite"`。OpenDB 创建句柄并不证明数据库已连接,继续执行实际查询并检查错误。后续 SQL 使用 `r.Context()` 与占位符绑定业务值。对需要按用户隔离的数据,从 SDK 读取可信请求身份并在查询条件中限定所属用户;不要提供任意 SQL 执行接口。
94
+
95
+ 沙箱内包含公共 CA 包,正式环境公共证书通常无需业务配置 RootCAs。本地环境私有 CA 按该环境的测试指导提供,不关闭证书验证。只有 tmpfs 用于临时写入,持久业务数据保存到 SQLite 或平台文件存储。
96
+
97
+ ## App 作者与初始权限
98
+
99
+ 在需要作者权限的 HTTP handler 内使用 Go SDK `v1.1.0-function.4` 或包含 IsAppOwner 的后续配套版本,并将实际依赖固定到 go.mod:
100
+
101
+ ```go
102
+ caller, present := function.CallerFromRequest(r)
103
+ if !present || !caller.IsAppOwner() {
104
+ http.Error(w, "仅 App 作者可操作", http.StatusForbidden)
105
+ return
106
+ }
107
+ // 在这里执行作者专属初始化或权限管理。
108
+ ```
109
+
110
+ 导入 `github.com/tianacloud/sdk-go/function`。`caller.AppOwnerID` 是本次调用来源 Web 的创建者 ID;同一个后端被多个 Web 使用时按本次来源分别判断。普通机器 Token 和没有来源 Web 的 Console 直接调用返回 false。前端会话 `is_app_owner` 只用于界面展示,不能将前端提交的布尔值或用户 ID 作为后端授权依据。模板安装的新 Web 使用安装后新创建者,作者账号和另一账号都需验证;CLI Web 预览要使用配套的来源 Web 授权流程。
111
+
112
+ ## 异步任务与休眠
113
+
114
+ 在启动后台 goroutine 前调用 `job, err := function.StartJob(jobID)`,成功后才启动任务,任务结束调用 `job.Finish()` 并处理错误。不同任务使用不同 ID;活跃期间相同 ID 的重复 Start 幂等,Finish 可重试,Finish 后复用 ID 表示新任务。已登记 Job 会阻止自动休眠;重启会清空登记,强制休眠和故障仍可中断任务。需要恢复的进度写入持久存储。
115
+
116
+ 本地参数文件采用 `{"MESSAGE":{"kind":"plain","value":"欢迎使用订单服务"}}`,设置 `FUNCTION_CONFIG_FILE` 指向它即可使用 SDK,不需解密密钥。平台提供的加密参数由 SDK 解密,业务继续使用 Get;读取错误应返回业务错误,不泄露参数内容。
@@ -4,7 +4,7 @@ description: 使用 Tiana Git 管理 Git 实例和原生仓库,关联项目远
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Tiana Cloud
7
- version: "1.0.10"
7
+ version: "1.0.11"
8
8
  parent: tiana
9
9
  source: https://github.com/tianacloud/agent-skills/tree/main/skills/tiana-git
10
10
  ---
@@ -18,10 +18,10 @@ metadata:
18
18
  **本会话首次使用任一 Tiana 技能时,先完成以下步骤,再开始登录、查询模板或操作应用:**
19
19
 
20
20
  1. 执行 `tiana version`,按[开始使用](../tiana/references/getting-started.md)核验最低版本;缺少 CLI 或版本过低时,先完成安装或经用户确认的升级。
21
- 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.10 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
21
+ 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.11 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
22
22
  3. 实际发起检查命令后,才在会话中记为已尝试,并保留返回结果或执行错误。仅运行 `tiana version` 只完成第 1 步。
23
23
 
24
- 四个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
24
+ 五个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
25
25
 
26
26
  仅在 `should_notify=true` 时简短提醒并询问是否升级;用户选择稍后或检查不可用时继续原任务。CLI 仍管理检查缓存和共同的 24 小时提醒额度。升级及重载见[开始使用](../tiana/references/getting-started.md#更新)。
27
27
 
@@ -36,4 +36,4 @@ metadata:
36
36
 
37
37
  阅读 [源码与版本](references/source-releases.md),确认项目托管选择和实际推送范围。全新 Tiana 应用创建自己的 Tiana Git;已有外部仓库首次同步时确认用户选择。提交源码与锁文件,排除凭据,普通推送并核验远端对应版本引用。
38
38
 
39
- Web 发布时从干净、确定的源码提交构建,给产物清单同时写实际 `git_instance_id` 和完整 `source_commit`;提交号只生成到忽略的构建目录。推送失败停止关联的 Web 发布,结果不明先读取远端状态。Web 构建和上传见 [Tiana Web](../tiana-web/SKILL.md)。
39
+ Web 发布时从干净、确定的源码提交构建,在交付记录中保存实际 `git_instance_id`、完整源码提交号和对应发布回执。推送失败停止关联的 Web 发布,结果不明先读取远端状态。Web 构建和上传见 [Tiana Web](../tiana-web/SKILL.md)。
@@ -42,10 +42,10 @@ git remote add tiana 'tiana://HOST:PORT/repo.git'
42
42
  ## 发布对应源码的当前内容
43
43
 
44
44
  1. 提交应用源码、构建配置、锁文件、SQL 和迁移。生成物只包含模块与资源,不含 tiana.app.json。应用源码提交和推送仍须在用户授权范围内;验证远端分支/标签确实指向将要构建的提交,不改写已分配的源码引用。
45
- 2. 从干净、已确认的源码提交按工程 README 构建。用实际 Git ID 和完整小写 40/64 位提交号更新项目参数;若构建脚本输出 `TIANA_PROJECT_PARAMS`,核对其值与真实源码及远端提交一致。项目参数不写进 dist。不得只修改参数冒充重新构建。
46
- 3. 新建项目:`tiana web create NAME --entry assets/app.js --database-instance-id DB_ID --git-instance-id GIT_ID --source-commit FULL_HASH --json`。既有项目先读取最新 project_revision,再用 `tiana web update WEB_ID --expected-revision REV --git-instance-id GIT_ID --source-commit FULL_HASH --json`。Git ID 可先绑定、commit 可暂缺;commit 非空时必须有 Git。entry 创建后不可修改,没有 styles/rendering/routing 字段。
47
- 4. 发布该提交产物:`tiana web publish WEB_ID --dir DIST --json`,保存 publish_id 和归档 SHA256,随后 `tiana web status WEB_ID --publish-id PUBLISH_ID --json` 确认 ACTIVATED 和 serving_sha256。项目参数和归档分别更新,MGR 不管理发布。参数更新成功但文件发布失败时报告部分完成;不伪称源码、项目参数、S3 对象原子一致。
48
- 5. 保存 Web/实例 ID、Git ID、远端引用、源码 commit、publish_id、校验和及托管链接。没有 Web 版本列表或恢复接口;Git 源码历史由 Git 管理。发布结果未知时只查询,禁止自动重放 PUT。用户不采用 Tiana Git 时保留原托管平台,不填写虚构关联。
45
+ 2. 从干净、已确认且已推送的 Git 提交按工程 README 构建。记录 Git ID 和完整源码提交号,核对远程引用;提交号作为本次构建和交付证据,不作为 Web 项目参数。构建期间保持源码不变。
46
+ 3. 新建项目:`tiana web create NAME --entry assets/app.js --database-instance-id DB_ID --git-instance-id GIT_ID --json`。后端服务访问数据库的应用省略数据库绑定。已有项目沿用创建时固定的数据库、Git 和 entry;名称、备注在 Console 实例基础信息编辑。
47
+ 4. 发布该提交产物:`tiana web publish WEB_ID --dir DIST --json`,保存 publish_id 和归档 SHA256,随后 `tiana web status WEB_ID --publish-id PUBLISH_ID --json` 确认 ACTIVATED 和 serving_sha256。Web 创建受理后先核对实例就绪,再发布;结果未知时先查询,不重建资源。
48
+ 5. 保存 Web/实例 ID、Git ID、远端引用、源码 commit、publish_id、校验和及托管链接。Git 源码历史由 Git 管理。发布结果未知时只查询,禁止自动重放 PUT。用户不采用 Tiana Git 时保留原托管平台,不填写虚构关联。
49
49
 
50
50
  ## 构建时传入源码提交
51
51
 
@@ -80,7 +80,7 @@ if ($LASTEXITCODE -ne 0) { throw '读取构建后的 Git 提交失败' }
80
80
  if ($buildStatus -or $buildCommit -ne $sourceCommit) { throw '构建期间源码变化,请从确认的提交重新构建' }
81
81
  ```
82
82
 
83
- 以上命令在同一次工具调用中执行;构建期间保持源码不变。核对构建输出参数的 `source_commit` 与本次 `$sourceCommit`、远程版本引用一致后再上传。脚本只检查提交号格式,不证明源码归属;调用方的 Git 核验是发布流程的一部分。
83
+ 以上命令在同一次工具调用中执行;构建期间保持源码不变。核对本次 `$sourceCommit` 与远程版本引用一致,并从该提交构建后再上传。脚本只检查提交号格式,不证明源码归属;调用方的 Git 核验是发布流程的一部分。
84
84
 
85
85
  ### 遇到子进程启动失败
86
86
 
@@ -4,7 +4,7 @@ description: 查询 Tiana SQLite 表结构、执行 SQL、选择数据库分支
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Tiana Cloud
7
- version: "1.0.10"
7
+ version: "1.0.11"
8
8
  parent: tiana
9
9
  source: https://github.com/tianacloud/agent-skills/tree/main/skills/tiana-sqlite
10
10
  ---
@@ -18,10 +18,10 @@ metadata:
18
18
  **本会话首次使用任一 Tiana 技能时,先完成以下步骤,再开始登录、查询模板或操作应用:**
19
19
 
20
20
  1. 执行 `tiana version`,按[开始使用](../tiana/references/getting-started.md)核验最低版本;缺少 CLI 或版本过低时,先完成安装或经用户确认的升级。
21
- 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.10 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
21
+ 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.11 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
22
22
  3. 实际发起检查命令后,才在会话中记为已尝试,并保留返回结果或执行错误。仅运行 `tiana version` 只完成第 1 步。
23
23
 
24
- 四个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
24
+ 五个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
25
25
 
26
26
  仅在 `should_notify=true` 时简短提醒并询问是否升级;用户选择稍后或检查不可用时继续原任务。CLI 仍管理检查缓存和共同的 24 小时提醒额度。升级及重载见[开始使用](../tiana/references/getting-started.md#更新)。
27
27
 
@@ -1,30 +1,34 @@
1
1
  ---
2
2
  name: tiana-web
3
- description: 使用 Tiana 创建、修改、预览和发布 Web 应用。用户要求制作账单、笔记、日历或其他 Web app 时使用;根据实时模板目录和需求决定采用模板或直接开发,并连接 SQLite 和 Git。用户要求把已有 Web app 发布为模板、分享可安装应用链接时也使用。
3
+ description: 使用 Tiana 创建、修改、预览和发布 Web 应用。用户要求制作账单、笔记、日历或其他 Web app 时使用;根据实时模板目录和需求决定采用模板或直接开发,并按业务选择直接连接 SQLite 或通过后端服务访问数据库。用户要求把已有 Web app 发布为模板、分享可安装应用链接时也使用。
4
4
  license: Apache-2.0
5
5
  metadata:
6
6
  author: Tiana Cloud
7
- version: "1.0.10"
7
+ version: "1.0.11"
8
8
  parent: tiana
9
9
  source: https://github.com/tianacloud/agent-skills/tree/main/skills/tiana-web
10
10
  ---
11
11
 
12
12
  # Tiana Web
13
13
 
14
- 安装、登录和通用实例管理见 [Tiana](../tiana/SKILL.md),SQL 与连接见 [Tiana SQLite](../tiana-sqlite/SKILL.md),源码见 [Tiana Git](../tiana-git/SKILL.md)。
14
+ 安装、登录和通用实例管理见 [Tiana](../tiana/SKILL.md),SQL 与连接见 [Tiana SQLite](../tiana-sqlite/SKILL.md),后端服务见 [Tiana Function](../tiana-function/SKILL.md),源码见 [Tiana Git](../tiana-git/SKILL.md)。
15
15
 
16
16
  ## 每个会话一次的更新检查
17
17
 
18
18
  **本会话首次使用任一 Tiana 技能时,先完成以下步骤,再开始登录、查询模板或操作应用:**
19
19
 
20
20
  1. 执行 `tiana version`,按[开始使用](../tiana/references/getting-started.md)核验最低版本;缺少 CLI 或版本过低时,先完成安装或经用户确认的升级。
21
- 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.10 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
21
+ 2. CLI 满足最低版本后,**仍须实际执行** `tiana version check --skills-version 1.0.11 --json`;版本号取实际加载的 metadata.version。这一步检查是否有更新版本。
22
22
  3. 实际发起检查命令后,才在会话中记为已尝试,并保留返回结果或执行错误。仅运行 `tiana version` 只完成第 1 步。
23
23
 
24
- 四个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
24
+ 五个技能共享这份实际调用记录;后续轮次、重复加载或切换技能复用记录,失败也不自动重试。上下文压缩或任务交接时保留记录,新会话重新检查。
25
25
 
26
26
  仅在 `should_notify=true` 时简短提醒并询问是否升级;用户选择稍后或检查不可用时继续原任务。CLI 仍管理检查缓存和共同的 24 小时提醒额度。升级及重载见[开始使用](../tiana/references/getting-started.md#更新)。
27
27
 
28
+ ## 数据与素材存储
29
+
30
+ 创建、修改应用或制作模板前,按[数据与素材存储](references/storage-and-assets.md)核对现有实现与干净构建。程序随 Web 打包;优化后、编码前不超过 16 KiB 的静态小图片内嵌 JS;其他外置素材与用户文件使用文件存储,持久业务记录使用数据库。含预置素材时读取[模板素材文件](references/template-files.md),准备本次应用目录或格式 2 安装材料,并核验目标环境能力。
31
+
28
32
  ## 将已有应用发布为模板
29
33
 
30
34
  用户要求“把某个 Web App 发布为模板”或分享可安装链接时,阅读[用户模板分享](references/share-template.md),在独立副本中整理源码、结构与个人无关 seed,再打包、上传并交付安装链接。默认包含源码,可让用户选择仅安装;必须制作预览和封面,并按[预览的响应式展示与验收](references/share-template.md#预览的响应式展示与验收)完成 PC 和手机适配。无法判断 seed 是否涉及个人信息时,先让用户选择。用户提供分享链接要求做同款时,也按该文档取得源码并开始新工程。此分支直接处理指定应用。
@@ -35,15 +39,27 @@ metadata:
35
39
 
36
40
  用户只需描述应用。根据本次返回的 `name`、`description` 判断核心功能、数据模型与可定制范围:合适的模板可加速制作,局部差异在工程中修改;没有合适模板就直接开发。已有工程继续修改自己的工程。以需求为依据决定,不要求用户选择模板,也不硬编码模板名称或模板版本。
37
41
 
42
+ ## 选择数据访问方式
43
+
44
+ 简单应用优先直接访问 SQLite。复杂业务、敏感数据或配置、需要限制用户可见数据时,采用后端服务,必须阅读[带后端服务的 Web 开发流程](references/backend-apps.md)。默认复用 Web 的 Git,后端私有数据库不绑定 Web。
45
+
46
+ 本 skill 负责选择访问方式、前端开发、Web 资源绑定、预览、发布与分享验收。后端的创建、源码、参数配置与读取、数据库访问和编译发布由 [Tiana Function](../tiana-function/SKILL.md)负责;取得后端发布结果后回到本流程完成前端接入。
47
+
48
+ ## 展示当前用户
49
+
50
+ 应用需要展示登录用户、昵称或区分用户与应用所属租户时,阅读[当前用户信息](references/csr-apps.md#当前用户信息),使用同源会话接口取得实际字段。
51
+
52
+ 需要 App 作者专属界面或初始权限管理时,用会话的 `is_app_owner` 判断当前用户是否为该 Web 的创建者,具体见[App 作者判断](references/csr-apps.md#app-作者判断)。后端权限校验交由 Tiana Function 的 `caller.IsAppOwner()`,前端只控制展示。
53
+
38
54
  ## 创建、初始化和发布
39
55
 
40
- 1. 阅读 [Web 开发与发布](references/csr-apps.md)及 [JavaScript 连接](../tiana-sqlite/references/js-sdk.md)。新应用默认为本次需求创建所需的 SQLite 和 Git 实例,并等待就绪、保存实际 ID;仅在用户明确指定已有实例时核实后复用。修改已有工程时沿用其已确认绑定。实例名称按当前应用命名,模板变量使用 CLI 回执中的 ID。先确定最终入口路径;创建 Web 时用 `--entry` 固定入口,配置实际数据库和 Git 绑定,并等就绪。Web ID 取 `web create` 返回的 `data.id`。
56
+ 1. 阅读 [Web 开发与发布](references/csr-apps.md);前端直连模式再读 [JavaScript 连接](../tiana-sqlite/references/js-sdk.md)。新应用默认为本次需求创建所需的 SQLite 和 Git 实例,并等待就绪、保存实际 ID;仅在用户明确指定已有实例时核实后复用。修改已有工程时沿用其已确认绑定。实例名称按当前应用命名,模板变量使用 CLI 回执中的 ID。先确定最终入口路径;创建 Web 时用 `--entry` 固定入口,按所选访问方式配置数据库或后端服务绑定,并配置 Git 绑定,并等就绪。Web ID 取 `web create` 返回的 `data.id`。
41
57
  2. 采用模板时,执行 `tiana web init-template NAME --dir PROJECT_DIR --json`。PROJECT_DIR 是用户项目的不存在目录,位于技能安装目录之外。CLI 下载并原样解压;按 [模板初始化](references/template-init.md)读取工程根部 `metadata.json`,由 Agent 完成全部变量替换及 SQLite 数据初始化。
42
58
  3. 直接开发时,使用 [固定 index.html](references/index.html)、哈希路由、支持动态账号鉴权的 SDK,按实际数据库结构编写应用及构建清单。
43
- 4. **模板和直接开发都由 Agent 处理数据库初始化。** 模板先执行已配置且存在的 schema,再执行已配置且存在的 seeds;两项独立跳过,SQL 失败先核对结果并停止后续发布。
59
+ 4. **模板和直接开发都由 Agent 处理数据库初始化。** 模板先执行已配置且存在的 schema,再执行已配置且存在的 seeds;两项独立跳过,SQL 失败先核对结果并停止后续发布。普通源码开发还须按[模板素材文件](references/template-files.md)准备新 Web ID 的预置素材;`web publish` 只发布程序包。
44
60
  5. 构建前按[应用图标](references/csr-apps.md#应用图标)准备真实 PNG:使用用户指定图片或已有的合适图标;需要制作时优先调用可用的 AI 生图工具,以应用核心功能设计图形图标。图片保存到源码,查看缩小后的效果,并核验干净构建根目录和发布包中都有该图片。
45
- 6. 按用户需求完成交互和定制,安装依赖并从确定源码提交构建。按 [源码版本流程](../tiana-git/references/source-releases.md)完成源码同步,用 `web publish` 发布当前归档,再用 `web status --publish-id` 核对。除非用户仅要求本地开发,交付实际托管地址、资源 ID 和对应源码提交;未验证的阶段如实说明。
61
+ 6. 按用户需求完成交互和定制。采用后端服务时,先完成[后端交接与接入验证](references/backend-apps.md),再交付可用前端。安装依赖并从确定源码提交构建;按 [源码版本流程](../tiana-git/references/source-releases.md)完成源码同步,用 `web publish` 发布当前归档,再用 `web status --publish-id` 核对。除非用户仅要求本地开发,交付实际托管地址、资源 ID 和对应源码提交;未验证的阶段如实说明。
46
62
 
47
- ## 文件上传、预览与下载
63
+ ## 素材、文件上传、预览与下载
48
64
 
49
- 应用需要文件存储时,阅读[WebApp 文件存储](references/files.md),核对配套候选环境后使用平台提供的 `context.files`。先创建 WebApp 获得 ID 即可本地预览,无需先发布;文件路径相对于该 WebApp 的目录。
65
+ 应用有外置素材或用户文件时,阅读[WebApp 文件存储](references/files.md),核对配套目标环境后使用平台提供的 `context.files`。先创建 WebApp 获得 ID 即可本地预览,无需先发布;文件路径相对于该 WebApp 的目录。没有上传 UI 的应用也须核对预置素材,不能依赖作者的文件链接。
@@ -0,0 +1,40 @@
1
+ # 带后端服务的 Web 开发流程
2
+
3
+ 仅在应用需要后端时使用。Web skill 负责以下编排与浏览器验收;后端实现交给 [Tiana Function](../../tiana-function/SKILL.md),具体命令、参数格式和 Go 示例由该 skill 维护。
4
+
5
+ ## 1. 确定共仓资源
6
+
7
+ 修改已有 Web 时读取实际 Git 绑定和后端服务列表,复用对应资源。新建应用时先创建一份 Git,在创建 Web 与后端服务时共同关联。已有 Web 沿用创建时固定的关联;未关联 Git 时为后端服务创建仓库,并记录前端与后端的实际源码位置。用户指定其他仓库时按其选择,模板工程按已声明的仓库关系处理。
8
+
9
+ 将实际 Git ID、已知后端服务 ID、接口需求和数据库依赖交给 Tiana Function。新服务明确使用这个 Git;由 Function skill 确定并保存 source_dir。前端和后端编辑保持同仓其他文件,共享仓库的后续提交基于最新 main,避免用前端旧副本覆盖后端或构建写回的依赖文件。
10
+
11
+ Web 只绑定前端实际需要直连的数据库;仅供后端使用的数据库不绑定 Web。纯后端访问模式创建 Web 时省略 `--database-instance-id`,并用 `--git-instance-id` 关联已确定的共享 Git。
12
+
13
+ ## 2. 完成后端交接
14
+
15
+ 向 Tiana Function 提供业务接口、所需参数的名称和用途、目标数据库及表结构;敏感值按该 skill 的参数配置流程处理,不作为前端构建变量。由它完成源码保存、编译发布和后端核验,返回:
16
+
17
+ - 后端服务 ID、Git ID 和实际 source_dir。
18
+ - 已发布的源码提交、构建回执及接口路径、方法、请求和响应格式。
19
+ - 必需参数的名称及配置/生效结果,不返回参数值;缺失配置或待生效状态明确列出。
20
+
21
+ 仅保存 Git 或构建受理不能视为后端就绪。后端失败时留在后端步骤处理;前端可以继续开发,但不能将真实调用未通过的应用交付为可用。
22
+
23
+ ## 3. 绑定并接入前端
24
+
25
+ ```sh
26
+ tiana web functions get WEB_ID --json
27
+ tiana web functions set WEB_ID --function-id FUNCTION_ID --expected-revision REVISION --json
28
+ ```
29
+
30
+ 使用实际 ID 和 get 返回的 revision。set 替换完整列表;保留仍需使用的服务,多个服务重复传 `--function-id`,冲突后重读列表。不传 ID 会清空绑定。
31
+
32
+ 前端使用平台提供的 `context.functions.fetch(FUNCTION_ID, "/orders", {method: "GET"})`。页面只保存服务 ID 和业务接口契约,所需调用凭据由平台提供;数据库 Token、第三方 API Key 等只留在后端参数中。按 [Web 开发与发布](csr-apps.md)处理入口、交互、构建和发布。
33
+
34
+ ## 4. 验证实际可用
35
+
36
+ 先用 `tiana web serve WEB_ID --dir dist` 验证接口及页面,再发布前端并核对实际托管页面。已有后端可能仍运行旧版本:按 Function skill 核对实际接口结果,不能仅凭最新构建成功判断当前请求使用新版。
37
+
38
+ 需要分享时,用另一账号通过 Site 登录打开应用,完成业务读写,确认只取得所绑定后端服务的调用权限,浏览器的 Bootstrap、网络响应和发布产物中没有后端私有数据库凭据或第三方密钥。本地预览的开发者账号不能替代此验收。按业务要求验证各用户的数据范围。
39
+
40
+ 交付托管地址、资源关联、源码提交及实测结果;缺少配置、未执行的环境验收如实列出。制作可安装模板另按[后端服务模板](function-templates.md)处理复制、参数映射与跨账号安装。