LifeOS LocalIntelligence 建筑许可工作流(Construction Workflow):从故乡施工信号到本地情报聚合 LifeOS LocalIntelligence 建筑许可工作流Construction Workflow从故乡施工信号到本地情报聚合【免费下载链接】LifeOS⛰️ The Life Operating System — an intent engineering platform that moves you from your current state to your ideal state, in life and work.项目地址: https://gitcode.com/GitHub_Trending/pe/LifeOS建筑许可与大型开发项目是观察一座城市走向的早期信号。本文以 LifeOS 的 LocalIntelligence 技能中的 Construction.md 工作流 为核心讲解如何围绕委托人principal的故乡城市聚合美国人口普查局建筑许可调查、城市开放数据门户与规划委员会议程三类数据源产出标准化的FetchResult并在对话中呈现最多 7 条施工情报。读完本文你将掌握该工作流的完整执行链路、数据源探测模式、Hometown解析机制与降级语义并能直接运行bun命令在本地验证效果。Construction 工作流在 LocalIntelligence 中的定位LocalIntelligence 是 LifeOS 中的一个通用型公民情报聚合技能SKILL面向任意美国城市运行每天聚合八类本地数据——建筑许可、犯罪、新开商户、公职人员、立法、选举、逮捕与本地新闻——写入一份 JSON 摘要digest供 Pulse 的 LOCAL 标签页读取渲染。技能清单定义见 SKILL.mdGeneric civic intelligence aggregator for any US city — daily local digest of construction permits, crime, new businesses, public officials, legislation, elections, arrests, and local news, keyed off principals Hometown.其中Construction建筑工作流的定位非常明确新建建筑许可与委托人故乡城市的大型开发项目信号New construction permits and major build-outs in the principals hometown。它的典型触发词包括 new construction、building permits、whats being built 等见 SKILL.md 的 Workflow Routing 表。需要强调的是该工作流不硬编码任何城市。目标城市在运行时通过Tools/Hometown.ts从委托人的身份文件中动态解析——这是 LocalIntelligence 全部八个工作流的公共地基也是理解 Construction 工作流的第一步。前置条件故乡城市的运行时解析Construction 工作流的第一步是Resolve hometown viaTools/Hometown.ts。这个看似简单的步骤背后有一套完整的解析逻辑源码见 Hometown.ts。身份文件与可配置路径Hometown.ts读取PRINCIPAL_IDENTITY.md中形如 Quick Reference 条目的**Hometown:**行- **Hometown:** Austin, TX (ZIP 78701, Travis County)默认路径为~/.claude/LIFEOS/USER/PRINCIPAL/PRINCIPAL_IDENTITY.md可通过环境变量LIFEOS_PRINCIPAL_IDENTITY覆盖readHometown的默认参数process.env.LIFEOS_PRINCIPAL_IDENTITY ?? IDENTITY_DEFAULT括号部分(ZIP zip, County County)可选但推荐提供。解析规则源码中的严格正则HOMETOWN_RE定义了可接受的行格式ST既可以是两位 USPS 州代码也可以是完整州名const HOMETOWN_RE /^- \*\*Hometown:\*\*\s(?city[^,]?),\s(?state[A-Za-z .]?)(?:\s*\((?paren[^)])\))?\s*$/m解析时城市取逗号前的部分并 trim州名通过内置的STATE_NAME_TO_CODE全量映射表50 州 哥伦比亚特区归一为两位代码并保留stateName全称括号内容用/ZIP\s(\d{5}(?:-\d{4})?)/i与/([A-Za-z .-])\sCounty/i分别提取 ZIP 与县名同时生成citySlug/stateSlugkebab-case供 Patch RSS 等模板化 URL 使用见slugify()实现。若身份文件中缺少**Hometown:**行readHometown会抛出NoHometownError并提示用户补充格式示例。SKILL.md 中的 Gotchas 对此有明确约束没有 hometown 行 不抓取任何工作流都不得自行编造一个城市。命令行直接验证Hometown.ts自带 CLI 入口import.meta.main分支可直接输出结构化 JSONbun run LifeOS/install/skills/LocalIntelligence/Tools/Hometown.ts无 hometown 时以退出码 2 打印错误信息。这个机制保证了下方所有 fetcher 拿到的都是同一份、结构化的城市信息。标准执行流程Construction.md 定义了工作流的四步标准流程并且要求同时发送两类通知。第一步语音通知向本地通知服务Pulse 的 VoiceServer默认监听localhost:31337发送异步 POSTcurl -s -X POST http://localhost:31337/notify \ -H Content-Type: application/json \ -d {message: Running Construction in LocalIntelligence} \ /dev/null 21 同时在对话中输出文本通知Running **Construction** in **LocalIntelligence**...这一双通道通知模式在 LocalIntelligence 的每个工作流DailyBrief、Crime、Business 等中保持一致SKILL.md 将其规定为执行任何工作流时的强制步骤。第二步运行抓取器bun run Tools/FetchConstruction.tsFetchConstruction.ts源码见 FetchConstruction.ts承担三类数据源的抓取职责US Census Building Permits Survey——按大都会区metro area拉取月度建筑许可数据城市开放数据许可门户——通过常见 URL 模式尽力探测/permits.json、/api/permits以及很多城市采用的 Accelaapo/...端点规划委员会议程——通过 Granicus/Legistar 探测规划委员会会议议程条目。第三步返回 FetchResult无论抓取结果如何抓取器都必须返回统一契约FetchResultinterface FetchResult { items: Item[] source_status: ok | unavailable | empty errors?: string[] }关于该契约的详细字段见下文数据契约与降级语义一节。第四步对话呈现在对话中向上展示最多 7 条条目title、date、source 三要素并附来源链接。7 条上限是 Construction 工作流的呈现约束用于避免在对话中淹没用户。数据源架构三层通用探测Construction 工作流的数据源在 DataSources.md 中有完整目录全部以{city, state}偶尔加county为键动态生成不做任何按城市的静态配置数据源URL 模式说明US Census Building Permits Surveyhttps://www2.census.gov/econ/bps/Place/...月度更新MSA place 两级粒度全美最统一的数据源城市开放数据许可门户city-domain/permits.json、city-domain/api/permits尽力探测许多城市使用 Accelaapo/...端点规划委员会议程Granicus / Legistar 发现通常形如https://city.granicus.com/...这三个来源在时间粒度与可用性上各有特点需要理解它们的行为差异Census BPS 是月度数据不是每日数据。SKILL.md 的 Gotchas 明确警告Construction 信号天然是中等延迟的不要向用户承诺今天的许可。FetchConstruction.ts的源码注释同样指出Census BPS 是全国最统一的路径、能产生最好的基线信号因此被列为第一优先实现对象。城市门户的可用性参差不齐。有些城市开放数据丰富有些只发布 PDF。SKILL.md 规定当某个通用源对解析出的城市没有数据时抓取器必须返回source_status: unavailable而不是抛错。Granicus/Legistar 覆盖的是市议会/规划委员会层面与覆盖州议会的 OpenStatesLegislation 工作流使用形成互补——这正是规划议程被单独列为 Construction 第三数据源的原因。数据契约与降级语义FetchResult的类型定义集中在 Types.ts是整个 LocalIntelligence 技能所有 fetcher 的公共契约export interface Item { title: string source: string url: string date: string // ISO 8601 if known, free-form date string otherwise summary?: string metadata?: Recordstring, unknown } export type SourceStatus ok | unavailable | empty export interface FetchResult { items: Item[] source_status: SourceStatus errors?: string[] }三种source_status的语义在 SKILL.md 中被严格区分Gotchas 最后一条ok——源正常返回且命中条目empty——源返回 200 但零命中小城镇常见不是错误unavailable——源 4xx/5xx 或 DNS 失败。Types.ts还提供了两个工具函数EMPTY_RESULT{ items: [], source_status: empty }与unavailable(reason)附带错误说明。FetchConstruction.ts当前正是通过unavailable()构造降级返回export async function fetchConstruction(home: Hometown): PromiseFetchResult { return unavailable( construction fetcher not yet implemented — TODO: Census BPS for ${home.city}, ${home.state} ) }重要实现事实仓库中的FetchConstruction.ts为 v1 桩实现stub返回source_statusunavailable并带 TODO 标记。其注释给出的实现路线是优先实现 Census BPS API——该路径在全国最统一能产生最好的基线信号。因此在当前仓库版本下直接运行bun run Tools/FetchConstruction.ts会得到一条unavailable结果与错误说明而非真实许可数据——这正是降级契约被设计出来要承载的场景数据源缺失时优雅降级而不是让整个 digest 空白。FetchConstruction.ts同样带有 CLI 入口会先通过readHometown()解析城市再执行抓取并输出 JSONbun run LifeOS/install/skills/LocalIntelligence/Tools/FetchConstruction.ts与 Refresh 编排器的集成Construction 抓取器并非孤立运行。在 DailyBrief 工作流中编排器 Refresh.ts 通过fetchers注册表将全部八个 fetcher 并行调度const fetchers: RecordSectionKey, Fetcher { construction: fetchConstruction, crime: fetchCrime, business: fetchBusiness, officials: fetchOfficials, legislation: fetchLegislation, elections: fetchElections, arrests: fetchArrests, news: fetchNews, }关键机制从 Refresh.ts 源码可确认Promise.allSettled并行执行一个数据源挂掉绝不会清空整个 digest每个 fetcher 内部也返回错误而非抛出外层runOne兜底把异常转换成unavailable结果错误归集失败的源进入meta.sources_failed具体错误进入meta.errors带源标签如construction: msg双路径持久化persist()同时写USER/CUSTOMIZATIONS/SKILLS/LocalIntelligence/latest.jsonPulse 模块首选读取路径与MEMORY/DATA/LocalIntelligence/latest.json历史回退路径另写一份带日期的历史文件YYYY-MM-DD_city_state_digest.jsonno-clobber 保护全空运行如当前 Construction 桩实现配合其他源全部失败只写日期文件绝不覆盖已有非空内容的latest.json避免一次失败的凌晨 6 点任务清空仪表盘--fill模式bun run Tools/Refresh.ts --fill在确定性抓取之后用ClaudeFill.ts对仍为空的 section 做 AI 研究补全但补全结果必须通过validateSection()校验且只能增加不能覆盖确定性数据。此外Pulse 侧通过PULSE.toml中0 6 * * *的[[job]]每日触发 Refresh并在local-intelligence.ts模块暴露GET /api/local-intelligence与POST /api/local-intelligence/refresh端点供 LOCAL 标签页按钮触发刷新。运行与验证在本地仓库中验证 Construction 工作流相关的组件# 1. 校验家乡城市解析需先配置 PRINCIPAL_IDENTITY.md 的 Hometown 行 bun run LifeOS/install/skills/LocalIntelligence/Tools/Hometown.ts # 2. 单独运行 Construction 抓取器当前仓库为 v1 桩返回 unavailable TODO bun run LifeOS/install/skills/LocalIntelligence/Tools/FetchConstruction.ts # 3. 运行完整八类聚合编排器确定性模式 bun run LifeOS/install/skills/LocalIntelligence/Tools/Refresh.ts # 4. 带 AI 补全的完整模式 bun run LifeOS/install/skills/LocalIntelligence/Tools/Refresh.ts --fill输出摘要包含sources_used、sources_failed、total_items与latest_skipped_no_clobber等字段可直接核对降级行为是否符合预期。若PRINCIPAL_IDENTITY.md缺少**Hometown:**行命令会以退出码 2 提示设置帮助信息。设计边界与注意事项综合 SKILL.md 的 Gotchas 与上述源码使用 Construction 工作流时需牢记以下边界Census 数据是月度的——不要承诺今日许可呈现时说明数据时点城市门户质量差异巨大——unavailable是正常的降级态不代表故障禁止绕过反爬——不绕过 CAPTCHA、不购买付费抓取服务SKILL.md 对 arrest 等模块有同样约束工作流是只读消费——仓库本身只提供查看、安装、运行与配置方式抓取产物写入~/.claude下的用户数据目录而非本仓库。从源码结构看当FetchConstruction.ts完成 Census BPS 第一优先实现后Construction 工作流将成为 LocalIntelligence 中基线最稳的通用情报源之一在此之前它完整演示了该技能无数据即优雅降级、绝不空白整体的核心设计哲学——这正是整个 LocalIntelligence 架构最值得借鉴的部分。【免费下载链接】LifeOS⛰️ The Life Operating System — an intent engineering platform that moves you from your current state to your ideal state, in life and work.项目地址: https://gitcode.com/GitHub_Trending/pe/LifeOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考