xmlsquishsource. compose. build.
English

XML PROMPT PROJECT MANAGER · v1.2.1

提示词项目,也值得好好构建。

创建项目,或从 xmlsquish.toml 发现已有项目与工作区:格式化源码、解析锁定依赖、把 XML 编译成可缓存的二进制 XSIR,经中端优化与链接,发布 .prompt、可复现 .pack 或可重定位 .sopack。

Rust 2024 · 项目级增量构建 · Human / Short / NDJSON

build / site-demo:agentDSL → IR → optimize → link → backend
01组织源码
agent.xmlxs:arg
persona.xmlexpand + arg
tasks.xmlimport + call
02编译 XSIR 并链接
<xs:expand ref="demo:persona">
  <xs:arg name="audience" value="researchers"/>
</xs:expand>
<xs:expand ref="demo:task"/>
03交付产物
ir/agent/site-demo/*.xsirlinked targetagent.promptagent.psdbg
项目清单 + XML 模块 → 二进制 XSIR → 链接 → .prompt + .psdbg。
  1. 01 / AUTHOR

    创建项目,声明依赖

    new 在尚不存在的目录生成规范项目;随后在 xmlsquish.toml 声明目标,add / remove 以事务方式更新依赖。

  2. 02 / COMPILE

    编译并缓存 XSIR

    每个 XML 模块生成规范二进制中间表示(XSIR);内容寻址缓存复用未变化的纯变换。

  3. 03 / DELIVER

    链接并发布提示词

    链接冻结的模块图并实例化入口,原子发布 .prompt;按 --emit 生成 .xsir 与自包含 .psdbg 伴随文件。

v1.1.0 · AGENT SKILLS

让 Agent Skills 也成为可审计的项目依赖。

在工作区根清单声明本地或 Git skill,在锁文件中固定完整内容,再安全地同步到 .agents/skills。内置的 prompt-squish 指南也能一条命令安装。

阅读 Agent Skills 用户指南
xmlsquish.toml      [skills]
       ↓                declare
xmlsquish.lock      [[skill]] + BLAKE3
       ↓                sync-skills
.agents/skills/    review-checks/

$ xmlsquish install-skill --project

SHOW, DON'T JUST MINIFY

从项目清单,看懂一次可复用构建。

切换项目清单、入口源码、二进制 XSIR 摘要、链接结果、最终 .prompt 与 .psdbg。示例命令可直接在仓库根目录运行。

显式传给 audience 的参数

未启用 JavaScript:以下完整列出两组参数的源码与结果。

arg.audience = researchers,由调用者显式传入。

arg.audience = everyone,由调用者显式传入。

xmlsquish.toml / researchers · 研究者

源码
manifest-version = 1

[package]
name = "site-demo"
version = "1.0.0"
source-root = "."

[target.agent]
entry = "agent.xml"

agent.xml / researchers · 研究者

源码
<xs:entry xmlns:xs="https://xmlsquish.moesegfault.dev/ns" xmlns:demo="https://example.com/macros/demo">
  <xs:import src="persona.xml"/>
  <xs:import src="tasks.xml"/>
  <prompt>
    <xs:expand ref="demo:persona"><xs:arg name="audience" value="researchers"/></xs:expand>
    <xs:expand ref="demo:task"/>
  </prompt>
</xs:entry>

ir/agent/site-demo/*.xsir / researchers · 研究者

构建阶段 / 伴随产物
XSIR/1 canonical binary module set
target/xmlsquish/artifacts/ir/agent/site-demo/agent.xsir  2535 bytes  blake3:8571019ad9b88ee5
target/xmlsquish/artifacts/ir/agent/site-demo/persona.xsir  2425 bytes  blake3:f0fb1883049c3f43
target/xmlsquish/artifacts/ir/agent/site-demo/tasks.xsir  1664 bytes  blake3:2ec94ab1ea5f9300

agent.prompt / researchers · 研究者

最终 .prompt
<prompt> <Persona> <audience> researchers </audience> <voice> clear &amp; kind </voice> </Persona> <task> Explain the trade-offs. </task> </prompt>

agent.psdbg / researchers · 研究者

构建阶段 / 伴随产物
PSDBG/1 self-contained debug companion
target/xmlsquish/artifacts/agent.psdbg  9600 bytes  blake3:de19134660fcbefb

xmlsquish.toml / everyone · 所有人

源码
manifest-version = 1

[package]
name = "site-demo"
version = "1.0.0"
source-root = "."

[target.agent]
entry = "agent.xml"

agent.xml / everyone · 所有人

源码
<xs:entry xmlns:xs="https://xmlsquish.moesegfault.dev/ns" xmlns:demo="https://example.com/macros/demo">
  <xs:import src="persona.xml"/>
  <xs:import src="tasks.xml"/>
  <prompt>
    <xs:expand ref="demo:persona"><xs:arg name="audience" value="everyone"/></xs:expand>
    <xs:expand ref="demo:task"/>
  </prompt>
</xs:entry>

ir/agent/site-demo/*.xsir / everyone · 所有人

构建阶段 / 伴随产物
XSIR/1 canonical binary module set
target/xmlsquish/artifacts/ir/agent/site-demo/agent.xsir  2529 bytes  blake3:fbf198aaf0936012
target/xmlsquish/artifacts/ir/agent/site-demo/persona.xsir  2425 bytes  blake3:f0fb1883049c3f43
target/xmlsquish/artifacts/ir/agent/site-demo/tasks.xsir  1664 bytes  blake3:2ec94ab1ea5f9300

agent.prompt / everyone · 所有人

最终 .prompt
<prompt> <Persona> <audience> everyone </audience> <voice> clear &amp; kind </voice> </Persona> <task> Explain the trade-offs. </task> </prompt>

agent.psdbg / everyone · 所有人

构建阶段 / 伴随产物
PSDBG/1 self-contained debug companion
target/xmlsquish/artifacts/agent.psdbg  9591 bytes  blake3:b85d179e2ae77002

数据记录当前项目管理器的工件契约;浏览器只展示结果,不把二进制 XSIR 伪装成 XML。

查看源码与示例

EXPLICIT CONTEXT. LOCAL STATE.

定义共享,调用相互独立。

源码单元(SourceUnit)按规范 URI 冻结;每次调用建立独立展开帧(Expansion Frame),仅显式传递 arg 与 fill。

父文件 / agent.xml
xs:arg value
researchers
file.name
agent.xml
xs:arg显式参数进入新的调用帧
子文件 / persona.xml
arg.audience
researchers
file.name
persona.xml ⌁

相对 src 与 file.* 绑定到宏的定义位置,不随调用者变化。参数不会隐式继承;所有声明参数都必须显式提供。

arg

不可变参数

必需参数由调用者显式传入,类型始终为 Unicode 字符串。

arg.audience = researchers
file

定义位置

uri / dir / name 只描述当前宏的定义源码。

file.name = persona.xml
match

词法捕获

ifr 的命名捕获仅在当前词法块内有效,离开后恢复外层绑定。

match.head · match.tail
slot / fill

结构通道

XML 节点序列与标量参数严格分离,不隐式转换为字符串。

<xs:slot name="body"/>

SMALL LANGUAGE. USEFUL BOUNDARIES.

组合、选择、输出,各司其职。

01

导入定义,递归展开宏

module 只存放宏定义;独立的 entry 导入模块、构建提示词。expand 递归展开宏并按值返回结果。

<xs:import src="persona.xml"/>
<xs:expand ref="demo:persona">
  <xs:arg name="audience" value="researchers"/>
</xs:expand>
02

在编译时做选择

ifr 匹配标量字符串,命名捕获只在词法块内可见。完整源码闭包在执行前加载与验证,包括未执行分支。

<xs:ifr get="file.name" pattern="^tasks[.]xml$">
  <task>Explain the trade-offs.</task>
</xs:ifr>
03

只有显式 insert 才输出变量

insert 将 arg.*、file.* 或 match.* 作为转义后的 XML 文本输出,不重新解析为标签或宏。

<answer><xs:insert get="arg.text"/></answer>
<!-- arg.text is text, never markup. -->

FROM SOURCE TO YOUR WORKFLOW

管理整个项目,再交付给 Agent。

new、fmt、build、add、remove 与 inspect 共享同一管理器与事件协议;new 创建项目,build 默认继续独立工作并原子发布成功目标。

new 要求目标尚不存在;它与面向已有目录的 init 不同。其他命令向上发现 xmlsquish.toml,也可显式传 --manifest-path。

从当前工作区源码安装(Rust 1.88+) ↗
terminal / xmlsquish

# 从当前工作区源码安装(Rust 1.88+)

cargo install --git https://github.com/kleedaisuki/prompt-squish --locked

# 在尚不存在的目录创建规范项目

xmlsquish new hello-prompts

# 格式化项目源码;--check 只检查

xmlsquish fmt --check --manifest-path hello-prompts/xmlsquish.toml

# 构建 prompt、XSIR 与调试伴随文件

xmlsquish build --offline --manifest-path hello-prompts/xmlsquish.toml

# 添加依赖并更新清单与锁文件

xmlsquish add prompt-kit@^1 --registry default --dry-run

# 移除直接依赖别名

xmlsquish remove prompt-kit --dry-run

# 检查类型化 IR、链接、来源、缓存或产物

xmlsquish inspect link agent --manifest-path examples/site-demo/xmlsquish.toml

# NDJSON 事件流,适合 CI 与工具

xmlsquish --message-format=json build --manifest-path examples/site-demo/xmlsquish.toml

一种事件协议,三种终端体验。

Human 提供进度与摘要,Short 逐行且可 grep,--message-format=json 输出带版本与序号的换行分隔 JSON(NDJSON)事件。--plain 提供无装饰追加输出。

{"version":{"major":3,"minor":0},"sequence":0,"payload":{"type":"planning_started"}}
{"version":{"major":3,"minor":0},"sequence":1,"payload":{"type":"action_succeeded","data":{"kind":"compile","cache":"persistent"}}}
{"version":{"major":3,"minor":0},"sequence":2,"payload":{"type":"job_finished","data":{"status":"success"}}}

MEASURE THE RIGHT TRANSFORMATION

缓存模块,链接目标,原子发布。

构建计划把扫描、编译、链接、实例化、后端与发布分开;只有确定性的纯变换进入持久动作缓存。

项目源码3XML filesxmlsquish.toml
可复用 XSIR3XSIR modules*.xsir
发布目标1promptagent.prompt
7 / 3 个模块构建动作
147 UTF-8 bytesagent.prompt

计数描述演示项目的结构,不声称二进制 XSIR 是文本或把缓存命中等同于端到端加速;最终字节数不含 BOM。

THE FINE PRINT, UP FRONT.

有边界,才可依赖。

仅构建可信源码与依赖:本地及已解析包可被前端读取。宏不能读取环境、时间或运行子进程;insert 也不能阻止提示词注入(prompt injection)。--locked / --offline / --frozen 控制解析,不是文件系统沙箱。

阅读完整语义与边界 ↗
明确的计算边界与资源预算

项目负责边界,XSIR 负责复用。

解析器保留 XML 语义;规范二进制 XSIR 跨目标复用;链接器解析导入与重定位;发布器只提交完整的一代 .prompt / .psdbg。缓存可删除,不是权威项目状态。

project → resolve → XML → binary XSIR → link → .prompt + .psdbgDSL specification ↗

让提示词可维护,让产物可交付。

v1.2 · DISTRIBUTION

一个编译器,三种分发角色。

遥测默认关闭;按需记录在项目元数据,不影响可复现产物。