> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comet.rpamis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflow Application

> 将流程、入口 Skill、规则和固定依赖组成可运行、可安装的应用。

Workflow Application 把工作流与实际执行内容绑定在一个包中。包记录应用身份、入口 Skill、执行模块、真实依赖及其摘要，Agent 平台据此加载和执行。

希望由 Agent 创作完整业务内容时，使用 [Comet Any](/zh/skill-creator/getting-started.md)。需要自行编写和接入应用时，从下面的本地报告样板开始。

## 什么时候需要完整应用

只在服务内部编排几个函数时，基础 Runtime 已能保存流程和结果。需要把应用交给另一个 Agent 平台、固定 Skill 依赖或安装项目入口时，使用 Application。

下面的样板生成本地 Markdown 报告，保留草稿、等待审批，再执行本地发布。准备一个独立目录，避免把项目源码、运行记录和凭据一起打包。

## 最小应用包

在项目内创建独立的 `local-report/` 目录，保存三份文件。

`application.json`：

```json theme={null}
{
  "schema": "comet.workflow.application.v1",
  "id": "local-report",
  "version": "1",
  "base": "standalone",
  "runtimeVersion": "0.5.0",
  "entrySkill": "SKILL.md",
  "module": "application.mjs",
  "skills": [],
  "bindings": []
}
```

`application.mjs`：

```js theme={null}
export { createReportApplication as createApplication } from '@rpamis/comet/applications';
```

`SKILL.md`：

```markdown theme={null}
---
name: local-report
description: 生成需要用户审批后才能发布的本地报告。
---

# 本地报告

使用 application.json 启动 report-publishing@1，提供 title、body 和 sources。
保存 Run ID，执行当前动作，展示实际草稿并等待用户决定。
批准后执行本地发布；结果未知时先核对原动作，不重新派发。
```

样板的 `draft` 与 `sources` 可以并行完成，`compose` 在两者完成后生成实际 Markdown 草稿。父流程展示草稿、路径和摘要，等待用户选择。它验证声明的报告格式与本地文件发布；来源事实核验或外部部署应另行声明验证与授权。

## 通过 SDK 加载

```js theme={null}
import path from 'node:path';
import { loadWorkflowApplication } from '@rpamis/comet/applications';

const application = await loadWorkflowApplication({
  file: path.resolve('local-report/application.json'),
  projectRoot: process.cwd(),
});
console.log(application.identity);
```

应用包必须位于独立目录，不能把整个项目连同运行状态作为包根。加载器核对实际文件、身份和固定依赖；同一版本内容发生变化时会拒绝继续使用原身份。

加载应用会执行其模块，接入前应审查模块与依赖来源。固定摘要用于核对内容，不提供代码沙箱。

### 生成草稿并审批发布

将下面的脚本保存为项目根目录的 `app-run.mjs`，保持在应用包目录之外。它使用加载器提供的固定实现和 Store，显式推进报告子流程：

```js theme={null}
import path from 'node:path';
import { loadWorkflowApplication } from '@rpamis/comet/applications';
import { createRuntime } from '@rpamis/comet/runtime';

const application = await loadWorkflowApplication({
  file: path.resolve('local-report/application.json'),
  projectRoot: process.cwd(),
  runId: 'report-1',
});
const runtime = createRuntime({ ...application.implementation, store: application.store });
await runtime.start({
  runId: 'report-1',
  workflow: { id: 'report-publishing', version: '1' },
  input: { title: '项目周报', body: '本周完成了三个已验收任务。', sources: ['本地任务记录'] },
});
let progress = await runtime.runUntilBlocked({ runId: 'report-1', executorId: 'report-local' });
for (const child of progress.run.children) {
  await runtime.runUntilBlocked({ runId: child.runId, executorId: 'report-local' });
}
progress = await runtime.runUntilBlocked({ runId: 'report-1', executorId: 'report-local' });
const wait = progress.run.waits.find((item) => item.status === 'pending');
console.log(progress.reason);
if (wait) console.log(wait.proposal);
if (process.argv.includes('--approve')) {
  if (!wait) throw new Error('No pending approval');
  await runtime.resolveWait({
    runId: progress.run.runId,
    waitId: wait.id,
    proposalHash: wait.proposalHash,
    decisionId: 'report-publication-1',
    choice: 'approved',
  });
  progress = await runtime.runUntilBlocked({ runId: 'report-1', executorId: 'report-local' });
  console.log(progress.reason);
}
console.log(progress.run.outputs.publish?.value);
```

先运行 `node app-run.mjs`，检查显示的草稿、路径和摘要。确认当前内容后运行 `node app-run.mjs --approve`，输出发布结果与本地报告路径。报告位于项目的 `.comet/reports/local-report/`，Run 数据由应用 Store 管理；不要把运行脚本或 Run 文件放进固定包来改变应用内容。

## 通过 CLI 运行

将每次请求保存为 JSON 文件，再调用 [comet runtime](/zh/cli/runtime.md)：

```bash theme={null}
comet runtime dispatch --application-file ./local-report/application.json --project-root . --request start.json --json
```

`start.json`：

```json theme={null}
{
  "operation": "start",
  "runId": "report-1",
  "workflow": { "id": "report-publishing", "version": "1" },
  "input": {
    "title": "项目周报",
    "body": "本周完成了三个已验收任务。",
    "sources": ["本地任务记录"]
  }
}
```

将返回的 Run ID 保存到业务记录。后续使用 `--application local-report` 和同一 Run ID 查询、执行或恢复。读取实际返回的子 Run、Action 和 Wait ID；不要根据步骤名称猜测它们。

保存下面的 `inspect.json`，然后执行查询命令：

```json theme={null}
{ "operation": "inspect", "runId": "report-1" }
```

```bash theme={null}
comet runtime dispatch --application local-report --project-root . --request inspect.json --json
```

从实际响应读取当前 pending Action 与配置的执行器，按 [runtime 请求参考](/zh/cli/runtime.md) 提交 `execute`。需要子 Run 执行时，使用返回的真实子 Run ID。停在审批时展示实际草稿和 Wait，再提交当前决定。不要把 `start` 成功当成报告已生成。

CLI 适合只能运行命令的 Agent 平台；在 Node.js 应用中可将加载后的应用能力接入 SDK。两种方式都使用同一份固定包与 Run，不能另写一份流程状态替代它。

## 接入真实 Skill

`inspectApplicationSkill` 读取实际目录，`adaptApplicationSkill` 把内容审查、能力、输入输出、副作用和恢复条件整理成适配契约。依赖按内容固定，不会在运行途中悄悄换成新文件。

使用 `createApplicationSkillExecutor` 接入 Agent 平台的实际 Skill 调用、能力检查和授权。Skill 已加载、Agent 已报告完成、机器验证通过和独立评审通过分别记录，前一项不能替代后一项。

分发与升级见 [comet application](/zh/cli/application.md)。应用评估见 [评估 SDK 应用](/zh/eval/applications.md)；必需文件与业务条件见 [阶段产物验收](/zh/sdk/artifact-validation.md)。

下一步：[安装、分发与升级](/zh/sdk/distribution.md)。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.